From 16b24f55cc3bb0a2258757ff37abb8baeecb5e97 Mon Sep 17 00:00:00 2001 From: Kamil Kaminski Date: Tue, 26 Jul 2011 20:32:45 -0500 Subject: initial commit --- Makefile | 32 +++++++++++ config.lua | 10 ++++ luaload.c | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 228 insertions(+) create mode 100644 Makefile create mode 100644 config.lua create mode 100644 luaload.c 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 +#include +#include +#include +#include +#include + +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; +} + -- cgit v1.2.3