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)
{
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)) {