SQInteger _stream_len(HSQUIRRELVM v)
{
    SETUP_STREAM(v);
    sq_pushinteger(v, self->Len());
    return 1;
}
Exemple #2
0
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
}
Exemple #3
0
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; }
Exemple #6
0
/*
 * 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;
}
Exemple #8
0
void RegisterVariable(HSQUIRRELVM pVM, const char * szVarName, int iValue)
{
    sq_pushstring(pVM, szVarName, -1);
    sq_pushinteger(pVM, iValue);
    sq_createslot(pVM, -3);
}
Exemple #9
0
/*
 * returns audio channel count
 */
SQInteger emoGetAudioChannelCount(HSQUIRRELVM v) {
    sq_pushinteger(v, engine->audio->getChannelCount());
    return 1;

}
Exemple #10
0
BOOL SquirrelObject::SetValue(int key,int n)
{
	_SETVALUE_INT_BEGIN
	sq_pushinteger(m_Vm.GetVMPtr(),n);
	_SETVALUE_INT_END
}
Exemple #11
0
BOOL SquirrelObject::SetValue(const SQChar *key,int n)
{
	_SETVALUE_STR_BEGIN
	sq_pushinteger(m_Vm.GetVMPtr(),n);
	_SETVALUE_STR_END
}
Exemple #12
0
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;
}
Exemple #13
0
int app_sqlang_return_error(HSQUIRRELVM J)
{
	sq_pushinteger(J, -1);
	return 1;
}
Exemple #14
0
int app_sqlang_return_int(HSQUIRRELVM J, int v)
{
	sq_pushinteger(J, v);
	return 1;
}
Exemple #15
0
/*
 * get elapsed time from stop watch
 */
SQInteger emoRuntimeStopwatchElapsed(HSQUIRRELVM v) {
    sq_pushinteger(v, engine->stopwatchElapsed());
    return 1;
}
Exemple #16
0
/**
 * 現在時刻の取得
 */
SQRESULT
Thread::global_getCurrentTick(HSQUIRRELVM v)
{
	sq_pushinteger(v, currentTick);
	return 1;
}
Exemple #17
0
/*
 * invoke garbage collection
 */
SQInteger emoRuntimeGC(HSQUIRRELVM v) {
    sq_pushinteger(v, sq_collectgarbage(v));
    return 1;
}
Exemple #18
0
/**
 * 差分時刻の取得
 */
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;
}
Exemple #20
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;
}
Exemple #21
0
	template <> inline int Return<uint16>      (HSQUIRRELVM vm, uint16 res)      { sq_pushinteger(vm, (int32)res); return 1; }
Exemple #22
0
static SQInteger math_rand(HSQUIRRELVM v)
{
	sq_pushinteger(v,rand());
	return 1;
}
Exemple #23
0
	template <> inline int Return<int64>       (HSQUIRRELVM vm, int64 res)       { sq_pushinteger(vm, ClampToI32(res)); return 1; }
Exemple #24
0
/*
 * 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);
}
Exemple #26
0
/*
 * Returns Android Native Orientation
 * 
 * See: http://www.badlogicgames.com/wordpress/?p=2041
 */
SQInteger emoRuntimeAndroidGetNativeOrientation(HSQUIRRELVM v) {
    sq_pushinteger(v, engine->nativeOrientation);
    return 1;
}
Exemple #27
0
SQInteger time_micros(HSQUIRRELVM v)
{
	sq_pushinteger(v,micros());
    return 1;
}
Exemple #28
0
/*
 * returns build number of the library
 */
SQInteger emoRuntimeBuildNumber(HSQUIRRELVM v) {
    sq_pushinteger(v, EMO_BUILD_NUMBER);
    return 1;
}
Exemple #29
0
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;
}