squirrel.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. /*
  2. Copyright (c) 2003-2017 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. #include <stdint.h>
  27. #ifndef SQUIRREL_API
  28. #define SQUIRREL_API extern //__attribute__ ((visibility ("default")))
  29. #endif
  30. #if (defined(_WIN64) || defined(_LP64))
  31. #if !(defined(_SQ64) || defined(_SQ32))
  32. #define _SQ64
  33. #endif
  34. #endif
  35. #define SQTrue (1)
  36. #define SQFalse (0)
  37. enum SQEnumArrayTypes {
  38. eat_SQArray = 1,
  39. eat_SQFloat64Array,
  40. eat_SQFloat32Array,
  41. eat_SQInt64Array,
  42. eat_SQInt32Array,
  43. eat_SQInt16Array,
  44. eat_SQInt8Array,
  45. };
  46. struct SQVM;
  47. struct SQTable;
  48. struct SQArrayBase;
  49. struct SQArray;
  50. struct SQFloat64Array;
  51. struct SQFloat32Array;
  52. struct SQInt64Array;
  53. struct SQInt32Array;
  54. struct SQInt16Array;
  55. struct SQInt8Array;
  56. struct SQString;
  57. struct SQClosure;
  58. struct SQGenerator;
  59. struct SQNativeClosure;
  60. struct SQUserData;
  61. struct SQFunctionProto;
  62. struct SQRefCounted;
  63. struct SQClass;
  64. struct SQInstance;
  65. struct SQDelegable;
  66. struct SQOuter;
  67. #if defined(_UNICODE) && !defined(ONLY_ASCII)
  68. #define SQUNICODE
  69. #endif
  70. #include "sqconfig.h"
  71. #define SQUIRREL_VERSION _SC("SquiLu based on Squirrel 3.1 stable and Lua 5.1.5")
  72. #define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2017 Alberto Demichelis, Domingo Alvarez Duarte")
  73. #define SQUIRREL_AUTHOR _SC("Alberto Demichelis, Domingo Alvarez Duarte")
  74. #define SQUIRREL_VERSION_NUMBER 310
  75. #define SQ_VMSTATE_IDLE 0
  76. #define SQ_VMSTATE_RUNNING 1
  77. #define SQ_VMSTATE_SUSPENDED 2
  78. #define SQUIRREL_EOB 0
  79. #define SQ_BYTECODE_STREAM_TAG 0xFAFA
  80. #define SQOBJECT_REF_COUNTED 0x08000000
  81. #define SQOBJECT_NUMERIC 0x04000000
  82. #define SQOBJECT_DELEGABLE 0x02000000
  83. #define SQOBJECT_CANBEFALSE 0x01000000
  84. #define SQ_MATCHTYPEMASKSTRING (-99999)
  85. #define _RT_MASK 0x00FFFFFF
  86. #define _RAW_TYPE(type) (type&_RT_MASK)
  87. #define _RT_NULL 0x00000001
  88. #define _RT_INTEGER 0x00000002
  89. #define _RT_FLOAT 0x00000004
  90. #define _RT_BOOL 0x00000008
  91. #define _RT_STRING 0x00000010
  92. #define _RT_TABLE 0x00000020
  93. #define _RT_ARRAY 0x00000040
  94. #define _RT_USERDATA 0x00000080
  95. #define _RT_CLOSURE 0x00000100
  96. #define _RT_NATIVECLOSURE 0x00000200
  97. #define _RT_GENERATOR 0x00000400
  98. #define _RT_USERPOINTER 0x00000800
  99. #define _RT_THREAD 0x00001000
  100. #define _RT_FUNCPROTO 0x00002000
  101. #define _RT_CLASS 0x00004000
  102. #define _RT_INSTANCE 0x00008000
  103. #define _RT_WEAKREF 0x00010000
  104. #define _RT_OUTER 0x00020000
  105. typedef enum tagSQObjectType{
  106. OT_NULL = (_RT_NULL|SQOBJECT_CANBEFALSE),
  107. OT_INTEGER = (_RT_INTEGER|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
  108. OT_FLOAT = (_RT_FLOAT|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE),
  109. OT_BOOL = (_RT_BOOL|SQOBJECT_CANBEFALSE),
  110. OT_STRING = (_RT_STRING|SQOBJECT_REF_COUNTED),
  111. OT_TABLE = (_RT_TABLE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
  112. OT_ARRAY = (_RT_ARRAY|SQOBJECT_REF_COUNTED),
  113. OT_USERDATA = (_RT_USERDATA|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
  114. OT_CLOSURE = (_RT_CLOSURE|SQOBJECT_REF_COUNTED),
  115. OT_NATIVECLOSURE = (_RT_NATIVECLOSURE|SQOBJECT_REF_COUNTED),
  116. OT_GENERATOR = (_RT_GENERATOR|SQOBJECT_REF_COUNTED),
  117. OT_USERPOINTER = _RT_USERPOINTER,
  118. OT_THREAD = (_RT_THREAD|SQOBJECT_REF_COUNTED) ,
  119. OT_FUNCPROTO = (_RT_FUNCPROTO|SQOBJECT_REF_COUNTED), //internal usage only
  120. OT_CLASS = (_RT_CLASS|SQOBJECT_REF_COUNTED),
  121. OT_INSTANCE = (_RT_INSTANCE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE),
  122. OT_WEAKREF = (_RT_WEAKREF|SQOBJECT_REF_COUNTED),
  123. OT_OUTER = (_RT_OUTER|SQOBJECT_REF_COUNTED) //internal usage only
  124. }SQObjectType;
  125. #define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED)
  126. typedef union tagSQObjectValue
  127. {
  128. struct SQTable *pTable;
  129. struct SQArrayBase *pArrayBase;
  130. struct SQArray *pArray;
  131. struct SQFloat64Array *pFloat64Array;
  132. struct SQFloat32Array *pFloat32Array;
  133. struct SQInt64Array *pInt64Array;
  134. struct SQInt32Array *pInt32Array;
  135. struct SQInt16Array *pInt16Array;
  136. struct SQInt8Array *pInt8Array;
  137. struct SQClosure *pClosure;
  138. struct SQOuter *pOuter;
  139. struct SQGenerator *pGenerator;
  140. struct SQNativeClosure *pNativeClosure;
  141. struct SQString *pString;
  142. struct SQUserData *pUserData;
  143. SQInteger nInteger;
  144. SQFloat fFloat;
  145. SQUserPointer pUserPointer;
  146. struct SQFunctionProto *pFunctionProto;
  147. struct SQRefCounted *pRefCounted;
  148. struct SQDelegable *pDelegable;
  149. struct SQVM *pThread;
  150. struct SQClass *pClass;
  151. struct SQInstance *pInstance;
  152. struct SQWeakRef *pWeakRef;
  153. SQRawObjectVal raw;
  154. }SQObjectValue;
  155. typedef struct tagSQObject
  156. {
  157. SQObjectType _type;
  158. SQObjectValue _unVal;
  159. }SQObject;
  160. typedef struct tagSQMemberHandle{
  161. SQBool _static;
  162. SQInteger _index;
  163. }SQMemberHandle;
  164. typedef struct tagSQStackInfos{
  165. const SQChar* funcname;
  166. const SQChar* source;
  167. SQInteger line;
  168. }SQStackInfos;
  169. typedef struct SQVM* HSQUIRRELVM;
  170. typedef SQObject HSQOBJECT;
  171. typedef SQMemberHandle HSQMEMBERHANDLE;
  172. typedef SQRESULT (*SQFUNCTION)(HSQUIRRELVM);
  173. #ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
  174. typedef SQRESULT (*SQRELEASEHOOK)(SQUserPointer ptr, SQInteger size, HSQUIRRELVM v);
  175. #else
  176. typedef SQRESULT (*SQRELEASEHOOK)(SQUserPointer ptr, SQInteger size, void *ep);
  177. #endif // SQ_WITH_DELAYED_RELEASE_HOOKS
  178. typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/);
  179. typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...) __attribute__ ((__format__ (__printf__, 2, 3)));
  180. typedef void (*SQDEBUGHOOK)(HSQUIRRELVM /*v*/, SQInteger /*type*/, const SQChar * /*sourcename*/, SQInteger /*line*/, const SQChar * /*funcname*/);
  181. typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger);
  182. typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger);
  183. typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer);
  184. typedef struct tagSQRegFunction{
  185. const SQChar *name;
  186. SQFUNCTION f;
  187. SQInteger nparamscheck;
  188. const SQChar *typemask;
  189. SQBool isStatic;
  190. }SQRegFunction;
  191. typedef struct tagSQFunctionInfo {
  192. SQUserPointer funcid;
  193. const SQChar *name;
  194. const SQChar *source;
  195. SQInteger line;
  196. }SQFunctionInfo;
  197. #if !defined(sq_assert)
  198. #define sq_assert(x) ((void)0)
  199. #endif
  200. #define SQ_EXTENSIONS_KEY _SC("sq__Extensions")
  201. typedef struct {
  202. const char* module_name;
  203. SQFUNCTION module_load_func;
  204. } sq_modules_preload_st;
  205. #define SQUIRREL_API_FUNC(fret, fname, fargs) SQUIRREL_API fret sq_##fname fargs;
  206. #include "sqapi.h"
  207. #undef SQUIRREL_API_FUNC
  208. /*UTILITY MACRO*/
  209. #define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC)
  210. #define sq_istable(o) ((o)._type==OT_TABLE)
  211. #define sq_isarray(o) ((o)._type==OT_ARRAY)
  212. #define sq_isfunction(o) ((o)._type==OT_FUNCPROTO)
  213. #define sq_isclosure(o) ((o)._type==OT_CLOSURE)
  214. #define sq_isgenerator(o) ((o)._type==OT_GENERATOR)
  215. #define sq_isnativeclosure(o) ((o)._type==OT_NATIVECLOSURE)
  216. #define sq_isstring(o) ((o)._type==OT_STRING)
  217. #define sq_isinteger(o) ((o)._type==OT_INTEGER)
  218. #define sq_isfloat(o) ((o)._type==OT_FLOAT)
  219. #define sq_isuserpointer(o) ((o)._type==OT_USERPOINTER)
  220. #define sq_isuserdata(o) ((o)._type==OT_USERDATA)
  221. #define sq_isthread(o) ((o)._type==OT_THREAD)
  222. #define sq_isnull(o) ((o)._type==OT_NULL)
  223. #define sq_isclass(o) ((o)._type==OT_CLASS)
  224. #define sq_isinstance(o) ((o)._type==OT_INSTANCE)
  225. #define sq_isbool(o) ((o)._type==OT_BOOL)
  226. #define sq_isweakref(o) ((o)._type==OT_WEAKREF)
  227. #define sq_type(o) ((o)._type)
  228. /* deprecated */
  229. #define sq_createslot(v,n) sq_newslot(v,n,SQFalse)
  230. #define SQ_OK (0)
  231. #define SQ_ERROR (-1)
  232. #define SQ_FAILED(res) (res<0)
  233. #define SQ_SUCCEEDED(res) (res>=0)
  234. #define SQ_RETURN_IF_ERROR(res) if(SQ_FAILED(res)) return res
  235. #ifdef __GNUC__
  236. # define SQ_UNUSED_ARG(x) x __attribute__((unused))
  237. #else
  238. # define SQ_UNUSED_ARG(x) x
  239. #endif
  240. /*DAD*/
  241. #define SQ_FUNC_VARS(v) \
  242. SQRESULT _rc_; SQInteger _top_=sq_gettop(v);
  243. #define SQ_FUNC_VARS_NO_TOP(v) \
  244. SQRESULT _rc_;
  245. #define KLASS_VAR(Klass, Var) Klass *Var
  246. #define SQ_GET_INSTANCE_VAR(v, idx, Klass, Var, Klass_tag) \
  247. KLASS_VAR(Klass, Var); \
  248. if((_rc_ = sq_getinstanceup(v,idx,(SQUserPointer*)&Var,(void*)Klass_tag)) < 0) return _rc_;
  249. #define SQ_GET_INSTANCE(v, idx, Klass, Klass_tag) SQ_GET_INSTANCE_VAR(v, idx, Klass, self, Klass_tag)
  250. #define SQ_GET_INSTANCE2(v, idx, Var, Klass, Klass_tag) SQ_GET_INSTANCE_VAR(v, idx, Klass, Var, Klass_tag)
  251. #define SQ_GET_STRING_NVD(v, idx, var)\
  252. if((_rc_ = sq_getstr_and_size(v,idx, &var, &var##_size)) < 0) return _rc_;
  253. #define SQ_GET_STRING(v, idx, var)\
  254. const SQChar *var;\
  255. SQInteger var##_size;\
  256. SQ_GET_STRING_NVD(v, idx, var)
  257. #define SQ_OPT_STRING_STRLEN() static inline size_t sq_opt_strlen(const SQChar *v) {return v ? scstrlen(v) : 0;}
  258. #define SQ_OPT_STRING_NVD(v, idx, var, dflt)\
  259. if(_top_ >= idx)\
  260. {if((_rc_ = sq_getstr_and_size(v,idx, &var, &var##_size)) < 0) return _rc_;}\
  261. else {var=dflt; var##_size = sq_opt_strlen(dflt);}
  262. #define SQ_OPT_STRING(v, idx, var, dflt)\
  263. const SQChar *var;\
  264. SQInteger var##_size;\
  265. SQ_OPT_STRING_NVD(v, idx, var, dflt)
  266. #define SQ_GET_BOOL_NVD(v, idx, var)\
  267. if((_rc_ = sq_getbool(v,idx, &var)) < 0) return _rc_;
  268. #define SQ_GET_BOOL(v, idx, var)\
  269. SQBool var;\
  270. SQ_GET_BOOL_NVD(v, idx, var)
  271. #define SQ_OPT_BOOL_NVD(v, idx, var, dflt)\
  272. if(_top_ >= idx)\
  273. {if((_rc_ = sq_getbool(v,idx, &var)) < 0) return _rc_;}\
  274. else {var=dflt;}
  275. #define SQ_OPT_BOOL(v, idx, var, dflt)\
  276. SQBool var;\
  277. SQ_OPT_BOOL_NVD(v, idx, var, dflt)
  278. #define SQ_GET_INTEGER_NVD(v, idx, var)\
  279. if((_rc_ = sq_getinteger(v,idx, &var)) < 0) return _rc_;
  280. #define SQ_GET_INTEGER(v, idx, var)\
  281. SQInteger var;\
  282. SQ_GET_INTEGER_NVD(v, idx, var)
  283. #define SQ_OPT_INTEGER_NVD(v, idx, var, dflt)\
  284. if(_top_ >= idx)\
  285. {if((_rc_ = sq_getinteger(v,idx, &var)) < 0) return _rc_;}\
  286. else {var=dflt;}
  287. #define SQ_OPT_INTEGER(v, idx, var, dflt)\
  288. SQInteger var;\
  289. SQ_OPT_INTEGER_NVD(v, idx, var, dflt)
  290. #define SQ_GET_FLOAT_NVD(v, idx, var)\
  291. if((_rc_ = sq_getfloat(v,idx, &var)) < 0) return _rc_;
  292. #define SQ_GET_FLOAT(v, idx, var)\
  293. SQFloat var;\
  294. SQ_GET_FLOAT_NVD(v, idx, var)
  295. #define SQ_OPT_FLOAT_NVD(v, idx, var, dflt)\
  296. if(_top_ >= idx)\
  297. {if((_rc_ = sq_getfloat(v,idx, &var)) < 0) return _rc_;}\
  298. else {var=dflt;}
  299. #define SQ_OPT_FLOAT(v, idx, var, dflt)\
  300. SQFloat var;\
  301. SQ_OPT_FLOAT_NVD(v, idx, var, dflt)
  302. #define sq_pushliteral(v, str) sq_pushstring(v, str, sizeof(str)-1)
  303. #define SQ_GET_USERPOINTER_NVD(v, idx, var)\
  304. if((_rc_ = sq_getuserpointer(v,idx, &var)) < 0) return _rc_;
  305. #define SQ_GET_USERPOINTER(v, idx, var)\
  306. SQUserPointer var;\
  307. SQ_GET_USERPOINTER_NVD(v, idx, var)
  308. #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);
  309. #define SQ_CHECK_ARRAY(v, idx) SQ_CHECK_TYPE(v, idx, ARRAY)
  310. #define SQ_CHECK_TABLE(v, idx) SQ_CHECK_TYPE(v, idx, TABLE)
  311. #define SIZEOF_SQCHAR_STRING(str) ((sizeof(str)/sizeof(SQChar))-1)
  312. struct SQStrBufState{
  313. const SQChar *buf;
  314. SQInteger ptr;
  315. SQInteger size;
  316. };
  317. SQInteger sq_strbuf_lexfeed(SQUserPointer file);
  318. SQRESULT sqext_register_SQLexer (HSQUIRRELVM v);
  319. #ifdef __cplusplus
  320. } /*extern "C"*/
  321. #endif
  322. #endif /*_SQUIRREL_H_*/