//#endif private static int tinsert(lua_State L) { TabA ta = new TabA(); lua_Integer e = aux_getn(L, 1, ta) + 1; /* first empty element */ lua_Integer pos; /* where to insert new element */ switch (lua_gettop(L)) { case 2: { /* called with only 2 arguments */ pos = e; /* insert new element at the end */ break; } case 3: { lua_Integer i; pos = luaL_checkinteger(L, 2); /* 2nd argument is the position */ luaL_argcheck(L, 1 <= pos && pos <= e, 2, "position out of bounds"); for (i = e; i > pos; i--) /* move up elements */ { ta.geti(L, 1, i - 1); ta.seti(L, 1, i); /* t[i] = t[i-1] */ } break; } default: { return(luaL_error(L, "wrong number of arguments to 'insert'")); } } ta.seti(L, 1, pos); /* t[pos] = v */ return(0); }
private static int tcopy(lua_State L) { TabA ta = new TabA(); lua_Integer f = luaL_checkinteger(L, 2); lua_Integer e = luaL_checkinteger(L, 3); lua_Integer t; int tt = 4; /* destination table */ /* the following restriction avoids several problems with overflows */ luaL_argcheck(L, f > 0, 2, "initial position must be positive"); if (lua_istable(L, tt)) { t = luaL_checkinteger(L, 5); } else { tt = 1; /* destination table is equal to source */ t = luaL_checkinteger(L, 4); } if (e >= f) /* otherwise, nothing to move */ { lua_Integer n, i; ta.geti = (0 == luaL_getmetafield(L, 1, "__index")) ? (geti_delegate)lua_rawgeti : geti; ta.seti = (0 == luaL_getmetafield(L, tt, "__newindex")) ? (seti_delegate)lua_rawseti : seti; n = e - f + 1; /* number of elements to move */ if (t > f) { for (i = n - 1; i >= 0; i--) { ta.geti(L, 1, f + i); ta.seti(L, tt, t + i); } } else { for (i = 0; i < n; i++) { ta.geti(L, 1, f + i); ta.seti(L, tt, t + i); } } } lua_pushvalue(L, tt); /* return "to table" */ return(1); }
private static int tmove(lua_State L) { TabA ta = new TabA(); lua_Integer f = luaL_checkinteger(L, 2); lua_Integer e = luaL_checkinteger(L, 3); lua_Integer t = luaL_checkinteger(L, 4); int tt = !lua_isnoneornil(L, 5) ? 5 : 1; /* destination table */ if (e >= f) /* otherwise, nothing to move */ { lua_Integer n, i; ta.geti = (luaL_getmetafield(L, 1, "__index") == LUA_TNIL) ? tmove_1(L) : lua_geti; ta.seti = (luaL_getmetafield(L, tt, "__newindex") == LUA_TNIL) ? tmove_2(L, tt) : lua_seti; luaL_argcheck(L, f > 0 || e < LUA_MAXINTEGER + f, 3, "too many elements to move"); n = e - f + 1; /* number of elements to move */ luaL_argcheck(L, t <= LUA_MAXINTEGER - n + 1, 4, "destination wrap around"); if (t > f) { for (i = n - 1; i >= 0; i--) { ta.geti(L, 1, f + i); ta.seti(L, tt, t + i); } } else { for (i = 0; i < n; i++) { ta.geti(L, 1, f + i); ta.seti(L, tt, t + i); } } } lua_pushvalue(L, tt); /* return "to table" */ return(1); }
private static int tremove(lua_State L) { TabA ta = new TabA(); lua_Integer size = aux_getn(L, 1, ta); lua_Integer pos = luaL_optinteger(L, 2, size); if (pos != size) /* validate 'pos' if given */ { luaL_argcheck(L, 1 <= pos && pos <= size + 1, 1, "position out of bounds"); } ta.geti(L, 1, pos); /* result = t[pos] */ for ( ; pos < size; pos++) { ta.geti(L, 1, pos + 1); ta.seti(L, 1, pos); /* t[pos] = t[pos+1] */ } lua_pushnil(L); ta.seti(L, 1, pos); /* t[pos] = nil */ return(1); }
private static int tmove(lua_State L) { TabA ta = new TabA(); lua_Integer f = luaL_checkinteger(L, 2); lua_Integer e = luaL_checkinteger(L, 3); lua_Integer t = luaL_checkinteger(L, 4); int tt = !lua_isnoneornil(L, 5) ? 5 : 1; /* destination table */ /* the following restriction avoids several problems with overflows */ luaL_argcheck(L, f > 0, 2, "initial position must be positive"); if (e >= f) /* otherwise, nothing to move */ { lua_Integer n, i; ta.geti = (luaL_getmetafield(L, 1, "__index") == LUA_TNIL) ? tmove_1(L) : lua_geti; ta.seti = (luaL_getmetafield(L, tt, "__newindex") == LUA_TNIL) ? tmove_2(L, tt) : lua_seti; n = e - f + 1; /* number of elements to move */ if (t > f) { for (i = n - 1; i >= 0; i--) { ta.geti(L, 1, f + i); ta.seti(L, tt, t + i); } } else { for (i = 0; i < n; i++) { ta.geti(L, 1, f + i); ta.seti(L, tt, t + i); } } } lua_pushvalue(L, tt); /* return "to table" */ return(1); }
/* }====================================================== */ /* ** {====================================================== ** Quicksort ** (based on 'Algorithms in MODULA-3', Robert Sedgewick; ** Addison-Wesley, 1993.) ** ======================================================= */ private static void set2(lua_State L, TabA ta, int i, int j) { ta.seti(L, 1, i); ta.seti(L, 1, j); }