12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
-
-
- #include <stdio.h>
- #include <string.h>
- #include "lua.h"
- #include "lauxlib.h"
- #include "compat-5.1.h"
-
- static void getfield(lua_State *L, int idx, const char *name) {
- const char *end = strchr(name, '.');
- lua_pushvalue(L, idx);
- while (end) {
- lua_pushlstring(L, name, end - name);
- lua_gettable(L, -2);
- lua_remove(L, -2);
- if (lua_isnil(L, -1)) return;
- name = end+1;
- end = strchr(name, '.');
- }
- lua_pushstring(L, name);
- lua_gettable(L, -2);
- lua_remove(L, -2);
- }
-
- static void setfield(lua_State *L, int idx, const char *name) {
- const char *end = strchr(name, '.');
- lua_pushvalue(L, idx);
- while (end) {
- lua_pushlstring(L, name, end - name);
- lua_gettable(L, -2);
-
- if (lua_isnil(L, -1)) {
- lua_pop(L, 1);
- lua_newtable(L);
- lua_pushlstring(L, name, end - name);
- lua_pushvalue(L, -2);
- lua_settable(L, -4);
- }
- lua_remove(L, -2);
- name = end+1;
- end = strchr(name, '.');
- }
- lua_pushstring(L, name);
- lua_pushvalue(L, -3);
- lua_settable(L, -3);
- lua_pop(L, 2);
- }
-
- LUALIB_API void luaL_module(lua_State *L, const char *libname,
- const luaL_reg *l, int nup) {
- if (libname) {
- getfield(L, LUA_GLOBALSINDEX, libname);
- if (lua_isnil(L, -1)) {
- int env, ns;
- lua_pop(L, 1);
- lua_pushliteral(L, "require");
- lua_gettable(L, LUA_GLOBALSINDEX);
- lua_getfenv(L, -1);
- lua_remove(L, -2);
- env = lua_gettop(L);
-
- lua_newtable(L);
- ns = lua_gettop(L);
- getfield(L, env, "package.loaded");
- if (lua_isnil(L, -1)) {
- lua_pop(L, 1);
- lua_newtable(L);
- lua_pushvalue(L, -1);
- setfield(L, env, "package.loaded");
- }
- else if (!lua_istable(L, -1))
- luaL_error(L, "name conflict for library `%s'", libname);
- lua_pushstring(L, libname);
- lua_pushvalue(L, ns);
- lua_settable(L, -3);
- lua_pop(L, 1);
- lua_pushvalue(L, ns);
- setfield(L, LUA_GLOBALSINDEX, libname);
- lua_remove (L, env);
- }
- lua_insert(L, -(nup+1));
- }
- for (; l->name; l++) {
- int i;
- lua_pushstring(L, l->name);
- for (i=0; i<nup; i++)
- lua_pushvalue(L, -(nup+1));
- lua_pushcclosure(L, l->func, nup);
- lua_settable(L, -(nup+3));
- }
- lua_pop(L, nup);
- }
|