make quadopts be consistently dealt with as strings.
[apps/madmutt.git] / lib-lua / runtime.c
index becd6de..923222b 100644 (file)
  */
 
 #include <lib-lib/lib-lib.h>
+#include <lib-lua/lib-lua.h>
 
-#include <lua.h>
-#include <lualib.h>
-#include <lauxlib.h>
-
-#include "lib-lua.h"
+#include "../alias.h"
+#include "../mutt.h"
 
 static lua_State *L;
 
-static const luaL_Reg lualibs[] = {
-    {"",              luaopen_base},
-    {LUA_LOADLIBNAME, luaopen_package},
-    {LUA_TABLIBNAME,  luaopen_table},
-    {LUA_IOLIBNAME,   luaopen_io},
-    {LUA_STRLIBNAME,  luaopen_string},
-    {LUA_MATHLIBNAME, luaopen_math},
-    {LUA_DBLIBNAME,   luaopen_debug},
-};
-
-static const struct luaL_Reg madmutt_module_funcs[] = {
-    {NULL, NULL}
-};
-
-static const struct {
-    const char *key;
-    const char *value;
-} madmutt_module_vars[] = {
-    { "version",    VERSION },
-    /*
-     ** .pp
-     ** \fIThis is a read-only system property and specifies madmutt's
-     ** version string.\fP
-     */
-    { "sysconfdir", SYSCONFDIR },
-    /*
-     ** .pp
-     ** \fIThis is a read-only system property and specifies madmutt's
-     ** subversion revision string.\fP
-     */
-    { "bindir",     BINDIR },
-    /*
-     ** .pp
-     ** \fIThis is a read-only system property and specifies the
-     ** directory containing the madmutt binary.\fP
-     */
-    { "docdir",     PKGDOCDIR },
-    /*
-     ** .pp
-     ** \fIThis is a read-only system property and specifies the
-     ** directory containing the madmutt documentation.\fP
-     */
-#ifdef USE_HCACHE
-#if defined(HAVE_QDBM)
-    {"hcache_backend", "qdbm" },
-#elif defined(HAVE_GDBM)
-    {"hcache_backend", "gdbm" },
-#elif defined(HAVE_DB4)
-    {"hcache_backend", "db4" },
-#else
-    {"hcache_backend", "unknown" },
-#endif
-    /*
-     ** .pp
-     ** \fIThis is a read-only system property and specifies the
-     ** header chaching's database backend.\fP
-     */
-#endif
-};
-
-void mlua_initialize(void)
+void luaM_initialize(void)
 {
+    static const luaL_Reg lualibs[] = {
+        {"",              luaopen_base},
+        {LUA_OSLIBNAME,   luaopen_os},
+        {LUA_LOADLIBNAME, luaopen_package},
+        {LUA_TABLIBNAME,  luaopen_table},
+        {LUA_IOLIBNAME,   luaopen_io},
+        {LUA_STRLIBNAME,  luaopen_string},
+        {LUA_MATHLIBNAME, luaopen_math},
+        {LUA_DBLIBNAME,   luaopen_debug},
+        {"MCore",         luaopen_MCore},
+        {"MTransport",    luaopen_MTransport},
+        {"MAlias",        luaopen_MAlias},
+    };
+
     int i;
 
     L = lua_open();
@@ -97,26 +49,20 @@ void mlua_initialize(void)
         lua_pushstring(L, lualibs[i].name);
         lua_call(L, 1, 0);
     }
-    luaL_register(L, "madmutt", madmutt_module_funcs);
-
-    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);
-    }
 }
 
-void mlua_shutdown(void)
+void luaM_shutdown(void)
 {
     lua_close(L);
 }
 
 
-int mlua_dofile(const char *filename)
+int luaM_dofile(const char *filename)
 {
     return luaL_dofile(L, filename);
 }
 
-int mlua_wrap(void (*errfun)(const char *fmt, ...), int status)
+int luaM_wrap(void (*errfun)(const char *fmt, ...), int status)
 {
     if (status) {
         (*errfun)("-[lua]-: %s\n", lua_tostring(L, -1));
@@ -125,3 +71,69 @@ int mlua_wrap(void (*errfun)(const char *fmt, ...), int status)
     return status;
 }
 
+
+quadopt_t luaM_checkquadopt(lua_State *Ls, int narg)
+{
+    const char *s;
+    int i;
+
+    if (lua_type(Ls, narg) == LUA_TSTRING) {
+        s = lua_tostring(Ls, narg);
+        switch (mlua_which_token(s, -1)) {
+          case LTK_YES:     return M_YES;
+          case LTK_NO:      return M_NO;
+          case LTK_ASK_YES: return M_ASKYES;
+          case LTK_ASK_NO:  return M_ASKNO;
+          default:
+            break;
+        }
+    }
+
+    i = luaL_checkinteger(Ls, narg);
+    if (i & ~3) {
+        s = lua_pushfstring(Ls, "int in [0-3] expected, got %d", i);
+        return luaL_argerror(Ls, narg, s);
+    }
+    return i;
+}
+
+void luaM_pushquadopt(lua_State *Ls, int val)
+{
+    switch (val) {
+      case M_YES:    return lua_pushstring(Ls, "yes");
+      case M_NO:     return lua_pushstring(Ls, "no");
+      case M_ASKYES: return lua_pushstring(Ls, "ask-yes");
+      case M_ASKNO:  return lua_pushstring(Ls, "ask-no");
+      default:       return lua_pushnil(Ls);
+    }
+}
+
+const char *luaM_checkrx(lua_State *Ls, int narg)
+{
+    const char *s = luaL_checkstring(Ls, narg);
+    char buf[STRING];
+
+    if (rx_validate(s, buf, ssizeof(buf))) {
+        s = lua_pushfstring(Ls, "invalid regexp: `%s'", buf);
+        luaL_argerror(Ls, narg, s);
+        return NULL;
+    }
+
+    return s;
+}
+
+char *luaM_pathnew(const char *val)
+{
+    char path[PATH_MAX];
+    _mutt_expand_path(path, sizeof(path), val, 0);
+    return m_strdup(path);
+}
+
+rx_t *luaM_rxnew(const char *val)
+{
+    if (m_strisempty(val))
+        val = ".";
+
+    return rx_compile(val, mutt_which_case(val));
+}
+