X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=lib-lua%2Fmadmutt.c;h=29907f3024f4c77a296824b4b3205ac69bbc5e26;hb=0dd5b492f18e549ef95b0ac6765329473e426633;hp=dfcf0840cdee21ae63e9238abf4a0c87b3b55481;hpb=0840ecb90bb99da0d6b0c028ace977dd1932e6e1;p=apps%2Fmadmutt.git diff --git a/lib-lua/madmutt.c b/lib-lua/madmutt.c index dfcf084..29907f3 100644 --- a/lib-lua/madmutt.c +++ b/lib-lua/madmutt.c @@ -26,6 +26,8 @@ #include "../mutt.h" +/* {{{ madmutt functions */ + static int madmutt_pwd(lua_State *L) { char path[_POSIX_PATH_MAX]; @@ -56,45 +58,90 @@ static int madmutt_folder_name(lua_State *L) return 1; } +static quadopt_t quadopt_parse(const char *s) +{ + if (!m_strcasecmp("yes", s)) + return M_YES; + if (!m_strcasecmp("no", s)) + return M_NO; + if (!m_strcasecmp("ask-yes", s)) + return M_ASKYES; + if (!m_strcasecmp("ask-no", s)) + return M_ASKNO; + return -1; +} + static int madmutt_assign(lua_State *L) { const char *idx = luaL_checkstring(L, 2); const char *val = luaL_checkstring(L, 3); + int tk; + + switch ((tk = lua_which_token(idx, -1))) { + char buf[STRING]; + int i; - switch (lua_which_token(idx, -1)) { default: - luaL_error(L, "bad subscript to madmutt: %s", val); + return luaL_error(L, "read-only or inexistant property '%s'", idx, tk); + + case LTK_DOTLOCK: + case LTK_SENDMAIL: + case LTK_SHELL: + case LTK_EDITOR: + _mutt_expand_path(buf, sizeof(buf), val, 0); + val = buf; + /* FALLTHROUGH */ + + mlua_regsets(tk, val); return 0; + case LTK_QUIT: + i = quadopt_parse(val); + if (i < 0) + return luaL_error(L, "invalid quad option value: '%s'", val); + mlua_regsetq(tk, i); + return 0; + } +} + +static int madmutt_get(lua_State *L) +{ + const char *idx = luaL_checkstring(L, 2); + int tk; + + switch ((tk = lua_which_token(idx, -1))) { + default: + lua_getmetatable(L, 1); + lua_replace(L, 1); + lua_rawget(L, 1); + return 1; + + case LTK_DOTLOCK: case LTK_SENDMAIL: case LTK_SHELL: + lua_pushstring(L, mlua_reggets(tk)); break; } - lua_getmetatable(L, 1); - lua_pushstring(L, idx); - lua_pushstring(L, val); - lua_rawset(L, -3); - - return 0; + return 1; } static const struct luaL_Reg madmutt_module_funcs[] = { - {"pwd", madmutt_pwd}, + { "pwd", madmutt_pwd }, /* ** .pp ** \fIThis is a read-only system property and, at runtime, ** specifies the current working directory of the madmutt ** binary.\fP */ - {"folder_path", madmutt_folder_path}, + { "folder_path", madmutt_folder_path }, /* ** .pp ** \fIThis is a read-only system property and, at runtime, ** specifies the full path or URI of the folder currently ** open (if any).\fP */ - {"folder_name", madmutt_folder_name}, + { "folder_name", madmutt_folder_name }, /* ** .pp ** \fIThis is a read-only system property and, at runtime, @@ -114,10 +161,15 @@ static const struct luaL_Reg madmutt_module_funcs[] = { ** $$$folder nor a ``/'' were found in the name. */ - {"__newindex", madmutt_assign}, - {NULL, NULL} + { "__newindex", madmutt_assign }, + { "__index", madmutt_get }, + { NULL, NULL } }; +/* }}} */ + +/* {{{ read-only properties */ + static const struct { const char *key; const char *value; @@ -164,27 +216,70 @@ static const struct { #endif }; -static const char *madmutt_init_shell(void) +/* }}} */ + +/* {{{ madmutt magic properties */ + +static void madmutt_init_editor(char *buf, ssize_t len) +{ + m_strcpy(buf, len, getenv("VISUAL") ?: getenv("EDITOR") ?: "vi"); +} + +static void madmutt_init_shell(char *buf, ssize_t len) { struct passwd *pw = getpwuid(getuid()); - if (pw) - return pw->pw_shell; - return getenv("SHELL") ?: "/bin/sh"; + if (pw) { + m_strcpy(buf, len, pw->pw_shell); + _mutt_expand_path(buf, len, pw->pw_shell, 0); + } else { + m_strcpy(buf, len, getenv("SHELL") ?: "/bin/sh"); + } } static const struct { - const char *k; - const char *(*f)(void); + const char *key; + void (*fun)(char *buf, ssize_t len); + const char *val; } madmutt_module_vars2[] = { - { "shell", madmutt_init_shell }, + { "dotlock", NULL, BINDIR "/mutt_dotlock" }, + /* + ** .pp + ** Contains the path of the \fTmadmutt_dotlock(1)\fP binary to be used by + ** Madmutt. + */ + {"editor", madmutt_init_editor, NULL }, + /* + ** .pp + ** This variable specifies which editor is used by Madmutt. + ** It defaults to the value of the \fT$$$VISUAL\fP, or \fT$$$EDITOR\fP, environment + ** variable, or to the string "\fTvi\fP" if neither of those are set. + */ + { "sendmail", NULL, SENDMAIL " -oem -oi" }, + /* + ** .pp + ** Specifies the program and arguments used to deliver mail sent by Madmutt. + ** Madmutt expects that the specified program interprets additional + ** arguments as recipient addresses. + */ + { "shell", madmutt_init_shell, NULL }, /* ** .pp ** Command to use when spawning a subshell. By default, the user's login ** shell from \fT/etc/passwd\fP is used. */ + {"quit", NULL, "yes" } + /* + ** .pp + ** This variable controls whether ``quit'' and ``exit'' actually quit + ** from Madmutt. If it set to \fIyes\fP, they do quit, if it is set to \fIno\fP, they + ** have no effect, and if it is set to \fIask-yes\fP or \fIask-no\fP, you are + ** prompted for confirmation when you try to quit. + */ }; +/* }}} */ + int luaopen_madmutt(lua_State *L) { int i; @@ -199,17 +294,19 @@ int luaopen_madmutt(lua_State *L) lua_setfield(L, -2, madmutt_module_vars[i].key); } + lua_setmetatable(L, -2); + for (i = 0; i < countof(madmutt_module_vars2); i++) { - lua_pushstring(L, madmutt_module_vars2[i].f()); - lua_setfield(L, -2, madmutt_module_vars2[i].k); + if (madmutt_module_vars2[i].fun) { + char buf[STRING]; + (madmutt_module_vars2[i].fun)(buf, sizeof(buf)); + lua_pushstring(L, buf); + } else { + lua_pushstring(L, madmutt_module_vars2[i].val); + } + lua_setfield(L, -2, madmutt_module_vars2[i].key); } - lua_pushstring(L, "__index"); - lua_pushvalue(L, -2); - lua_settable(L, -3); - - lua_setmetatable(L, -2); lua_setglobal(L, "madmutt"); - return 1; }