summaryrefslogtreecommitdiffstats
path: root/src/resources/script.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/resources/script.c')
-rw-r--r--src/resources/script.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/resources/script.c b/src/resources/script.c
new file mode 100644
index 0000000..5212219
--- /dev/null
+++ b/src/resources/script.c
@@ -0,0 +1,82 @@
+/*
+ * 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 <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+#include "../logging.h"
+#include "../viewport.h"
+#include "script.h"
+#include "resource.h"
+
+/* LUA_OK is defined in Lua 5.2 but not 5.1. */
+#ifndef LUA_OK
+#define LUA_OK 0
+#endif
+
+static struct resource_table script_res;
+
+struct script *
+script_get(const char *path)
+{
+ struct script *s;
+
+ s = (struct script *) resource_get(&script_res, path);
+ if (s != NULL) {
+ resource_use((struct resource *) s);
+ return s;
+ }
+
+ s = resource_alloc(path, sizeof(*s));
+
+ /* 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));
+ }
+
+ lua_register(s->lua_state, "init_viewport", init_viewport_lua);
+
+ resource_use((struct resource *) s);
+ resource_add(&script_res, path, (struct resource *) s);
+
+ return s;
+}
+
+void
+script_free(struct script *script)
+{
+ lua_State *data;
+
+ if (script == NULL) {
+ return;
+ }
+
+ data = script->lua_state;
+ if (resource_free(&script_res, (struct resource *) script)) {
+ lua_close(data);
+ }
+}