X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-lua%2Fmadmutt.c;fp=lib-lua%2Fmadmutt.c;h=31ee28a5af15f635d4fd9fc154031e26c912a936;hp=351ecb5256122cc5b199d449e72f72e8bce76baa;hb=88d22daa9c1316d5ccc4b4bb60d40cc96c767757;hpb=6729a8ab646a00a661858b7ac7ee21f770bff3d3 diff --git a/lib-lua/madmutt.c b/lib-lua/madmutt.c index 351ecb5..31ee28a 100644 --- a/lib-lua/madmutt.c +++ b/lib-lua/madmutt.c @@ -52,6 +52,29 @@ static int madmutt_folder_name(lua_State *L) return 1; } +static int madmutt_assign(lua_State *L) +{ + const char *idx = luaL_checkstring(L, 2); + const char *val = luaL_checkstring(L, 3); + + switch (lua_which_token(idx, -1)) { + default: + luaL_error(L, "bad subscript to madmutt: %s", val); + return 0; + + case LTK_SENDMAIL: + case LTK_SHELL: + break; + } + + lua_getmetatable(L, 1); + lua_pushstring(L, idx); + lua_pushstring(L, val); + lua_rawset(L, -3); + + return 0; +} + static const struct luaL_Reg madmutt_module_funcs[] = { {"pwd", madmutt_pwd}, /* @@ -86,6 +109,8 @@ static const struct luaL_Reg madmutt_module_funcs[] = { ** Third and last, the result will be just the name if neither ** $$$folder nor a ``/'' were found in the name. */ + + {"__newindex", madmutt_assign}, {NULL, NULL} }; @@ -138,11 +163,23 @@ static const struct { int luaopen_madmutt(lua_State *L) { int i; - luaL_register(L, LUA_MADMUTT, madmutt_module_funcs); + + lua_newuserdata(L, sizeof(void*)); + luaL_newmetatable(L, "madmutt.core"); + + luaL_openlib(L, NULL, madmutt_module_funcs, 0); for (i = 0; i < countof(madmutt_module_vars); i++) { lua_pushstring(L, madmutt_module_vars[i].value); lua_setfield(L, -2, madmutt_module_vars[i].key); } + + lua_pushstring(L, "__index"); + lua_pushvalue(L, -2); + lua_settable(L, -3); + + lua_setmetatable(L, -2); + lua_setglobal(L, "madmutt"); + return 1; }