X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=lua%2Fuci.c;h=8ace746eabf0dc22f751154e2b08b634b47b8d66;hp=64e509eb34c0800d8850111bcdfd213ebe8c2750;hb=446e774d0e39aeb08d9df4a80453e1334805a606;hpb=1e1f503d8fb8336da22029faaa1a7252bed22976 diff --git a/lua/uci.c b/lua/uci.c index 64e509e..8ace746 100644 --- a/lua/uci.c +++ b/lua/uci.c @@ -34,6 +34,28 @@ #define DPRINTF(...) do {} while (0) #endif +#if !defined LUA_VERSION_NUM || LUA_VERSION_NUM==501 + +/* + * ** Adapted from Lua 5.2.0 + * */ +static 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)); + } + lua_pop(L, nup); /* remove upvalues */ +} + +#define lua_rawlen(L, i) lua_objlen(L, i) + +#endif + static struct uci_context *global_ctx = NULL; static struct uci_context * @@ -551,6 +573,7 @@ uci_lua_set(lua_State *L) bool istable = false; int err = UCI_ERR_MEM; char *s = NULL; + const char *v; int i, nargs, offset = 0; ctx = find_context(L, &offset); @@ -565,7 +588,7 @@ uci_lua_set(lua_State *L) case 4: /* Format: uci.set("p", "s", "o", "v") */ if (lua_istable(L, nargs)) { - if (lua_objlen(L, nargs) < 1) + if (lua_rawlen(L, nargs) < 1) return luaL_error(L, "Cannot set an uci option to an empty table value"); lua_rawgeti(L, nargs, 1); ptr.value = luaL_checkstring(L, -1); @@ -595,10 +618,16 @@ uci_lua_set(lua_State *L) } if (istable) { - if (lua_objlen(L, nargs) == 1) { + if (lua_rawlen(L, nargs) == 1) { i = 1; - if (ptr.o) + if (ptr.o) { + v = ptr.value; + ptr.value = NULL; err = uci_delete(ctx, &ptr); + if (err) + goto error; + ptr.value = v; + } } else { i = 2; err = uci_set(ctx, &ptr); @@ -606,7 +635,7 @@ uci_lua_set(lua_State *L) goto error; } - for (; i <= lua_objlen(L, nargs); i++) { + for (; i <= lua_rawlen(L, nargs); i++) { lua_rawgeti(L, nargs, i); ptr.value = luaL_checkstring(L, -1); err = uci_add_list(ctx, &ptr); @@ -746,7 +775,7 @@ uci_lua_add_change(lua_State *L, struct uci_element *e) * list_add, append this value to table */ } else { lua_pushstring(L, value); - lua_rawseti(L, -2, lua_objlen(L, -2) + 1); + lua_rawseti(L, -2, lua_rawlen(L, -2) + 1); } /* non-list change, simply set/replace field */ @@ -960,11 +989,13 @@ luaopen_uci(lua_State *L) lua_setfield(L, -2, "__index"); /* fill metatable */ - luaL_register(L, NULL, uci); + luaL_setfuncs(L, uci, 0); lua_pop(L, 1); /* create module */ - luaL_register(L, MODNAME, uci); + lua_newtable(L); + luaL_setfuncs(L, uci, 0); + lua_setglobal(L, MODNAME); return 0; }