LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { LoadF lf; int status, readstatus; int c; //BEGINNING OF FCEU PS3 char fullFilename[128]; //END OF FCEU PS3 int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ lf.extraline = 0; if (filename == NULL) { lua_pushliteral(L, "=stdin"); lf.f = stdin; } else { //Note: Always open as the requested file, Lua should not care about //our crazy directory remapping lua_pushfstring(L, "@%s", filename); #if (PS3) // On the PS3, check always the /dev_hdd0/game/FCEU90000/USRDIR/Lua/ directory! CheckForValidFilenameWithPath(fullFilename, filename, "/dev_hdd0/game/FCEU90000/USRDIR/Lua/"); #endif //Rest of this code is untouched, we just use fullFilename now! lf.f = fopen(fullFilename, "r"); if (lf.f == NULL) return errfile(L, "open", fnameindex); } c = getc(lf.f); if (c == '#') { /* Unix exec. file? */ lf.extraline = 1; while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ if (c == '\n') c = getc(lf.f); } if (c == LUA_SIGNATURE[0] && fullFilename) { /* binary file? */ lf.f = freopen(fullFilename, "rb", lf.f); /* reopen in binary mode */ if (lf.f == NULL) return errfile(L, "reopen", fnameindex); /* skip eventual `#!...' */ while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ; lf.extraline = 0; } ungetc(c, lf.f); status = lua_load(L, getF, &lf, lua_tostring(L, -1)); readstatus = ferror(lf.f); if (filename) fclose(lf.f); /* close file (even in case of errors) */ if (readstatus) { lua_settop(L, fnameindex); /* ignore results from `lua_load' */ return errfile(L, "read", fnameindex); } lua_remove(L, fnameindex); return status; }
LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { LoadF lf; int status, readstatus; int c; char fullFilename[128]; int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ lf.extraline = 0; if (filename == NULL) { lua_pushliteral(L, "=stdin"); lf.f = stdin; } else { // Note: Always open as the requested file, Lua should not care about // our crazy directory remapping. lua_pushfstring(L, "@%s", filename); #if (PS3) // On the PS3, check always the /app_home/Lua/ directory! // This works both for dev-testing via remote HDD and on the game disc. // These work probably too just for developing, but app_home is fine! // /host_root/Lua/ or /dev_bdvd/PS3_GAME/USRDIR/Lua/ CheckForValidFilenameWithPath(fullFilename, filename, "/app_home/Lua/"); #elif XBOX // For the Xbox we have to make sure always to load files from D:\ because // fopen ALWAYS expects a full paths, there are no current directories on the // Xbox 360 and therefore no relative paths! Check always "D:\Lua\<file>" CheckForValidFilenameWithPath(fullFilename, filename, "D:\\Lua\\"); #else // On the PC we just use the default search logic (see luaconf.h) and we // don't care about directories since we will already be in the correct one! // In earlier versions we had a lot of extra checks here. strcpy(fullFilename, filename); #endif // Rest of this code is untouched, we just use fullFilename now! lf.f = fopen(fullFilename, "r"); if (lf.f == NULL) return errfile(L, "open", fnameindex); } c = getc(lf.f); if (c == '#') { /* Unix exec. file? */ lf.extraline = 1; while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ if (c == '\n') c = getc(lf.f); } if (c == LUA_SIGNATURE[0] && fullFilename) { /* binary file? */ lf.f = freopen(fullFilename, "rb", lf.f); /* reopen in binary mode */ if (lf.f == NULL) return errfile(L, "reopen", fnameindex); /* skip eventual `#!...' */ while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ; lf.extraline = 0; } ungetc(c, lf.f); status = lua_load(L, getF, &lf, lua_tostring(L, -1)); readstatus = ferror(lf.f); if (filename) fclose(lf.f); /* close file (even in case of errors) */ if (readstatus) { lua_settop(L, fnameindex); /* ignore results from `lua_load' */ return errfile(L, "read", fnameindex); } lua_remove(L, fnameindex); return status; }