Пример #1
0
//#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);
        }
Пример #2
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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        /* }====================================================== */



        /*
        ** {======================================================
        ** 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);
        }