--- /dev/null
+/*
+ * 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
+ */
+
+#include <lib-lib/lib-lib.h>
+
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+
+#include "lib-lua.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
+ { NULL, NULL }
+};
+
+void mlua_initialize(void)
+{
+ int i;
+
+ L = lua_open();
+ for (i = 0; i < countof(lualibs); i++) {
+ lua_pushcfunction(L, lualibs[i].func);
+ 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++) {
+ char buffer[STRING];
+
+ snprintf(buffer, sizeof(buffer), "madmutt.%s = \"%s\";",
+ madmutt_module_vars[i].key,
+ madmutt_module_vars[i].value);
+ (void)luaL_dostring(L, buffer);
+ }
+}
+
+void mlua_shutdown(void)
+{
+ lua_close(L);
+}
+
+
+int mlua_dofile(const char *filename)
+{
+ return luaL_dofile(L, filename);
+}
+
+int mlua_wrap(void (*errfun)(const char *fmt, ...), int status)
+{
+ if (status) {
+ (*errfun)("-[lua]-: %s\n", lua_tostring(L, -1));
+ lua_pop(L, 1);
+ }
+ return status;
+}
+