Simplify include/squirrel.h (from ohnobinki; patch submitted upstream and untested...
[supertux.git] / external / squirrel / include / squirrel.h
1 /*
2 Copyright (c) 2003-2009 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 /* Get uintptr_t from a non standard or standard location */
43 #ifdef _MSC_VER
44 #include <stddef.h>
45
46 typedef __int32 SQInt32;
47 typedef __int64 SQInt64;
48 #else /* _MSC_VER */
49 #include <stdint.h>
50
51 typedef int32_t SQInt32;
52 typedef int64_t SQInt64;
53 #endif /* _MSC_VER */
54
55 typedef intptr_t SQInteger;
56 typedef uintptr_t SQUnsignedInteger;
57 typedef uintptr_t SQHash;
58
59 #ifdef SQUSEDOUBLE
60 typedef double SQFloat;
61 #else
62 typedef float SQFloat;
63 #endif
64
65 #if defined(SQUSEDOUBLE)
66 typedef SQInt64 SQRawObjectVal; /* must be 64 bits */
67 #define SQ_OBJECT_RAWINIT() { _unVal.raw = 0; }
68 #else
69 typedef SQUnsignedInteger SQRawObjectVal; //is 32 bits on 32 bits builds and 64 bits otherwise
70 #define SQ_OBJECT_RAWINIT()
71 #endif
72
73 typedef void* SQUserPointer;
74 typedef SQUnsignedInteger SQBool;
75 typedef SQInteger SQRESULT;
76
77 #define SQTrue  (1)
78 #define SQFalse (0)
79
80 struct SQVM;
81 struct SQTable;
82 struct SQArray;
83 struct SQString;
84 struct SQClosure;
85 struct SQGenerator;
86 struct SQNativeClosure;
87 struct SQUserData;
88 struct SQFunctionProto;
89 struct SQRefCounted;
90 struct SQClass;
91 struct SQInstance;
92 struct SQDelegable;
93
94 #ifdef _UNICODE
95 #define SQUNICODE
96 #endif
97
98 #ifdef SQUNICODE
99 #if (defined(_MSC_VER) && _MSC_VER >= 1400) // 1400 = VS8
100
101 #if defined(wchar_t) //this is if the compiler considers wchar_t as native type
102 #define wchar_t unsigned short
103 #endif
104
105 #else
106 typedef unsigned short wchar_t;
107 #endif
108
109 typedef wchar_t SQChar;
110 #define _SC(a) L##a
111 #define scstrcmp        wcscmp
112 #define scsprintf       swprintf
113 #define scstrlen        wcslen
114 #define scstrtod        wcstod
115 #define scstrtol        wcstol
116 #define scatoi          _wtoi
117 #define scstrtoul       wcstoul
118 #define scvsprintf      vswprintf
119 #define scstrstr        wcsstr
120 #define scisspace       iswspace
121 #define scisdigit       iswdigit
122 #define scisxdigit      iswxdigit
123 #define scisalpha       iswalpha
124 #define sciscntrl       iswcntrl
125 #define scisalnum       iswalnum
126 #define scprintf        wprintf
127 #define MAX_CHAR 0xFFFF
128 #else
129 typedef char SQChar;
130 #define _SC(a) a
131 #define scstrcmp        strcmp
132 #define scsprintf       sprintf
133 #define scstrlen        strlen
134 #define scstrtod        strtod
135 #define scstrtol        strtol
136 #define scatoi          atoi
137 #define scstrtoul       strtoul
138 #define scvsprintf      vsprintf
139 #define scstrstr        strstr
140 #define scisspace       isspace
141 #define scisdigit       isdigit
142 #define scisxdigit      isxdigit
143 #define sciscntrl       iscntrl
144 #define scisalpha       isalpha
145 #define scisalnum       isalnum
146 #define scprintf        printf
147 #define MAX_CHAR 0xFF
148 #endif
149
150 #define SQUIRREL_VERSION        _SC("Squirrel 2.2.4 stable")
151 #define SQUIRREL_COPYRIGHT      _SC("Copyright (C) 2003-2009 Alberto Demichelis")
152 #define SQUIRREL_AUTHOR         _SC("Alberto Demichelis")
153
154 #define SQ_VMSTATE_IDLE                 0
155 #define SQ_VMSTATE_RUNNING              1
156 #define SQ_VMSTATE_SUSPENDED    2
157
158 #define SQUIRREL_EOB 0
159 #define SQ_BYTECODE_STREAM_TAG  0xFAFA
160
161 #define SQOBJECT_REF_COUNTED    0x08000000
162 #define SQOBJECT_NUMERIC                0x04000000
163 #define SQOBJECT_DELEGABLE              0x02000000
164 #define SQOBJECT_CANBEFALSE             0x01000000
165
166 #define SQ_MATCHTYPEMASKSTRING (-99999)
167
168 #define _RT_MASK 0x00FFFFFF
169 #define _RAW_TYPE(type) (type&_RT_MASK)
170
171 #define _RT_NULL                        0x00000001
172 #define _RT_INTEGER                     0x00000002
173 #define _RT_FLOAT                       0x00000004
174 #define _RT_BOOL                        0x00000008
175 #define _RT_STRING                      0x00000010
176 #define _RT_TABLE                       0x00000020
177 #define _RT_ARRAY                       0x00000040
178 #define _RT_USERDATA            0x00000080
179 #define _RT_CLOSURE                     0x00000100
180 #define _RT_NATIVECLOSURE       0x00000200
181 #define _RT_GENERATOR           0x00000400
182 #define _RT_USERPOINTER         0x00000800
183 #define _RT_THREAD                      0x00001000
184 #define _RT_FUNCPROTO           0x00002000
185 #define _RT_CLASS                       0x00004000
186 #define _RT_INSTANCE            0x00008000
187 #define _RT_WEAKREF                     0x00010000
188
189 typedef enum tagSQObjectType{
190         OT_NULL =                       (_RT_NULL|SQOBJECT_CANBEFALSE),
191         OT_INTEGER =            (_RT_INTEGER|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
192         OT_FLOAT =                      (_RT_FLOAT|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
193         OT_BOOL =                       (_RT_BOOL|SQOBJECT_CANBEFALSE),
194         OT_STRING =                     (_RT_STRING|SQOBJECT_REF_COUNTED),
195         OT_TABLE =                      (_RT_TABLE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
196         OT_ARRAY =                      (_RT_ARRAY|SQOBJECT_REF_COUNTED),
197         OT_USERDATA =           (_RT_USERDATA|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
198         OT_CLOSURE =            (_RT_CLOSURE|SQOBJECT_REF_COUNTED),
199         OT_NATIVECLOSURE =      (_RT_NATIVECLOSURE|SQOBJECT_REF_COUNTED),
200         OT_GENERATOR =          (_RT_GENERATOR|SQOBJECT_REF_COUNTED),
201         OT_USERPOINTER =        _RT_USERPOINTER,
202         OT_THREAD =                     (_RT_THREAD|SQOBJECT_REF_COUNTED) ,
203         OT_FUNCPROTO =          (_RT_FUNCPROTO|SQOBJECT_REF_COUNTED), //internal usage only
204         OT_CLASS =                      (_RT_CLASS|SQOBJECT_REF_COUNTED),
205         OT_INSTANCE =           (_RT_INSTANCE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
206         OT_WEAKREF =            (_RT_WEAKREF|SQOBJECT_REF_COUNTED)
207 }SQObjectType;
208
209 #define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED)
210
211
212 typedef union tagSQObjectValue
213 {
214         struct SQTable *pTable;
215         struct SQArray *pArray;
216         struct SQClosure *pClosure;
217         struct SQGenerator *pGenerator;
218         struct SQNativeClosure *pNativeClosure;
219         struct SQString *pString;
220         struct SQUserData *pUserData;
221         SQInteger nInteger;
222         SQFloat fFloat;
223         SQUserPointer pUserPointer;
224         struct SQFunctionProto *pFunctionProto;
225         struct SQRefCounted *pRefCounted;
226         struct SQDelegable *pDelegable;
227         struct SQVM *pThread;
228         struct SQClass *pClass;
229         struct SQInstance *pInstance;
230         struct SQWeakRef *pWeakRef;
231         SQRawObjectVal raw;
232 }SQObjectValue;
233
234
235 typedef struct tagSQObject
236 {
237         SQObjectType _type;
238         SQObjectValue _unVal;
239 }SQObject;
240
241 typedef struct tagSQStackInfos{
242         const SQChar* funcname;
243         const SQChar* source;
244         SQInteger line;
245 }SQStackInfos;
246
247 typedef struct SQVM* HSQUIRRELVM;
248 typedef SQObject HSQOBJECT;
249 typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM);
250 typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size);
251 typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/);
252 typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...);
253
254 typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
255 typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
256
257 typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer);
258
259 typedef struct tagSQRegFunction{
260         const SQChar *name;
261         SQFUNCTION f;
262         SQInteger nparamscheck;
263         const SQChar *typemask;
264 }SQRegFunction;
265
266 typedef struct tagSQFunctionInfo {
267         SQUserPointer funcid;
268         const SQChar *name;
269         const SQChar *source;
270 }SQFunctionInfo;
271
272
273 /*vm*/
274 SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize);
275 SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
276 SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v);
277 SQUIRREL_API void sq_close(HSQUIRRELVM v);
278 SQUIRREL_API void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p);
279 SQUIRREL_API SQUserPointer sq_getforeignptr(HSQUIRRELVM v);
280 SQUIRREL_API void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc);
281 SQUIRREL_API SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v);
282 SQUIRREL_API SQRESULT sq_suspendvm(HSQUIRRELVM v);
283 SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror,SQBool throwerror);
284 SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v);
285
286 /*compiler*/
287 SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror);
288 SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror);
289 SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable);
290 SQUIRREL_API void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable);
291 SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f);
292
293 /*stack operations*/
294 SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx);
295 SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop);
296 SQUIRREL_API void sq_poptop(HSQUIRRELVM v);
297 SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx);
298 SQUIRREL_API SQInteger sq_gettop(HSQUIRRELVM v);
299 SQUIRREL_API void sq_settop(HSQUIRRELVM v,SQInteger newtop);
300 SQUIRREL_API void sq_reservestack(HSQUIRRELVM v,SQInteger nsize);
301 SQUIRREL_API SQInteger sq_cmp(HSQUIRRELVM v);
302 SQUIRREL_API void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx);
303
304 /*object creation handling*/
305 SQUIRREL_API SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size);
306 SQUIRREL_API void sq_newtable(HSQUIRRELVM v);
307 SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size);
308 SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars);
309 SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
310 SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx);
311 SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
312 SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
313 SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
314 SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b);
315 SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
316 SQUIRREL_API void sq_pushnull(HSQUIRRELVM v);
317 SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx);
318 SQUIRREL_API SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx);
319 SQUIRREL_API SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx);
320 SQUIRREL_API SQBool sq_instanceof(HSQUIRRELVM v);
321 SQUIRREL_API void sq_tostring(HSQUIRRELVM v,SQInteger idx);
322 SQUIRREL_API void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b);
323 SQUIRREL_API SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
324 SQUIRREL_API SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
325 SQUIRREL_API SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
326 SQUIRREL_API SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b);
327 SQUIRREL_API SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread);
328 SQUIRREL_API SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
329 SQUIRREL_API SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
330 SQUIRREL_API SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
331 SQUIRREL_API SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
332 SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
333 SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
334 SQUIRREL_API SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger idx,SQFunctionInfo *fi);
335 SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
336 SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
337 SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
338 SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
339 SQUIRREL_API SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize);
340 SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
341 SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
342 SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
343 SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);
344 SQUIRREL_API SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx);
345 SQUIRREL_API void sq_weakref(HSQUIRRELVM v,SQInteger idx);
346 SQUIRREL_API SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t);
347
348 /*object manipulation*/
349 SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v);
350 SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
351 SQUIRREL_API void sq_pushconsttable(HSQUIRRELVM v);
352 SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v);
353 SQUIRREL_API SQRESULT sq_setconsttable(HSQUIRRELVM v);
354 SQUIRREL_API SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic);
355 SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
356 SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx);
357 SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx);
358 SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
359 SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx);
360 SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
361 SQUIRREL_API SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx);
362 SQUIRREL_API SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval); 
363 SQUIRREL_API SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize); 
364 SQUIRREL_API SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx); 
365 SQUIRREL_API SQRESULT sq_arrayremove(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx);
366 SQUIRREL_API SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos);
367 SQUIRREL_API SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx);
368 SQUIRREL_API SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx);
369 SQUIRREL_API SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx);
370 SQUIRREL_API SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
371 SQUIRREL_API SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx);
372 SQUIRREL_API SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx);
373 SQUIRREL_API SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx);
374
375 /*calls*/
376 SQUIRREL_API SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror);
377 SQUIRREL_API SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror);
378 SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
379 SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
380 SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err);
381 SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
382 SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
383
384 /*raw object handling*/
385 SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);
386 SQUIRREL_API void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj);
387 SQUIRREL_API void sq_addref(HSQUIRRELVM v,HSQOBJECT *po);
388 SQUIRREL_API SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po);
389 SQUIRREL_API void sq_resetobject(HSQOBJECT *po);
390 SQUIRREL_API const SQChar *sq_objtostring(HSQOBJECT *o);
391 SQUIRREL_API SQBool sq_objtobool(HSQOBJECT *o);
392 SQUIRREL_API SQInteger sq_objtointeger(HSQOBJECT *o);
393 SQUIRREL_API SQFloat sq_objtofloat(HSQOBJECT *o);
394 SQUIRREL_API SQRESULT sq_getobjtypetag(HSQOBJECT *o,SQUserPointer * typetag);
395
396 /*GC*/
397 SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v);
398
399 /*serialization*/
400 SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
401 SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
402
403 /*mem allocation*/
404 SQUIRREL_API void *sq_malloc(SQUnsignedInteger size);
405 SQUIRREL_API void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize);
406 SQUIRREL_API void sq_free(void *p,SQUnsignedInteger size);
407
408 /*debug*/
409 SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
410 SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v);
411
412 /*UTILITY MACRO*/
413 #define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC)
414 #define sq_istable(o) ((o)._type==OT_TABLE)
415 #define sq_isarray(o) ((o)._type==OT_ARRAY)
416 #define sq_isfunction(o) ((o)._type==OT_FUNCPROTO)
417 #define sq_isclosure(o) ((o)._type==OT_CLOSURE)
418 #define sq_isgenerator(o) ((o)._type==OT_GENERATOR)
419 #define sq_isnativeclosure(o) ((o)._type==OT_NATIVECLOSURE)
420 #define sq_isstring(o) ((o)._type==OT_STRING)
421 #define sq_isinteger(o) ((o)._type==OT_INTEGER)
422 #define sq_isfloat(o) ((o)._type==OT_FLOAT)
423 #define sq_isuserpointer(o) ((o)._type==OT_USERPOINTER)
424 #define sq_isuserdata(o) ((o)._type==OT_USERDATA)
425 #define sq_isthread(o) ((o)._type==OT_THREAD)
426 #define sq_isnull(o) ((o)._type==OT_NULL)
427 #define sq_isclass(o) ((o)._type==OT_CLASS)
428 #define sq_isinstance(o) ((o)._type==OT_INSTANCE)
429 #define sq_isbool(o) ((o)._type==OT_BOOL)
430 #define sq_isweakref(o) ((o)._type==OT_WEAKREF)
431 #define sq_type(o) ((o)._type)
432
433 /* deprecated */
434 #define sq_createslot(v,n) sq_newslot(v,n,SQFalse)
435
436 #define SQ_OK (0)
437 #define SQ_ERROR (-1)
438
439 #define SQ_FAILED(res) (res<0)
440 #define SQ_SUCCEEDED(res) (res>=0)
441
442 #ifdef __cplusplus
443 } /*extern "C"*/
444 #endif
445
446 /*
447   define for code which depend on squirrel to
448   determine bitiness. IMO, this should be discouraged.
449   --ohnobinki
450 */
451 #if (defined(_WIN64) || defined(_LP64))
452 #define _SQ64
453 #endif
454
455 #endif /*_SQUIRREL_H_*/