#include "config.h" #include "log.h" #include "lauxlib.h" #include "lualib.h" #include "stdlib.h" #include "string.h" int pow_open_config(lua_State *L_global, pow_config *cfg, char *path) { int err; cfg->L_global = L_global; luaL_openlibs(L_global); lua_State *L = lua_newthread(L_global); cfg->L_cfg = L; err = luaL_loadfile(L, path); if (err) { return 1; } err = lua_pcall(L, 0, 1, 0); if (err) { pow_log_error("%s\n", lua_tostring(L, -1)); return 1; } if (!lua_istable(L, -1)) { pow_log_error("bad config. you must return a table.\n"); return 1; } lua_getfield(L, -1, "repos"); // this will push the entire config table to -2 // and push repos to -1 if (lua_istable(L, -1)) { size_t repo_count = lua_objlen(L, -1); for (size_t i = 1; i <= repo_count; i++) { lua_rawgeti(L, -1, i); if (lua_istable(L, -1)) { pow_repo *repo = malloc(sizeof(pow_repo)); if (!repo) { lua_pop(L, 1); pow_log_error("malloc for repo failed, what the fuck? something really bad " "happened i guess\n"); return 1; } lua_getfield(L, -1, "path"); if (lua_isstring(L, -1)) { const char *path = lua_tostring(L, -1); const char *path_dup = strdup(path); if (!path_dup) { lua_pop(L, 1); lua_pop(L, 1); free(repo); pow_log_error( "malloc for path failed, what the fuck? something really bad " "happened i guess\n"); return 1; } repo->path = path_dup; } else { pow_log_error("invalid (or non existent) path for repo"); lua_pop(L, 1); lua_pop(L, 1); free(repo); continue; } pow_repo **repos = realloc(cfg->repos, (cfg->repos_count + 1) * sizeof(*repos)); if (!repos) { pow_log_error("failed realloc! bad things coming\n"); lua_pop(L, 1); lua_pop(L, 1); free((void*)repo->path); free(repo); return 1; } repos[cfg->repos_count++] = repo; cfg->repos = repos; lua_pop(L, 1); } lua_pop(L, 1); } lua_pop(L, 1); lua_getfield(L, -1, "build"); if (!lua_istable(L, -1)) { pow_log_info("no build options specified"); } else { pow_log_info("build opts defined"); } cfg->build_cfg_ref = luaL_ref(L, LUA_REGISTRYINDEX); } return 0; } int pow_close_config(pow_config *cfg) { for (size_t i = 0; i < cfg->repos_count; i++) { free((void*)cfg->repos[i]->path); free(cfg->repos[i]); } free(cfg->repos); lua_close(cfg->L_cfg); return 0; }