📄 lbaselib.c
字号:
sprintf(buff, "userdata(%d): %p", lua_tag(L, 1), lua_touserdata(L, 1)); break; case LUA_TNIL: lua_pushstring(L, "nil"); return 1; default: luaL_argerror(L, 1, "value expected"); } lua_pushstring(L, buff); return 1;}static int luaB_foreachi (lua_State *L) { int n, i; luaL_checktype(L, 1, LUA_TTABLE); luaL_checktype(L, 2, LUA_TFUNCTION); n = lua_getn(L, 1); for (i=1; i<=n; i++) { lua_pushvalue(L, 2); /* function */ lua_pushnumber(L, i); /* 1st argument */ lua_rawgeti(L, 1, i); /* 2nd argument */ lua_rawcall(L, 2, 1); if (!lua_isnil(L, -1)) return 1; lua_pop(L, 1); /* remove nil result */ } return 0;}static int luaB_foreach (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); luaL_checktype(L, 2, LUA_TFUNCTION); lua_pushnil(L); /* first index */ for (;;) { if (lua_next(L, 1) == 0) return 0; lua_pushvalue(L, 2); /* function */ lua_pushvalue(L, -3); /* key */ lua_pushvalue(L, -3); /* value */ lua_rawcall(L, 2, 1); if (!lua_isnil(L, -1)) return 1; lua_pop(L, 2); /* remove value and result */ }}static int luaB_assert (lua_State *L) { luaL_checkany(L, 1); if (lua_isnil(L, 1)) luaL_verror(L, "assertion failed! %.90s", luaL_opt_string(L, 2, "")); return 0;}static int luaB_getn (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); lua_pushnumber(L, lua_getn(L, 1)); return 1;}static int luaB_tinsert (lua_State *L) { int v = lua_gettop(L); /* last argument: to be inserted */ int n, pos; luaL_checktype(L, 1, LUA_TTABLE); n = lua_getn(L, 1); if (v == 2) /* called with only 2 arguments */ pos = n+1; else pos = luaL_check_int(L, 2); /* 2nd argument is the position */ lua_pushstring(L, "n"); lua_pushnumber(L, n+1); lua_rawset(L, 1); /* t.n = n+1 */ for (; n>=pos; n--) { lua_rawgeti(L, 1, n); lua_rawseti(L, 1, n+1); /* t[n+1] = t[n] */ } lua_pushvalue(L, v); lua_rawseti(L, 1, pos); /* t[pos] = v */ return 0;}static int luaB_tremove (lua_State *L) { int pos, n; luaL_checktype(L, 1, LUA_TTABLE); n = lua_getn(L, 1); pos = luaL_opt_int(L, 2, n); if (n <= 0) return 0; /* table is "empty" */ lua_rawgeti(L, 1, pos); /* result = t[pos] */ for ( ;pos<n; pos++) { lua_rawgeti(L, 1, pos+1); lua_rawseti(L, 1, pos); /* a[pos] = a[pos+1] */ } lua_pushstring(L, "n"); lua_pushnumber(L, n-1); lua_rawset(L, 1); /* t.n = n-1 */ lua_pushnil(L); lua_rawseti(L, 1, n); /* t[n] = nil */ return 1;}/*** {======================================================** Quicksort** (based on `Algorithms in MODULA-3', Robert Sedgewick;** Addison-Wesley, 1993.)*/static void set2 (lua_State *L, int i, int j) { lua_rawseti(L, 1, i); lua_rawseti(L, 1, j);}static int sort_comp (lua_State *L, int a, int b) { /* WARNING: the caller (auxsort) must ensure stack space */ if (!lua_isnil(L, 2)) { /* function? */ int res; lua_pushvalue(L, 2); lua_pushvalue(L, a-1); /* -1 to compensate function */ lua_pushvalue(L, b-2); /* -2 to compensate function and `a' */ lua_rawcall(L, 2, 1); res = !lua_isnil(L, -1); lua_pop(L, 1); return res; } else /* a < b? */ return lua_lessthan(L, a, b);}static void auxsort (lua_State *L, int l, int u) { while (l < u) { /* for tail recursion */ int i, j; /* sort elements a[l], a[(l+u)/2] and a[u] */ lua_rawgeti(L, 1, l); lua_rawgeti(L, 1, u); if (sort_comp(L, -1, -2)) /* a[u] < a[l]? */ set2(L, l, u); /* swap a[l] - a[u] */ else lua_pop(L, 2); if (u-l == 1) break; /* only 2 elements */ i = (l+u)/2; lua_rawgeti(L, 1, i); lua_rawgeti(L, 1, l); if (sort_comp(L, -2, -1)) /* a[i]<a[l]? */ set2(L, i, l); else { lua_pop(L, 1); /* remove a[l] */ lua_rawgeti(L, 1, u); if (sort_comp(L, -1, -2)) /* a[u]<a[i]? */ set2(L, i, u); else lua_pop(L, 2); } if (u-l == 2) break; /* only 3 elements */ lua_rawgeti(L, 1, i); /* Pivot */ lua_pushvalue(L, -1); lua_rawgeti(L, 1, u-1); set2(L, i, u-1); /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */ i = l; j = u-1; for (;;) { /* invariant: a[l..i] <= P <= a[j..u] */ /* repeat ++i until a[i] >= P */ while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { if (i>u) lua_error(L, "invalid order function for sorting"); lua_pop(L, 1); /* remove a[i] */ } /* repeat --j until a[j] <= P */ while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { if (j<l) lua_error(L, "invalid order function for sorting"); lua_pop(L, 1); /* remove a[j] */ } if (j<i) { lua_pop(L, 3); /* pop pivot, a[i], a[j] */ break; } set2(L, i, j); } lua_rawgeti(L, 1, u-1); lua_rawgeti(L, 1, i); set2(L, u-1, i); /* swap pivot (a[u-1]) with a[i] */ /* a[l..i-1] <= a[i] == P <= a[i+1..u] */ /* adjust so that smaller "half" is in [j..i] and larger one in [l..u] */ if (i-l < u-i) { j=l; i=i-1; l=i+2; } else { j=i+1; i=u; u=j-2; } auxsort(L, j, i); /* call recursively the smaller one */ } /* repeat the routine for the larger one */}static int luaB_sort (lua_State *L) { int n; luaL_checktype(L, 1, LUA_TTABLE); n = lua_getn(L, 1); if (!lua_isnull(L, 2)) /* is there a 2nd argument? */ luaL_checktype(L, 2, LUA_TFUNCTION); lua_settop(L, 2); /* make sure there is two arguments */ auxsort(L, 1, n); return 0;}/* }====================================================== *//*** {======================================================** Deprecated functions to manipulate global environment.** =======================================================*/#define num_deprecated 4static const struct luaL_reg deprecated_names [num_deprecated] = { {"foreachvar", luaB_foreach}, {"nextvar", luaB_next}, {"rawgetglobal", luaB_rawget}, {"rawsetglobal", luaB_rawset}};#ifdef LUA_DEPRECATEDFUNCS/*** call corresponding function inserting `globals' as first argument*/static int deprecated_func (lua_State *L) { lua_insert(L, 1); /* upvalue is the function to be called */ lua_getglobals(L); lua_insert(L, 2); /* table of globals is 1o argument */ lua_rawcall(L, lua_gettop(L)-1, LUA_MULTRET); return lua_gettop(L); /* return all results */}static void deprecated_funcs (lua_State *L) { int i; for (i=0; i<num_deprecated; i++) { lua_pushcfunction(L, deprecated_names[i].func); lua_pushcclosure(L, deprecated_func, 1); lua_setglobal(L, deprecated_names[i].name); }}#else/*** gives an explicit error in any attempt to call a deprecated function*/static int deprecated_func (lua_State *L) { luaL_verror(L, "function `%.20s' is deprecated", lua_tostring(L, -1)); return 0; /* to avoid warnings */}static void deprecated_funcs (lua_State *L) { int i; for (i=0; i<num_deprecated; i++) { lua_pushstring(L, deprecated_names[i].name); lua_pushcclosure(L, deprecated_func, 1); lua_setglobal(L, deprecated_names[i].name); }}#endif/* }====================================================== */static const struct luaL_reg base_funcs[] = { {LUA_ALERT, luaB__ALERT}, {LUA_ERRORMESSAGE, luaB__ERRORMESSAGE}, {"call", luaB_call}, {"collectgarbage", luaB_collectgarbage}, {"copytagmethods", luaB_copytagmethods}, {"dofile", luaB_dofile}, {"dostring", luaB_dostring}, {"error", luaB_error}, {"foreach", luaB_foreach}, {"foreachi", luaB_foreachi}, {"gcinfo", luaB_gcinfo}, {"getglobal", luaB_getglobal}, {"gettagmethod", luaB_gettagmethod}, {"globals", luaB_globals}, {"newtag", luaB_newtag}, {"next", luaB_next}, {"print", luaB_print}, {"rawget", luaB_rawget}, {"rawset", luaB_rawset}, {"rawgettable", luaB_rawget}, /* for compatibility */ {"rawsettable", luaB_rawset}, /* for compatibility */ {"setglobal", luaB_setglobal}, {"settag", luaB_settag}, {"settagmethod", luaB_settagmethod}, {"tag", luaB_tag}, {"tonumber", luaB_tonumber}, {"tostring", luaB_tostring}, {"type", luaB_type}, {"assert", luaB_assert}, {"getn", luaB_getn}, {"sort", luaB_sort}, {"tinsert", luaB_tinsert}, {"tremove", luaB_tremove}};LUALIB_API void lua_baselibopen (lua_State *L) { luaL_openl(L, base_funcs); lua_pushstring(L, LUA_VERSION); lua_setglobal(L, "_VERSION"); deprecated_funcs(L);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -