static void io_writeto() { lua_Object f = lua_getparam(FIRSTARG); if (f == LUA_NOOBJECT) { closefile(FOUTPUT); setreturn(2, FOUTPUT); } else if (lua_tag(f) == gettag(IOTAG)) { int32 id = lua_getuserdata(f); LuaFile *current = getfile(id); if (!current->isOpen()) { pushresult(0); return; } setreturn(id, FOUTPUT); } else { Common::String s = Common::lastPathComponent(luaL_check_string(FIRSTARG), '\\'); LuaFile *current; Common::WriteStream *outFile = NULL; Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); outFile = saveFileMan->openForSaving(s); if (!outFile) { pushresult(0); return; } current = new LuaFile(); current->_out = outFile; current->_filename = s; setreturn(addfile(current), FOUTPUT); } }
static void closefile(const char *name) { LuaFile *f = getfile(name); f->close(); lua_pushobject(lua_getglobal(name)); lua_settag(gettag(CLOSEDTAG)); delete f; }
int LuaScript::Loader(lua_State* L) { // Get module name String fileName(luaL_checkstring(L, 1)); #ifdef URHO3D_LUA_RAW_SCRIPT_LOADER // First attempt to load lua script file from the file system // Attempt to load .luc file first, then fall back to .lua LuaScript* lua = ::GetContext(L)->GetSubsystem<LuaScript>(); if (lua->LoadRawFile(fileName + ".luc") || lua->LoadRawFile(fileName + ".lua")) return 1; #endif ResourceCache* cache = ::GetContext(L)->GetSubsystem<ResourceCache>(); // Attempt to get .luc file first LuaFile* lucFile = cache->GetResource<LuaFile>(fileName + ".luc", false); if (lucFile) return lucFile->LoadChunk(L) ? 1 : 0; // Then try to get .lua file. If this also fails, error is logged and // resource not found event is sent LuaFile* luaFile = cache->GetResource<LuaFile>(fileName + ".lua"); if (luaFile) return luaFile->LoadChunk(L) ? 1 : 0; return 0; }
bool LuaScript::ExecuteFile(const String& fileName) { PROFILE(ExecuteFile); ResourceCache* cache = GetSubsystem<ResourceCache>(); LuaFile* luaFile = cache->GetResource<LuaFile>(fileName); return luaFile && luaFile->LoadAndExecute(luaState_); }
static void io_write() { int32 arg = FIRSTARG; LuaFile *f = (LuaFile *)getfileparam(FOUTPUT, &arg); int32 status = 1; const char *s; while ((s = luaL_opt_string(arg++, NULL)) != NULL) status = status && ((int32)f->write(s, strlen(s)) != EOF); pushresult(status); }
static void io_read() { int32 arg = FIRSTARG; LuaFile *f = (LuaFile *)getfileparam(FINPUT, &arg); char *buff; const char *p = luaL_opt_string(arg, "[^\n]*{\n}"); int inskip = 0; // to control {skips} int c = NEED_OTHER; luaL_resetbuffer(); while (*p) { if (*p == '{') { inskip++; p++; } else if (*p == '}') { if (inskip == 0) lua_error("unbalanced braces in read pattern"); inskip--; p++; } else { const char *ep; // get what is next int m; // match result if (c == NEED_OTHER) { char z; if (f->read(&z, 1) != 1) c = EOF; else c = z; } m = luaI_singlematch((c == EOF) ? 0 : (char)c, p, &ep); if (m) { if (inskip == 0) luaL_addchar(c); c = NEED_OTHER; } switch (*ep) { case '*': // repetition if (!m) p = ep + 1; // else stay in (repeat) the same item break; case '?': // optional p = ep + 1; // continues reading the pattern break; default: if (m) p = ep; // continues reading the pattern else goto break_while; // pattern fails } } } break_while: if (c >= 0) // not EOF nor NEED_OTHER? f->seek(-1, SEEK_CUR); luaL_addchar(0); buff = luaL_buffer(); if (*buff != 0 || *p == 0) // read something or did not fail? lua_pushstring(buff); }
bool LuaScript::ExecuteFile(const String& fileName) { PROFILE(ExecuteFile); #ifdef URHO3D_LUA_RAW_SCRIPT_LOADER if (ExecuteRawFile(fileName)) return true; #endif ResourceCache* cache = GetSubsystem<ResourceCache>(); LuaFile* luaFile = cache->GetResource<LuaFile>(fileName); return luaFile && luaFile->LoadAndExecute(luaState_); }
void LuaScriptInstance::SetScriptFileName(const String& scriptFileName) { if (scriptFileName_ == scriptFileName) return; scriptFileName_ = scriptFileName; if (scriptFileName_.Empty()) return; ResourceCache* cache = GetSubsystem<ResourceCache>(); LuaFile* luaFile = cache->GetResource<LuaFile>(scriptFileName_); if (!luaFile) return; if (!luaFile->LoadAndExecute(luaState_)) LOGERROR("Execute Lua file failed: " + scriptFileName_); }
int LuaScript::Loader(lua_State* L) { ResourceCache* cache = ::GetContext(L)->GetSubsystem<ResourceCache>(); // Get module name const char* name = luaL_checkstring(L, 1); // Attempt to get .luc file first. String lucFileName = String(name) + ".luc"; LuaFile* lucFile = cache->GetResource<LuaFile>(lucFileName, false); if (lucFile) return lucFile->LoadChunk(L) ? 1 : 0; // Then try to get .lua file. If this also fails, error is logged and resource not found event is sent String luaFileName = String(name) + ".lua"; LuaFile* luaFile = cache->GetResource<LuaFile>(luaFileName); if (luaFile) return luaFile->LoadChunk(L) ? 1 : 0; return 0; }