diff -r 4866573c6944 -r 2523d03a840e librazor/lua.c --- a/librazor/lua.c Thu Feb 05 22:43:29 2009 +0000 +++ b/librazor/lua.c Wed Apr 29 17:00:01 2009 +0100 @@ -289,6 +289,66 @@ return retval; } +struct razor_lua_loader { + uint32_t name; + lua_CFunction func; +}; + +static struct razor_preload { + int init; + struct hashtable modules; + struct array name_pool; + struct array loaders; +} razor_preload = {0}; + +RAZOR_EXPORT void razor_set_lua_loader(const char *modname, void (*loader)()) +{ + uint32_t name; + struct razor_lua_loader *ploader, *end; + + if (!razor_preload.init) { + razor_preload.init = 1; + array_init(&razor_preload.name_pool); + array_init(&razor_preload.loaders); + hashtable_init(&razor_preload.modules, + &razor_preload.name_pool); + } + + name = hashtable_tokenize(&razor_preload.modules, modname); + + end = razor_preload.loaders.data + razor_preload.loaders.size; + for(ploader = razor_preload.loaders.data; ploader < end; ploader++) + if (ploader->name == name) { + ploader->func = loader; + return; + } + + ploader = array_add(&razor_preload.loaders, sizeof(*ploader)); + ploader->name = name; + ploader->func = loader; +} + +static void razor_lua_preload(lua_State *L) +{ + struct razor_lua_loader *ploader, *end; + + if (!razor_preload.init) + return; + + lua_getfield(L, LUA_GLOBALSINDEX, "package"); + lua_getfield(L, -1, "preload"); + lua_remove(L, -2); + + end = razor_preload.loaders.data + razor_preload.loaders.size; + for(ploader = razor_preload.loaders.data; ploader < end; ploader++) { + lua_pushcfunction(L, ploader->func); + lua_setfield(L, -2, + razor_preload.name_pool.data + ploader->name); + } + + lua_pop(L, 1); +} + int run_lua_script(const char *root, const char *name, const char *body, ssize_t len) { @@ -303,6 +363,7 @@ L = lua_newstate(alloc_lua, &rl); luaL_openlibs(L); + razor_lua_preload(L); lua_getglobal(L, "require"); lua_pushstring(L, "posix"); if (lua_pcall(L, 1, 1, 0)) {