Beispiel #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);
        }
Beispiel #2
0
        private static int unpack(lua_State L)
        {
            TabA         ta = new TabA();
            lua_Integer  i, e;
            lua_Unsigned n = 0;

            checktab(L, 1, ta);
            i = luaL_optinteger(L, 2, 1);
            e = luaL_opt_integer(L, luaL_checkinteger, 3, luaL_len(L, 1));
            if (i > e)
            {
                return(0);                   /* empty range */
            }
            n = (uint)((lua_Unsigned)e - i); /* number of elements minus 1 (avoid overflows) */
            if (n >= (uint)INT_MAX || 0 == lua_checkstack(L, (int)(++n)))
            {
                return(luaL_error(L, "too many results to unpack"));
            }
            do                    /* must have at least one element */
            {
                ta.geti(L, 1, i); /* push arg[i..e] */
            } while (i++ < e);

            return((int)n);
        }
Beispiel #3
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);
        }
Beispiel #4
0
 private static void addfield(lua_State L, luaL_Buffer b, TabA ta, lua_Integer i)
 {
     ta.geti(L, 1, i);
     if (lua_isstring(L, -1) == 0)
     {
         luaL_error(L, "invalid value (%s) at index %d in table for 'concat'",
                    luaL_typename(L, -1), i);
     }
     luaL_addvalue(b);
 }
Beispiel #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 */

            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);
        }
Beispiel #6
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);
        }
Beispiel #7
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);
        }
Beispiel #8
0
 private static void auxsort(lua_State L, TabA ta, int l, int u)
 {
     while (l < u)          /* for tail recursion */
     {
         int i, j;
         /* sort elements a[l], a[(l+u)/2] and a[u] */
         ta.geti(L, 1, l);
         ta.geti(L, 1, u);
         if (sort_comp(L, -1, -2) != 0) /* a[u] < a[l]? */
         {
             set2(L, ta, l, u);         /* swap a[l] - a[u] */
         }
         else
         {
             lua_pop(L, 2);
         }
         if (u - l == 1)
         {
             break;                    /* only 2 elements */
         }
         i = (l + u) / 2;
         ta.geti(L, 1, i);
         ta.geti(L, 1, l);
         if (sort_comp(L, -2, -1) != 0)          /* a[i]<a[l]? */
         {
             set2(L, ta, i, l);
         }
         else
         {
             lua_pop(L, 1);                 /* remove a[l] */
             ta.geti(L, 1, u);
             if (sort_comp(L, -1, -2) != 0) /* a[u]<a[i]? */
             {
                 set2(L, ta, i, u);
             }
             else
             {
                 lua_pop(L, 2);
             }
         }
         if (u - l == 2)
         {
             break;                 /* only 3 elements */
         }
         ta.geti(L, 1, i);          /* Pivot */
         lua_pushvalue(L, -1);
         ta.geti(L, 1, u - 1);
         set2(L, ta, 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 (auxsort_loop1(L, ref i, ta) != 0)         //FIXME:here changed
             {
                 if (i >= u)
                 {
                     luaL_error(L, "invalid order function for sorting");
                 }
                 lua_pop(L, 1);          /* remove a[i] */
             }
             /* repeat --j until a[j] <= P */
             while (auxsort_loop2(L, ref j, ta) != 0)         //FIXME:here changed
             {
                 if (j <= l)
                 {
                     luaL_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, ta, i, j);
         }
         lua_rawgeti(L, 1, u - 1);
         lua_rawgeti(L, 1, i);
         set2(L, ta, 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, ta, j, i); /* call recursively the smaller one */
     }                         /* repeat the routine for the larger one */
 }
Beispiel #9
0
 private static int auxsort_loop2(lua_State L, ref int j, TabA ta)
 {
     ta.geti(L, 1, --j);
     return(sort_comp(L, -3, -1));
 }
Beispiel #10
0
 private static int auxsort_loop1(lua_State L, ref int i, TabA ta)
 {
     ta.geti(L, 1, ++i);
     return(sort_comp(L, -1, -2));
 }