int sqlang_sr_init_child(void) { memset(&_sr_J_env, 0, sizeof(sr_sqlang_env_t)); _sr_J_env.J = sq_open(1024); if(_sr_J_env.J==NULL) { LM_ERR("cannot create SQlang context (exec)\n"); return -1; } sq_pushroottable(_sr_J_env.J); /*sets the print functions*/ sq_setprintfunc(_sr_J_env.J, sqlang_printfunc, sqlang_errorfunc); //sq_setnativedebughook(_sr_J_env.J, sqlang_debughook); sq_enabledebuginfo(_sr_J_env.J, 1); sqstd_register_bloblib(_sr_J_env.J); sqstd_register_iolib(_sr_J_env.J); sqstd_register_systemlib(_sr_J_env.J); sqstd_register_mathlib(_sr_J_env.J); sqstd_register_stringlib(_sr_J_env.J); sqstd_seterrorhandlers(_sr_J_env.J); sqlang_sr_kemi_register_libs(_sr_J_env.J); if(_sr_sqlang_load_file.s != NULL && _sr_sqlang_load_file.len>0) { _sr_J_env.JJ = sq_open(1024); if(_sr_J_env.JJ==NULL) { LM_ERR("cannot create load SQLang context (load)\n"); return -1; } sq_pushroottable(_sr_J_env.JJ); LM_DBG("*** sqlang top index now is: %d\n", (int)sqlang_gettop(_sr_J_env.JJ)); /*sets the print functions*/ sq_setprintfunc(_sr_J_env.JJ, sqlang_printfunc, sqlang_errorfunc); //sq_setnativedebughook(_sr_J_env.JJ, sqlang_debughook); sq_enabledebuginfo(_sr_J_env.JJ, 1); sqstd_register_bloblib(_sr_J_env.JJ); sqstd_register_iolib(_sr_J_env.JJ); sqstd_register_systemlib(_sr_J_env.JJ); sqstd_register_mathlib(_sr_J_env.JJ); sqstd_register_stringlib(_sr_J_env.JJ); sqstd_seterrorhandlers(_sr_J_env.JJ); sqlang_sr_kemi_register_libs(_sr_J_env.JJ); LM_DBG("loading sqlang script file: %.*s\n", _sr_sqlang_load_file.len, _sr_sqlang_load_file.s); if(sqlang_kemi_load_script()<0) { return -1; } } LM_DBG("JS initialized!\n"); return 0; }
static SQInteger base_enabledebuginfo(HSQUIRRELVM v) { SQObjectPtr &o=stack_get(v,2); sq_enabledebuginfo(v,SQVM::IsFalse(o)?SQFalse:SQTrue); return 0; }
int main(int argc, char *argv[]) { setbuf(stdout, NULL); if (argc < 2) { scprintf(_SC("SQDBG error : no file specified")); return -1; } HSQUIRRELVM v = sq_open(1024); sqstd_seterrorhandlers(v); //!! INITIALIZES THE DEBUGGER ON THE TCP PORT 1234 //!! ENABLES AUTOUPDATE HSQREMOTEDBG rdbg = sq_rdbg_init(v, 1234, SQTrue); if (rdbg) { //!! ENABLES DEBUG INFO GENERATION(for the compiler) sq_enabledebuginfo(v, SQTrue); sq_setprintfunc(v, printfunc, errorfunc); //!! SUSPENDS THE APP UNTIL THE DEBUGGER CLIENT CONNECTS if (SQ_SUCCEEDED(sq_rdbg_waitforconnections(rdbg))) { scprintf(_SC("connected\n")); const SQChar *fname = NULL; #ifdef _UNICODE SQChar sTemp[256]; mbstowcs(sTemp,argv[1],(int)strlen(argv[1])+1); fname=sTemp; #else fname = argv[1]; #endif //!!REGISTERS STANDARDS LIBS sq_pushroottable(v); sqstd_register_bloblib(v); sqstd_register_iolib(v); //!!EXECUTE A SCTIPT if (SQ_FAILED(sqstd_dofile(v, fname, SQFalse, SQTrue))) { PrintError(v); #if defined(_WIN32) || defined(_WIN64) _getch(); #else getch(); #endif } } //!! CLEANUP sq_rdbg_shutdown(rdbg); } else { PrintError(v); } sq_close(v); return 0; }
bool GameWorld::loadWorldAPI() { sq_enabledebuginfo(_vm.GetVM(), SQTrue); sq_setnativedebughook(_vm.GetVM(), &DebugHook); _vm.SetErrorHandler(&RuntimeErrorFunction, &CompileErrorFunction); _vm.SetPrintFunc(&printfunc, &errorfunc); GenerateIdDelegate = std::bind(&GameWorld::generateId, this); _vm.GetRootTable().Func("GenerateId", &GenerateId); RegisterActionDelegate = std::bind(&GameWorld::registerAction, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); _vm.GetRootTable().Func("__RegisterAction", &RegisterAction); Pawn::Bind(_vm); Pawn::_registerPawnDelegate = std::bind(&GameWorld::addPawn, this, std::placeholders::_1); Pawn::_unregisterPawnDelegate = std::bind(&GameWorld::removePawn, this, std::placeholders::_1); CreateResourceDelegate = std::bind(&GameWorld::createResource, this, std::placeholders::_1, std::placeholders::_2); _vm.GetRootTable().Func("__CreateResource", &CreateResource); SetResourceValueDelegate = std::bind(&GameWorld::setResourceValue, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); _vm.GetRootTable().Func("__SetResourceValue", &SetResourceValue); ConsumeResourceDelegate = std::bind(&GameWorld::consumeResource, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); _vm.GetRootTable().Func("__ConsumeResource", &ConsumeResource); Resource::mode = Resource::kVerify; Resource::enough = true; if (_vm.DoFile(RESOURCES_DIR "GameWorldAPI.nut") != sq::SqratVM::SQRAT_NO_ERROR) { std::cout << _vm.GetLastErrorMsg() << std::endl; return false; } if (_vm.DoFile(RESOURCES_DIR "GameWorld.nut") != sq::SqratVM::SQRAT_NO_ERROR) { std::cout << _vm.GetLastErrorMsg() << std::endl; return false; } sq::Function f = _vm.GetRootTable().GetFunction("Initialize"); if (f.IsNull()) { std::cout << "No Initialize function" << std::endl; return false; } f.Execute(_map.size(), _map[0].size()); return true; }
//<<FIXME>> this func is a mess int getargs(HSQUIRRELVM v,int argc, char* argv[],SQInteger *retval) { int i; int compiles_only = 0; static SQChar temp[500]; const SQChar *ret=NULL; char * output = NULL; int lineinfo=0; *retval = 0; if(argc>1) { int arg=1,exitloop=0; while(arg < argc && !exitloop) { if(argv[arg][0]=='-') { switch(argv[arg][1]) { case 'd': //DEBUG(debug infos) sq_enabledebuginfo(v,1); break; case 'c': compiles_only = 1; break; case 'o': if(arg < argc) { arg++; output = argv[arg]; } break; case 'v': PrintVersionInfos(); return _DONE; case 'h': PrintVersionInfos(); PrintUsage(); return _DONE; default: PrintVersionInfos(); scprintf(_SC("unknown prameter '-%c'\n"),argv[arg][1]); PrintUsage(); *retval = -1; return _ERROR; } }else break; arg++; } // src file if(arg<argc) { const SQChar *filename=NULL; #ifdef SQUNICODE mbstowcs(temp,argv[arg],strlen(argv[arg])); filename=temp; #else filename=argv[arg]; #endif arg++; //sq_pushstring(v,_SC("ARGS"),-1); //sq_newarray(v,0); //sq_createslot(v,-3); //sq_pop(v,1); if(compiles_only) { if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,SQTrue))){ const SQChar *outfile = _SC("out.cnut"); if(output) { #ifdef SQUNICODE int len = (int)(strlen(output)+1); mbstowcs(sq_getscratchpad(v,len*sizeof(SQChar)),output,len); outfile = sq_getscratchpad(v,-1); #else outfile = output; #endif } if(SQ_SUCCEEDED(sqstd_writeclosuretofile(v,outfile))) return _DONE; } } else { //if(SQ_SUCCEEDED(sqstd_dofile(v,filename,SQFalse,SQTrue))) { //return _DONE; //} if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,SQTrue))) { int callargs = 1; sq_pushroottable(v); for(i=arg;i<argc;i++) { const SQChar *a; #ifdef SQUNICODE int alen=(int)strlen(argv[i]); a=sq_getscratchpad(v,(int)(alen*sizeof(SQChar))); mbstowcs(sq_getscratchpad(v,-1),argv[i],alen); sq_getscratchpad(v,-1)[alen] = _SC('\0'); #else a=argv[i]; #endif sq_pushstring(v,a,-1); callargs++; //sq_arrayappend(v,-2); } if(SQ_SUCCEEDED(sq_call(v,callargs,SQTrue,SQTrue))) { SQObjectType type = sq_gettype(v,-1); if(type == OT_INTEGER) { *retval = type; sq_getinteger(v,-1,retval); } return _DONE; } else{ return _ERROR; } } } //if this point is reached an error occured { const SQChar *err; sq_getlasterror(v); if(SQ_SUCCEEDED(sq_getstring(v,-1,&err))) { scprintf(_SC("Error [%s]\n"),err); *retval = -2; return _ERROR; } } } } return _INTERACTIVE; }
int main (int argc, char** argv) { ENABLE_LEAK_CHECK(); #if defined(SHELL_PLATFORM_WINDOWS) SetConsoleTitle("Squirrel Shell " SHELL_VERSION_STR " (" SHELL_CPUARCH ")"); #else stderrIsRedirected = !isatty(2); #endif // Parse command line arguments. const char* fileName = NULL; bool interactive = argc == 1; int firstArg = 0, i; bool isDebug = false; int debuggerPort = 0; for (i = 1; argv[i]; ++i) { char* arg = argv[i]; if (!strcmp(arg, "-h") || !strcmp(arg, "--help")) { printf("Squirrel Shell %s for %s on %s (" __DATE__ ")\n" SHELL_VERSION_COPYRIGHT "\n" "\n" "This is free software, and comes WITHOUT ANY WARRANTY; without even the implied\n" "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" "General Public License for more details.\n" "\n" "MD5 hash calculation code (c) Colin Plumb\n" "PCRE (c) University of Cambridge\n" "Squirrel (c) Alberto Demichelis\n" "zlib (c) Jean-loup Gailly and Mark Adler\n" "\n" "Usage:\n" " squirrelsh [options] [script_file] [script_arguments]\n" "\n" "Options:\n" " -h, --help Display this text\n" " -d<PORT> Enable the debugger, in the specified port\n" " -i, --interactive Run shell in interactive mode\n" " If script file is specified, it will be executed before\n" " entering this mode\n" " -s, --silent Do not display error and warning messages\n" " -v, --version Display shell version number\n" "\n" "Examples:\n" " squirrelsh Run shell in interactive mode\n" " squirrelsh foo.nut Run foo.nut script without arguments\n" " squirrelsh -i foo.nut 1 2 3 Run foo.nut script with arguments \"1\", \"2\"\n" " and \"3\", and switch into interactive mode\n", SHELL_VERSION_STR, SHELL_PLATFORM, SHELL_CPUARCH); return EXIT_SUCCESS; } else if (!strncmp(arg, "-d", 2)) { // RVF + isDebug = true; debuggerPort = std::atoi(arg + 2); if (debuggerPort == 0) { printf("No debugger port specified\n"); return EXIT_FAILURE; } // RVF - } else if (!strcmp(arg, "-i") || !strcmp(arg, "--interactive")) interactive = true; else if (!strcmp(arg, "-v") || !strcmp(arg, "--version")) { printf("%s\n", SHELL_VERSION_STR); return EXIT_SUCCESS; } else if (!strcmp(arg, "-s") || !strcmp(arg, "--silent")) silent = true; else { // First unreserved argument will be treated as script file name. fileName = arg; firstArg = i; break; } } if (!fileName && !interactive) { PrintError("ERROR: Script file not specified.\n"); return EXIT_FAILURE; } // Initialize Squirrel. sqvm = sq_open(1024); if (!sqvm) { PrintError("ERROR: Failed to create Squirrel VM.\n"); return EXIT_FAILURE; } sqstd_seterrorhandlers(sqvm); HSQREMOTEDBG rdbg = nullptr; if (isDebug) { rdbg = sq_rdbg_init(sqvm, debuggerPort, SQTrue); sq_enabledebuginfo(sqvm, SQTrue); //!! SUSPENDS THE APP UNTIL THE DEBUGGER CLIENT CONNECTS scprintf("Waiting for the debugger to connect...\n"); if (!SQ_SUCCEEDED(sq_rdbg_waitforconnections(rdbg))) { PrintError("ERROR: Failed to connect to the debugger.\n"); return EXIT_FAILURE; } scprintf(_SC("Connected to the debugger\n")); } //sq_setcompilererrorhandler(sqvm, SquirrelCompileError); _RPT0(_CRT_WARN, "--- Squirrel initialized\n"); // Register some globals. SetSqString("SHELL_VERSION", SHELL_VERSION_STR, SQTrue); SetSqString("SQUIRREL_VERSION", SQUIRREL_VERSION_SHORT, SQTrue); SetSqString("PLATFORM", SHELL_PLATFORM, SQTrue); SetSqString("CPU_ARCH", SHELL_CPUARCH, SQTrue); // Initialize libraries. Init_Base(); Init_IO(); Init_File(); Init_Math(); Init_Util(); Init_Hash(); Init_RegExp(); _RPT0(_CRT_WARN, "--- Libraries initialized\n"); // Set up global variables... sq_pushroottable(sqvm); // RVF + // Initialize squirrel std libraries //sqstd_register_bloblib(sqvm); sqstd_register_iolib(sqvm); // We need this one because of the handy "dofile" function sqstd_register_stringfunctions(sqvm); // This registers only some string functions that are useful and don't clash with Squirrel Shell // NOTE: Not registering the other libraries, because there are name clashing between Squirrel Shell and SqStdLib //sqstd_register_systemlib(sqvm); //sqstd_register_mathlib(sqvm); //sqstd_register_stringlib(sqvm); // RVF - // ... number of command line arguments... sq_pushstring(sqvm, "__argc", -1); sq_pushinteger(sqvm, SQInteger(argc - firstArg)); if (SQ_FAILED(sq_newslot(sqvm, -3, SQFalse))) { PrintError("ERROR: Failed to create \"__argc\" integer value.\n"); Shutdown(); return EXIT_FAILURE; } // ... and arguments themselves. sq_pushstring(sqvm, "__argv", -1); sq_newarray(sqvm, 0); for (i = firstArg; argv[i]; ++i) { sq_pushstring(sqvm, argv[i], -1); sq_arrayappend(sqvm, -2); } if (SQ_FAILED(sq_newslot(sqvm, -3, SQFalse))) { PrintError("ERROR: Failed to create \"__argv\" array.\n"); Shutdown(); return EXIT_FAILURE; } sq_pop(sqvm, 1); // Load and run script. SQInteger result = EXIT_SUCCESS; if (fileName && LoadScript(fileName)) { sq_pushroottable(sqvm); if (SQ_FAILED(sq_call(sqvm, 1, SQTrue, isDebug ? SQTrue : SQFalse))) { if (!silent) { const SQChar* errMsg = "Unknown error."; sq_getlasterror(sqvm); if (sq_gettype(sqvm, -1) == OT_STRING) sq_getstring(sqvm, -1, &errMsg); PrintError("ERROR: %s\n", errMsg); } Shutdown(); return EXIT_FAILURE; } // Get script execution result. if (sq_getvmstate(sqvm) == SQ_VMSTATE_SUSPENDED) result = retCode; else { if (sq_gettype(sqvm, -1) == OT_INTEGER) sq_getinteger(sqvm, -1, &result); } // Pop everything except root table. sq_settop(sqvm, 1); } // Enter interactive mode (if necessary). if (interactive) { SQChar cmd[MAX_CMD_LENGTH + 1]; do { #if defined(SHELL_PLATFORM_WINDOWS) GetCurrentDirectory(sizeof(cmd), cmd); #else getcwd(cmd, sizeof(cmd)); #endif cmd[sizeof(cmd) - 1] = 0; printf("%s> ", ConvPath(cmd, SQFalse)); fgets(cmd, MAX_CMD_LENGTH, stdin); if (SQ_FAILED(sq_compilebuffer(sqvm, cmd, SQInteger(strlen(cmd)), "", SQTrue))) continue; sq_pushroottable(sqvm); if (SQ_FAILED(sq_call(sqvm, 1, SQFalse, SQFalse)) && !silent) { const SQChar* errMsg = "Unknown error."; sq_getlasterror(sqvm); if (sq_gettype(sqvm, -1) == OT_STRING) sq_getstring(sqvm, -1, &errMsg); PrintError("ERROR: %s\n", errMsg); } } while(sq_getvmstate(sqvm) != SQ_VMSTATE_SUSPENDED); result = retCode; } if (isDebug) { sq_rdbg_shutdown(rdbg); } Shutdown(); return int(result); }
static SQInteger base_enabledebuginfo(HSQUIRRELVM v) { SQObjectPtr &o=stack_get(v,2); sq_enabledebuginfo(v,(type(o) != OT_NULL)?1:0); return 0; }
int main(int argc, char *argv[]) { if(argc < 2){ scprintf(_SC("SQDBG error : no file specified")); return -1; } // RVF + int debuggerPort = 0; for (int i = 1; i < argc; i++) { const char* arg = argv[i]; if (!strncmp(arg, "-d", 2)) debuggerPort = std::atoi(arg + 2); } if (!debuggerPort) { scprintf(_SC("SQDBG error : Debugger port not specified. Use the -d<PORT> parameter")); return EXIT_FAILURE; } // RVF - HSQUIRRELVM v = sq_open(1024); sqstd_seterrorhandlers(v); //!! INITIALIZES THE DEBUGGER ON THE TCP PORT 1234 //!! ENABLES AUTOUPDATE HSQREMOTEDBG rdbg = sq_rdbg_init(v,debuggerPort,SQTrue); if(rdbg) { //!! ENABLES DEBUG INFO GENERATION(for the compiler) sq_enabledebuginfo(v,SQTrue); sq_setprintfunc(v,printfunc,errorfunc); //!! SUSPENDS THE APP UNTIL THE DEBUGGER CLIENT CONNECTS if(SQ_SUCCEEDED(sq_rdbg_waitforconnections(rdbg))) { scprintf(_SC("connected\n")); const SQChar *fname=NULL; #ifdef _UNICODE SQChar sTemp[256]; mbstowcs(sTemp,argv[argc-1],(int)strlen(argv[1])+1); fname=sTemp; #else fname=argv[argc-1]; #endif //!!REGISTERS STANDARDS LIBS sq_pushroottable(v); sqstd_register_bloblib(v); sqstd_register_iolib(v); sqstd_register_systemlib(v); sqstd_register_mathlib(v); sqstd_register_stringlib(v); //!!EXECUTE A SCTIPT if(SQ_FAILED(sqstd_dofile(v,fname,SQFalse,SQTrue))) { PrintError(v); _getch(); } } //!! CLEANUP sq_rdbg_shutdown(rdbg); } else { PrintError(v); } sq_close(v); return 0; }