summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/local.mk2
-rw-r--r--src/script.c67
-rw-r--r--src/script.h32
3 files changed, 101 insertions, 0 deletions
diff --git a/src/local.mk b/src/local.mk
index 76b986d..1950fee 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -16,6 +16,8 @@ sdlex_SOURCES += \
src/main.c \
src/palettes.c \
src/palettes.h \
+ src/script.c \
+ src/script.h \
src/viewport.c \
src/viewport.h \
src/xml.c \
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));
+ }
+}
diff --git a/src/script.h b/src/script.h
new file mode 100644
index 0000000..662c8ea
--- /dev/null
+++ b/src/script.h
@@ -0,0 +1,32 @@
+/*
+ * 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/>.
+ */
+
+#ifndef SCRIPT_H
+#define SCRIPT_H
+
+#include <lua.h>
+
+struct script {
+ const char *path;
+ lua_State *lua_state;
+};
+
+struct script *script_load(const char *path);
+void script_call(struct script *s, const char *func);
+
+#endif