static void _addrexmatch( HSQUIRRELVM v, const SQChar *str, const SQChar *begin, const SQChar *end ) { sq_newtable( v ); sq_pushstring( v, _SC( "begin" ), -1 ); sq_pushinteger( v, begin - str ); sq_rawset( v, -3 ); sq_pushstring( v, _SC( "end" ), -1 ); sq_pushinteger( v, end - str ); sq_rawset( v, -3 ); }
static SQRESULT sq_mysql_result_row_as_table(HSQUIRRELVM v){ SQ_FUNC_VARS(v); GET_mysql_result_INSTANCE(); SQ_OPT_INTEGER(v, 2, row, -1); if(row < 0){ sq_pushstring(v, _curr_row_key, -1); if(sq_get(v, 1) == SQ_OK){ sq_getinteger(v, -1, &row); } } int row_count = dlmysql_num_rows(self); if(row < 0 || row >= row_count) return sq_throwerror(v, _SC("invalid row (" _PRINT_INT_FMT ")"), row); int col_count = dlmysql_num_fields(self); sq_newtableex(v, col_count); dlmysql_data_seek(self, row); const MYSQL_ROW res_row = dlmysql_fetch_row(self); unsigned long *lengths = dlmysql_fetch_lengths(self); MYSQL_FIELD *fields = dlmysql_fetch_fields(self); for(int i=0; i < col_count; ++i){ sq_pushstring(v, fields[i].name, -1); sq_pushstring(v, (const SQChar*)res_row[i], lengths[i]); sq_rawset(v, -3); } return 1; }
void SQDbgServer::SerializeState() { sq_pushnull(_v); sq_setdebughook(_v); sq_pushnull(_v); sq_seterrorhandler(_v); const SQChar *sz; sq_pushobject(_v,_serializefunc); sq_pushobject(_v,_debugroot); sq_pushstring(_v,_SC("watches"),-1); sq_newtable(_v); for(WatchSetItor i=_watches.begin(); i!=_watches.end(); ++i) { sq_pushinteger(_v,i->_id); sq_pushstring(_v,i->_exp.c_str(),(int)i->_exp.length()); sq_createslot(_v,-3); } sq_rawset(_v,-3); if(SQ_SUCCEEDED(sq_call(_v,1,SQTrue,SQTrue))){ if(SQ_SUCCEEDED(sqstd_getblob(_v,-1,(SQUserPointer*)&sz))) SendChunk(sz); } sq_pop(_v,2); SetErrorHandlers(); }
/* static */ bool ScriptInstance::LoadObjects(HSQUIRRELVM vm) { SlObject(NULL, _script_byte); switch (_script_sl_byte) { case SQSL_INT: { int value; SlArray(&value, 1, SLE_INT32); if (vm != NULL) sq_pushinteger(vm, (SQInteger)value); return true; } case SQSL_STRING: { SlObject(NULL, _script_byte); static char buf[256]; SlArray(buf, _script_sl_byte, SLE_CHAR); if (vm != NULL) sq_pushstring(vm, OTTD2SQ(buf), -1); return true; } case SQSL_ARRAY: { if (vm != NULL) sq_newarray(vm, 0); while (LoadObjects(vm)) { if (vm != NULL) sq_arrayappend(vm, -2); /* The value is popped from the stack by squirrel. */ } return true; } case SQSL_TABLE: { if (vm != NULL) sq_newtable(vm); while (LoadObjects(vm)) { LoadObjects(vm); if (vm != NULL) sq_rawset(vm, -3); /* The key (-2) and value (-1) are popped from the stack by squirrel. */ } return true; } case SQSL_BOOL: { SlObject(NULL, _script_byte); if (vm != NULL) sq_pushinteger(vm, (SQBool)(_script_sl_byte != 0)); return true; } case SQSL_NULL: { if (vm != NULL) sq_pushnull(vm); return true; } case SQSL_ARRAY_TABLE_END: { return false; } default: NOT_REACHED(); } }
BOOL SquirrelObject::SetValue(const SquirrelObject &key,const SquirrelObject &val) { BOOL ret = FALSE; int top = sq_gettop(m_Vm.GetVMPtr()); sq_pushobject(m_Vm.GetVMPtr(),_o); sq_pushobject(m_Vm.GetVMPtr(),key._o); sq_pushobject(m_Vm.GetVMPtr(),val._o); if(SQ_SUCCEEDED(sq_rawset(m_Vm.GetVMPtr(),-3))) { ret = TRUE; } sq_settop(m_Vm.GetVMPtr(),top); return ret; }
static SQRESULT sq_minizip_unzip_get_file_info(HSQUIRRELVM v) { SQ_FUNC_VARS_NO_TOP(v); GET_minizip_unzip_INSTANCE(); char filename_inzip[LZ_MAX_ZIP_NAME_SIZE]; unz_file_info64 file_info; int err = unzGetCurrentFileInfo64(self,&file_info,filename_inzip,LZ_MAX_ZIP_NAME_SIZE,NULL,0,NULL,0); if (err!=UNZ_OK) { return sq_throwerror(v, _SC("error %d with zipfile in unzGetCurrentFileInfo\n"),err); } sq_newtable(v); sq_pushliteral(v, "name"); sq_pushstring(v, filename_inzip, -1); sq_rawset(v, -3); sq_pushliteral(v, "size"); sq_pushinteger(v, file_info.uncompressed_size); sq_rawset(v, -3); sq_pushliteral(v, "is_dir"); sq_pushbool(v, file_info.external_fa & ZIP_DOS_DIR_ATTRIBUTE_BITFLAG); sq_rawset(v, -3); return 1; }
/*fa MTR_ScriptsRegisterVariable_s yes */ MTR_DCLSPC bool MTR_CALL MTR_ScriptsRegisterVariable_s(const char *name, const char *value) { if ((name != NULL) && (strcmp(name, "") != 0)) { sq_pushroottable(mtrVm); sq_pushstring(mtrVm, name, -1); sq_pushstring(mtrVm, value, -1); sq_rawset(mtrVm, -3); sq_poptop(mtrVm); MTR_LogWrite_s("Script const added:", 3, MTR_LMT_INFO, name); return true; } else { MTR_LogWrite("Script const not added. Incorrect const name:", 3, MTR_LMT_ERROR); } return false; }
char *ScriptEventAdminPort::ReadTable(HSQUIRRELVM vm, char *p) { sq_newtable(vm); SKIP_EMPTY(p); if (*p++ != '{') RETURN_ERROR(1); for (;;) { SKIP_EMPTY(p); if (*p++ != '"') RETURN_ERROR(1); p = ReadString(vm, p); if (p == NULL) { sq_pop(vm, 1); return NULL; } SKIP_EMPTY(p); if (*p++ != ':') RETURN_ERROR(2); p = this->ReadValue(vm, p); if (p == NULL) { sq_pop(vm, 2); return NULL; } sq_rawset(vm, -3); /* The key (-2) and value (-1) are popped from the stack by squirrel. */ SKIP_EMPTY(p); if (*p == ',') { p++; continue; } break; } SKIP_EMPTY(p); if (*p++ != '}') RETURN_ERROR(1); return p; }
void SQDbgServer::SerializeState(HSQUIRRELVM v) { sq_pushnull(v); sq_setdebughook(v); sq_pushnull(v); sq_seterrorhandler(v); sq_pushobject(v, _serializefunc); sq_pushobject(v, _debugroot); sq_pushstring(v, _SC("watches"), -1); sq_newtable(v); for (WatchSetItor i = _watches.begin(); i != _watches.end(); ++i) { sq_pushinteger(v, i->_id); sq_pushstring(v, i->_exp.c_str(), (SQInteger) i->_exp.length()); sq_createslot(v, -3); } sq_rawset(v, -3); if (SQ_SUCCEEDED(sq_call(v, 1, SQTrue, SQFalse))) { //if(SQ_SUCCEEDED(sqstd_getblob(v,-1,(SQUserPointer*)&sz))) //SendChunk(sz); } sq_pop(v, 2); SetErrorHandlers(v); }
static SQInteger table_rawset(HSQUIRRELVM v) { return sq_rawset(v,-3); }
static void _set_integer_slot(HSQUIRRELVM v,const SQChar *name,SQInteger val) { sq_pushstring(v,name,-1); sq_pushinteger(v,val); sq_rawset(v,-3); }
static SQInteger container_rawset(HSQUIRRELVM v) { return sq_rawset(v,-3); }
int Xml_eval(HSQUIRRELVM v) { SQ_FUNC_VARS_NO_TOP(v); SQChar* str = 0; size_t str_size=0; if(sq_gettype(v,2) == OT_USERPOINTER) sq_getuserpointer(v, 2, &str); else { SQ_GET_STRING(v, 2, sTmp); str = (SQChar*)sq_malloc(sTmp_size+(sizeof(SQChar))); memcpy(str, sTmp, sTmp_size); str[sTmp_size]=0; str_size = sTmp_size; } Tokenizer* tok = Tokenizer_new(str, str_size ? str_size : scstrlen(str)); sq_settop(v,0); const SQChar* token=0; int firstStatement = 1; while((token=Tokenizer_next(tok))!=0) if(token[0]==OPN) { // new tag found if(sq_gettop(v)) { int newIndex=sq_size(v,-1)+1; sq_pushinteger(v,newIndex); sq_newtable(v); sq_set(v, -3); sq_pushinteger(v,newIndex); sq_get(v,-2); } else { if (firstStatement) { sq_newtable(v); firstStatement = 0; } else return lua_gettop(L); } // set metatable: sq_newtable(v); sq_pushliteral(v, _SC("__index")); sq_getglobal(v, "xml"); lua_settable(v, -3); sq_pushliteral(v, _SC("__tostring")); // set __tostring metamethod lua_getglobal(L, "xml"); lua_pushliteral(L,"str"); lua_gettable(v, -2); sq_remove(v, -2); sq_set(v, -3); lua_setmetatable(L, -2); // parse tag and content: sq_pushinteger(v,0); // use index 0 for storing the tag sq_pushstring(v, Tokenizer_next(tok), -1); sq_set(v, -3); while(((token = Tokenizer_next(tok))!=0)&&(token[0]!=CLS)&&(token[0]!=ESC)) { // parse tag header size_t sepPos=find(token, "=", 0); if(token[sepPos]) { // regular attribute const SQChar* aVal =token+sepPos+2; sq_pushstring(v, token, sepPos); size_t lenVal = strlen(aVal)-1; if(!lenVal) Xml_pushDecode(v, _SC(""), 0); else Xml_pushDecode(v, aVal, lenVal); sq_set(v, -3); } } if(!token||(token[0]==ESC)) { if(sq_gettop(v)>1) sq_settop(v,-2); // this tag has no content, only attributes else break; } } else if(token[0]==ESC) { // previous tag is over if(sq_gettop(v)>1) sq_settop(v,-2); // pop current table else break; } else { // read elements sq_pushinteger(v,sq_size(v,-1)+1); Xml_pushDecode(v, token, 0); sq_rawset(v, -3); } Tokenizer_delete(tok); sq_free(str); return sq_gettop(v); }