Использование 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 делает.

Другие вопросы по тегам