7d2f9a053e5e6f04e30fd326966ffb498287c595
[supertux.git] / src / 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 #if (defined(_WIN64) || defined(_LP64))
43 #define _SQ64
44 #endif
45
46 #ifdef _SQ64
47 #ifdef _MSC_VER
48 typedef __int64 SQInteger;
49 typedef unsigned __int64 SQUnsignedInteger;
50 typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/
51 #else
52 typedef long SQInteger;
53 typedef unsigned long SQUnsignedInteger;
54 typedef unsigned long SQHash; /*should be the same size of a pointer*/
55 #endif
56 typedef int SQInt32; 
57 #else 
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*/
62 #endif
63
64
65 #ifdef SQUSEDOUBLE
66 typedef double SQFloat;
67 #else
68 typedef float SQFloat;
69 #endif
70
71 #if defined(SQUSEDOUBLE) && !defined(_SQ64)
72 #ifdef _MSC_VER
73 typedef __int64 SQRawObjectVal; //must be 64bits
74 #else
75 typedef long SQRawObjectVal; //must be 64bits
76 #endif
77 #define SQ_OBJECT_RAWINIT() { _unVal.raw = 0; }
78 #else
79 typedef SQUnsignedInteger SQRawObjectVal; //is 32 bits on 32 bits builds and 64 bits otherwise
80 #define SQ_OBJECT_RAWINIT()
81 #endif
82
83 typedef void* SQUserPointer;
84 typedef SQUnsignedInteger SQBool;
85 typedef SQInteger SQRESULT;
86
87 #define SQTrue  (1)
88 #define SQFalse (0)
89
90 struct SQVM;
91 struct SQTable;
92 struct SQArray;
93 struct SQString;
94 struct SQClosure;
95 struct SQGenerator;
96 struct SQNativeClosure;
97 struct SQUserData;
98 struct SQFunctionProto;
99 struct SQRefCounted;
100 struct SQClass;
101 struct SQInstance;
102 struct SQDelegable;
103
104 #ifdef _UNICODE
105 #define SQUNICODE
106 #endif
107
108 #ifdef SQUNICODE
109 #if (defined(_MSC_VER) && _MSC_VER >= 1400) // 1400 = VS8
110
111 #if defined(wchar_t) //this is if the compiler considers wchar_t as native type
112 #define wchar_t unsigned short
113 #endif
114
115 #else
116 typedef unsigned short wchar_t;
117 #endif
118
119 typedef wchar_t SQChar;
120 #define _SC(a) L##a
121 #define scstrcmp        wcscmp
122 #define scsprintf       swprintf
123 #define scstrlen        wcslen
124 #define scstrtod        wcstod
125 #define scstrtol        wcstol
126 #define scatoi          _wtoi
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
138 #else
139 typedef char SQChar;
140 #define _SC(a) a
141 #define scstrcmp        strcmp
142 #define scsprintf       sprintf
143 #define scstrlen        strlen
144 #define scstrtod        strtod
145 #define scstrtol        strtol
146 #define scatoi          atoi
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
158 #endif
159
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")
163
164 #define SQ_VMSTATE_IDLE                 0
165 #define SQ_VMSTATE_RUNNING              1
166 #define SQ_VMSTATE_SUSPENDED    2
167
168 #define SQUIRREL_EOB 0
169 #define SQ_BYTECODE_STREAM_TAG  0xFAFA
170
171 #define SQOBJECT_REF_COUNTED    0x08000000
172 #define SQOBJECT_NUMERIC                0x04000000
173 #define SQOBJECT_DELEGABLE              0x02000000
174 #define SQOBJECT_CANBEFALSE             0x01000000
175
176 #define SQ_MATCHTYPEMASKSTRING (-99999)
177
178 #define _RT_MASK 0x00FFFFFF
179 #define _RAW_TYPE(type) (type&_RT_MASK)
180
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
198
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)
217 }SQObjectType;
218
219 #define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED)
220
221
222 typedef union tagSQObjectValue
223 {
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;
231         SQInteger nInteger;
232         SQFloat fFloat;
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;
241         SQRawObjectVal raw;
242 }SQObjectValue;
243
244
245 typedef struct tagSQObject
246 {
247         SQObjectType _type;
248         SQObjectValue _unVal;
249 }SQObject;
250
251 typedef struct tagSQStackInfos{
252         const SQChar* funcname;
253         const SQChar* source;
254         SQInteger line;
255 }SQStackInfos;
256
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 * ,...);
263
264 typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
265 typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
266
267 typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer);
268
269 typedef struct tagSQRegFunction{
270         const SQChar *name;
271         SQFUNCTION f;
272         SQInteger nparamscheck;
273         const SQChar *typemask;
274 }SQRegFunction;
275
276 typedef struct tagSQFunctionInfo {
277         SQUserPointer funcid;
278         const SQChar *name;
279         const SQChar *source;
280 }SQFunctionInfo;
281
282
283 /*vm*/
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);
295
296 /*compiler*/
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);
302
303 /*stack operations*/
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);
313
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);
357
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);
384
385 /*calls*/
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);
393
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);
405
406 /*GC*/
407 SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v);
408
409 /*serialization*/
410 SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
411 SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
412
413 /*mem allocation*/
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);
417
418 /*debug*/
419 SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
420 SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v);
421
422 /*UTILITY MACRO*/
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)
442
443 /* deprecated */
444 #define sq_createslot(v,n) sq_newslot(v,n,SQFalse)
445
446 #define SQ_OK (0)
447 #define SQ_ERROR (-1)
448
449 #define SQ_FAILED(res) (res<0)
450 #define SQ_SUCCEEDED(res) (res>=0)
451
452 #ifdef __cplusplus
453 } /*extern "C"*/
454 #endif
455
456 #endif /*_SQUIRREL_H_*/