/*
 * load squirrel script from given file name
 */
bool loadScript(const char* fname) {
    FILE* fp = fopen(fname, "r");
    if (fp == NULL) {
        engine->setLastError(ERR_SCRIPT_OPEN);
        LOGW("loadScript: failed to open main script file");
        LOGW(fname);
        return false;
    }
    if (SQ_SUCCEEDED(sq_compile(engine->sqvm, sq_lexer_fp, fp, fname, SQTrue))) {
        sq_pushroottable(engine->sqvm);
        if (SQ_FAILED(sq_call(engine->sqvm, 1, SQFalse, SQTrue))) {
            engine->setLastError(ERR_SCRIPT_CALL_ROOT);
            LOGW("loadScript: failed to sq_call");
            LOGW(fname);
            fclose(fp);
            return false;
        }
    } else {
        engine->setLastError(ERR_SCRIPT_COMPILE);
        LOGW("loadScript: failed to compile squirrel script");
        LOGW(fname);
        fclose(fp);
        return false;
    }

    fclose(fp);
    return true;
}
Ejemplo n.º 2
0
SQRESULT CompileNutFile(HSQUIRRELVM v, const char *filename)
{
	SQRESULT r = -1;

	FILE *f=fopen(filename,"rb");
	if(f)
	{
		r = sq_compile(v,file_lexfeedASCII, f, filename, 1);

		fclose(f);
	}

	return r;
}
bool SquirrelScriptContext::ExecuteString(const char* string)
{
	SQRESULT result = 0;

	// Compile from string and push function onto the stack
	m_currentStringProgram = string;
	result = sq_compile(
		m_vm,
		SquirrelReadCallback,
		this,
		"some script",
		SQTrue);
	if (result != SQ_OK) return false;

	// Push root table (environment)
	sq_pushroottable(m_vm);

	// Execute function
	result = sq_call(m_vm, 1 /* root table */, SQFalse, SQTrue);
	sq_pop(m_vm, 1); // Pop function

	return result == SQ_OK;
}
/*
 * Load squirrel script from asset
 */
bool loadScriptFromAsset(const char* fname) {

    std::string fpath = std::string( SQUIRREL_SCRIPT_DIR );
    fpath.append(fname);

    /*
     * read squirrel script from asset
     */
    AAssetManager* mgr = engine->app->activity->assetManager;
    if (mgr == NULL) {
        engine->setLastError(ERR_SCRIPT_LOAD);
        LOGE("loadScriptFromAsset: failed to load AAssetManager");
        return false;
    }

    AAsset* asset = AAssetManager_open(mgr, fpath.c_str(), AASSET_MODE_UNKNOWN);
    if (asset == NULL) {
        engine->setLastError(ERR_SCRIPT_OPEN);
        LOGW("loadScriptFromAsset: failed to open main script file");
        LOGW(fname);
        return false;
    }

    unsigned short sqtag;
    bool isByteCode = false;
    if (AAsset_read(asset, &sqtag, 2) > 0) {
        if (sqtag == SQ_BYTECODE_STREAM_TAG) {
            isByteCode = true;
        }
        AAsset_seek(asset, 0, SEEK_SET);
    } else {
        AAsset_close(asset);
        return false;
    }

    if (isByteCode
            && SQ_SUCCEEDED(sq_readclosure(engine->sqvm, sq_lexer_bytecode, asset))) {
        sq_pushroottable(engine->sqvm);
        if (SQ_FAILED(sq_call(engine->sqvm, 1, SQFalse, SQTrue))) {
            engine->setLastError(ERR_SCRIPT_CALL_ROOT);
            LOGW("loadScriptFromAsset: failed to sq_call");
            LOGW(fname);
            AAsset_close(asset);
            return false;
        }
    } else if (!isByteCode
            && SQ_SUCCEEDED(sq_compile(engine->sqvm, sq_lexer_asset, asset, fname, SQTrue))) {
        sq_pushroottable(engine->sqvm);
        if (SQ_FAILED(sq_call(engine->sqvm, 1, SQFalse, SQTrue))) {
            engine->setLastError(ERR_SCRIPT_CALL_ROOT);
            LOGW("loadScriptFromAsset: failed to sq_call");
            LOGW(fname);
            AAsset_close(asset);
            return false;
        }
    } else {
        engine->setLastError(ERR_SCRIPT_COMPILE);
        LOGW("loadScriptFromAsset: failed to compile squirrel script");
        LOGW(fname);
        AAsset_close(asset);
        return false;
    }

    AAsset_close(asset);

    return true;
}
Ejemplo n.º 5
0
void compile_script(HSQUIRRELVM vm, std::istream& in, const std::string& sourcename)
{
  if(SQ_FAILED(sq_compile(vm, squirrel_read_char, &in, sourcename.c_str(), true)))
    throw SquirrelError(vm, "Couldn't parse script");
}