2 Copyright (c) 2003-2009 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
42 #if (defined(_WIN64) || defined(_LP64))
48 typedef __int64 SQInteger;
49 typedef unsigned __int64 SQUnsignedInteger;
50 typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/
52 typedef long SQInteger;
53 typedef unsigned long SQUnsignedInteger;
54 typedef unsigned long SQHash; /*should be the same size of a pointer*/
58 typedef int SQInteger;
59 typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/
60 typedef unsigned int SQUnsignedInteger;
61 typedef unsigned int SQHash; /*should be the same size of a pointer*/
66 typedef double SQFloat;
68 typedef float SQFloat;
71 #if defined(SQUSEDOUBLE) && !defined(_SQ64)
73 typedef __int64 SQRawObjectVal; //must be 64bits
75 typedef long SQRawObjectVal; //must be 64bits
77 #define SQ_OBJECT_RAWINIT() { _unVal.raw = 0; }
79 typedef SQUnsignedInteger SQRawObjectVal; //is 32 bits on 32 bits builds and 64 bits otherwise
80 #define SQ_OBJECT_RAWINIT()
83 typedef void* SQUserPointer;
84 typedef SQUnsignedInteger SQBool;
85 typedef SQInteger SQRESULT;
96 struct SQNativeClosure;
98 struct SQFunctionProto;
109 #if (defined(_MSC_VER) && _MSC_VER >= 1400) // 1400 = VS8
111 #if defined(wchar_t) //this is if the compiler considers wchar_t as native type
112 #define wchar_t unsigned short
116 typedef unsigned short wchar_t;
119 typedef wchar_t SQChar;
121 #define scstrcmp wcscmp
122 #define scsprintf swprintf
123 #define scstrlen wcslen
124 #define scstrtod wcstod
125 #define scstrtol wcstol
127 #define scstrtoul wcstoul
128 #define scvsprintf vswprintf
129 #define scstrstr wcsstr
130 #define scisspace iswspace
131 #define scisdigit iswdigit
132 #define scisxdigit iswxdigit
133 #define scisalpha iswalpha
134 #define sciscntrl iswcntrl
135 #define scisalnum iswalnum
136 #define scprintf wprintf
137 #define MAX_CHAR 0xFFFF
141 #define scstrcmp strcmp
142 #define scsprintf sprintf
143 #define scstrlen strlen
144 #define scstrtod strtod
145 #define scstrtol strtol
147 #define scstrtoul strtoul
148 #define scvsprintf vsprintf
149 #define scstrstr strstr
150 #define scisspace isspace
151 #define scisdigit isdigit
152 #define scisxdigit isxdigit
153 #define sciscntrl iscntrl
154 #define scisalpha isalpha
155 #define scisalnum isalnum
156 #define scprintf printf
157 #define MAX_CHAR 0xFF
160 #define SQUIRREL_VERSION _SC("Squirrel 2.2.3 stable")
161 #define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2009 Alberto Demichelis")
162 #define SQUIRREL_AUTHOR _SC("Alberto Demichelis")
164 #define SQ_VMSTATE_IDLE 0
165 #define SQ_VMSTATE_RUNNING 1
166 #define SQ_VMSTATE_SUSPENDED 2
168 #define SQUIRREL_EOB 0
169 #define SQ_BYTECODE_STREAM_TAG 0xFAFA
171 #define SQOBJECT_REF_COUNTED 0x08000000
172 #define SQOBJECT_NUMERIC 0x04000000
173 #define SQOBJECT_DELEGABLE 0x02000000
174 #define SQOBJECT_CANBEFALSE 0x01000000
176 #define SQ_MATCHTYPEMASKSTRING (-99999)
178 #define _RT_MASK 0x00FFFFFF
179 #define _RAW_TYPE(type) (type&_RT_MASK)
181 #define _RT_NULL 0x00000001
182 #define _RT_INTEGER 0x00000002
183 #define _RT_FLOAT 0x00000004
184 #define _RT_BOOL 0x00000008
185 #define _RT_STRING 0x00000010
186 #define _RT_TABLE 0x00000020
187 #define _RT_ARRAY 0x00000040
188 #define _RT_USERDATA 0x00000080
189 #define _RT_CLOSURE 0x00000100
190 #define _RT_NATIVECLOSURE 0x00000200
191 #define _RT_GENERATOR 0x00000400
192 #define _RT_USERPOINTER 0x00000800
193 #define _RT_THREAD 0x00001000
194 #define _RT_FUNCPROTO 0x00002000
195 #define _RT_CLASS 0x00004000
196 #define _RT_INSTANCE 0x00008000
197 #define _RT_WEAKREF 0x00010000
199 typedef enum tagSQObjectType{
200 OT_NULL = (_RT_NULL|SQOBJECT_CANBEFALSE),
201 OT_INTEGER = (_RT_INTEGER|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
202 OT_FLOAT = (_RT_FLOAT|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
203 OT_BOOL = (_RT_BOOL|SQOBJECT_CANBEFALSE),
204 OT_STRING = (_RT_STRING|SQOBJECT_REF_COUNTED),
205 OT_TABLE = (_RT_TABLE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
206 OT_ARRAY = (_RT_ARRAY|SQOBJECT_REF_COUNTED),
207 OT_USERDATA = (_RT_USERDATA|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
208 OT_CLOSURE = (_RT_CLOSURE|SQOBJECT_REF_COUNTED),
209 OT_NATIVECLOSURE = (_RT_NATIVECLOSURE|SQOBJECT_REF_COUNTED),
210 OT_GENERATOR = (_RT_GENERATOR|SQOBJECT_REF_COUNTED),
211 OT_USERPOINTER = _RT_USERPOINTER,
212 OT_THREAD = (_RT_THREAD|SQOBJECT_REF_COUNTED) ,
213 OT_FUNCPROTO = (_RT_FUNCPROTO|SQOBJECT_REF_COUNTED), //internal usage only
214 OT_CLASS = (_RT_CLASS|SQOBJECT_REF_COUNTED),
215 OT_INSTANCE = (_RT_INSTANCE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
216 OT_WEAKREF = (_RT_WEAKREF|SQOBJECT_REF_COUNTED)
219 #define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED)
222 typedef union tagSQObjectValue
224 struct SQTable *pTable;
225 struct SQArray *pArray;
226 struct SQClosure *pClosure;
227 struct SQGenerator *pGenerator;
228 struct SQNativeClosure *pNativeClosure;
229 struct SQString *pString;
230 struct SQUserData *pUserData;
233 SQUserPointer pUserPointer;
234 struct SQFunctionProto *pFunctionProto;
235 struct SQRefCounted *pRefCounted;
236 struct SQDelegable *pDelegable;
237 struct SQVM *pThread;
238 struct SQClass *pClass;
239 struct SQInstance *pInstance;
240 struct SQWeakRef *pWeakRef;
245 typedef struct tagSQObject
248 SQObjectValue _unVal;
251 typedef struct tagSQStackInfos{
252 const SQChar* funcname;
253 const SQChar* source;
257 typedef struct SQVM* HSQUIRRELVM;
258 typedef SQObject HSQOBJECT;
259 typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM);
260 typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size);
261 typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/);
262 typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...);
264 typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
265 typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
267 typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer);
269 typedef struct tagSQRegFunction{
272 SQInteger nparamscheck;
273 const SQChar *typemask;
276 typedef struct tagSQFunctionInfo {
277 SQUserPointer funcid;
279 const SQChar *source;
284 SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize);
285 SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
286 SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v);
287 SQUIRREL_API void sq_close(HSQUIRRELVM v);
288 SQUIRREL_API void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p);
289 SQUIRREL_API SQUserPointer sq_getforeignptr(HSQUIRRELVM v);
290 SQUIRREL_API void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc);
291 SQUIRREL_API SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v);
292 SQUIRREL_API SQRESULT sq_suspendvm(HSQUIRRELVM v);
293 SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror,SQBool throwerror);
294 SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v);
297 SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror);
298 SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror);
299 SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable);
300 SQUIRREL_API void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable);
301 SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f);
304 SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx);
305 SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop);
306 SQUIRREL_API void sq_poptop(HSQUIRRELVM v);
307 SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx);
308 SQUIRREL_API SQInteger sq_gettop(HSQUIRRELVM v);
309 SQUIRREL_API void sq_settop(HSQUIRRELVM v,SQInteger newtop);
310 SQUIRREL_API void sq_reservestack(HSQUIRRELVM v,SQInteger nsize);
311 SQUIRREL_API SQInteger sq_cmp(HSQUIRRELVM v);
312 SQUIRREL_API void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx);
314 /*object creation handling*/
315 SQUIRREL_API SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size);
316 SQUIRREL_API void sq_newtable(HSQUIRRELVM v);
317 SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size);
318 SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars);
319 SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
320 SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx);
321 SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
322 SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
323 SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
324 SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b);
325 SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
326 SQUIRREL_API void sq_pushnull(HSQUIRRELVM v);
327 SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx);
328 SQUIRREL_API SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx);
329 SQUIRREL_API SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx);
330 SQUIRREL_API SQBool sq_instanceof(HSQUIRRELVM v);
331 SQUIRREL_API void sq_tostring(HSQUIRRELVM v,SQInteger idx);
332 SQUIRREL_API void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b);
333 SQUIRREL_API SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
334 SQUIRREL_API SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
335 SQUIRREL_API SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
336 SQUIRREL_API SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b);
337 SQUIRREL_API SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread);
338 SQUIRREL_API SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
339 SQUIRREL_API SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
340 SQUIRREL_API SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
341 SQUIRREL_API SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
342 SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
343 SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
344 SQUIRREL_API SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger idx,SQFunctionInfo *fi);
345 SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
346 SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
347 SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
348 SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
349 SQUIRREL_API SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize);
350 SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
351 SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
352 SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
353 SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);
354 SQUIRREL_API SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx);
355 SQUIRREL_API void sq_weakref(HSQUIRRELVM v,SQInteger idx);
356 SQUIRREL_API SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t);
358 /*object manipulation*/
359 SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v);
360 SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
361 SQUIRREL_API void sq_pushconsttable(HSQUIRRELVM v);
362 SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v);
363 SQUIRREL_API SQRESULT sq_setconsttable(HSQUIRRELVM v);
364 SQUIRREL_API SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic);
365 SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
366 SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx);
367 SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx);
368 SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
369 SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx);
370 SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
371 SQUIRREL_API SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx);
372 SQUIRREL_API SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
373 SQUIRREL_API SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize);
374 SQUIRREL_API SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx);
375 SQUIRREL_API SQRESULT sq_arrayremove(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx);
376 SQUIRREL_API SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos);
377 SQUIRREL_API SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx);
378 SQUIRREL_API SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx);
379 SQUIRREL_API SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx);
380 SQUIRREL_API SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
381 SQUIRREL_API SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx);
382 SQUIRREL_API SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx);
383 SQUIRREL_API SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx);
386 SQUIRREL_API SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror);
387 SQUIRREL_API SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror);
388 SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
389 SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
390 SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err);
391 SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
392 SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
394 /*raw object handling*/
395 SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);
396 SQUIRREL_API void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj);
397 SQUIRREL_API void sq_addref(HSQUIRRELVM v,HSQOBJECT *po);
398 SQUIRREL_API SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po);
399 SQUIRREL_API void sq_resetobject(HSQOBJECT *po);
400 SQUIRREL_API const SQChar *sq_objtostring(HSQOBJECT *o);
401 SQUIRREL_API SQBool sq_objtobool(HSQOBJECT *o);
402 SQUIRREL_API SQInteger sq_objtointeger(HSQOBJECT *o);
403 SQUIRREL_API SQFloat sq_objtofloat(HSQOBJECT *o);
404 SQUIRREL_API SQRESULT sq_getobjtypetag(HSQOBJECT *o,SQUserPointer * typetag);
407 SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v);
410 SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
411 SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
414 SQUIRREL_API void *sq_malloc(SQUnsignedInteger size);
415 SQUIRREL_API void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize);
416 SQUIRREL_API void sq_free(void *p,SQUnsignedInteger size);
419 SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
420 SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v);
423 #define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC)
424 #define sq_istable(o) ((o)._type==OT_TABLE)
425 #define sq_isarray(o) ((o)._type==OT_ARRAY)
426 #define sq_isfunction(o) ((o)._type==OT_FUNCPROTO)
427 #define sq_isclosure(o) ((o)._type==OT_CLOSURE)
428 #define sq_isgenerator(o) ((o)._type==OT_GENERATOR)
429 #define sq_isnativeclosure(o) ((o)._type==OT_NATIVECLOSURE)
430 #define sq_isstring(o) ((o)._type==OT_STRING)
431 #define sq_isinteger(o) ((o)._type==OT_INTEGER)
432 #define sq_isfloat(o) ((o)._type==OT_FLOAT)
433 #define sq_isuserpointer(o) ((o)._type==OT_USERPOINTER)
434 #define sq_isuserdata(o) ((o)._type==OT_USERDATA)
435 #define sq_isthread(o) ((o)._type==OT_THREAD)
436 #define sq_isnull(o) ((o)._type==OT_NULL)
437 #define sq_isclass(o) ((o)._type==OT_CLASS)
438 #define sq_isinstance(o) ((o)._type==OT_INSTANCE)
439 #define sq_isbool(o) ((o)._type==OT_BOOL)
440 #define sq_isweakref(o) ((o)._type==OT_WEAKREF)
441 #define sq_type(o) ((o)._type)
444 #define sq_createslot(v,n) sq_newslot(v,n,SQFalse)
447 #define SQ_ERROR (-1)
449 #define SQ_FAILED(res) (res<0)
450 #define SQ_SUCCEEDED(res) (res>=0)
456 #endif /*_SQUIRREL_H_*/