squirrel.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. /*
  2. Copyright (c) 2003-2012 Alberto Demichelis
  3. Forked by Domingo Alvarez Duarte
  4. Permission is hereby granted, free of charge, to any person obtaining a copy
  5. of this software and associated documentation files (the "Software"), to deal
  6. in the Software without restriction, including without limitation the rights
  7. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. copies of the Software, and to permit persons to whom the Software is
  9. furnished to do so, subject to the following conditions:
  10. The above copyright notice and this permission notice shall be included in
  11. all copies or substantial portions of the Software.
  12. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  13. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  14. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  15. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  16. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  17. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  18. THE SOFTWARE.
  19. */
  20. #ifndef _SQUIRREL_H_
  21. #define _SQUIRREL_H_
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif
  25. #include <stdarg.h>
  26. #ifndef SQUIRREL_API
  27. #define SQUIRREL_API extern
  28. #endif
  29. #if (defined(_WIN64) || defined(_LP64))
  30. #ifndef _SQ64
  31. #define _SQ64
  32. #endif
  33. #endif
  34. #ifdef _SQ64
  35. typedef short SQInt16;
  36. typedef unsigned short SQUnsignedInt16;
  37. #ifdef _MSC_VER
  38. typedef __int64 SQInteger;
  39. typedef unsigned __int64 SQUnsignedInteger;
  40. typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/
  41. #else
  42. typedef long long SQInteger;
  43. typedef unsigned long long SQUnsignedInteger;
  44. typedef unsigned long long SQHash; /*should be the same size of a pointer*/
  45. #endif
  46. typedef int SQInt32;
  47. typedef unsigned int SQUnsignedInteger32;
  48. #else
  49. typedef int SQInteger;
  50. typedef unsigned int SQUnsignedInteger;
  51. typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/
  52. typedef unsigned int SQUnsignedInteger32; /*must be 32 bits(also on 64bits processors)*/
  53. typedef short SQInt16;
  54. typedef unsigned short SQUnsignedInt16;
  55. typedef unsigned int /*ptrdiff_t*/ SQHash; /*should be the same size of a pointer*/
  56. #endif
  57. #ifdef SQUSEDECIMAL64
  58. typedef _Decimal64 SQFloat;
  59. #elif defined(SQUSEDOUBLE)
  60. typedef double SQFloat;
  61. #else
  62. typedef float SQFloat;
  63. #endif
  64. #if defined(SQUSEDOUBLE) && !defined(_SQ64) || !defined(SQUSEDOUBLE) && defined(_SQ64)
  65. #ifdef _MSC_VER
  66. typedef __int64 SQRawObjectVal; //must be 64bits
  67. #else
  68. typedef long long SQRawObjectVal; //must be 64bits
  69. #endif
  70. #define SQ_OBJECT_RAWINIT() { _unVal.raw = 0; }
  71. #else
  72. typedef SQUnsignedInteger SQRawObjectVal; //is 32 bits on 32 bits builds and 64 bits otherwise
  73. #define SQ_OBJECT_RAWINIT()
  74. #endif
  75. #ifndef SQ_ALIGNMENT // SQ_ALIGNMENT shall be less than or equal to SQ_MALLOC alignments, and its value shall be power of 2.
  76. #if defined(SQUSEDOUBLE) || defined(_SQ64)
  77. #define SQ_ALIGNMENT 8
  78. #else
  79. #define SQ_ALIGNMENT 4
  80. #endif
  81. #endif
  82. typedef void* SQUserPointer;
  83. typedef SQUnsignedInteger SQBool;
  84. typedef SQInteger SQRESULT;
  85. #define SQTrue (1)
  86. #define SQFalse (0)
  87. struct SQVM;
  88. struct SQTable;
  89. struct SQArray;
  90. struct SQString;
  91. struct SQClosure;
  92. struct SQGenerator;
  93. struct SQNativeClosure;
  94. struct SQUserData;
  95. struct SQFunctionProto;
  96. struct SQRefCounted;
  97. struct SQClass;
  98. struct SQInstance;
  99. struct SQDelegable;
  100. struct SQOuter;
  101. #if defined(_UNICODE) && !defined(ONLY_ASCII)
  102. #define SQUNICODE
  103. #endif
  104. #ifdef SQUNICODE
  105. #if (defined(_MSC_VER) && _MSC_VER >= 1400) // 1400 = VS8
  106. #if !defined(_NATIVE_WCHAR_T_DEFINED) //this is if the compiler considers wchar_t as native type
  107. #define wchar_t unsigned short
  108. #endif
  109. #else
  110. typedef unsigned short wchar_t;
  111. #endif
  112. typedef wchar_t SQChar;
  113. typedef wchar_t USQChar;
  114. #define uchar(c) ((unsigned short)(c))
  115. #define _SC(a) L##a
  116. #define scstrchr wcschr
  117. #ifdef _WIN32_WCE
  118. #define scsnprintf _snwprintf
  119. #define scvfprintf _vfwprintf
  120. #define scvsprintf _vswprintf
  121. #define scvsnprintf _vsnwprintf
  122. #else
  123. #define scsnprintf wsnprintf
  124. #define scvfprintf vfwprintf
  125. #define scvsprintf vswprintf
  126. #define scvsnprintf vswnprintf
  127. #endif
  128. #define scstrcmp wcscmp
  129. #define scsprintf swprintf
  130. #define scstrlen wcslen
  131. #define scstrtod wcstod
  132. #ifdef _SQ64
  133. #define scstrtol _wcstoi64
  134. #else
  135. #define scstrtol wcstol
  136. #endif
  137. //#define scatoi _wtoi
  138. #define scstrtoul wcstoul
  139. #define scstrstr wcsstr
  140. #define scstrpbrk wcspbrk
  141. #define scisspace iswspace
  142. #define scisdigit iswdigit
  143. #define scisxdigit iswxdigit
  144. #define scisalpha iswalpha
  145. #define sciscntrl iswcntrl
  146. #define scisalnum iswalnum
  147. #define scprintf wprintf
  148. #define MAX_CHAR 0xFFFF
  149. #define sq_rsl(l) ((l)<<WCHAR_SHIFT_MUL)
  150. #else
  151. typedef char SQChar;
  152. typedef unsigned char USQChar;
  153. #define uchar(c) ((unsigned char)(c))
  154. #define _SC(a) a
  155. #define scstrchr strchr
  156. #define scsnprintf snprintf
  157. #define scstrcmp strcmp
  158. #define scsprintf sprintf
  159. #define scstrlen strlen
  160. #define scstrtod strtod
  161. #ifdef _SQ64
  162. #ifdef _MSC_VER
  163. #define scstrtol _strtoi64
  164. #else
  165. #define scstrtol strtoll
  166. #endif
  167. #else
  168. #define scstrtol strtol
  169. #endif
  170. //#define scatoi atoi
  171. #define scstrtoul strtoul
  172. #define scfprintf fprintf
  173. #define scvfprintf vfprintf
  174. #define scvsprintf vsprintf
  175. #define scvsnprintf vsnprintf
  176. #define scstrstr strstr
  177. #define scstrpbrk strpbrk
  178. #define scstrtok strtok
  179. #define scisspace isspace
  180. #define scisdigit isdigit
  181. #define scisxdigit isxdigit
  182. #define sciscntrl iscntrl
  183. #define scisalpha isalpha
  184. #define scisalnum isalnum
  185. #define scprintf printf
  186. #define MAX_CHAR 0xFF
  187. #define sq_rsl(l) (l)
  188. #endif
  189. #ifdef _SQ64
  190. #define _PRINT_INT_PREC _SC("ll")
  191. #define _PRINT_INT_FMT _SC("%lld")
  192. #else
  193. #define _PRINT_INT_FMT _SC("%d")
  194. #endif
  195. #define SQUIRREL_VERSION _SC("SquiLu based on Squirrel 3.0.4 stable and Lua 5.1.5")
  196. #define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2012 Alberto Demichelis, Domingo Alvarez Duarte")
  197. #define SQUIRREL_AUTHOR _SC("Alberto Demichelis, Domingo Alvarez Duarte")
  198. #define SQUIRREL_VERSION_NUMBER 304
  199. #define SQ_VMSTATE_IDLE 0
  200. #define SQ_VMSTATE_RUNNING 1
  201. #define SQ_VMSTATE_SUSPENDED 2
  202. #define SQUIRREL_EOB 0
  203. #define SQ_BYTECODE_STREAM_TAG 0xFAFA
  204. #define SQOBJECT_REF_COUNTED 0x08000000
  205. #define SQOBJECT_NUMERIC 0x04000000
  206. #define SQOBJECT_DELEGABLE 0x02000000
  207. #define SQOBJECT_CANBEFALSE 0x01000000
  208. #define SQ_MATCHTYPEMASKSTRING (-99999)
  209. #define _RT_MASK 0x00FFFFFF
  210. #define _RAW_TYPE(type) (type&_RT_MASK)
  211. #define _RT_NULL 0x00000001
  212. #define _RT_INTEGER 0x00000002
  213. #define _RT_FLOAT 0x00000004
  214. #define _RT_BOOL 0x00000008
  215. #define _RT_STRING 0x00000010
  216. #define _RT_TABLE 0x00000020
  217. #define _RT_ARRAY 0x00000040
  218. #define _RT_USERDATA 0x00000080
  219. #define _RT_CLOSURE 0x00000100
  220. #define _RT_NATIVECLOSURE 0x00000200
  221. #define _RT_GENERATOR 0x00000400
  222. #define _RT_USERPOINTER 0x00000800
  223. #define _RT_THREAD 0x00001000
  224. #define _RT_FUNCPROTO 0x00002000
  225. #define _RT_CLASS 0x00004000
  226. #define _RT_INSTANCE 0x00008000
  227. #define _RT_WEAKREF 0x00010000
  228. #define _RT_OUTER 0x00020000
  229. typedef enum tagSQObjectType{
  230. OT_NULL = (_RT_NULL|SQOBJECT_CANBEFALSE),
  231. OT_INTEGER = (_RT_INTEGER|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
  232. OT_FLOAT = (_RT_FLOAT|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
  233. OT_BOOL = (_RT_BOOL|SQOBJECT_CANBEFALSE),
  234. OT_STRING = (_RT_STRING|SQOBJECT_REF_COUNTED),
  235. OT_TABLE = (_RT_TABLE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
  236. OT_ARRAY = (_RT_ARRAY|SQOBJECT_REF_COUNTED),
  237. OT_USERDATA = (_RT_USERDATA|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
  238. OT_CLOSURE = (_RT_CLOSURE|SQOBJECT_REF_COUNTED),
  239. OT_NATIVECLOSURE = (_RT_NATIVECLOSURE|SQOBJECT_REF_COUNTED),
  240. OT_GENERATOR = (_RT_GENERATOR|SQOBJECT_REF_COUNTED),
  241. OT_USERPOINTER = _RT_USERPOINTER,
  242. OT_THREAD = (_RT_THREAD|SQOBJECT_REF_COUNTED) ,
  243. OT_FUNCPROTO = (_RT_FUNCPROTO|SQOBJECT_REF_COUNTED), //internal usage only
  244. OT_CLASS = (_RT_CLASS|SQOBJECT_REF_COUNTED),
  245. OT_INSTANCE = (_RT_INSTANCE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
  246. OT_WEAKREF = (_RT_WEAKREF|SQOBJECT_REF_COUNTED),
  247. OT_OUTER = (_RT_OUTER|SQOBJECT_REF_COUNTED) //internal usage only
  248. }SQObjectType;
  249. #define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED)
  250. typedef union tagSQObjectValue
  251. {
  252. struct SQTable *pTable;
  253. struct SQArray *pArray;
  254. struct SQClosure *pClosure;
  255. struct SQOuter *pOuter;
  256. struct SQGenerator *pGenerator;
  257. struct SQNativeClosure *pNativeClosure;
  258. struct SQString *pString;
  259. struct SQUserData *pUserData;
  260. SQInteger nInteger;
  261. SQFloat fFloat;
  262. SQUserPointer pUserPointer;
  263. struct SQFunctionProto *pFunctionProto;
  264. struct SQRefCounted *pRefCounted;
  265. struct SQDelegable *pDelegable;
  266. struct SQVM *pThread;
  267. struct SQClass *pClass;
  268. struct SQInstance *pInstance;
  269. struct SQWeakRef *pWeakRef;
  270. SQRawObjectVal raw;
  271. }SQObjectValue;
  272. typedef struct tagSQObject
  273. {
  274. SQObjectType _type;
  275. SQObjectValue _unVal;
  276. }SQObject;
  277. typedef struct tagSQMemberHandle{
  278. SQBool _static;
  279. SQInteger _index;
  280. }SQMemberHandle;
  281. typedef struct tagSQStackInfos{
  282. const SQChar* funcname;
  283. const SQChar* source;
  284. SQInteger line;
  285. }SQStackInfos;
  286. typedef struct SQVM* HSQUIRRELVM;
  287. typedef SQObject HSQOBJECT;
  288. typedef SQMemberHandle HSQMEMBERHANDLE;
  289. typedef SQRESULT (*SQFUNCTION)(HSQUIRRELVM);
  290. typedef SQRESULT (*SQRELEASEHOOK)(SQUserPointer ptr, SQInteger size, HSQUIRRELVM v);
  291. typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/);
  292. typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...);
  293. typedef void (*SQDEBUGHOOK)(HSQUIRRELVM /*v*/, SQInteger /*type*/, const SQChar * /*sourcename*/, SQInteger /*line*/, const SQChar * /*funcname*/);
  294. typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
  295. typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
  296. typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer);
  297. typedef struct tagSQRegFunction{
  298. const SQChar *name;
  299. SQFUNCTION f;
  300. SQInteger nparamscheck;
  301. const SQChar *typemask;
  302. SQBool isStatic;
  303. }SQRegFunction;
  304. typedef struct tagSQFunctionInfo {
  305. SQUserPointer funcid;
  306. const SQChar *name;
  307. const SQChar *source;
  308. SQInteger line;
  309. }SQFunctionInfo;
  310. #if !defined(sq_assert)
  311. #define sq_assert(x) ((void)0)
  312. #endif
  313. /*vm*/
  314. SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize);
  315. SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
  316. SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v);
  317. SQUIRREL_API SQRESULT sq_geterrorhandler(HSQUIRRELVM v);
  318. SQUIRREL_API void sq_setatexithandler(HSQUIRRELVM v);
  319. SQUIRREL_API SQRESULT sq_getatexithandler(HSQUIRRELVM v);
  320. SQUIRREL_API void sq_close(HSQUIRRELVM v);
  321. SQUIRREL_API void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p);
  322. SQUIRREL_API SQUserPointer sq_getforeignptr(HSQUIRRELVM v);
  323. SQUIRREL_API void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc,SQPRINTFUNCTION errfunc);
  324. SQUIRREL_API SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v);
  325. SQUIRREL_API SQPRINTFUNCTION sq_geterrorfunc(HSQUIRRELVM v);
  326. SQUIRREL_API SQRESULT sq_suspendvm(HSQUIRRELVM v);
  327. SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror,SQBool throwerror);
  328. SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v);
  329. SQUIRREL_API SQInteger sq_getversion();
  330. /*compiler*/
  331. SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,
  332. SQBool raiseerror, SQBool show_warnings);
  333. SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,
  334. SQBool raiseerror, SQBool show_warnings);
  335. SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable);
  336. SQUIRREL_API void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable);
  337. SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f);
  338. /*stack operations*/
  339. SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx);
  340. SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop);
  341. SQUIRREL_API void sq_poptop(HSQUIRRELVM v);
  342. SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx);
  343. SQUIRREL_API void sq_insert(HSQUIRRELVM v,SQInteger idx);
  344. SQUIRREL_API void sq_replace(HSQUIRRELVM v,SQInteger idx);
  345. SQUIRREL_API SQInteger sq_gettop(HSQUIRRELVM v);
  346. SQUIRREL_API void sq_settop(HSQUIRRELVM v,SQInteger newtop);
  347. SQUIRREL_API SQRESULT sq_reservestack(HSQUIRRELVM v,SQInteger nsize);
  348. SQUIRREL_API SQInteger sq_compare(HSQUIRRELVM v, SQInteger idx1, SQInteger idx2);
  349. SQUIRREL_API SQInteger sq_cmp(HSQUIRRELVM v);
  350. SQUIRREL_API void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx);
  351. /*object creation handling*/
  352. SQUIRREL_API SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size);
  353. SQUIRREL_API void sq_newtable(HSQUIRRELVM v);
  354. SQUIRREL_API void sq_newtableex(HSQUIRRELVM v,SQInteger initialcapacity);
  355. SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size);
  356. SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars);
  357. SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
  358. SQUIRREL_API SQRESULT sq_setfenv(HSQUIRRELVM v,SQInteger idx, SQBool cloning);
  359. SQUIRREL_API SQRESULT sq_getfenv(HSQUIRRELVM v,SQInteger idx, SQBool roottable_when_null);
  360. SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx);
  361. SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
  362. SQUIRREL_API void sq_pushfstring(HSQUIRRELVM v,const SQChar *fmt, ...);
  363. SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
  364. SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
  365. SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b);
  366. SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
  367. SQUIRREL_API void sq_pushnull(HSQUIRRELVM v);
  368. SQUIRREL_API SQRESULT sq_checkoption (HSQUIRRELVM v, SQInteger narg, const SQChar *def,
  369. const SQChar *const lst[]);
  370. SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx);
  371. SQUIRREL_API const SQChar *sq_gettypename(HSQUIRRELVM v,SQInteger idx);
  372. SQUIRREL_API SQRESULT sq_typeof(HSQUIRRELVM v,SQInteger idx);
  373. SQUIRREL_API SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx);
  374. SQUIRREL_API SQHash sq_gethash(HSQUIRRELVM v, SQInteger idx);
  375. SQUIRREL_API SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx);
  376. SQUIRREL_API SQBool sq_instanceof(HSQUIRRELVM v);
  377. SQUIRREL_API SQRESULT sq_tostring(HSQUIRRELVM v,SQInteger idx);
  378. SQUIRREL_API SQRESULT sq_tobool(HSQUIRRELVM v, SQInteger idx);
  379. SQUIRREL_API SQRESULT sq_tointeger(HSQUIRRELVM v, SQInteger idx);
  380. SQUIRREL_API SQRESULT sq_tofloat(HSQUIRRELVM v, SQInteger idx);
  381. SQUIRREL_API SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
  382. SQUIRREL_API SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
  383. SQUIRREL_API SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
  384. SQUIRREL_API SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b);
  385. SQUIRREL_API SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread);
  386. SQUIRREL_API SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
  387. SQUIRREL_API SQUserPointer sq_get_as_userpointer(HSQUIRRELVM v,SQInteger idx);
  388. SQUIRREL_API SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
  389. SQUIRREL_API SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
  390. SQUIRREL_API SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
  391. SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
  392. SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize);
  393. SQUIRREL_API SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi);
  394. SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
  395. SQUIRREL_API SQRESULT sq_getclosurename(HSQUIRRELVM v,SQInteger idx);
  396. SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
  397. SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
  398. SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
  399. SQUIRREL_API SQRESULT sq_setclassudsize(HSQUIRRELVM v, SQInteger idx, SQInteger udsize);
  400. SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase);
  401. SQUIRREL_API SQRESULT sq_pushnewclass(HSQUIRRELVM v, const SQChar *className,
  402. const SQChar *parentName,
  403. void *classTag, SQRegFunction *methods, SQBool leaveOnTop);
  404. SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx);
  405. SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx);
  406. SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx);
  407. SQUIRREL_API SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx);
  408. SQUIRREL_API void sq_weakref(HSQUIRRELVM v,SQInteger idx);
  409. SQUIRREL_API SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t);
  410. SQUIRREL_API SQRESULT sq_getmemberhandle(HSQUIRRELVM v,SQInteger idx,HSQMEMBERHANDLE *handle);
  411. SQUIRREL_API SQRESULT sq_getbyhandle(HSQUIRRELVM v,SQInteger idx,const HSQMEMBERHANDLE *handle);
  412. SQUIRREL_API SQRESULT sq_setbyhandle(HSQUIRRELVM v,SQInteger idx,const HSQMEMBERHANDLE *handle);
  413. SQUIRREL_API void sq_insertfunc(HSQUIRRELVM sqvm, const SQChar *fname, SQFUNCTION func,
  414. SQInteger nparamscheck, const SQChar *typemask, SQBool isStatic);
  415. SQUIRREL_API void sq_insert_reg_funcs(HSQUIRRELVM sqvm, SQRegFunction *obj_funcs);
  416. SQUIRREL_API const SQChar *sq_optstring(HSQUIRRELVM sqvm, SQInteger idx, const SQChar *dflt, SQInteger *size);
  417. SQUIRREL_API SQRESULT sq_optinteger(HSQUIRRELVM sqvm, SQInteger idx, SQInteger *value, SQInteger default_value);
  418. /*object manipulation*/
  419. SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v);
  420. SQUIRREL_API SQRESULT sq_getonroottable(HSQUIRRELVM v);
  421. SQUIRREL_API SQRESULT sq_setonroottable(HSQUIRRELVM v);
  422. SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v);
  423. SQUIRREL_API SQRESULT sq_getonregistrytable(HSQUIRRELVM v);
  424. SQUIRREL_API SQRESULT sq_setonregistrytable(HSQUIRRELVM v);
  425. #define SQ_EXTENSIONS_KEY _SC("sq__Extensions")
  426. typedef struct {
  427. const char* module_name;
  428. SQFUNCTION module_load_func;
  429. } sq_modules_preload_st;
  430. int sq_preload_modules(HSQUIRRELVM v, sq_modules_preload_st *modules);
  431. SQUIRREL_API void sq_pushconsttable(HSQUIRRELVM v);
  432. SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v);
  433. SQUIRREL_API SQRESULT sq_setconsttable(HSQUIRRELVM v);
  434. SQUIRREL_API SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic);
  435. SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
  436. SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx);
  437. SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx);
  438. SQUIRREL_API SQRESULT sq_getbyname(HSQUIRRELVM v,SQInteger idx, const SQChar *key, SQInteger key_len);
  439. SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx);
  440. SQUIRREL_API SQBool sq_rawexists(HSQUIRRELVM v,SQInteger idx);
  441. SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx);
  442. SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
  443. SQUIRREL_API SQRESULT sq_newmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic);
  444. SQUIRREL_API SQRESULT sq_rawnewmember(HSQUIRRELVM v,SQInteger idx,SQBool bstatic);
  445. SQUIRREL_API SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx);
  446. SQUIRREL_API SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
  447. SQUIRREL_API SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize);
  448. SQUIRREL_API SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx);
  449. SQUIRREL_API SQRESULT sq_arrayremove(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx);
  450. SQUIRREL_API SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos);
  451. SQUIRREL_API SQRESULT sq_arrayget(HSQUIRRELVM v,SQInteger idx,SQInteger pos);
  452. SQUIRREL_API SQRESULT sq_arrayset(HSQUIRRELVM v,SQInteger idx,SQInteger destpos);
  453. SQUIRREL_API SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx);
  454. SQUIRREL_API SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx);
  455. SQUIRREL_API SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx);
  456. SQUIRREL_API SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
  457. SQUIRREL_API SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx);
  458. SQUIRREL_API SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx);
  459. SQUIRREL_API SQRESULT sq_clear(HSQUIRRELVM v,SQInteger idx);
  460. /*calls*/
  461. SQUIRREL_API SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror);
  462. SQUIRREL_API SQRESULT sq_call_va_vl(HSQUIRRELVM v, SQBool reset_stack, SQInteger idx, const SQChar *func,
  463. SQInteger idx_this, const SQChar *sig, va_list vl);
  464. SQUIRREL_API SQRESULT sq_call_va(HSQUIRRELVM v, SQBool reset_stack, SQInteger idx, const SQChar *func,
  465. SQInteger idx_this, const SQChar *sig, ...);
  466. SQUIRREL_API SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror);
  467. SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
  468. SQUIRREL_API SQRESULT sq_getcallee(HSQUIRRELVM v);
  469. SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
  470. SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *fmt, ...);
  471. SQUIRREL_API SQRESULT sq_throwobject(HSQUIRRELVM v);
  472. SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
  473. SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
  474. SQUIRREL_API const SQChar *sq_getlasterror_str(HSQUIRRELVM v);
  475. SQUIRREL_API void sq_getlasterror_line_col(HSQUIRRELVM v, SQInteger *line, SQInteger *column);
  476. /*raw object handling*/
  477. SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);
  478. SQUIRREL_API void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj);
  479. SQUIRREL_API void sq_addref(HSQUIRRELVM v,HSQOBJECT *po);
  480. SQUIRREL_API SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po);
  481. SQUIRREL_API SQUnsignedInteger sq_getrefcount(HSQUIRRELVM v,HSQOBJECT *po);
  482. SQUIRREL_API void sq_resetobject(HSQOBJECT *po);
  483. SQUIRREL_API const SQChar *sq_objtostring(const HSQOBJECT *o);
  484. SQUIRREL_API SQBool sq_objtobool(const HSQOBJECT *o);
  485. SQUIRREL_API SQInteger sq_objtointeger(const HSQOBJECT *o);
  486. SQUIRREL_API SQFloat sq_objtofloat(const HSQOBJECT *o);
  487. SQUIRREL_API SQUserPointer sq_objtouserpointer(const HSQOBJECT *o);
  488. SQUIRREL_API SQRESULT sq_getobjtypetag(const HSQOBJECT *o,SQUserPointer * typetag);
  489. /*GC*/
  490. SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v);
  491. SQUIRREL_API SQRESULT sq_resurrectunreachable(HSQUIRRELVM v);
  492. /*serialization*/
  493. SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
  494. SQUIRREL_API SQRESULT sq_writeclosure_as_source(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
  495. SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
  496. /*mem allocation*/
  497. SQUIRREL_API void *sq_malloc(SQUnsignedInteger size);
  498. SQUIRREL_API void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize);
  499. SQUIRREL_API void sq_free(void *p,SQUnsignedInteger size);
  500. /*debug*/
  501. SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
  502. SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v);
  503. SQUIRREL_API void sq_setnativedebughook(HSQUIRRELVM v,SQDEBUGHOOK hook);
  504. SQUIRREL_API SQInteger sq_getfulltop(HSQUIRRELVM v);
  505. SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
  506. SQUIRREL_API void sq_getlaststackinfo(HSQUIRRELVM v);
  507. /*UTILITY MACRO*/
  508. #define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC)
  509. #define sq_istable(o) ((o)._type==OT_TABLE)
  510. #define sq_isarray(o) ((o)._type==OT_ARRAY)
  511. #define sq_isfunction(o) ((o)._type==OT_FUNCPROTO)
  512. #define sq_isclosure(o) ((o)._type==OT_CLOSURE)
  513. #define sq_isgenerator(o) ((o)._type==OT_GENERATOR)
  514. #define sq_isnativeclosure(o) ((o)._type==OT_NATIVECLOSURE)
  515. #define sq_isstring(o) ((o)._type==OT_STRING)
  516. #define sq_isinteger(o) ((o)._type==OT_INTEGER)
  517. #define sq_isfloat(o) ((o)._type==OT_FLOAT)
  518. #define sq_isuserpointer(o) ((o)._type==OT_USERPOINTER)
  519. #define sq_isuserdata(o) ((o)._type==OT_USERDATA)
  520. #define sq_isthread(o) ((o)._type==OT_THREAD)
  521. #define sq_isnull(o) ((o)._type==OT_NULL)
  522. #define sq_isclass(o) ((o)._type==OT_CLASS)
  523. #define sq_isinstance(o) ((o)._type==OT_INSTANCE)
  524. #define sq_isbool(o) ((o)._type==OT_BOOL)
  525. #define sq_isweakref(o) ((o)._type==OT_WEAKREF)
  526. #define sq_type(o) ((o)._type)
  527. /* deprecated */
  528. #define sq_createslot(v,n) sq_newslot(v,n,SQFalse)
  529. #define SQ_OK (0)
  530. #define SQ_ERROR (-1)
  531. #define SQ_FAILED(res) (res<0)
  532. #define SQ_SUCCEEDED(res) (res>=0)
  533. #define SQ_RETURN_IF_ERROR(res) if(SQ_FAILED(res)) return res
  534. /*DAD*/
  535. #define SQ_FUNC_VARS(v) \
  536. SQRESULT _rc_; SQInteger _top_=sq_gettop(v);
  537. #define SQ_FUNC_VARS_NO_TOP(v) \
  538. SQRESULT _rc_;
  539. #define SQ_GET_INSTANCE_VAR(v, idx, Klass, Var, Klass_tag) \
  540. Klass *Var; \
  541. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)&Var,(void*)Klass_tag)) < 0) return _rc_;
  542. #define SQ_GET_INSTANCE(v, idx, Klass, Klass_tag) SQ_GET_INSTANCE_VAR(v, idx, Klass, self, Klass_tag)
  543. #define SQ_GET_STRING(v, idx, var)\
  544. const SQChar *var;\
  545. SQInteger var##_size;\
  546. if((_rc_ = sq_getstr_and_size(v,idx, &var, &var##_size)) < 0) return _rc_;
  547. #define SQ_OPT_STRING_STRLEN() static inline size_t sq_opt_strlen(const SQChar *v) {return v ? scstrlen(v) : 0;}
  548. #define SQ_OPT_STRING(v, idx, var, dflt)\
  549. const SQChar *var;\
  550. SQInteger var##_size;\
  551. if(_top_ >= idx)\
  552. {if((_rc_ = sq_getstr_and_size(v,idx, &var, &var##_size)) < 0) return _rc_;}\
  553. else {var=dflt; var##_size = sq_opt_strlen(dflt);}
  554. #define SQ_GET_BOOL(v, idx, var)\
  555. SQBool var;\
  556. if((_rc_ = sq_getbool(v,idx, &var)) < 0) return _rc_;
  557. #define SQ_OPT_BOOL(v, idx, var, dflt)\
  558. SQBool var;\
  559. if(_top_ >= idx)\
  560. {if((_rc_ = sq_getbool(v,idx, &var)) < 0) return _rc_;}\
  561. else {var=dflt;}
  562. #define SQ_GET_INTEGER(v, idx, var)\
  563. SQInteger var;\
  564. if((_rc_ = sq_getinteger(v,idx, &var)) < 0) return _rc_;
  565. #define SQ_OPT_INTEGER(v, idx, var, dflt)\
  566. SQInteger var;\
  567. if(_top_ >= idx)\
  568. {if((_rc_ = sq_getinteger(v,idx, &var)) < 0) return _rc_;}\
  569. else {var=dflt;}
  570. #define SQ_GET_FLOAT(v, idx, var)\
  571. SQFloat var;\
  572. if((_rc_ = sq_getfloat(v,idx, &var)) < 0) return _rc_;
  573. #define SQ_OPT_FLOAT(v, idx, var, dflt)\
  574. SQFloat var;\
  575. if(_top_ >= idx)\
  576. {if((_rc_ = sq_getfloat(v,idx, &var)) < 0) return _rc_;}\
  577. else {var=dflt;}
  578. #define sq_pushliteral(v, str) sq_pushstring(v, str, sizeof(str)-1)
  579. #define SQ_GET_USERPOINTER(v, idx, var)\
  580. SQUserPointer var;\
  581. if((_rc_ = sq_getuserpointer(v,idx, &var)) < 0) return _rc_;
  582. #define SQ_CHECK_TYPE(v, idx, tp) if(sq_gettype(v, idx) != OT_##tp) return sq_throwerror(v, _SC( #tp " expected for parameter (%d)"), idx-1);
  583. #define SQ_CHECK_ARRAY(v, idx) SQ_CHECK_TYPE(v, idx, ARRAY)
  584. #define SQ_CHECK_TABLE(v, idx) SQ_CHECK_TYPE(v, idx, TABLE)
  585. #define SIZEOF_SQCHAR_STRING(str) ((sizeof(str)/sizeof(SQChar))-1)
  586. SQUIRREL_API void sq_insert_reg_funcs(HSQUIRRELVM sqvm, SQRegFunction *obj_funcs);
  587. SQUIRREL_API SQRESULT sq_getstr_and_size(HSQUIRRELVM v,SQInteger idx,const SQChar **c, SQInteger *size);
  588. #ifdef __cplusplus
  589. } /*extern "C"*/
  590. #endif
  591. #endif /*_SQUIRREL_H_*/