*/
#include <lib-lib/lib-lib.h>
-#include "lib-lua_priv.h"
+#include <lib-lua/lib-lua.h>
+
+#include "../mutt.h"
+#include "../alias.li"
+#include "../buffy.li"
+#include "../charset.li"
+#include "../crypt.li"
+#include "../score.li"
+#include <lib-sys/mutt_ssl.li>
static lua_State *L;
-static reg_entry registry[LTK_count];
-
-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},
- {LUA_MADMUTT, luaopen_madmutt},
-};
-
-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},
+ {"mod_core", luaopen_mod_core},
+ {"MTransport", luaopen_MTransport},
+ {"MAlias", luaopen_MAlias},
+ {"mod_cset", luaopen_mod_cset},
+ {"mod_mime", luaopen_mod_mime},
+ {"mod_buffy", luaopen_mod_buffy},
+ {"mod_ssl", luaopen_mod_ssl},
+ {"mod_crypt", luaopen_mod_crypt},
+ {"mod_score", luaopen_mod_score},
+ };
+
int i;
L = lua_open();
}
}
-void mlua_shutdown(void)
+void luaM_shutdown(void)
{
lua_close(L);
}
+lua_State *luaM_getruntime(void)
+{
+ return 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));
return status;
}
-const char *mlua_reggets(int tk)
+
+quadopt_t luaM_checkquadopt(lua_State *Ls, int narg)
{
- if (registry[tk].type != REG_STR)
+ 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 registry[tk].s;
+ }
+
+ return s;
}
-int mlua_reggeti(int tk)
+rx_t *luaM_rxnew(const char *val)
{
- if (registry[tk].type != REG_INT)
- return -1;
- return registry[tk].i;
+ if (m_strisempty(val))
+ val = ".";
+
+ return rx_compile(val, mutt_which_case(val));
}
-void mlua_regsets(int tk, const char *s)
+char *luaM_pathnew(const char *val)
{
- reg_entry_wipe(registry + tk);
- registry[tk].type = REG_STR;
- registry[tk].s = m_strdup(s);
+ char path[_POSIX_PATH_MAX];
+ _mutt_expand_path(path, sizeof(path), val, 0);
+ return m_strdup(path);
}
-void mlua_regseti(int tk, int i)
+
+void luaM_pushaddr(lua_State *Ls, address_t *addr)
{
- reg_entry_wipe(registry + tk);
- registry[tk].type = REG_INT;
- registry[tk].i = i;
+ char s[HUGE_STRING] = "";
+ rfc822_addrcat(s, sizeof(s), addr, 0);
+ lua_pushstring(Ls, s);
}