Использование Lua "require" изнутри zip с помощью Physfs
При использовании Physfs загрузка и запуск lua-скрипта достаточно просты, если использовать luaL_dostring и читать файл в себе, но когда дело доходит до использования "require", у него явно возникают проблемы.
Кто-нибудь занимался этой проблемой? Мне нужно.... переписать часть lua? Я бы действительно предпочел не делать этого!
Спасибо.
Обновите, вот как я заставил его работать
static int MyLoader(lua_State *L)
{
const char *name = luaL_checkstring(L, 1);
std::string s = name;
std::replace( s.begin(), s.end(), '.', '/'); // replace all '.' to '/'
s += ".lua"; // apend .lua
File moduleFile = FileManager::ReadFile(s.c_str());
if( luaL_loadbuffer(L, moduleFile.data, moduleFile.fileLength, name) ) {
lua_pop(L, 1);
}
return 1;
}
а затем после создания состояния lua...
lua_register(L, "my_loader", MyLoader);
const char* str = "table.insert(package.searchers, 2, my_loader) \n";
luaL_dostring(L, str);
1 ответ
Решение
В package.searchers
таблица содержит список функций загрузчика дляrequire
.
Если хочешь require
для загрузки файлов из zip-файла вам нужно будет добавить функцию, которая проверяет zip-файл. Если путь существует в zip-файле, извлеките его в буфер памяти и вызовитеluaL_loadbuffer
а также checkload
, подобно searcher_Lua
делает.