⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lbaselib.c

📁 小游戏 linux very happy
💻 C
📖 第 1 页 / 共 2 页
字号:
      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 + -