rationalize settings into a central registry.
authorPierre Habouzit <madcoder@debian.org>
Sun, 11 Mar 2007 21:22:23 +0000 (22:22 +0100)
committerPierre Habouzit <madcoder@debian.org>
Sun, 11 Mar 2007 21:22:23 +0000 (22:22 +0100)
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
commands.c
lib-lua/lib-lua.h
lib-lua/lib-lua_priv.h
lib-lua/lua-token.sh
lib-lua/madmutt.c
lib-lua/runtime.c
lib-mx/mx.c
sendlib.c

index 8d31af6..a7cc074 100644 (file)
@@ -520,7 +520,7 @@ void mutt_shell_escape (void)
   buf[0] = 0;
   if (mutt_get_field (_("Shell command: "), buf, sizeof (buf), M_CMD) == 0) {
     if (!buf[0])
-      mlua_value(buf, sizeof(buf), "madmutt", "shell");
+      m_strcpy(buf, sizeof(buf), mlua_reggets(LTK_SHELL));
     if (buf[0]) {
       CLEARLINE (LINES - 1);
       mutt_endwin (NULL);
index 75b58fa..47e9daa 100644 (file)
 # include "../config.h"
 #endif
 
+#include "lua-token.h"
+
 void mlua_initialize(void);
 void mlua_shutdown(void);
 
 int mlua_dofile(const char *filename);
 int mlua_wrap(void (*errfun)(const char *fmt, ...), int status);
-ssize_t mlua_value(char *buf, ssize_t len,
-                   const char *table, const char *key);
+
+const char *mlua_reggets(enum lua_token tk);
+void mlua_regsets(enum lua_token tk, const char *s);
 
 #endif
index ff68378..5f69d81 100644 (file)
 #define MUTT_LIB_LUA_LIB_LUA_PRIV_H
 
 #include "lib-lua.h"
-#include "lua-token.h"
 
 #include <lua.h>
 #include <lualib.h>
 #include <lauxlib.h>
 
-#define LUA_MADMUTT          "madmutt"
+typedef enum reg_type {
+    REG_NIL,
+    REG_INT,
+    REG_BOOL,
+    REG_QUAD,
+    REG_STR,
+} reg_type;
 
+typedef struct reg_entry {
+    int type;
+    union {
+        int i;
+        void *p;
+        char *s;
+    };
+} reg_entry;
+
+static inline void reg_entry_wipe(reg_entry *e) {
+    switch (e->type) {
+      case REG_STR:
+        p_delete(&e->s);
+        break;
+      default:
+        break;
+    }
+    e->type = REG_NIL;
+}
+
+#define LUA_MADMUTT  "madmutt"
 int luaopen_madmutt(lua_State *L);
 
 #endif
index 7c83e5d..654ff54 100644 (file)
@@ -38,8 +38,9 @@ do_h() {
 #define MUTT_LIB_LUA_LUA_TOKEN_H
 
 enum lua_token {
-    LTK_UNKNOWN,
+    LTK_UNKNOWN = -1,
 `tr 'a-z-/' 'A-Z__' | sed -e 's/.*/    LTK_&,/'`
+    LTK_count,
 };
 
 __attribute__((pure))
@@ -48,6 +49,12 @@ enum lua_token lua_which_token(const char *s, ssize_t len);
 EOF
 }
 
+do_tokens() {
+    while read tok; do
+        echo "$tok, LTK_`echo $tok | tr 'a-z-' 'A-Z_'`"
+    done
+}
+
 do_c() {
     cat <<EOF | gperf -m16 -l -t -C -F",0" -Nlua_which_token_aux
 %{
@@ -62,7 +69,7 @@ lua_which_token_aux(const char *str, unsigned int len);
 %}
 struct tok { const char *name; int val; };
 %%
-`awk '{print $0 ", " NR }'`
+`do_tokens`
 %%
 
 enum lua_token lua_which_token(const char *s, ssize_t len)
index 6872096..4bb0095 100644 (file)
@@ -26,6 +26,8 @@
 
 #include "../mutt.h"
 
+/* {{{ madmutt functions */
+
 static int madmutt_pwd(lua_State *L)
 {
     char path[_POSIX_PATH_MAX];
@@ -60,45 +62,62 @@ static int madmutt_assign(lua_State *L)
 {
     const char *idx = luaL_checkstring(L, 2);
     const char *val = luaL_checkstring(L, 3);
-    char buf[STRING];
+    int tk;
+
+    switch ((tk = lua_which_token(idx, -1))) {
+        char buf[STRING];
 
-    switch (lua_which_token(idx, -1)) {
       default:
-        luaL_error(L, "bad subscript to madmutt: %s", val);
+        luaL_error(L, "read-only or inexistant property '%s'", idx, tk);
         return 0;
 
       case LTK_DOTLOCK:
       case LTK_SENDMAIL:
       case LTK_SHELL:
         _mutt_expand_path(buf, sizeof(buf), val, 0);
-        val = buf;
-        break;
+        mlua_regsets(tk, buf);
+        return 0;
     }
+}
 
-    lua_getmetatable(L, 1);
-    lua_pushstring(L, idx);
-    lua_pushstring(L, val);
-    lua_rawset(L, -3);
+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;
+    }
 
-    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,
@@ -118,10 +137,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;
@@ -166,22 +190,12 @@ static const struct {
      ** header chaching's database backend.\fP
      */
 #endif
-
-    {"dotlock",     BINDIR "/mutt_dotlock"},
-    /*
-     ** .pp
-     ** Contains the path of the \fTmadmutt_dotlock(1)\fP binary to be used by
-     ** Madmutt.
-     */
-    {"sendmail",    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.
-     */
 };
 
+/* }}} */
+
+/* {{{ madmutt magic properties */
+
 static void madmutt_init_shell(char *buf, ssize_t len)
 {
     struct passwd *pw = getpwuid(getuid());
@@ -197,8 +211,22 @@ static void madmutt_init_shell(char *buf, ssize_t len)
 static const struct {
     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.
+     */
+    { "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
@@ -206,6 +234,8 @@ static const struct {
      */
 };
 
+/* }}} */
+
 int luaopen_madmutt(lua_State *L)
 {
     int i;
@@ -220,19 +250,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++) {
-        char buf[STRING];
-        (madmutt_module_vars2[i].fun)(buf, sizeof(buf));
-        lua_pushstring(L, buf);
+        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;
 }
index a442401..552587c 100644 (file)
@@ -21,6 +21,7 @@
 #include "lib-lua_priv.h"
 
 static lua_State *L;
+static reg_entry registry[LTK_count];
 
 static const luaL_Reg lualibs[] = {
     {"",              luaopen_base},
@@ -66,18 +67,16 @@ int mlua_wrap(void (*errfun)(const char *fmt, ...), int status)
     return status;
 }
 
-ssize_t mlua_value(char *buf, ssize_t len,
-                   const char *table, const char *key)
+const char *mlua_reggets(int tk)
 {
-    ssize_t res;
-
-    lua_getglobal(L, table);
-    lua_pushstring(L, key);
-    lua_gettable(L, -2);
-    res = m_strcpy(buf, len, lua_tostring(L, -1));
-    lua_remove(L, -1);
-    lua_remove(L, -1);
-
-    return res;
+    if (registry[tk].type != REG_STR)
+        return NULL;
+    return registry[tk].s;
 }
 
+void mlua_regsets(int tk, const char *s)
+{
+    reg_entry_wipe(registry + tk);
+    registry[tk].type = REG_STR;
+    registry[tk].s    = m_strdup(s);
+}
index 9c0221a..1d6ebf1 100644 (file)
@@ -63,17 +63,14 @@ static int invoke_dotlock (const char *path, int flags, int retry)
   char cmd[LONG_STRING + _POSIX_PATH_MAX];
   char f[STRING + _POSIX_PATH_MAX];
   char r[STRING];
-  int pos;
 
   if (flags & DL_FL_RETRY)
     snprintf (r, sizeof (r), "-r %d ", retry ? MAXLOCKATTEMPT : 0);
 
   mutt_quote_filename (f, sizeof (f), path);
 
-  pos  = mlua_value(cmd, sizeof(cmd), "madmutt", "dotlock");
-
-  snprintf(cmd + pos, sizeof(cmd) - pos,
-            " %s%s%s%s%s%s%s",
+  snprintf(cmd, sizeof(cmd), "%s %s%s%s%s%s%s%s",
+            mlua_reggets(LTK_DOTLOCK),
             flags & DL_FL_TRY ? "-t " : "",
             flags & DL_FL_UNLOCK ? "-u " : "",
             flags & DL_FL_USEPRIV ? "-p " : "",
index 0a63e34..f5f5867 100644 (file)
--- a/sendlib.c
+++ b/sendlib.c
@@ -1849,7 +1849,7 @@ static int mutt_invoke_sendmail (address_t * from,        /* the sender */
   } else
 #endif
   {
-    mlua_value(cmd, sizeof(cmd), "madmutt", "sendmail");
+    m_strcpy(cmd, sizeof(cmd), mlua_reggets(LTK_SENDMAIL));
   }
 
   ps = cmd;