static int os_pushresult (lv_State *L, int i, const char *filename) { int en = errno; /* calls to [L u a] API may change this value */ if (i) { lv_pushboolean(L, 1); return 1; } else { lv_pushnil(L); lv_pushfstring(L, "%s: %s", filename, strerror(en)); lv_pushinteger(L, en); return 3; } }
static int foreachi (lv_State *L) { lv_clearFirstTableValue(L); int i; int n = aux_getn(L, 1); lvL_checktype(L, 2, LV_TFUNCTION); for (i=1; i <= n; i++) { lv_pushvalue(L, 2); /* function */ lv_pushinteger(L, i); /* 1st argument */ lv_rawgeti(L, 1, i); /* 2nd argument */ lv_call(L, 2, 1); if (!lv_isnil(L, -1)) return 1; lv_pop(L, 1); /* remove nil result */ } return 0; }
static void hookf (lv_State *L, lv_Debug *ar) { static const char *const hooknames[] = {"call", "return", "line", "count", "tail return"}; lv_pushlightuserdata(L, (void *)&KEY_HOOK); lv_rawget(L, LV_REGISTRYINDEX); lv_pushlightuserdata(L, L); lv_rawget(L, -2); if (lv_isfunction(L, -1)) { lv_pushstring(L, hooknames[(int)ar->event]); if (ar->currentline >= 0) lv_pushinteger(L, ar->currentline); else lv_pushnil(L); lv_assert(lv_getinfo(L, "lS", ar)); lv_call(L, 2, 0); } }
static int db_gethook (lv_State *L) { int arg; lv_State *L1 = getthread(L, &arg); char buff[5]; int mask = lv_gethookmask(L1); lv_Hook hook = lv_gethook(L1); if (hook != NULL && hook != hookf) /* external hook? */ lv_pushliteral(L, "external hook"); else { gethooktable(L); lv_pushlightuserdata(L, L1); lv_rawget(L, -2); /* get hook */ lv_remove(L, -2); /* remove hook table */ } lv_pushstring(L, unmakemask(mask, buff)); lv_pushinteger(L, lv_gethookcount(L1)); return 3; }
static void setfield (lv_State *L, const char *key, int value) { lv_pushinteger(L, value); lv_setfield(L, -2, key); }
static int os_execute (lv_State *L) { //lv_pushinteger(L, system(lvL_optstring(L, 1, NULL))); lv_pushinteger(L, 0); return 1; }
static int getn (lv_State *L) { lv_clearFirstTableValue(L); lv_pushinteger(L, aux_getn(L, 1)); return 1; }
static void settabsi (lv_State *L, const char *i, int v) { lv_pushinteger(L, v); lv_setfield(L, -2, i); }