2 Copyright (c) 2003-2007 Alberto Demichelis
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.
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:
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
22 2. Altered source versions must be plainly
23 marked as such, and must not be
24 misrepresented as being the original
27 3. This notice may not be removed or
28 altered from any source distribution.
39 #define SQUIRREL_API extern
44 typedef __int64 SQInteger;
45 typedef unsigned __int64 SQUnsignedInteger;
46 typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/
48 typedef long SQInteger;
49 typedef unsigned long SQUnsignedInteger;
50 typedef unsigned long SQHash; /*should be the same size of a pointer*/
54 typedef int SQInteger;
55 typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/
56 typedef unsigned int SQUnsignedInteger;
57 typedef unsigned int SQHash; /*should be the same size of a pointer*/
60 typedef float SQFloat;
61 typedef void* SQUserPointer;
62 typedef SQUnsignedInteger SQBool;
63 typedef SQInteger SQRESULT;
75 struct SQNativeClosure;
77 struct SQFunctionProto;
88 #if (defined(_MSC_VER) && _MSC_VER >= 1400) // 1400 = VS8
90 #if defined(wchar_t) //this is if the compiler considers wchar_t as native type
91 #define wchar_t unsigned short
95 typedef unsigned short wchar_t;
98 typedef wchar_t SQChar;
100 #define scstrcmp wcscmp
101 #define scsprintf swprintf
102 #define scstrlen wcslen
103 #define scstrtod wcstod
104 #define scstrtol wcstol
106 #define scstrtoul wcstoul
107 #define scvsprintf vswprintf
108 #define scstrstr wcsstr
109 #define scisspace iswspace
110 #define scisdigit iswdigit
111 #define scisxdigit iswxdigit
112 #define scisalpha iswalpha
113 #define sciscntrl iswcntrl
114 #define scisalnum iswalnum
115 #define scprintf wprintf
116 #define MAX_CHAR 0xFFFF
120 #define scstrcmp strcmp
121 #define scsprintf sprintf
122 #define scstrlen strlen
123 #define scstrtod strtod
124 #define scstrtol strtol
126 #define scstrtoul strtoul
127 #define scvsprintf vsprintf
128 #define scstrstr strstr
129 #define scisspace isspace
130 #define scisdigit isdigit
131 #define scisxdigit isxdigit
132 #define sciscntrl iscntrl
133 #define scisalpha isalpha
134 #define scisalnum isalnum
135 #define scprintf printf
136 #define MAX_CHAR 0xFF
139 #define SQUIRREL_VERSION _SC("Squirrel 2.1.2 stable")
140 #define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2007 Alberto Demichelis")
141 #define SQUIRREL_AUTHOR _SC("Alberto Demichelis")
143 #define SQ_VMSTATE_IDLE 0
144 #define SQ_VMSTATE_RUNNING 1
145 #define SQ_VMSTATE_SUSPENDED 2
147 #define SQUIRREL_EOB 0
148 #define SQ_BYTECODE_STREAM_TAG 0xFAFA
150 #define SQOBJECT_REF_COUNTED 0x08000000
151 #define SQOBJECT_NUMERIC 0x04000000
152 #define SQOBJECT_DELEGABLE 0x02000000
153 #define SQOBJECT_CANBEFALSE 0x01000000
155 #define SQ_MATCHTYPEMASKSTRING (-99999)
157 #define _RT_MASK 0x00FFFFFF
158 #define _RAW_TYPE(type) (type&_RT_MASK)
160 #define _RT_NULL 0x00000001
161 #define _RT_INTEGER 0x00000002
162 #define _RT_FLOAT 0x00000004
163 #define _RT_BOOL 0x00000008
164 #define _RT_STRING 0x00000010
165 #define _RT_TABLE 0x00000020
166 #define _RT_ARRAY 0x00000040
167 #define _RT_USERDATA 0x00000080
168 #define _RT_CLOSURE 0x00000100
169 #define _RT_NATIVECLOSURE 0x00000200
170 #define _RT_GENERATOR 0x00000400
171 #define _RT_USERPOINTER 0x00000800
172 #define _RT_THREAD 0x00001000
173 #define _RT_FUNCPROTO 0x00002000
174 #define _RT_CLASS 0x00004000
175 #define _RT_INSTANCE 0x00008000
176 #define _RT_WEAKREF 0x00010000
178 typedef enum tagSQObjectType{
179 OT_NULL = (_RT_NULL|SQOBJECT_CANBEFALSE),
180 OT_INTEGER = (_RT_INTEGER|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
181 OT_FLOAT = (_RT_FLOAT|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
182 OT_BOOL = (_RT_BOOL|SQOBJECT_CANBEFALSE),
183 OT_STRING = (_RT_STRING|SQOBJECT_REF_COUNTED),
184 OT_TABLE = (_RT_TABLE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
185 OT_ARRAY = (_RT_ARRAY|SQOBJECT_REF_COUNTED),
186 OT_USERDATA = (_RT_USERDATA|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
187 OT_CLOSURE = (_RT_CLOSURE|SQOBJECT_REF_COUNTED),
188 OT_NATIVECLOSURE = (_RT_NATIVECLOSURE|SQOBJECT_REF_COUNTED),
189 OT_GENERATOR = (_RT_GENERATOR|SQOBJECT_REF_COUNTED),
190 OT_USERPOINTER = _RT_USERPOINTER,
191 OT_THREAD = (_RT_THREAD|SQOBJECT_REF_COUNTED) ,
192 OT_FUNCPROTO = (_RT_FUNCPROTO|SQOBJECT_REF_COUNTED), //internal usage only
193 OT_CLASS = (_RT_CLASS|SQOBJECT_REF_COUNTED),
194 OT_INSTANCE = (_RT_INSTANCE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
195 OT_WEAKREF = (_RT_WEAKREF|SQOBJECT_REF_COUNTED)
198 #define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED)
201 typedef union tagSQObjectValue
203 struct SQTable *pTable;
204 struct SQArray *pArray;
205 struct SQClosure *pClosure;
206 struct SQGenerator *pGenerator;
207 struct SQNativeClosure *pNativeClosure;
208 struct SQString *pString;
209 struct SQUserData *pUserData;
212 SQUserPointer pUserPointer;
213 struct SQFunctionProto *pFunctionProto;
214 struct SQRefCounted *pRefCounted;
215 struct SQDelegable *pDelegable;
216 struct SQVM *pThread;
217 struct SQClass *pClass;
218 struct SQInstance *pInstance;
219 struct SQWeakRef *pWeakRef;
223 typedef struct tagSQObject
226 SQObjectValue _unVal;
229 typedef struct tagSQStackInfos{
230 const SQChar* funcname;
231 const SQChar* source;
235 typedef struct SQVM* HSQUIRRELVM;
236 typedef SQObject HSQOBJECT;
237 typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM);
238 typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size);
239 typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/);
240 typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...);
242 typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
243 typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
245 typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer);
247 typedef struct tagSQRegFunction{
250 SQInteger nparamscheck;
251 const SQChar *typemask;
255 SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize);
256 SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
257 SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v);
258 SQUIRREL_API void sq_close(HSQUIRRELVM v);
259 SQUIRREL_API void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p);
260 SQUIRREL_API SQUserPointer sq_getforeignptr(HSQUIRRELVM v);
261 SQUIRREL_API void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc);
262 SQUIRREL_API SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v);
263 SQUIRREL_API SQRESULT sq_suspendvm(HSQUIRRELVM v);
264 SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror);
265 SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v);
268 SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror);
269 SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror);
270 SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable);
271 SQUIRREL_API void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable);
272 SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f);
275 SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx);
276 SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop);
277 SQUIRREL_API void sq_poptop(HSQUIRRELVM v);
278 SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx);
279 SQUIRREL_API SQInteger sq_gettop(HSQUIRRELVM v);
280 SQUIRREL_API void sq_settop(HSQUIRRELVM v,SQInteger newtop);
281 SQUIRREL_API void sq_reservestack(HSQUIRRELVM v,SQInteger nsize);
282 SQUIRREL_API SQInteger sq_cmp(HSQUIRRELVM v);
283 SQUIRREL_API void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx);
285 /*object creation handling*/
286 SQUIRREL_API SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size);
287 SQUIRREL_API void sq_newtable(HSQUIRRELVM v);
288 SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size);
289 SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars);
290 SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
291 SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx);
292 SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
293 SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
294 SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
295 SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b);
296 SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
297 SQUIRREL_API void sq_pushnull(HSQUIRRELVM v);
298 SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx);
299 SQUIRREL_API SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx);
300 SQUIRREL_API SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx);
301 SQUIRREL_API SQBool sq_instanceof(HSQUIRRELVM v);
302 SQUIRREL_API void sq_tostring(HSQUIRRELVM v,SQInteger idx);
303 SQUIRREL_API void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b);
304 SQUIRREL_API SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
305 SQUIRREL_API SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
306 SQUIRREL_API SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
307 SQUIRREL_API SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b);
308 SQUIRREL_API SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread);
309 SQUIRREL_API SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
310 SQUIRREL_API SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
311 SQUIRREL_API SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
312 SQUIRREL_API SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
313 SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
314 SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
315 SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
316 SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
317 SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
318 SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
319 SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
320 SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
321 SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
322 SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);
323 SQUIRREL_API SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx);
324 SQUIRREL_API void sq_weakref(HSQUIRRELVM v,SQInteger idx);
325 SQUIRREL_API SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t);
327 /*object manipulation*/
328 SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v);
329 SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
330 SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v);
331 SQUIRREL_API SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic);
332 SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
333 SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx);
334 SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx);
335 SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
336 SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx);
337 SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
338 SQUIRREL_API SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx);
339 SQUIRREL_API SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
340 SQUIRREL_API SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize);
341 SQUIRREL_API SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx);
342 SQUIRREL_API SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx);
343 SQUIRREL_API SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx);
344 SQUIRREL_API SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx);
345 SQUIRREL_API SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
346 SQUIRREL_API SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx);
347 SQUIRREL_API SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx);
348 SQUIRREL_API SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx);
351 SQUIRREL_API SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror);
352 SQUIRREL_API SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror);
353 SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
354 SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
355 SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err);
356 SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
357 SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
359 /*raw object handling*/
360 SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);
361 SQUIRREL_API void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj);
362 SQUIRREL_API void sq_addref(HSQUIRRELVM v,HSQOBJECT *po);
363 SQUIRREL_API SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po);
364 SQUIRREL_API void sq_resetobject(HSQOBJECT *po);
365 SQUIRREL_API const SQChar *sq_objtostring(HSQOBJECT *o);
366 SQUIRREL_API SQBool sq_objtobool(HSQOBJECT *o);
367 SQUIRREL_API SQInteger sq_objtointeger(HSQOBJECT *o);
368 SQUIRREL_API SQFloat sq_objtofloat(HSQOBJECT *o);
369 SQUIRREL_API SQRESULT sq_getobjtypetag(HSQOBJECT *o,SQUserPointer * typetag);
372 SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v);
375 SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
376 SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
379 SQUIRREL_API void *sq_malloc(SQUnsignedInteger size);
380 SQUIRREL_API void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize);
381 SQUIRREL_API void sq_free(void *p,SQUnsignedInteger size);
384 SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
385 SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v);
388 #define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC)
389 #define sq_istable(o) ((o)._type==OT_TABLE)
390 #define sq_isarray(o) ((o)._type==OT_ARRAY)
391 #define sq_isfunction(o) ((o)._type==OT_FUNCPROTO)
392 #define sq_isclosure(o) ((o)._type==OT_CLOSURE)
393 #define sq_isgenerator(o) ((o)._type==OT_GENERATOR)
394 #define sq_isnativeclosure(o) ((o)._type==OT_NATIVECLOSURE)
395 #define sq_isstring(o) ((o)._type==OT_STRING)
396 #define sq_isinteger(o) ((o)._type==OT_INTEGER)
397 #define sq_isfloat(o) ((o)._type==OT_FLOAT)
398 #define sq_isuserpointer(o) ((o)._type==OT_USERPOINTER)
399 #define sq_isuserdata(o) ((o)._type==OT_USERDATA)
400 #define sq_isthread(o) ((o)._type==OT_THREAD)
401 #define sq_isnull(o) ((o)._type==OT_NULL)
402 #define sq_isclass(o) ((o)._type==OT_CLASS)
403 #define sq_isinstance(o) ((o)._type==OT_INSTANCE)
404 #define sq_isbool(o) ((o)._type==OT_BOOL)
405 #define sq_isweakref(o) ((o)._type==OT_WEAKREF)
406 #define sq_type(o) ((o)._type)
409 #define sq_createslot(v,n) sq_newslot(v,n,SQFalse)
412 #define SQ_ERROR (-1)
414 #define SQ_FAILED(res) (res<0)
415 #define SQ_SUCCEEDED(res) (res>=0)
421 #endif /*_SQUIRREL_H_*/