/** * @author Alberto DEMICHELIS * @author Edouard DUPIN * @copyright 2018, Edouard DUPIN, all right reserved * @copyright 2003-2017, Alberto DEMICHELIS, all right reserved * @license MPL-2 (see license file) */ #include #include #include #include #if defined(_MSC_VER) && defined(_DEBUG) #include #include #endif #include #include #include #include #include #include #include void PrintVersionInfos(); #if defined(_MSC_VER) && defined(_DEBUG) int MemAllocHook(int allocType, void *userData, size_t size, int blockType, long requestNumber, const unsigned char *filename, int lineNumber) { //if(requestNumber==769)_asm int 3; return 1; } #endif int64_t quit(rabbit::VirtualMachine* v) { int *done; sq_getuserpointer(v,-1,(rabbit::UserPointer*)&done); *done=1; return 0; } void printfunc(rabbit::VirtualMachine* SQ_UNUSED_ARG(v),const char *s,...) { va_list vl; va_start(vl, s); vfprintf(stdout, s, vl); va_end(vl); } void errorfunc(rabbit::VirtualMachine* SQ_UNUSED_ARG(v),const char *s,...) { va_list vl; va_start(vl, s); vfprintf(stderr, s, vl); va_end(vl); } void PrintVersionInfos() { fprintf(stdout,"%s %s (%d bits)\n",RABBIT_VERSION,RABBIT_COPYRIGHT,((int)(sizeof(int64_t)*8))); } void PrintUsage() { fprintf(stderr,"usage: sq .\n" "Available options are:\n" " -d generates debug infos\n" " -v displays version infos\n" " -h prints help\n"); } #define _INTERACTIVE 0 #define _DONE 2 #define _ERROR 3 //<> this func is a mess int getargs(rabbit::VirtualMachine* v,int argc, char* argv[],int64_t *retval) { int i; *retval = 0; if(argc>1) { int arg=1,exitloop=0; while(arg < argc && !exitloop) { if(argv[arg][0]=='-') { switch(argv[arg][1]) { case 'd': sq_enabledebuginfo(v,1); break; break; case 'v': PrintVersionInfos(); return _DONE; case 'h': PrintVersionInfos(); PrintUsage(); return _DONE; default: PrintVersionInfos(); printf("unknown prameter '-%c'\n",argv[arg][1]); PrintUsage(); *retval = -1; return _ERROR; } }else break; arg++; } // src file if(arg "); for(;;) { int c; if(done)return; c = getchar(); if (c == '\n') { if (i>0 && buffer[i-1] == '\\') { buffer[i-1] = '\n'; } else if(blocks==0)break; buffer[i++] = '\n'; } else if (c=='}') {blocks--; buffer[i++] = (char)c;} else if(c=='{' && !string){ blocks++; buffer[i++] = (char)c; } else if(c=='"' || c=='\''){ string=!string; buffer[i++] = (char)c; } else if (i >= MAXINPUT-1) { fprintf(stderr, "rabbit: input line too long\n"); break; } else{ buffer[i++] = (char)c; } } buffer[i] = '\0'; if(buffer[0]=='='){ snprintf(sq_getscratchpad(v,MAXINPUT),(size_t)MAXINPUT,"return (%s)",&buffer[1]); memcpy(buffer,sq_getscratchpad(v,-1),(strlen(sq_getscratchpad(v,-1))+1)*sizeof(char)); retval=1; } i=strlen(buffer); if(i>0){ int64_t oldtop=sq_gettop(v); if(SQ_SUCCEEDED(sq_compilebuffer(v,buffer,i,"interactive console",SQTrue))){ sq_pushroottable(v); if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue)) && retval){ printf("\n"); sq_pushroottable(v); sq_pushstring(v,"print",-1); sq_get(v,-2); sq_pushroottable(v); sq_push(v,-4); sq_call(v,2,SQFalse,SQTrue); retval=0; printf("\n"); } } sq_settop(v,oldtop); } } } int main(int argc, char* argv[]) { rabbit::VirtualMachine* v; int64_t retval = 0; #if defined(_MSC_VER) && defined(_DEBUG) _CrtsetAllocHook(MemAllocHook); #endif v=rabbit::sq_open(1024); sq_setprintfunc(v,printfunc,errorfunc); sq_pushroottable(v); rabbit::std::register_bloblib(v); rabbit::std::register_iolib(v); rabbit::std::register_systemlib(v); rabbit::std::register_mathlib(v); rabbit::std::register_stringlib(v); //aux library //sets error handlers rabbit::std::seterrorhandlers(v); //gets arguments switch(getargs(v,argc,argv,&retval)) { case _INTERACTIVE: Interactive(v); break; case _DONE: case _ERROR: default: break; } sq_close(v); #if defined(_MSC_VER) && defined(_DEBUG) _getch(); _CrtMemdumpAllObjectsSince( NULL ); #endif return retval; }