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