summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKamil Kaminski <kamilkss@gmail.com>2011-07-26 20:32:45 -0500
committerKamil Kaminski <kamilkss@gmail.com>2011-07-26 20:32:45 -0500
commit16b24f55cc3bb0a2258757ff37abb8baeecb5e97 (patch)
tree67bdd274c77a20ee366f16761b0701001cdaa730
downloadluaload-16b24f55cc3bb0a2258757ff37abb8baeecb5e97.tar.gz
luaload-16b24f55cc3bb0a2258757ff37abb8baeecb5e97.tar.bz2
luaload-16b24f55cc3bb0a2258757ff37abb8baeecb5e97.zip
initial commit
-rw-r--r--Makefile32
-rw-r--r--config.lua10
-rw-r--r--luaload.c186
3 files changed, 228 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f11b251
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,32 @@
+BIN = luaload
+SRC = luaload.c
+CC = gcc
+CFLAGS = -Wall -std=gnu99
+DBGFLAGS = -g -O0
+ifdef DEBUG
+ CFLAGS += $(DBGFLAGS)
+else
+ CFLAGS += -O2 -march=native -mtune=native
+endif
+LDFLAGS = -lm -llua
+
+OBJ_DIR = obj
+OBJ_FILES = $(addprefix $(OBJ_DIR)/, $(addsuffix .o, $(subst .c,,$(SRC))))
+
+$(BIN): $(OBJ_DIR) $(OBJ_FILES)
+ $(CC) $(LDFLAGS) $(OBJ_FILES) -o $@
+
+$(OBJ_DIR)/luaload.o: $(OBJ_DIR)/%.o: %.c
+ $(CC) -c $(CFLAGS) $< -o $@
+
+$(OBJ_DIR):
+ mkdir -p $(OBJ_DIR)
+
+.PHONY: clean info
+
+clean:
+ @rm -rf $(OBJ_DIR)
+ @rm -f $(BIN)
+
+info:
+ @echo $(OBJ_FILES)
diff --git a/config.lua b/config.lua
new file mode 100644
index 0000000..a34d1da
--- /dev/null
+++ b/config.lua
@@ -0,0 +1,10 @@
+platform =
+{
+xres_w = 640,
+yres_w = 480,
+bpp_w = 32,
+fovy_w = 40.0,
+znear_w = 1.0,
+zfar_w = 40.0
+}
+
diff --git a/luaload.c b/luaload.c
new file mode 100644
index 0000000..0161fa8
--- /dev/null
+++ b/luaload.c
@@ -0,0 +1,186 @@
+/* luaload.c
+ *
+ * Kamil Kaminski
+ * kkaminsk.com
+ *
+ * Loading a Lua table in C
+ *
+ *
+ */
+
+#include <lua.h>
+#include <lauxlib.h>
+#include <lualib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct platform
+{
+ unsigned int xres_w;
+ unsigned int yres_w;
+ unsigned int bpp_w;
+ float fovy_w;
+ float znear_w;
+ float zfar_w;
+};
+
+const char *LuaGetFieldString(lua_State *L, const char *);
+double luaGetFieldNumber(lua_State *, const char *);
+int luaLoadConfig(lua_State *, const char *);
+int luaFillPlatform(lua_State *, struct platform *);
+void printPlatform(struct platform *);
+
+const char *LuaGetFieldString(lua_State *L, const char *key)
+{
+ if (!L || !key)
+ return NULL;
+
+ const char *ret = NULL;
+
+ /* push the key string onto stack */
+ lua_pushstring(L, key);
+
+ lua_gettable(L, -2);
+ if (!lua_isstring(L, -1))
+ {
+ fprintf(stderr, "Lua: \"%s\" field within the table is not a string\n", key);
+ lua_pop(L, 1);
+
+ return ret;
+ }
+
+ ret = lua_tostring(L, -1);
+ lua_pop(L, 1);
+
+ return ret;
+}
+
+double luaGetFieldNumber(lua_State *L, const char *key)
+{
+ if (!L || !key)
+ return -1.0;
+
+ double ret = -1.0;
+
+ /* push the key string onto stack */
+ lua_pushstring(L, key);
+
+ /* remember, -1 points to top of the stack, our table should a second
+ * item from the top, this call effectively accesses t[key] and
+ * pushes that value on the stack */
+ lua_gettable(L, -2);
+ if (!lua_isnumber(L, -1))
+ {
+ fprintf(stderr, "Lua: \"%s\" field within the table is NaN\n", key);
+ lua_pop(L, 1);
+
+ return ret;
+ }
+
+ /* finally retrieve our value */
+ ret = lua_tonumber(L, -1);
+
+ /* value is no longer needed, pop it */
+ lua_pop(L, 1);
+
+ return ret;
+}
+
+int luaLoadConfig(lua_State *L, const char *fname)
+{
+ if (!L || !fname)
+ return -1;
+
+ int status;
+
+ /* load the file containing the config */
+ /* call a function, what function? dry run the script? */
+ status = (luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0));
+ if (status)
+ {
+ fprintf(stderr, "Lua: %s\n", lua_tostring(L, -1));
+ return -1;
+ }
+
+ return 0;
+}
+
+int luaFillPlatform(lua_State *L, struct platform *p)
+{
+ if (!L || !p)
+ return -1;
+
+ double ret;
+
+ /* pushes the table on the stack */
+ lua_getglobal(L, "platform");
+
+ if (!lua_istable(L, -1))
+ {
+ fprintf(stderr, "Lua: failed to parse \"platform\" table\n");
+ lua_pop(L, 1);
+ return -1;
+ }
+
+ if ((ret = luaGetFieldNumber(L, "xres_w")) != -1.0)
+ p->xres_w = (unsigned int) ret;
+
+ if ((ret = luaGetFieldNumber(L, "yres_w")) != -1.0)
+ p->yres_w = (unsigned int) ret;
+
+ if ((ret = luaGetFieldNumber(L, "bpp_w")) != -1.0)
+ p->bpp_w = (unsigned int) ret;
+
+ if ((ret = luaGetFieldNumber(L, "fovy_w")) != -1.0)
+ p->fovy_w = (float) ret;
+
+ if ((ret = luaGetFieldNumber(L, "znear_w")) != -1.0)
+ p->znear_w = (float) ret;
+
+ if ((ret = luaGetFieldNumber(L, "zfar_w")) != -1.0)
+ p->zfar_w = (float) ret;
+
+ /* pop the table */
+ lua_pop(L, 1);
+
+ return 0;
+}
+
+void printPlatform(struct platform *p)
+{
+ if (!p)
+ return;
+
+ printf("xres_w : %u\n"
+ "yres_w : %u\n"
+ "bpp_w : %u\n"
+ "fovy_w : %f\n"
+ "znear_w: %f\n"
+ "zfar_w : %f",
+ p->xres_w, p->yres_w, p->bpp_w, p->fovy_w,
+ p->znear_w, p->zfar_w);
+ puts("");
+}
+
+int main(int argc, char **argv)
+{
+ lua_State *L;
+
+ /* create new lua state */
+ L = luaL_newstate();
+
+ /* load lua libraries */
+ luaL_openlibs(L);
+
+ struct platform p;
+ memset(&p, 0, sizeof(p));
+ luaLoadConfig(L, "config.lua");
+ luaFillPlatform(L, &p);
+ printPlatform(&p);
+
+ lua_close(L);
+
+ return 0;
+}
+