65 lines
1.8 KiB
C
65 lines
1.8 KiB
C
#include <lauxlib.h>
|
|
|
|
#include "compat.h"
|
|
|
|
static int lua_absindex (lua_State *L, int i) {
|
|
if (i < 0 && i > LUA_REGISTRYINDEX)
|
|
i += lua_gettop(L) + 1;
|
|
return i;
|
|
}
|
|
|
|
int luaL_getsubtable (lua_State *L, int i, const char *name) {
|
|
int abs_i = lua_absindex(L, i);
|
|
luaL_checkstack(L, 3, "not enough stack slots");
|
|
lua_pushstring(L, name);
|
|
lua_gettable(L, abs_i);
|
|
if (lua_istable(L, -1))
|
|
return 1;
|
|
lua_pop(L, 1);
|
|
lua_newtable(L);
|
|
lua_pushstring(L, name);
|
|
lua_pushvalue(L, -2);
|
|
lua_settable(L, abs_i);
|
|
return 0;
|
|
}
|
|
|
|
void luaL_requiref (lua_State *L, const char *modname, lua_CFunction openf, int glb) {
|
|
luaL_checkstack(L, 3, "not enough stack slots available");
|
|
luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED");
|
|
lua_getfield(L, -1, modname);
|
|
if (lua_isnil(L, -1)) {
|
|
lua_pop(L, 1);
|
|
lua_pushcfunction(L, openf);
|
|
lua_pushstring(L, modname);
|
|
lua_call(L, 1, 1);
|
|
lua_pushvalue(L, -1);
|
|
lua_setfield(L, -3, modname);
|
|
}
|
|
if (glb) {
|
|
lua_pushvalue(L, -1);
|
|
lua_setglobal(L, modname);
|
|
}
|
|
lua_replace(L, -2);
|
|
}
|
|
|
|
void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
|
|
luaL_checkstack(L, nup+1, "too many upvalues");
|
|
for (; l->name != NULL; l++) { /* fill the table with given functions */
|
|
int i;
|
|
lua_pushstring(L, l->name);
|
|
for (i = 0; i < nup; i++) /* copy upvalues to the top */
|
|
lua_pushvalue(L, -(nup + 1));
|
|
lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */
|
|
lua_settable(L, -(nup + 3)); /* table must be below the upvalues, the name and the closure */
|
|
}
|
|
lua_pop(L, nup); /* remove upvalues */
|
|
}
|
|
|
|
|
|
void luaL_setmetatable (lua_State *L, const char *tname) {
|
|
luaL_checkstack(L, 1, "not enough stack slots");
|
|
luaL_getmetatable(L, tname);
|
|
lua_setmetatable(L, -2);
|
|
}
|
|
|