1.1 --- a/librazor/lua.c Thu Feb 05 22:43:29 2009 +0000
1.2 +++ b/librazor/lua.c Thu May 14 05:55:19 2009 +0100
1.3 @@ -289,6 +289,66 @@
1.4 return retval;
1.5 }
1.6
1.7 +struct razor_lua_loader {
1.8 + uint32_t name;
1.9 + lua_CFunction func;
1.10 +};
1.11 +
1.12 +static struct razor_preload {
1.13 + int init;
1.14 + struct hashtable modules;
1.15 + struct array name_pool;
1.16 + struct array loaders;
1.17 +} razor_preload = {0};
1.18 +
1.19 +RAZOR_EXPORT void razor_set_lua_loader(const char *modname, void (*loader)())
1.20 +{
1.21 + uint32_t name;
1.22 + struct razor_lua_loader *ploader, *end;
1.23 +
1.24 + if (!razor_preload.init) {
1.25 + razor_preload.init = 1;
1.26 + array_init(&razor_preload.name_pool);
1.27 + array_init(&razor_preload.loaders);
1.28 + hashtable_init(&razor_preload.modules,
1.29 + &razor_preload.name_pool);
1.30 + }
1.31 +
1.32 + name = hashtable_tokenize(&razor_preload.modules, modname);
1.33 +
1.34 + end = razor_preload.loaders.data + razor_preload.loaders.size;
1.35 + for(ploader = razor_preload.loaders.data; ploader < end; ploader++)
1.36 + if (ploader->name == name) {
1.37 + ploader->func = loader;
1.38 + return;
1.39 + }
1.40 +
1.41 + ploader = array_add(&razor_preload.loaders, sizeof(*ploader));
1.42 + ploader->name = name;
1.43 + ploader->func = loader;
1.44 +}
1.45 +
1.46 +static void razor_lua_preload(lua_State *L)
1.47 +{
1.48 + struct razor_lua_loader *ploader, *end;
1.49 +
1.50 + if (!razor_preload.init)
1.51 + return;
1.52 +
1.53 + lua_getfield(L, LUA_GLOBALSINDEX, "package");
1.54 + lua_getfield(L, -1, "preload");
1.55 + lua_remove(L, -2);
1.56 +
1.57 + end = razor_preload.loaders.data + razor_preload.loaders.size;
1.58 + for(ploader = razor_preload.loaders.data; ploader < end; ploader++) {
1.59 + lua_pushcfunction(L, ploader->func);
1.60 + lua_setfield(L, -2,
1.61 + razor_preload.name_pool.data + ploader->name);
1.62 + }
1.63 +
1.64 + lua_pop(L, 1);
1.65 +}
1.66 +
1.67 int run_lua_script(const char *root, const char *name, const char *body,
1.68 ssize_t len)
1.69 {
1.70 @@ -303,6 +363,7 @@
1.71
1.72 L = lua_newstate(alloc_lua, &rl);
1.73 luaL_openlibs(L);
1.74 + razor_lua_preload(L);
1.75 lua_getglobal(L, "require");
1.76 lua_pushstring(L, "posix");
1.77 if (lua_pcall(L, 1, 1, 0)) {