SQInteger _stream_len(HSQUIRRELVM v) { SETUP_STREAM(v); sq_pushinteger(v, self->Len()); return 1; }
SQInteger time_millis(HSQUIRRELVM v) { sq_pushinteger(v,millis()); //push the number of arguments as return value return 1; //1 because 1 value is returned }
void CScripts::Call(RakNet::BitStream * bitStream) { for(int i = 0; i < MAX_SCRIPTS; i++) { if(m_pScripts[i]) { int iArgCount = 0; int funcLen = 0; CHAR szFunc[256]; bitStream->Read(funcLen); bitStream->Read(iArgCount); bitStream->Read(szFunc, funcLen); szFunc[funcLen] = '\0'; // get the script vm pointer SQVM * pVM = m_pScripts[i]->GetVM(); // Get the stack top int iTop = sq_gettop(pVM); // Push the root table onto the stack sq_pushroottable(pVM); // Push the function name onto the stack sq_pushstring(pVM, szFunc, -1); if(SQ_SUCCEEDED(sq_get(pVM, -2))) { // Push the root table onto the stack sq_pushroottable(pVM); if(iArgCount > 0) { for(int j = 0; i < iArgCount; i++) { int type; bitStream->Read(type); if(type == OT_INTEGER) { int val; bitStream->Read(val); sq_pushinteger(pVM, val); } else if(type == OT_FLOAT) { float val; bitStream->Read(val); sq_pushfloat(pVM, val); } else if(type == OT_BOOL) { bool val; bitStream->Read(val); sq_pushbool(pVM, val); } else if(type == OT_STRING) { int len; bitStream->Read(len); CHAR szStr[256]; bitStream->Read(szStr, len); szStr[len] = '\0'; std::string str = szStr; sq_pushstring(pVM, str.c_str(), -1); } } } sq_call(pVM, iArgCount + 1, true, true); } // Restore the stack top sq_settop(pVM, iTop); bitStream->ResetReadPointer(); } } }
template <> inline int Return<int32> (HSQUIRRELVM vm, int32 res) { sq_pushinteger(vm, res); return 1; }
template <> inline int Return<Money> (HSQUIRRELVM vm, Money res) { sq_pushinteger(vm, ClampToI32(res)); return 1; }
/* * Use simple log without tag * * This takes no effect on Android */ SQInteger emoEnableSimpleLogWithLevel(HSQUIRRELVM v) { sq_pushinteger(v, ERR_NOT_SUPPORTED); return 1; }
static SQInteger _regexp_subexpcount(HSQUIRRELVM v) { SETUP_REX(v); sq_pushinteger(v,sqstd_rex_getsubexpcount(self)); return 1; }
void RegisterVariable(HSQUIRRELVM pVM, const char * szVarName, int iValue) { sq_pushstring(pVM, szVarName, -1); sq_pushinteger(pVM, iValue); sq_createslot(pVM, -3); }
/* * returns audio channel count */ SQInteger emoGetAudioChannelCount(HSQUIRRELVM v) { sq_pushinteger(v, engine->audio->getChannelCount()); return 1; }
BOOL SquirrelObject::SetValue(int key,int n) { _SETVALUE_INT_BEGIN sq_pushinteger(m_Vm.GetVMPtr(),n); _SETVALUE_INT_END }
BOOL SquirrelObject::SetValue(const SQChar *key,int n) { _SETVALUE_STR_BEGIN sq_pushinteger(m_Vm.GetVMPtr(),n); _SETVALUE_STR_END }
static SQInteger sqlang_sr_modf (HSQUIRRELVM J) { int ret; char *sqlangv[MAX_ACTIONS]; char *argv[MAX_ACTIONS]; int argc; int i; int mod_type; struct run_act_ctx ra_ctx; unsigned modver; struct action *act; sr31_cmd_export_t* expf; sr_sqlang_env_t *env_J; ret = 1; act = NULL; argc = 0; memset(sqlangv, 0, MAX_ACTIONS*sizeof(char*)); memset(argv, 0, MAX_ACTIONS*sizeof(char*)); env_J = sqlang_sr_env_get(); if(env_J->msg==NULL) goto error; argc = sqlang_gettop(J); if(argc==0) { LM_ERR("name of module function not provided\n"); goto error; } if(argc>=MAX_ACTIONS) { LM_ERR("too many parameters\n"); goto error; } /* first is function name, then parameters */ for(i=0; i<argc; i++) { if (!sqlang_isstring(J, i)) { LM_ERR("invalid parameter type (%d)\n", i); goto error; } sqlangv[i] = (char*)sqlang_to_string(J, i); } LM_ERR("request to execute cfg function '%s'\n", sqlangv[0]); /* pkg copy only parameters */ for(i=1; i<MAX_ACTIONS; i++) { if(sqlangv[i]!=NULL) { argv[i] = (char*)pkg_malloc(strlen(sqlangv[i])+1); if(argv[i]==NULL) { LM_ERR("no more pkg\n"); goto error; } strcpy(argv[i], sqlangv[i]); } } expf = find_export_record(sqlangv[0], argc-1, 0, &modver); if (expf==NULL) { LM_ERR("function '%s' is not available\n", sqlangv[0]); goto error; } /* check fixups */ if (expf->fixup!=NULL && expf->free_fixup==NULL) { LM_ERR("function '%s' has fixup - cannot be used\n", sqlangv[0]); goto error; } switch(expf->param_no) { case 0: mod_type = MODULE0_T; break; case 1: mod_type = MODULE1_T; break; case 2: mod_type = MODULE2_T; break; case 3: mod_type = MODULE3_T; break; case 4: mod_type = MODULE4_T; break; case 5: mod_type = MODULE5_T; break; case 6: mod_type = MODULE6_T; break; case VAR_PARAM_NO: mod_type = MODULEX_T; break; default: LM_ERR("unknown/bad definition for function '%s' (%d params)\n", sqlangv[0], expf->param_no); goto error; } act = mk_action(mod_type, argc+1 /* number of (type, value) pairs */, MODEXP_ST, expf, /* function */ NUMBER_ST, argc-1, /* parameter number */ STRING_ST, argv[1], /* param. 1 */ STRING_ST, argv[2], /* param. 2 */ STRING_ST, argv[3], /* param. 3 */ STRING_ST, argv[4], /* param. 4 */ STRING_ST, argv[5], /* param. 5 */ STRING_ST, argv[6] /* param. 6 */ ); if (act==NULL) { LM_ERR("action structure could not be created for '%s'\n", sqlangv[0]); goto error; } /* handle fixups */ if (expf->fixup) { if(argc==1) { /* no parameters */ if(expf->fixup(0, 0)<0) { LM_ERR("Error in fixup (0) for '%s'\n", sqlangv[0]); goto error; } } else { for(i=1; i<argc; i++) { if(expf->fixup(&(act->val[i+1].u.data), i)<0) { LM_ERR("Error in fixup (%d) for '%s'\n", i, sqlangv[0]); goto error; } act->val[i+1].type = MODFIXUP_ST; } } } init_run_actions_ctx(&ra_ctx); ret = do_action(&ra_ctx, act, env_J->msg); /* free fixups */ if (expf->fixup) { for(i=1; i<argc; i++) { if ((act->val[i+1].type == MODFIXUP_ST) && (act->val[i+1].u.data)) { expf->free_fixup(&(act->val[i+1].u.data), i); } } } pkg_free(act); for(i=0; i<MAX_ACTIONS; i++) { if(argv[i]!=NULL) pkg_free(argv[i]); argv[i] = 0; } sq_pushinteger(J, ret); return 1; error: if(act!=NULL) pkg_free(act); for(i=0; i<MAX_ACTIONS; i++) { if(argv[i]!=NULL) pkg_free(argv[i]); argv[i] = 0; } sq_pushinteger(J, -1); return 1; }
int app_sqlang_return_error(HSQUIRRELVM J) { sq_pushinteger(J, -1); return 1; }
int app_sqlang_return_int(HSQUIRRELVM J, int v) { sq_pushinteger(J, v); return 1; }
/* * get elapsed time from stop watch */ SQInteger emoRuntimeStopwatchElapsed(HSQUIRRELVM v) { sq_pushinteger(v, engine->stopwatchElapsed()); return 1; }
/** * 現在時刻の取得 */ SQRESULT Thread::global_getCurrentTick(HSQUIRRELVM v) { sq_pushinteger(v, currentTick); return 1; }
/* * invoke garbage collection */ SQInteger emoRuntimeGC(HSQUIRRELVM v) { sq_pushinteger(v, sq_collectgarbage(v)); return 1; }
/** * 差分時刻の取得 */ SQRESULT Thread::global_getDiffTick(HSQUIRRELVM v) { sq_pushinteger(v, diffTick); return 1; }
SQInteger AIList::Valuate(HSQUIRRELVM vm) { this->modifications++; /* The first parameter is the instance of AIList. */ int nparam = sq_gettop(vm) - 1; if (nparam < 1) { return sq_throwerror(vm, _SC("You need to give a least a Valuator as parameter to AIList::Valuate")); } /* Make sure the valuator function is really a function, and not any * other type. It's parameter 2 for us, but for the user it's the * first parameter they give. */ SQObjectType valuator_type = sq_gettype(vm, 2); if (valuator_type != OT_CLOSURE && valuator_type != OT_NATIVECLOSURE) { return sq_throwerror(vm, _SC("parameter 1 has an invalid type (expected function)")); } /* Don't allow docommand from a Valuator, as we can't resume in * mid C++-code. */ bool backup_allow = AIObject::GetAllowDoCommand(); AIObject::SetAllowDoCommand(false); /* Push the function to call */ sq_push(vm, 2); for (AIListMap::iterator iter = this->items.begin(); iter != this->items.end(); iter++) { /* Check for changing of items. */ int previous_modification_count = this->modifications; /* Push the root table as instance object, this is what squirrel does for meta-functions. */ sq_pushroottable(vm); /* Push all arguments for the valuator function. */ sq_pushinteger(vm, (*iter).first); for (int i = 0; i < nparam - 1; i++) { sq_push(vm, i + 3); } /* Call the function. Squirrel pops all parameters and pushes the return value. */ if (SQ_FAILED(sq_call(vm, nparam + 1, SQTrue, SQTrue))) { AIObject::SetAllowDoCommand(backup_allow); return SQ_ERROR; } /* Retreive the return value */ SQInteger value; switch (sq_gettype(vm, -1)) { case OT_INTEGER: { sq_getinteger(vm, -1, &value); break; } case OT_BOOL: { SQBool v; sq_getbool(vm, -1, &v); value = v ? 1 : 0; break; } default: { /* See below for explanation. The extra pop is the return value. */ sq_pop(vm, nparam + 4); AIObject::SetAllowDoCommand(backup_allow); return sq_throwerror(vm, _SC("return value of valuator is not valid (not integer/bool)")); } } /* Was something changed? */ if (previous_modification_count != this->modifications) { /* See below for explanation. The extra pop is the return value. */ sq_pop(vm, nparam + 4); AIObject::SetAllowDoCommand(backup_allow); return sq_throwerror(vm, _SC("modifying valuated list outside of valuator function")); } this->SetValue((*iter).first, value); /* Pop the return value. */ sq_poptop(vm); Squirrel::DecreaseOps(vm, 5); } /* Pop from the squirrel stack: * 1. The root stable (as instance object). * 2. The valuator function. * 3. The parameters given to this function. * 4. The AIList instance object. */ sq_pop(vm, nparam + 3); AIObject::SetAllowDoCommand(backup_allow); return 0; }
char *ScriptEventAdminPort::ReadValue(HSQUIRRELVM vm, char *p) { SKIP_EMPTY(p); if (strncmp(p, "false", 5) == 0) { sq_pushinteger(vm, 0); return p + 5; } if (strncmp(p, "true", 4) == 0) { sq_pushinteger(vm, 1); return p + 4; } if (strncmp(p, "null", 4) == 0) { sq_pushnull(vm); return p + 4; } switch (*p) { case '"': { /* String */ p = ReadString(vm, ++p); if (p == NULL) return NULL; break; } case '{': { /* Table */ p = this->ReadTable(vm, p); if (p == NULL) return NULL; break; } case '[': { /* Array */ sq_newarray(vm, 0); while (*p++ != ']') { p = this->ReadValue(vm, p); if (p == NULL) { sq_pop(vm, 1); return NULL; } sq_arrayappend(vm, -2); SKIP_EMPTY(p); if (*p == ',') continue; if (*p == ']') break; RETURN_ERROR(1); } p++; break; } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': case '-': { /* Integer */ const char *value = p++; for (;;) { switch (*p++) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': continue; default: break; } p--; break; } int res = atoi(value); sq_pushinteger(vm, (SQInteger)res); break; } default: RETURN_ERROR(0); } return p; }
template <> inline int Return<uint16> (HSQUIRRELVM vm, uint16 res) { sq_pushinteger(vm, (int32)res); return 1; }
static SQInteger math_rand(HSQUIRRELVM v) { sq_pushinteger(v,rand()); return 1; }
template <> inline int Return<int64> (HSQUIRRELVM vm, int64 res) { sq_pushinteger(vm, ClampToI32(res)); return 1; }
/* * Returns Android SDK version */ SQInteger emoRuntimeAndroidGetSDKVersion(HSQUIRRELVM v) { sq_pushinteger(v, engine->javaGlue->getSDKVersion()); return 1; }
void Squirrel::AddConst(const char *var_name, int value) { sq_pushstring(this->vm, OTTD2SQ(var_name), -1); sq_pushinteger(this->vm, value); sq_newslot(this->vm, -3, SQTrue); }
/* * Returns Android Native Orientation * * See: http://www.badlogicgames.com/wordpress/?p=2041 */ SQInteger emoRuntimeAndroidGetNativeOrientation(HSQUIRRELVM v) { sq_pushinteger(v, engine->nativeOrientation); return 1; }
SQInteger time_micros(HSQUIRRELVM v) { sq_pushinteger(v,micros()); return 1; }
/* * returns build number of the library */ SQInteger emoRuntimeBuildNumber(HSQUIRRELVM v) { sq_pushinteger(v, EMO_BUILD_NUMBER); return 1; }
static SQInteger base_collectgarbage(HSQUIRRELVM v) { sq_pushinteger(v, sq_collectgarbage(v)); return 1; }
SQInteger _stream_tell(HSQUIRRELVM v) { SETUP_STREAM(v); sq_pushinteger(v, self->Tell()); return 1; }