diff options
Diffstat (limited to 'runlscript.c')
-rw-r--r-- | runlscript.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/runlscript.c b/runlscript.c new file mode 100644 index 0000000..5eaef8a --- /dev/null +++ b/runlscript.c @@ -0,0 +1,70 @@ + +#include <sys/mman.h> +#include <sys/stat.h> + +#include <fcntl.h> +#include <stdio.h> +#include <string.h> + +#include <lua.h> +#include <lauxlib.h> +#include <lualib.h> + +#define RCLUAPATH "/lib/rc/lua" + +int load_rclibs(lua_State *L) +{ + int err = luaL_loadstring(L, "package.path = package.path..\";" RCLUAPATH "/?.lua\"\n" + "require(\"e\")\n") + || lua_pcall(L, 0, 0, 0); + if (err) { + fprintf(stderr, "error loading libs: %s\n", + lua_tostring(L, -1)); + lua_pop(L, 1); + return -1; + } +} + +int runfile(lua_State *L, const char *filename) +{ + int err; + err = luaL_loadfile(L, filename) + || lua_pcall(L, 0, 0, 0); + if (err) { + fprintf(stderr, "%s", lua_tostring(L, -1)); + lua_pop(L, 1); + } + return(err); +} + +int main(int argc, char *argv[]) +{ + int err; + lua_State *L = lua_open(); + char *filename = NULL; + char *func = NULL; + + luaL_openlibs(L); + if (argc > 1) + filename = argv[1]; + if (argc > 2) + func = argv[2]; + + if (load_rclibs(L) != 0) + return 1; + + err = runfile(L, filename); + if (err || func == NULL) + return err; + + lua_getglobal(L, func); + if (lua_pcall(L, 0, 1, 0) != 0) { + fprintf(stderr, "error running function '%s': %s\n", func, + lua_tostring(L, -1)); + return -1; + } + err = lua_toboolean(L, -1); + lua_close(L); + return !err; +} + |