1 /*
2 Copyright (c) 2003-2005 Alberto Demichelis
3 
4 This software is provided 'as-is', without any
5 express or implied warranty. In no event will the
6 authors be held liable for any damages arising from
7 the use of this software.
8 
9 Permission is granted to anyone to use this software
10 for any purpose, including commercial applications,
11 and to alter it and redistribute it freely, subject
12 to the following restrictions:
13 
14 		1. The origin of this software must not be
15 		misrepresented; you must not claim that
16 		you wrote the original software. If you
17 		use this software in a product, an
18 		acknowledgment in the product
19 		documentation would be appreciated but is
20 		not required.
21 
22 		2. Altered source versions must be plainly
23 		marked as such, and must not be
24 		misrepresented as being the original
25 		software.
26 
27 		3. This notice may not be removed or
28 		altered from any source distribution.
29 
30 */
31 #ifndef _SQUIRREL_H_
32 #define _SQUIRREL_H_
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #ifndef SQUIRREL_API
39 #define SQUIRREL_API extern
40 #endif
41 
42 typedef float SQFloat;
43 typedef int SQInteger;
44 typedef int SQInt32; //must be 32 bits(also on 64bits processors)
45 typedef void* SQUserPointer;
46 typedef unsigned int SQUnsignedInteger;
47 typedef unsigned long int SQHash; //should be the same size of a pointer
48 typedef SQUnsignedInteger SQBool;
49 typedef SQInteger SQRESULT;
50 
51 #define SQTrue	(1)
52 #define SQFalse	(0)
53 
54 
55 struct SQVM;
56 struct SQTable;
57 struct SQArray;
58 struct SQString;
59 struct SQClosure;
60 struct SQGenerator;
61 struct SQNativeClosure;
62 struct SQUserData;
63 struct SQFunctionProto;
64 struct SQRefCounted;
65 struct SQClass;
66 struct SQInstance;
67 struct SQDelegable;
68 
69 #ifdef _UNICODE
70 #define SQUNICODE
71 #endif
72 
73 #ifdef SQUNICODE
74 typedef unsigned short SQChar;
75 #define _SC(a) L##a
76 #define	scstrcmp	wcscmp
77 #define scsprintf	swprintf
78 #define scstrlen	wcslen
79 #define scstrtod	wcstod
80 #define scstrtol	wcstol
81 #define scatoi		_wtoi
82 #define scstrtoul	wcstoul
83 #define scvsprintf	vswprintf
84 #define scstrstr	wcsstr
85 #define scisspace	iswspace
86 #define scisdigit	iswdigit
87 #define scisalpha	iswalpha
88 #define sciscntrl	iswcntrl
89 #define scisalnum	iswalnum
90 #define scprintf	wprintf
91 #define MAX_CHAR 0xFFFF
92 #else
93 typedef char SQChar;
94 #define _SC(a) a
95 #define	scstrcmp	strcmp
96 #define scsprintf	sprintf
97 #define scstrlen	strlen
98 #define scstrtod	strtod
99 #define scstrtol	strtol
100 #define scatoi		atoi
101 #define scstrtoul	strtoul
102 #define scvsprintf	vsprintf
103 #define scstrstr	strstr
104 #define scisspace	isspace
105 #define scisdigit	isdigit
106 #define sciscntrl	iscntrl
107 #define scisalpha	isalpha
108 #define scisalnum	isalnum
109 #define scprintf	printf
110 #define MAX_CHAR 0xFF
111 #endif
112 
113 #define SQUIRREL_VERSION	_SC("Squirrel 2.0.5 stable")
114 #define SQUIRREL_COPYRIGHT	_SC("Copyright (C) 2003-2005 Alberto Demichelis")
115 #define SQUIRREL_AUTHOR		_SC("Alberto Demichelis")
116 
117 #define SQ_VMSTATE_IDLE			0
118 #define SQ_VMSTATE_RUNNING		1
119 #define SQ_VMSTATE_SUSPENDED	2
120 
121 #define SQUIRREL_EOB 0
122 #define SQ_BYTECODE_STREAM_TAG	0xFAFA
123 
124 #define SQOBJECT_REF_COUNTED	0x08000000
125 #define SQOBJECT_NUMERIC		0x04000000
126 #define SQOBJECT_DELEGABLE		0x02000000
127 #define SQOBJECT_CANBEFALSE		0x01000000
128 
129 #define SQ_MATCHTYPEMASKSTRING (-99999)
130 
131 #define _RT_MASK 0x00FFFFFF
132 #define _RAW_TYPE(type) (type&_RT_MASK)
133 
134 #define _RT_NULL			0x00000001
135 #define _RT_INTEGER			0x00000002
136 #define _RT_FLOAT			0x00000004
137 #define _RT_BOOL			0x00000008
138 #define _RT_STRING			0x00000010
139 #define _RT_TABLE			0x00000020
140 #define _RT_ARRAY			0x00000040
141 #define _RT_USERDATA		0x00000080
142 #define _RT_CLOSURE			0x00000100
143 #define _RT_NATIVECLOSURE	0x00000200
144 #define _RT_GENERATOR		0x00000400
145 #define _RT_USERPOINTER		0x00000800
146 #define _RT_THREAD			0x00001000
147 #define _RT_FUNCPROTO		0x00002000
148 #define _RT_CLASS			0x00004000
149 #define _RT_INSTANCE		0x00008000
150 #define _RT_WEAKREF			0x00010000
151 
152 typedef enum {
153 	OT_NULL =			(_RT_NULL|SQOBJECT_CANBEFALSE),
154 	OT_INTEGER =		(_RT_INTEGER|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
155 	OT_FLOAT =			(_RT_FLOAT|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
156 	OT_BOOL =			(_RT_BOOL|SQOBJECT_CANBEFALSE),
157 	OT_STRING =			(_RT_STRING|SQOBJECT_REF_COUNTED),
158 	OT_TABLE =			(_RT_TABLE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
159 	OT_ARRAY =			(_RT_ARRAY|SQOBJECT_REF_COUNTED),
160 	OT_USERDATA =		(_RT_USERDATA|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
161 	OT_CLOSURE =		(_RT_CLOSURE|SQOBJECT_REF_COUNTED),
162 	OT_NATIVECLOSURE =	(_RT_NATIVECLOSURE|SQOBJECT_REF_COUNTED),
163 	OT_GENERATOR =		(_RT_GENERATOR|SQOBJECT_REF_COUNTED),
164 	OT_USERPOINTER =	_RT_USERPOINTER,
165 	OT_THREAD =			(_RT_THREAD|SQOBJECT_REF_COUNTED) ,
166 	OT_FUNCPROTO =		(_RT_FUNCPROTO|SQOBJECT_REF_COUNTED), //internal usage only
167 	OT_CLASS =			(_RT_CLASS|SQOBJECT_REF_COUNTED),
168 	OT_INSTANCE =		(_RT_INSTANCE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
169 	OT_WEAKREF =		(_RT_WEAKREF|SQOBJECT_REF_COUNTED)
170 }SQObjectType;
171 
172 #define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED)
173 
174 
175 typedef union tagSQObjectValue
176 {
177 	struct SQTable *pTable;
178 	struct SQArray *pArray;
179 	struct SQClosure *pClosure;
180 	struct SQGenerator *pGenerator;
181 	struct SQNativeClosure *pNativeClosure;
182 	struct SQString *pString;
183 	struct SQUserData *pUserData;
184 	SQInteger nInteger;
185 	SQFloat fFloat;
186 	SQUserPointer pUserPointer;
187 	struct SQFunctionProto *pFunctionProto;
188 	struct SQRefCounted *pRefCounted;
189 	struct SQDelegable *pDelegable;
190 	struct SQVM *pThread;
191 	struct SQClass *pClass;
192 	struct SQInstance *pInstance;
193 	struct SQWeakRef *pWeakRef;
194 }SQObjectValue;
195 
196 
197 typedef struct tagSQObject
198 {
199 	SQObjectValue _unVal;
200 	SQObjectType _type;
201 }SQObject;
202 
203 typedef struct tagSQStackInfos{
204 	const SQChar* funcname;
205 	const SQChar* source;
206 	SQInteger line;
207 }SQStackInfos;
208 
209 typedef struct SQVM* HSQUIRRELVM;
210 typedef SQObject HSQOBJECT;
211 typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM);
212 typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size);
213 typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/);
214 typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...);
215 
216 typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
217 typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
218 
219 typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer);
220 
221 typedef struct tagSQRegFunction{
222 	const SQChar *name;
223 	SQFUNCTION f;
224 	SQInteger nparamscheck;
225 	const SQChar *typemask;
226 }SQRegFunction;
227 
228 /*vm*/
229 SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize);
230 SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
231 SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v);
232 SQUIRREL_API void sq_close(HSQUIRRELVM v);
233 SQUIRREL_API void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p);
234 SQUIRREL_API SQUserPointer sq_getforeignptr(HSQUIRRELVM v);
235 SQUIRREL_API void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc);
236 SQUIRREL_API SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v);
237 SQUIRREL_API SQRESULT sq_suspendvm(HSQUIRRELVM v);
238 SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval);
239 SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v);
240 
241 /*compiler*/
242 SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror);
243 SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror);
244 SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool debuginfo);
245 SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f);
246 
247 /*stack operations*/
248 SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx);
249 SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop);
250 SQUIRREL_API void sq_poptop(HSQUIRRELVM v);
251 SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx);
252 SQUIRREL_API SQInteger sq_gettop(HSQUIRRELVM v);
253 SQUIRREL_API void sq_settop(HSQUIRRELVM v,SQInteger newtop);
254 SQUIRREL_API void sq_reservestack(HSQUIRRELVM v,SQInteger nsize);
255 SQUIRREL_API SQInteger sq_cmp(HSQUIRRELVM v);
256 SQUIRREL_API void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx);
257 
258 /*object creation handling*/
259 SQUIRREL_API SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size);
260 SQUIRREL_API void sq_newtable(HSQUIRRELVM v);
261 SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size);
262 SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars);
263 SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
264 SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
265 SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
266 SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
267 SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b);
268 SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
269 SQUIRREL_API void sq_pushnull(HSQUIRRELVM v);
270 SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx);
271 SQUIRREL_API SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx);
272 SQUIRREL_API void sq_tostring(HSQUIRRELVM v,SQInteger idx);
273 SQUIRREL_API SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
274 SQUIRREL_API SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
275 SQUIRREL_API SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
276 SQUIRREL_API SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b);
277 SQUIRREL_API SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread);
278 SQUIRREL_API SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
279 SQUIRREL_API SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
280 SQUIRREL_API SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
281 SQUIRREL_API SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
282 SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
283 SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
284 SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
285 SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
286 SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
287 SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
288 SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
289 SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
290 SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
291 SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);
292 SQUIRREL_API SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx);
293 SQUIRREL_API void sq_weakref(HSQUIRRELVM v,SQInteger idx);
294 
295 /*object manipulation*/
296 SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v);
297 SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
298 SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v);
299 SQUIRREL_API SQRESULT sq_createslot(HSQUIRRELVM v,SQInteger idx);
300 SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
301 SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx);
302 SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx);
303 SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
304 SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx);
305 SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
306 SQUIRREL_API SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx);
307 SQUIRREL_API SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
308 SQUIRREL_API SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize);
309 SQUIRREL_API SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx);
310 SQUIRREL_API SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx);
311 SQUIRREL_API SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx);
312 SQUIRREL_API SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx);
313 SQUIRREL_API SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
314 SQUIRREL_API SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx);
315 SQUIRREL_API SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx);
316 
317 /*calls*/
318 SQUIRREL_API SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval);
319 SQUIRREL_API SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval);
320 SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
321 SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
322 SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err);
323 SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
324 SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
325 
326 /*raw object handling*/
327 SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);
328 SQUIRREL_API void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj);
329 SQUIRREL_API void sq_addref(HSQUIRRELVM v,HSQOBJECT *po);
330 SQUIRREL_API SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po);
331 SQUIRREL_API void sq_resetobject(HSQOBJECT *po);
332 SQUIRREL_API const SQChar *sq_objtostring(HSQOBJECT *o);
333 SQUIRREL_API SQBool sq_objtobool(HSQOBJECT *o);
334 SQUIRREL_API SQInteger sq_objtointeger(HSQOBJECT *o);
335 SQUIRREL_API SQFloat sq_objtofloat(HSQOBJECT *o);
336 
337 /*GC*/
338 SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v);
339 
340 /*serialization*/
341 SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
342 SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
343 
344 /*mem allocation*/
345 SQUIRREL_API void *sq_malloc(SQUnsignedInteger size);
346 SQUIRREL_API void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize);
347 SQUIRREL_API void sq_free(void *p,SQUnsignedInteger size);
348 
349 /*debug*/
350 SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
351 SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v);
352 
353 /*UTILITY MACRO*/
354 #define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC)
355 #define sq_istable(o) ((o)._type==OT_TABLE)
356 #define sq_isarray(o) ((o)._type==OT_ARRAY)
357 #define sq_isfunction(o) ((o)._type==OT_FUNCPROTO)
358 #define sq_isclosure(o) ((o)._type==OT_CLOSURE)
359 #define sq_isgenerator(o) ((o)._type==OT_GENERATOR)
360 #define sq_isnativeclosure(o) ((o)._type==OT_NATIVECLOSURE)
361 #define sq_isstring(o) ((o)._type==OT_STRING)
362 #define sq_isinteger(o) ((o)._type==OT_INTEGER)
363 #define sq_isfloat(o) ((o)._type==OT_FLOAT)
364 #define sq_isuserpointer(o) ((o)._type==OT_USERPOINTER)
365 #define sq_isuserdata(o) ((o)._type==OT_USERDATA)
366 #define sq_isthread(o) ((o)._type==OT_THREAD)
367 #define sq_isnull(o) ((o)._type==OT_NULL)
368 #define sq_isclass(o) ((o)._type==OT_CLASS)
369 #define sq_isinstance(o) ((o)._type==OT_INSTANCE)
370 #define sq_isbool(o) ((o)._type==OT_BOOL)
371 #define sq_isweakref(o) ((o)._type==OT_WEAKREF)
372 #define sq_type(o) ((o)._type)
373 
374 #define SQ_OK (0)
375 #define SQ_ERROR (-1)
376 
377 #define SQ_FAILED(res) (res<0)
378 #define SQ_SUCCEEDED(res) (res>=0)
379 
380 #ifdef __cplusplus
381 } /*extern "C"*/
382 #endif
383 
384 #endif /*_SQUIRREL_H_*/
385