summaryrefslogtreecommitdiffstats
path: root/src/script.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/script.c')
-rw-r--r--src/script.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/script.c b/src/script.c
new file mode 100644
index 0000000..cb1baf6
--- /dev/null
+++ b/src/script.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2013 Patrick "P. J." McDermott
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+#include "logging.h"
+#include "script.h"
+
+/* LUA_OK is defined in Lua 5.2 but not 5.1. */
+#ifndef LUA_OK
+#define LUA_OK 0
+#endif
+
+struct script *
+script_load(const char *path)
+{
+ struct script *s;
+
+ s = malloc(sizeof(*s));
+ if (s == NULL) {
+ err(1, "Failed to allocate script");
+ }
+ s->path = path;
+
+ /* Load the script. */
+ s->lua_state = luaL_newstate();
+ luaL_openlibs(s->lua_state);
+ if (luaL_loadfile(s->lua_state, path) != LUA_OK) {
+ err(1, "Error loading script: %s\n",
+ lua_tostring(s->lua_state, -1));
+ }
+
+ /* Run the script once to let it define functions. */
+ if (lua_pcall(s->lua_state, 0, 0, 0) != LUA_OK) {
+ err(1, "Error running script: %s\n",
+ lua_tostring(s->lua_state, -1));
+ }
+
+ return s;
+}
+
+void
+script_call(struct script *s, const char *func)
+{
+ lua_getglobal(s->lua_state, func);
+ if (lua_pcall(s->lua_state, 0, 0, 0) != LUA_OK) {
+ err(1, "Error calling function: %s\n",
+ lua_tostring(s->lua_state, -1));
+ }
+}