/* 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; }