int LS_jam_evaluaterule(ls_lua_State *L) { LOL lol; int i; LIST *list; int index; int numParams = ls_lua_gettop(L); if (numParams < 1) return 0; if (!ls_lua_isstring(L, 1)) return 0; lol_init(&lol); for (i = 0; i < numParams - 1; ++i) { lol_add(&lol, luahelper_addtolist(L, L0, 2 + i)); } list = evaluate_rule(ls_lua_tostring(L, 1), &lol, L0); lol_free(&lol); ls_lua_newtable(L); index = 1; for (; list; list = list_next(list), ++index) { ls_lua_pushnumber(L, index); ls_lua_pushstring(L, list->string); ls_lua_settable(L, -3); } return 1; }
LIST * builtin_luafile( PARSE *parse, LOL *args, int *jmp) { int top; int ret; LIST *l2; int index = 0; LIST *l = lol_get(args, 0); if (!l) { printf("jam: No argument passed to LuaFile\n"); exit(EXITBAD); } ls_lua_init(); top = ls_lua_gettop(L); ls_lua_newtable(L); for (l2 = lol_get(args, 1); l2; l2 = l2->next) { ls_lua_pushstring(L, l2->string); ls_lua_rawseti(L, -2, ++index); } ls_lua_setfield(L, LUA_GLOBALSINDEX, "arg"); ret = ls_luaL_loadfile(L, l->string); return ls_lua_callhelper(top, ret); }
int LS_jam_expand(ls_lua_State *L) { LIST *list = L0; LISTITEM* item; int index; int numParams = ls_lua_gettop(L); if (numParams < 1 || numParams > 1) return 0; if (!ls_lua_isstring(L, 1)) return 0; { LOL lol; const char* src = ls_lua_tostring(L, 1); lol_init(&lol); list = var_expand(L0, src, src + strlen(src), &lol, 0); } ls_lua_newtable(L); index = 1; for (item = list_first(list); item; item = list_next(item), ++index) { ls_lua_pushnumber(L, index); ls_lua_pushstring(L, list_value(item)); ls_lua_settable(L, -3); } return 1; }
LIST * builtin_luafile( PARSE *parse, LOL *args, int *jmp) { int top; int ret; LISTITEM *l2; int index = 0; LIST *l = lol_get(args, 0); if (!list_first(l)) { printf("jam: No argument passed to LuaFile\n"); exit(EXITBAD); } ls_lua_init(); top = ls_lua_gettop(L); ls_lua_newtable(L); for (l2 = list_first(lol_get(args, 1)); l2; l2 = list_next(l2)) { ls_lua_pushstring(L, list_value(l2)); ls_lua_rawseti(L, -2, ++index); } ls_lua_setglobal(L, "arg"); ret = ls_luaL_loadfile(L, list_value(list_first(l))); return ls_lua_callhelper(top, ret); }
int luahelper_taskadd(const char* taskscript) { int ret; int ref; size_t taskscriptlen = strlen(taskscript); char* newTaskScript; ls_lua_init(); ls_lua_getfield(L, LUA_GLOBALSINDEX, "lanes"); /* lanes */ ls_lua_getfield(L, -1, "gen"); /* lanes gen */ ls_lua_pushstring(L, "*"); /* lanes gen * */ newTaskScript = malloc( taskscriptlen + 1 ); strncpy(newTaskScript, taskscript, taskscriptlen); newTaskScript[taskscriptlen] = 0; ret = ls_luaL_loadstring(L, newTaskScript); /* lanes gen * script */ if (ret != 0) { if (ls_lua_isstring(L, -1)) printf("jam: Error compiling Lua lane\n%s\n", ls_lua_tostring(L, -1)); ls_lua_pop(L, 2); printf("%s\n", newTaskScript); free(newTaskScript); return -1; } free(newTaskScript); ret = ls_lua_pcall(L, 2, 1, 0); /* lanes lane_h */ if (ret != 0) { if (ls_lua_isstring(L, -1)) printf("jam: Error creating Lua lane\n%s\n", ls_lua_tostring(L, -1)); ls_lua_pop(L, 2); return -1; } if (!ls_lua_isfunction(L, -1)) /* lanes lane_h */ { ls_lua_pop(L, 2); return -1; } ret = ls_lua_pcall(L, 0, 1, 0); /* lanes ret */ if (ret != 0) { if (ls_lua_isstring(L, -1)) printf("jam: Error calling Lua lane\n%s\n", ls_lua_tostring(L, -1)); ls_lua_pop(L, 2); return -1; } ref = ls_luaL_ref(L, LUA_REGISTRYINDEX); ls_lua_pop(L, 1); return ref; }
int luahelper_md5callback(const char *filename, MD5SUM sum, const char* callback) { int ret; ls_lua_init(); ls_lua_getfield(L, LUA_GLOBALSINDEX, callback); if (!ls_lua_isfunction(L, -1)) { ls_lua_pop(L, 1); printf("jam: Error calling Lua md5 callback '%s'.\n", callback); memset(sum, 0, sizeof(MD5SUM)); return 0; } ls_lua_pushstring(L, filename); ret = ls_lua_pcall(L, 1, 1, 0); if (ret != 0) { if (ls_lua_isstring(L, -1)) printf("jam: Error running Lua md5 callback\n%s\n", ls_lua_tostring(L, -1)); ls_lua_pop(L, 1); memset(sum, 0, sizeof(MD5SUM)); return 0; } if (ls_lua_isnil(L, -1)) { memset(sum, 0, sizeof(MD5SUM)); ls_lua_pop(L, 1); return 0; } if (!ls_lua_isstring(L, -1) || ls_lua_objlen(L, -1) != sizeof(MD5SUM)) { printf("jam: Error running Lua md5 callback '%s'.\n", callback); memset(sum, 0, sizeof(MD5SUM)); ls_lua_pop(L, 1); return 0; } memcpy(sum, ls_lua_tostring(L, -1), sizeof(MD5SUM)); ls_lua_pop(L, 1); return 1; }
int LS_jam_getvar(ls_lua_State *L) { LIST *list; LISTITEM* item; int index; int numParams = ls_lua_gettop(L); if (numParams < 1 || numParams > 2) return 0; if (!ls_lua_isstring(L, 1)) return 0; if (numParams == 1) { list = var_get(ls_lua_tostring(L, 1)); } else { TARGET *t; if (!ls_lua_isstring(L, 2)) return 0; t = bindtarget(ls_lua_tostring(L, 1)); pushsettings(t->settings); list = var_get(ls_lua_tostring(L, 2)); popsettings(t->settings); } ls_lua_newtable(L); index = 1; for (item = list_first(list); item; item = list_next(item), ++index) { ls_lua_pushnumber(L, index); ls_lua_pushstring(L, list_value(item)); ls_lua_settable(L, -3); } return 1; }
int LS_jam_evaluaterule(ls_lua_State *L) { LOL lol; int i; LIST *list; LISTITEM* item; int index; const char* rule; int numParams = ls_lua_gettop(L); if (numParams < 1) return 0; if (!ls_lua_isstring(L, 1)) return 0; lol_init(&lol); rule = ls_lua_tostring(L, 1); for (i = 0; i < numParams - 1; ++i) { lol_add(&lol, luahelper_addtolist(L, L0, 2 + i)); } list = evaluate_rule(rule, &lol, L0); lol_free(&lol); ls_lua_newtable(L); index = 1; for (item = list_first(list); item; item = list_next(item), ++index) { ls_lua_pushnumber(L, index); ls_lua_pushstring(L, list_value(item)); ls_lua_settable(L, -3); } return 1; }
int luahelper_taskadd(const char* taskscript, LOL* args) { int ret; int ref; size_t taskscriptlen = strlen(taskscript); char* newTaskScript; int i; ls_lua_init(); ls_lua_getglobal(L, "lanes"); /* lanes */ ls_lua_getfield(L, -1, "gen"); /* lanes gen */ ls_lua_pushstring(L, "*"); /* lanes gen * */ newTaskScript = malloc( taskscriptlen + 1 ); strncpy(newTaskScript, taskscript, taskscriptlen); newTaskScript[taskscriptlen] = 0; ret = ls_luaL_loadstring(L, newTaskScript); /* lanes gen * script */ if (ret != 0) { if (ls_lua_isstring(L, -1)) printf("jam: Error compiling Lua lane\n%s\n", ls_lua_tostring(L, -1)); ls_lua_pop(L, 2); printf("%s\n", newTaskScript); free(newTaskScript); return -1; } free(newTaskScript); ret = ls_lua_pcall(L, 2, 1, 0); /* lanes lane_h */ if (ret != 0) { if (ls_lua_isstring(L, -1)) printf("jam: Error creating Lua lane\n%s\n", ls_lua_tostring(L, -1)); ls_lua_pop(L, 2); return -1; } if (!ls_lua_isfunction(L, -1)) /* lanes lane_h */ { ls_lua_pop(L, 2); return -1; } for (i = 0; i < args->count; ++i) { LIST* list = lol_get(args, i); LISTITEM *l2; int index = 0; ls_lua_newtable(L); for (l2 = list_first(list); l2; l2 = list_next(l2)) { ls_lua_pushstring(L, list_value(l2)); ls_lua_rawseti(L, -2, ++index); } } ret = ls_lua_pcall(L, args->count, 1, 0); /* lanes ret */ if (ret != 0) { if (ls_lua_isstring(L, -1)) printf("jam: Error calling Lua lane\n%s\n", ls_lua_tostring(L, -1)); ls_lua_pop(L, 2); return -1; } ref = ls_luaL_ref(L, LUA_REGISTRYINDEX); ls_lua_pop(L, 1); return ref; }