sq.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  1. /* see copyright notice in squirrel.h */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdarg.h>
  6. #if defined(_MSC_VER) && defined(_DEBUG)
  7. #include <crtdbg.h>
  8. #include <conio.h>
  9. #endif
  10. #include <squirrel.h>
  11. #include <sqstdblob.h>
  12. #include <sqstdsystem.h>
  13. #include <sqstdio.h>
  14. #include <sqstdmath.h>
  15. #include <sqstdstring.h>
  16. #include <sqstdaux.h>
  17. #define MAXINPUT 1024
  18. int sq_main_argc = 0;
  19. char** sq_main_argv = 0;
  20. void PrintVersionInfos(void);
  21. #if defined(_MSC_VER) && defined(_DEBUG)
  22. int MemAllocHook( int allocType, void *userData, size_t size, int blockType,
  23. long requestNumber, const unsigned char *filename, int lineNumber)
  24. {
  25. //if(requestNumber==769)_asm int 3;
  26. return 1;
  27. }
  28. #endif
  29. static SQInteger quit(HSQUIRRELVM v)
  30. {
  31. int *done;
  32. sq_getuserpointer(v,-1,(SQUserPointer*)&done);
  33. *done=1;
  34. return 0;
  35. }
  36. //static void printfunc(HSQUIRRELVM v,const SQChar *s,...) __attribute__ ((__format__ (__printf__, 2, 3)));
  37. static void printfunc(HSQUIRRELVM v,const SQChar *s,...)
  38. {
  39. va_list vl;
  40. va_start(vl, s);
  41. scvprintf(stdout, s, vl);
  42. va_end(vl);
  43. (void)v; /* UNUSED */
  44. }
  45. //static void errorfunc(HSQUIRRELVM v,const SQChar *s,...) __attribute__ ((__format__ (__printf__, 2, 3)));
  46. static void errorfunc(HSQUIRRELVM v,const SQChar *s,...)
  47. {
  48. va_list vl;
  49. va_start(vl, s);
  50. fflush(stdout);
  51. scvprintf(stderr, s, vl);
  52. va_end(vl);
  53. (void)v; /* UNUSED */
  54. }
  55. void PrintVersionInfos()
  56. {
  57. scfprintf(stdout,_SC("%s %s (%d bits)\n"),SQUIRREL_VERSION,SQUIRREL_COPYRIGHT,((int)(sizeof(SQInteger)*8)));
  58. }
  59. static SQInteger push_program_args(HSQUIRRELVM v,SQInteger arg, SQInteger argc, char* argv[], int asArray){
  60. SQInteger i, callargs = 0;
  61. if(asArray)
  62. {
  63. sq_newarray(v, 0);
  64. }
  65. for(i=arg;i<argc;i++)
  66. {
  67. const SQChar *a;
  68. #ifdef SQUNICODE
  69. int alen=(int)strlen(argv[i]);
  70. a=sq_getscratchpad(v,(int)(alen*sizeof(SQChar)));
  71. mbstowcs(sq_getscratchpad(v,-1),argv[i],alen);
  72. sq_getscratchpad(v,-1)[alen] = _SC('\0');
  73. #else
  74. a=argv[i];
  75. #endif
  76. sq_pushstring(v,a,-1);
  77. if(asArray) sq_arrayappend(v, -2);
  78. callargs++;
  79. //sq_arrayappend(v,-2);
  80. }
  81. return callargs;
  82. }
  83. static void PrintUsage()
  84. {
  85. scfprintf(stderr,_SC("usage: sq <options> <scriptpath [args]>.\n")
  86. _SC("Available options are:\n")
  87. _SC(" -s compiles the file to bytecode(default output 'out.cnut')\n")
  88. _SC(" -o specifies output file for the -c option\n")
  89. _SC(" -c compiles only\n")
  90. _SC(" -d generates debug infos\n")
  91. _SC(" -v displays version infos\n")
  92. _SC(" -p preload given script file\n")
  93. _SC(" -i set the include_path\n")
  94. _SC(" -D define a preprocesor named constant\n")
  95. _SC(" -h prints help\n"));
  96. }
  97. static void loadDefaultScript(HSQUIRRELVM v, const char *script)
  98. {
  99. FILE *fb = scfopen(script, "rb");
  100. if (!fb) return;
  101. fclose(fb);
  102. SQChar srcBoot[256];
  103. scsprintf(srcBoot, sizeof(srcBoot), _SC("dofile(\"%s\", false);"), script);
  104. if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, strlen(srcBoot), _SC("defaultScript"), SQTrue, SQTrue,
  105. SQ_MAX_INCLUDE_FILES))) {
  106. int callargs = 1;
  107. sq_pushroottable(v);
  108. callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);
  109. sq_call(v, callargs,SQFalse, SQTrue);
  110. }
  111. }
  112. #define _INTERACTIVE 0
  113. #define _DONE 2
  114. #define _ERROR 3
  115. //<<FIXME>> this func is a mess
  116. static int getargs(HSQUIRRELVM v,int argc, char* argv[],SQInteger *retval)
  117. {
  118. int compiles_only = 0;
  119. int compiles_as_source_only = 0;
  120. #ifdef SQUNICODE
  121. static SQChar temp[500];
  122. #endif
  123. const char * output = NULL;
  124. const char * preload = NULL;
  125. *retval = 0;
  126. if(argc>1)
  127. {
  128. int arg=1,exitloop=0;
  129. while(arg < argc && !exitloop)
  130. {
  131. if(argv[arg][0]=='-')
  132. {
  133. switch(argv[arg][1])
  134. {
  135. case 'd': //DEBUG(debug infos)
  136. sq_enabledebuginfo(v,1);
  137. break;
  138. case 'c':
  139. compiles_only = 1;
  140. break;
  141. case 's':
  142. compiles_as_source_only = 1;
  143. break;
  144. case 'o':
  145. if(arg < argc) {
  146. arg++;
  147. output = argv[arg];
  148. }
  149. break;
  150. case 'p':
  151. if(arg < argc) {
  152. arg++;
  153. preload = argv[arg];
  154. }
  155. break;
  156. case 'i':
  157. if(arg < argc) {
  158. arg++;
  159. sq_set_include_path(v, argv[arg]);
  160. }
  161. break;
  162. case 'D':
  163. if(arg < argc) {
  164. if(argv[arg][2])
  165. {
  166. //printf("-D=%s\n", argv[arg]+2);
  167. sq_set_define_name(v, argv[arg]+2);
  168. }
  169. else //argument separated by spaces
  170. {
  171. arg++;
  172. sq_set_define_name(v, argv[arg]);
  173. }
  174. }
  175. break;
  176. case 'v':
  177. PrintVersionInfos();
  178. return _DONE;
  179. case 'h':
  180. PrintVersionInfos();
  181. PrintUsage();
  182. return _DONE;
  183. default:
  184. PrintVersionInfos();
  185. scprintf(_SC("unknown prameter '-%c'\n"),argv[arg][1]);
  186. PrintUsage();
  187. *retval = -1;
  188. return _ERROR;
  189. }
  190. }else break;
  191. arg++;
  192. }
  193. if(preload) loadDefaultScript(v, preload);
  194. // src file
  195. if(arg<argc) {
  196. const SQChar *filename=NULL;
  197. #ifdef SQUNICODE
  198. mbstowcs(temp,argv[arg],strlen(argv[arg]));
  199. filename=temp;
  200. #else
  201. filename=argv[arg];
  202. #endif
  203. //arg++; //commenting this line to pass the script filename as first parameter in vargv
  204. //sq_pushstring(v,_SC("ARGS"),-1);
  205. //sq_newarray(v,0);
  206. //sq_createslot(v,-3);
  207. //sq_pop(v,1);
  208. if(compiles_only) {
  209. if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,SQTrue,SQTrue))){
  210. const SQChar *outfile = _SC("out.cnut");
  211. if(output) {
  212. #ifdef SQUNICODE
  213. int len = (int)(strlen(output)+1);
  214. mbstowcs(sq_getscratchpad(v,len*sizeof(SQChar)),output,len);
  215. outfile = sq_getscratchpad(v,-1);
  216. #else
  217. outfile = output;
  218. #endif
  219. }
  220. if(SQ_SUCCEEDED(sqstd_writeclosuretofile(v,outfile)))
  221. return _DONE;
  222. }
  223. }
  224. else if(compiles_as_source_only) {
  225. if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,SQTrue,SQTrue))){
  226. const SQChar *outfile = _SC("out.nut");
  227. if(output) {
  228. #ifdef SQUNICODE
  229. int len = (int)(strlen(output)+1);
  230. mbstowcs(sq_getscratchpad(v,len*sizeof(SQChar)),output,len);
  231. outfile = sq_getscratchpad(v,-1);
  232. #else
  233. outfile = output;
  234. #endif
  235. }
  236. if(SQ_SUCCEEDED(sqstd_writeclosuretofile_as_source(v,outfile)))
  237. return _DONE;
  238. }
  239. }
  240. else {
  241. //if(SQ_SUCCEEDED(sqstd_dofile(v,filename,SQFalse,SQTrue))) {
  242. //return _DONE;
  243. //}
  244. if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,SQTrue,SQTrue))) {
  245. int callargs = 1;
  246. sq_pushroottable(v);
  247. callargs += push_program_args(v, arg, argc, argv, 0);
  248. if(SQ_SUCCEEDED(sq_call(v,callargs,SQTrue,SQTrue))) {
  249. SQObjectType type = sq_gettype(v,-1);
  250. if(type == OT_INTEGER) {
  251. sq_getinteger(v,-1,retval);
  252. }
  253. //if there is a function called "main" we call it like in C/C++
  254. sq_pushliteral(v, _SC("main"));
  255. if(sq_getonroottable(v) == SQ_OK)
  256. {
  257. if(sq_gettype(v, -1) == OT_CLOSURE)
  258. {
  259. sq_pushroottable(v);
  260. sq_pushinteger(v, 1);
  261. callargs = push_program_args(v, arg, argc, argv, 1);
  262. sq_pushinteger(v, callargs);
  263. sq_replace(v, -3);
  264. if(SQ_SUCCEEDED(sq_call(v,3,SQTrue,SQTrue))) {
  265. type = sq_gettype(v,-1);
  266. if(type == OT_INTEGER) {
  267. sq_getinteger(v,-1,retval);
  268. }
  269. }
  270. }
  271. }
  272. return _DONE;
  273. }
  274. else{
  275. return _ERROR;
  276. }
  277. }
  278. }
  279. //if this point is reached an error occured
  280. {
  281. const SQChar *err;
  282. sq_getlasterror(v);
  283. if(SQ_SUCCEEDED(sq_getstring(v,-1,&err))) {
  284. scprintf(_SC("Error [%s]\n"),err);
  285. *retval = -2;
  286. return _ERROR;
  287. }
  288. }
  289. }
  290. }
  291. return _INTERACTIVE;
  292. }
  293. static void Interactive(HSQUIRRELVM v)
  294. {
  295. SQChar buffer[MAXINPUT];
  296. SQInteger blocks =0;
  297. SQInteger string=0;
  298. SQInteger retval=0;
  299. SQInteger done=0;
  300. PrintVersionInfos();
  301. sq_pushroottable(v);
  302. sq_pushstring(v,_SC("quit"),-1);
  303. sq_pushuserpointer(v,&done);
  304. sq_newclosure(v,quit,1);
  305. sq_setparamscheck(v,1,NULL);
  306. sq_newslot(v,-3,SQFalse);
  307. sq_pop(v,1);
  308. while (!done)
  309. {
  310. SQInteger i = 0;
  311. scprintf(_SC("\nsq>"));
  312. for(;;) {
  313. int c;
  314. if(done)return;
  315. c = getchar();
  316. if (c == _SC('\n')) {
  317. if (i>0 && buffer[i-1] == _SC('\\'))
  318. {
  319. buffer[i-1] = _SC('\n');
  320. }
  321. else if(blocks==0)break;
  322. buffer[i++] = _SC('\n');
  323. }
  324. else if (c==_SC('}')) {blocks--; buffer[i++] = (SQChar)c;}
  325. else if(c==_SC('{') && !string){
  326. blocks++;
  327. buffer[i++] = (SQChar)c;
  328. }
  329. else if(c==_SC('"') || c==_SC('\'')){
  330. string=!string;
  331. buffer[i++] = (SQChar)c;
  332. }
  333. else if (i >= MAXINPUT-1) {
  334. scfprintf(stderr, _SC("sq : input line too long\n"));
  335. break;
  336. }
  337. else{
  338. buffer[i++] = (SQChar)c;
  339. }
  340. }
  341. buffer[i] = _SC('\0');
  342. if(buffer[0]==_SC('=')){
  343. #define FMT_STR _SC("return (%s)")
  344. #define MAX_INPUT_SIZE (MAXINPUT+sizeof(FMT_STR))
  345. scsprintf(sq_getscratchpad(v,MAX_INPUT_SIZE),MAX_INPUT_SIZE,FMT_STR,&buffer[1]);
  346. memcpy(buffer,sq_getscratchpad(v,-1),(scstrlen(sq_getscratchpad(v,-1))+1)*sizeof(SQChar));
  347. retval=1;
  348. #undef FMT_STR
  349. #undef MAX_INPUT_SIZE
  350. }
  351. i=scstrlen(buffer);
  352. if(i>0){
  353. SQInteger oldtop=sq_gettop(v);
  354. if(SQ_SUCCEEDED(sq_compilebuffer(v,buffer,i,_SC("interactive console"),SQTrue, SQTrue,
  355. SQ_MAX_INCLUDE_FILES))){
  356. sq_pushroottable(v);
  357. if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue)) && retval){
  358. scprintf(_SC("\n"));
  359. sq_pushroottable(v);
  360. sq_pushstring(v,_SC("print"),-1);
  361. sq_get(v,-2);
  362. sq_pushroottable(v);
  363. sq_push(v,-4);
  364. sq_call(v,2,SQFalse,SQTrue);
  365. retval=0;
  366. scprintf(_SC("\n"));
  367. }
  368. }
  369. sq_settop(v,oldtop);
  370. }
  371. }
  372. }
  373. #define SCRIPT_END_TAG "<DAD:%ld>ooOo(^.^)oOoo"
  374. // end of file is 29: "<DAD:%010d>ooOo(^.^)oOoo", script_len
  375. #define END_TAG_LEN 29
  376. #if 0
  377. static SQInteger LoadFrozenScript0(HSQUIRRELVM v, const SQChar* filename, int only_check)
  378. {
  379. SQInteger retval;
  380. // lots of debugging to make sure that everything is ok
  381. //printf("%s\n", filename);
  382. FILE *f = scfopen(filename, "rb");
  383. if (!f) return -1;
  384. if (fseek(f, 0, SEEK_END))
  385. {
  386. fclose(f);
  387. return -1;
  388. }
  389. int fileSize = ftell(f);
  390. //printf("%d\n", fileSize);
  391. if (fseek(f, fileSize-END_TAG_LEN, SEEK_SET ))
  392. {
  393. fclose(f);
  394. return -1;
  395. }
  396. // do some sanity checking before reading the script length
  397. char tag_buf[END_TAG_LEN+2] = {0};
  398. memset(tag_buf, 0, sizeof(char)*(END_TAG_LEN+2));
  399. long script_len = 0;
  400. if (fread((void*)tag_buf, 1, END_TAG_LEN, f) != END_TAG_LEN)
  401. {
  402. fclose(f);
  403. return -1;
  404. }
  405. //printf("%s\n", tag_buf);
  406. if (sscanf(tag_buf, SCRIPT_END_TAG, &script_len) != 1)
  407. {
  408. fclose(f);
  409. // they only wanted to know if the script exists, assume it's valid
  410. if (only_check) return -2;
  411. else return -1;
  412. }
  413. else if (fseek(f, fileSize-END_TAG_LEN - script_len, SEEK_SET ))
  414. {
  415. fclose(f);
  416. return -1;
  417. }
  418. // size should be valid from Seek statement
  419. char *script = (char*)sq_malloc(script_len+10);
  420. if (script)
  421. {
  422. memset(script, 0, sizeof(script_len+10));
  423. fread(script, 1, script_len, f);
  424. script[script_len] = 0;
  425. //printf("%s", script);
  426. }
  427. fclose(f);
  428. // we finally have our script!
  429. //fwrite(script, 1, finalSize, f);
  430. //fclose(f);
  431. if(SQ_SUCCEEDED(sq_compilebuffer(v,script, script_len, _SC("frozenScript"), SQTrue))) {
  432. int callargs = 1;
  433. sq_pushroottable(v);
  434. callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);
  435. if(SQ_SUCCEEDED(sq_call(v,callargs,SQTrue,SQTrue))) {
  436. SQObjectType type = sq_gettype(v,-1);
  437. if(type == OT_INTEGER) {
  438. sq_getinteger(v,-1, &retval);
  439. }
  440. return _DONE;
  441. }
  442. else{
  443. return _ERROR;
  444. }
  445. }
  446. free(script);
  447. return 0;
  448. }
  449. #endif
  450. #ifndef SQUILU_ALONE
  451. static char *chngChar (char *str, char oldChar, char newChar) {
  452. char *strPtr = str;
  453. while ((strPtr = strchr (strPtr, oldChar)) != NULL)
  454. *strPtr++ = newChar;
  455. return str;
  456. }
  457. #endif
  458. static SQInteger LoadFrozenScript(HSQUIRRELVM v, const SQChar* filename, int only_check)
  459. {
  460. #ifndef SQUILU_ALONE
  461. // lots of debugging to make sure that everything is ok
  462. //printf("%s\n", filename);
  463. FILE *f = scfopen(filename, "rb");
  464. if (!f) return -1;
  465. if (fseek(f, 0, SEEK_END))
  466. {
  467. fclose(f);
  468. return -1;
  469. }
  470. int fileSize = ftell(f);
  471. //printf("%d\n", fileSize);
  472. if (fseek(f, fileSize-END_TAG_LEN, SEEK_SET ))
  473. {
  474. fclose(f);
  475. return -1;
  476. }
  477. // do some sanity checking before reading the script length
  478. char tag_buf[END_TAG_LEN+2] = {0};
  479. memset(tag_buf, 0, sizeof(char)*(END_TAG_LEN+2));
  480. long script_len = 0;
  481. if (fread((void*)tag_buf, 1, END_TAG_LEN, f) != END_TAG_LEN)
  482. {
  483. fclose(f);
  484. return -1;
  485. }
  486. //printf("%s\n", tag_buf);
  487. if (sscanf(tag_buf, SCRIPT_END_TAG, &script_len) != 1)
  488. {
  489. fclose(f);
  490. // they only wanted to know if the script exists, assume it's valid
  491. if (only_check) return -2;
  492. else return -1;
  493. }
  494. else if (fseek(f, fileSize-END_TAG_LEN - script_len, SEEK_SET ))
  495. {
  496. fclose(f);
  497. return -1;
  498. }
  499. fclose(f);
  500. SQChar srcBoot[256];
  501. SQInteger scr_len = scsprintf(srcBoot, sizeof(srcBoot),
  502. _SC("local __fd=file(\"%s\", \"rb\");__fd.seek(%d, 'b');local __zsrc=__fd.read(%d);__fd.close();__zsrc=compilestring(zlib.inflate(__zsrc),\"zsrc\",false);__zsrc.acall2(this, vargv);"),
  503. filename, (int)(fileSize-END_TAG_LEN - script_len), (int)script_len);
  504. chngChar(srcBoot, '\\', '/');
  505. if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, scr_len, _SC("bootScript"), SQTrue, SQTrue,SQ_MAX_INCLUDE_FILES))) {
  506. int callargs = 1;
  507. sq_pushroottable(v);
  508. callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);
  509. if(SQ_SUCCEEDED(sq_call(v, callargs,SQFalse, SQTrue))) {
  510. return _DONE;
  511. }
  512. else{
  513. return _ERROR;
  514. }
  515. }
  516. #endif //SQUILU_ALONE
  517. return 0;
  518. }
  519. SQRESULT sqext_register_sqfs(HSQUIRRELVM v);
  520. SQRESULT sqext_register_sq_zmq3(HSQUIRRELVM v);
  521. SQRESULT sqext_register_sq_socket(HSQUIRRELVM v);
  522. SQRESULT sqext_register_sq_zlib(HSQUIRRELVM v);
  523. SQRESULT sqext_register_sq_miniz(HSQUIRRELVM v);
  524. SQRESULT sqext_register_mongoose(HSQUIRRELVM v);
  525. SQRESULT sqrat_register_importlib(HSQUIRRELVM v);
  526. SQRESULT sqext_register_sq_slave_vm(HSQUIRRELVM v);
  527. SQRESULT sqext_register_axtls (HSQUIRRELVM v);
  528. SQRESULT sqext_register_openssl (HSQUIRRELVM v);
  529. SQRESULT sqext_register_base64(HSQUIRRELVM v);
  530. SQRESULT sqext_register_Sq_Fpdf(HSQUIRRELVM v);
  531. SQRESULT sqext_register_SQLite3(HSQUIRRELVM v);
  532. SQRESULT sqext_register_mix (HSQUIRRELVM sqvm);
  533. SQRESULT sqext_register_rs232(HSQUIRRELVM v);
  534. SQRESULT sqext_register_tinyxml2(HSQUIRRELVM v);
  535. SQRESULT sqext_register_decimal(HSQUIRRELVM v);
  536. SQRESULT sqext_register_markdown(HSQUIRRELVM v);
  537. SQRESULT sqext_register_PostgreSQL(HSQUIRRELVM v);
  538. SQRESULT sqext_register_MySQL(HSQUIRRELVM v);
  539. SQRESULT sqext_register_Java(HSQUIRRELVM v);
  540. SQRESULT sqext_register_ThreadObjects(HSQUIRRELVM v);
  541. SQRESULT sqext_register_csv_parser (HSQUIRRELVM v);
  542. SQRESULT sqext_register_fltklib(HSQUIRRELVM v);
  543. SQRESULT sqext_register_dad_utils(HSQUIRRELVM v);
  544. SQRESULT sqext_register_gumbo(HSQUIRRELVM v);
  545. SQRESULT sqext_register_sys(HSQUIRRELVM v);
  546. SQRESULT sqext_register_DNS_SD(HSQUIRRELVM v);
  547. SQRESULT sqext_register_ffi(HSQUIRRELVM v);
  548. SQRESULT sqext_register_xjd1(HSQUIRRELVM v);
  549. SQRESULT sqext_register_libclang(HSQUIRRELVM v);
  550. SQRESULT sqext_register_EasyCurl (HSQUIRRELVM v);
  551. SQRESULT sqext_register_tweetnacl(HSQUIRRELVM v);
  552. SQRESULT sqext_register_ipc (HSQUIRRELVM v);
  553. SQRESULT sqext_register_BitVector (HSQUIRRELVM v); //depends on sqlite3
  554. SQRESULT sqext_register_pack(HSQUIRRELVM v);
  555. SQRESULT sqext_register_sq_blosc(HSQUIRRELVM v);
  556. SQRESULT sqext_register_pcre(HSQUIRRELVM v);
  557. SQRESULT sqext_register_pcre2(HSQUIRRELVM v);
  558. SQRESULT sqext_register_freetype(HSQUIRRELVM v);
  559. SQRESULT sqext_register_tre(HSQUIRRELVM v);
  560. SQRESULT sqext_register_hunspell(HSQUIRRELVM v);
  561. SQRESULT sqext_register_fossil (HSQUIRRELVM sqvm);
  562. SQRESULT sqext_register_sqpeg (HSQUIRRELVM sqvm);
  563. SQRESULT sqext_register_LmDB (HSQUIRRELVM v);
  564. SQRESULT sqext_register_fuzzy_hash (HSQUIRRELVM sqvm);
  565. SQRESULT sqext_register_nn (HSQUIRRELVM v);
  566. SQRESULT sqext_register_lapack (HSQUIRRELVM v);
  567. SQRESULT sqext_register_numarray (HSQUIRRELVM v);
  568. SQRESULT sqext_register_fann (HSQUIRRELVM v);
  569. SQRESULT sqext_register_numarray (HSQUIRRELVM v);
  570. SQRESULT sqext_register_Snowball (HSQUIRRELVM v);
  571. SQRESULT sqext_register_sq_spawnx(HSQUIRRELVM v);
  572. SQRESULT sqext_register_lpsolve(HSQUIRRELVM v);
  573. SQRESULT sqext_register_tree_sitter(HSQUIRRELVM v);
  574. static sq_modules_preload_st modules_preload[] = {
  575. {"blob", sqstd_register_bloblib},
  576. {"io", sqstd_register_iolib},
  577. {"math", sqstd_register_mathlib},
  578. {"sys", sqstd_register_systemlib},
  579. {"string", sqstd_register_stringlib},
  580. #ifdef WITH_DAD_EXTRAS
  581. #ifndef SQUILU_ALONE
  582. {"sqlexer", sqext_register_SQLexer},
  583. {"gumbo", sqext_register_gumbo},
  584. {"base64", sqext_register_base64},
  585. #ifndef NO_SQ_PDF
  586. {"fpdf", sqext_register_Sq_Fpdf},
  587. #endif
  588. #ifdef SQ_USE_NUMARRAY
  589. {"numarray", sqext_register_numarray},
  590. #endif
  591. #ifdef SQ_USE_SQFANN
  592. {"SQFann", sqext_register_fann},
  593. #endif
  594. {"AnnRprop", sqext_register_nn},
  595. {"sqlite3", sqext_register_SQLite3},
  596. {"bitvector", sqext_register_BitVector}, //depends on sqlite3
  597. //{"xdj1", sqext_register_xjd1},
  598. {"mix", sqext_register_mix},
  599. {"sqfs", sqext_register_sqfs},
  600. //{"ipc", sqext_register_ipc},
  601. {"socket", sqext_register_sq_socket},
  602. {"tweetnacl", sqext_register_tweetnacl},
  603. {"pack", sqext_register_pack},
  604. {"sqfossil", sqext_register_fossil},
  605. #if !defined(TARGET_IOS)
  606. #ifdef SQ_USE_PCRE
  607. {"sqpcre", sqext_register_pcre},
  608. #endif // SQ_USE_PCRE
  609. #if defined(SQ_USE_PCRE2) || defined(SQ_USE_PCRE2_STATIC)
  610. {"sqpcre2", sqext_register_pcre2},
  611. #endif // SQ_USE_PCRE2
  612. #if defined(SQ_USE_TRE) || defined(SQ_USE_TRE_STATIC)
  613. {"sqtre", sqext_register_tre},
  614. #endif // SQ_USE_TRE
  615. #if defined(SQ_USE_HUNSPELL) || defined(SQ_USE_HUNSPELL_STATIC)
  616. {"sqhunspell", sqext_register_hunspell},
  617. #endif // SQ_USE_HUNSPELL
  618. #if defined(SQ_USE_LPSOLVE) || defined(SQ_USE_LPSOLVE_STATIC)
  619. {"sqlpsolve", sqext_register_lpsolve},
  620. #endif // SQ_USE_LPSOLVE
  621. #ifdef SQ_USE_FREETYPE
  622. {"freetype", sqext_register_freetype},
  623. #endif // SQ_USE_FREETYPE
  624. #ifdef SQ_USE_BLOSC
  625. {"blosc", sqext_register_sq_blosc},
  626. #endif // SQ_USE_BLOSC
  627. #ifdef SQ_USE_SPAWNX
  628. {"sqspawnx", sqext_register_sq_spawnx},
  629. #endif // SQ_USE_SPAWNX
  630. #ifdef SQ_USE_LAPACK
  631. {"lapack", sqext_register_lapack},
  632. #endif // SQ_USE_LAPACK
  633. #endif
  634. #ifdef USE_AXTLS
  635. {"axtls", sqext_register_axtls},
  636. #endif
  637. #ifdef WITH_FFI
  638. {"ffi", sqext_register_ffi},
  639. #endif
  640. #ifdef USE_OPENSSL
  641. {"openssl", sqext_register_openssl},
  642. #endif
  643. {"zlib", sqext_register_sq_zlib},
  644. //{"miniz", sqext_register_sq_miniz},
  645. {"mongoose", sqext_register_mongoose},
  646. {"importlib", sqrat_register_importlib},
  647. #ifndef NO_TINYXML2
  648. {"tinyxml2", sqext_register_tinyxml2},
  649. #endif
  650. #ifndef _WIN32_WCE
  651. #ifdef WITH_MPDECIMAL
  652. {"decimal", sqext_register_decimal},
  653. #endif
  654. {"markdown", sqext_register_markdown},
  655. #endif
  656. {"slave_vm", sqext_register_sq_slave_vm},
  657. //{"thread", sqext_register_ThreadObjects},
  658. #ifndef ANDROID_BUILD
  659. {"dad_utils", sqext_register_dad_utils},
  660. #endif
  661. //{"sys_extra", sqext_register_sys},
  662. #ifdef SQ_USE_EASYCURL
  663. {"easycurl", sqext_register_EasyCurl},
  664. #endif // SQ_USE_EASYCURL
  665. #ifdef WITH_FULL_DAD_EXTRAS
  666. {"csv_parser", sqext_register_csv_parser},
  667. //{"zmq3", sqext_register_sq_zmq3},
  668. //{"java", sqext_register_Java},
  669. #endif
  670. #ifdef WITH_LIBCLANG
  671. {"libclang", sqext_register_libclang},
  672. #endif
  673. #ifdef WITH_POSTGRESQL
  674. {"postgresql", sqext_register_PostgreSQL},
  675. #endif
  676. #ifdef WITH_MYSQL
  677. {"mysql", sqext_register_MySQL},
  678. #endif
  679. #ifdef USE_SNOWBALL
  680. {"snowball", sqext_register_Snowball},
  681. #endif
  682. #if !defined(ANDROID_BUILD) && !defined(NO_RS232)
  683. {"rs232", sqext_register_rs232},
  684. #endif
  685. #ifdef WITH_FLTK
  686. {"fltk", sqext_register_fltklib},
  687. #endif
  688. #ifdef WITH_DNS_SD
  689. {"dns_sd", sqext_register_DNS_SD},
  690. #endif
  691. #ifdef SQ_USE_FUZZY_HASH
  692. {"sqfuzzy_hash", sqext_register_fuzzy_hash},
  693. #endif // SQ_USE_FUZZY_HASH
  694. #ifdef SQ_USE_NUMARRAY
  695. {"numarray", sqext_register_numarray},
  696. #endif // SQ_USE_FUZZY_HASH
  697. #endif //SQUILU_ALONE
  698. #endif // WITH_DAD_EXTRAS
  699. #if defined(SQ_USE_SQLEG)
  700. {"sqleg", sqext_register_sqpeg},
  701. #endif // SQ_USE_PCRE2
  702. #if defined(SQ_USE_LMDB)
  703. {"sqlmdb", sqext_register_LmDB},
  704. #endif // SQ_USE_LMDB
  705. #ifdef SQ_USE_TREE_SITTER
  706. {"tree_sitter", sqext_register_tree_sitter},
  707. #endif // SQ_USE_FREETYPE
  708. {NULL, NULL}
  709. };
  710. int main(int argc, char* argv[])
  711. {
  712. sq_main_argc = argc;
  713. sq_main_argv = argv;
  714. HSQUIRRELVM v;
  715. SQInteger retval = 0;
  716. //const SQChar *filename=NULL;
  717. #if defined(_MSC_VER) && defined(_DEBUG)
  718. _CrtSetAllocHook(MemAllocHook);
  719. #endif
  720. #ifndef SQ_OPEN_VM_SIZE
  721. #define SQ_OPEN_VM_SIZE 1024
  722. #endif // SQ_OPEN_VM_SIZE
  723. v=sq_open(SQ_OPEN_VM_SIZE);
  724. const SQChar *include_path = scgetenv(_SC("SQUILU_PATH"));
  725. if(include_path) sq_set_include_path(v, include_path);
  726. sq_setprintfunc(v,printfunc,errorfunc);
  727. sq_pushroottable(v);
  728. /*
  729. sq_pushstring(v, _SC("sq_xinterpreter"), -1);
  730. sq_pushstring(v, argv[0], -1);
  731. sq_newslot(v,-3,SQFalse);
  732. */
  733. sq_modules_preload_st *mp = modules_preload;
  734. sq_preload_modules(v, mp);
  735. while(mp->module_load_func){
  736. mp->module_load_func(v);
  737. ++mp;
  738. }
  739. //aux library
  740. //sets error handlers
  741. sqstd_seterrorhandlers(v);
  742. //frozen script executed ?
  743. if(LoadFrozenScript(v, argv[0], 0) == _DONE) return 0;
  744. //gets arguments
  745. switch(getargs(v,argc,argv,&retval))
  746. {
  747. case _INTERACTIVE:
  748. Interactive(v);
  749. break;
  750. case _DONE:
  751. case _ERROR:
  752. default:
  753. break;
  754. }
  755. sq_close(v);
  756. #if defined(_MSC_VER) && defined(_DEBUG)
  757. _getch();
  758. _CrtMemDumpAllObjectsSince( NULL );
  759. #endif
  760. return retval;
  761. }