--- /dev/null
+lua-token.[hc]
+BUILT_SOURCES = lua-token.h lua-token.c
+DISTCLEANFILES = $(BUILT_SOURCES)
+
noinst_LIBRARIES = liblua.a
liblua_a_SOURCES = lib-lua.h lib-lua_priv.h \
- runtime.c madmutt.c
+ runtime.c madmutt.c \
+ $(BUILT_SOURCES)
noinst_HEADERS = lib-lua.h lib-lua_priv.h
+lua-token.c lua-token.h: lua-token.sh
+ sh $< $@ || (rm -f $@; exit 1)
+
DEFS=-DPKGDATADIR=\"$(pkgdatadir)\" -DSYSCONFDIR=\"$(sysconfdir)\" \
-DBINDIR=\"$(bindir)\" -DMUTTLOCALEDIR=\"$(datadir)/locale\" \
-DHAVE_CONFIG_H=1 -DPKGDOCDIR=\"$(docdir)\"
#define MUTT_LIB_LUA_LIB_LUA_PRIV_H
#include "lib-lua.h"
+#include "lua-token.h"
#include <lua.h>
#include <lualib.h>
--- /dev/null
+#! /bin/sh -e
+
+die() {
+ echo "$@" 1>&2
+ exit 2
+}
+
+do_hdr() {
+ cat <<EOF
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * Copyright © 2007 Pierre Habouzit
+ */
+
+/***** THIS FILE IS AUTOGENERATED DO NOT MODIFY DIRECTLY ! *****/
+
+EOF
+}
+
+do_h() {
+ do_hdr
+ cat <<EOF
+#ifndef MUTT_LIB_LUA_LUA_TOKEN_H
+#define MUTT_LIB_LUA_LUA_TOKEN_H
+
+enum lua_token {
+ LTK_UNKNOWN,
+`tr 'a-z-/' 'A-Z__' | sed -e 's/.*/ LTK_&,/'`
+};
+
+__attribute__((pure))
+enum lua_token lua_which_token(const char *s, ssize_t len);
+#endif /* MUTT_LIB_LUA_LUA_TOKEN_H */
+EOF
+}
+
+do_c() {
+ cat <<EOF | gperf -m16 -l -t -C -F",0" -Nlua_which_token_aux
+%{
+`do_hdr`
+
+#include <lib-lib/lib-lib.h>
+#include "lua-token.h"
+
+static const struct tok *
+lua_which_token_aux(const char *str, unsigned int len);
+
+%}
+struct tok { const char *name; int val; };
+%%
+`awk '{print $0 ", " NR }'`
+%%
+
+enum lua_token lua_which_token(const char *s, ssize_t len)
+{
+ if (len < 0)
+ len = m_strlen(s);
+
+ if (len) {
+ const struct tok *res = lua_which_token_aux(s, len);
+ return res ? res->val : LTK_UNKNOWN;
+ } else {
+ return LTK_UNKNOWN;
+ }
+}
+EOF
+}
+
+grep_self() {
+ grep '^## ' "$1" | cut -d' ' -f2
+}
+
+trap "rm -f $1" 1 2 3 15
+
+rm -f $1
+case "$1" in
+ *.h) grep_self "$0" | do_h > $1;;
+ *.c) grep_self "$0" | do_c > $1;;
+ *) die "you must ask for the 'h' or 'c' generation";;
+esac
+chmod -w $1
+
+exit 0
+
+############ Put tokens here ############
+## shell
+## sendmail
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},
/*
** 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}
};
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;
}
static const luaL_Reg lualibs[] = {
{"", luaopen_base},
+ {LUA_OSLIBNAME, luaopen_os},
{LUA_LOADLIBNAME, luaopen_package},
{LUA_TABLIBNAME, luaopen_table},
{LUA_IOLIBNAME, luaopen_io},