|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: lbuiltin.c,v 1.110 2000/05/24 13:54:49 roberto Exp roberto $
|
|
|
+** $Id: lbuiltin.c,v 1.111 2000/05/26 19:17:57 roberto Exp roberto $
|
|
|
** Built-in functions
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -438,10 +438,49 @@ void luaB_tremove (lua_State *L) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+static void luaB_foreachi (lua_State *L) {
|
|
|
+ const Hash *t = gettable(L, 1);
|
|
|
+ int n = (int)getnarg(L, t);
|
|
|
+ int i;
|
|
|
+ lua_Object f = luaL_functionarg(L, 2);
|
|
|
+ luaD_checkstack(L, 3); /* for f, key, and val */
|
|
|
+ for (i=1; i<=n; i++) {
|
|
|
+ *(L->top++) = *f;
|
|
|
+ ttype(L->top) = TAG_NUMBER; nvalue(L->top++) = i;
|
|
|
+ *(L->top++) = *luaH_getnum(t, i);
|
|
|
+ luaD_call(L, L->top-3, 1);
|
|
|
+ if (ttype(L->top-1) != TAG_NIL)
|
|
|
+ return;
|
|
|
+ L->top--; /* remove nil result */
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static void luaB_foreach (lua_State *L) {
|
|
|
+ const Hash *a = gettable(L, 1);
|
|
|
+ lua_Object f = luaL_functionarg(L, 2);
|
|
|
+ int i;
|
|
|
+ luaD_checkstack(L, 3); /* for f, key, and val */
|
|
|
+ for (i=0; i<a->size; i++) {
|
|
|
+ const Node *nd = &(a->node[i]);
|
|
|
+ if (ttype(val(nd)) != TAG_NIL) {
|
|
|
+ *(L->top++) = *f;
|
|
|
+ *(L->top++) = *key(nd);
|
|
|
+ *(L->top++) = *val(nd);
|
|
|
+ luaD_call(L, L->top-3, 1);
|
|
|
+ if (ttype(L->top-1) != TAG_NIL)
|
|
|
+ return;
|
|
|
+ L->top--; /* remove result */
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
** {======================================================
|
|
|
** Quicksort
|
|
|
-** (based on `Algorithms in MODULA-3', Robert Sedgewick; Addison-Wesley, 1993.)
|
|
|
+** (based on `Algorithms in MODULA-3', Robert Sedgewick;
|
|
|
+** Addison-Wesley, 1993.)
|
|
|
*/
|
|
|
|
|
|
static void swap (lua_State *L, Hash *a, int i, int j) {
|
|
@@ -539,43 +578,6 @@ void luaB_sort (lua_State *L) {
|
|
|
|
|
|
#ifdef LUA_DEPRECATETFUNCS
|
|
|
|
|
|
-static void luaB_foreachi (lua_State *L) {
|
|
|
- const Hash *t = gettable(L, 1);
|
|
|
- int n = (int)getnarg(L, t);
|
|
|
- int i;
|
|
|
- lua_Object f = luaL_functionarg(L, 2);
|
|
|
- luaD_checkstack(L, 3); /* for f, key, and val */
|
|
|
- for (i=1; i<=n; i++) {
|
|
|
- *(L->top++) = *f;
|
|
|
- ttype(L->top) = TAG_NUMBER; nvalue(L->top++) = i;
|
|
|
- *(L->top++) = *luaH_getnum(t, i);
|
|
|
- luaD_call(L, L->top-3, 1);
|
|
|
- if (ttype(L->top-1) != TAG_NIL)
|
|
|
- return;
|
|
|
- L->top--; /* remove nil result */
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-static void luaB_foreach (lua_State *L) {
|
|
|
- const Hash *a = gettable(L, 1);
|
|
|
- lua_Object f = luaL_functionarg(L, 2);
|
|
|
- int i;
|
|
|
- luaD_checkstack(L, 3); /* for f, key, and val */
|
|
|
- for (i=0; i<a->size; i++) {
|
|
|
- const Node *nd = &(a->node[i]);
|
|
|
- if (ttype(val(nd)) != TAG_NIL) {
|
|
|
- *(L->top++) = *f;
|
|
|
- *(L->top++) = *key(nd);
|
|
|
- *(L->top++) = *val(nd);
|
|
|
- luaD_call(L, L->top-3, 1);
|
|
|
- if (ttype(L->top-1) != TAG_NIL)
|
|
|
- return;
|
|
|
- L->top--; /* remove result */
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
#define num_deprecated 4
|
|
|
|
|
|
static const struct luaL_reg deprecated_global_funcs[num_deprecated] = {
|
|
@@ -587,8 +589,6 @@ static const struct luaL_reg deprecated_global_funcs[num_deprecated] = {
|
|
|
|
|
|
|
|
|
static const struct luaL_reg other_deprecated_global_funcs[] = {
|
|
|
- {"foreach", luaB_foreach},
|
|
|
- {"foreachi", luaB_foreachi},
|
|
|
{"rawgettable", luaB_rawget},
|
|
|
{"rawsettable", luaB_rawset}
|
|
|
};
|
|
@@ -618,10 +618,10 @@ static void obsolete_func (lua_State *L) {
|
|
|
}
|
|
|
|
|
|
|
|
|
-#define num_deprecated 8
|
|
|
+#define num_deprecated 6
|
|
|
|
|
|
static const char *const obsolete_names [num_deprecated] = {
|
|
|
- "foreach", "foreachi", "foreachvar", "nextvar", "rawgetglobal",
|
|
|
+ "foreachvar", "nextvar", "rawgetglobal",
|
|
|
"rawgettable", "rawsetglobal", "rawsettable"
|
|
|
};
|
|
|
|
|
@@ -648,6 +648,8 @@ static const struct luaL_reg builtin_funcs[] = {
|
|
|
{"dofile", luaB_dofile},
|
|
|
{"dostring", luaB_dostring},
|
|
|
{"error", luaB_error},
|
|
|
+ {"foreach", luaB_foreach},
|
|
|
+ {"foreachi", luaB_foreachi},
|
|
|
{"getglobal", luaB_getglobal},
|
|
|
{"gettagmethod", luaB_gettagmethod},
|
|
|
{"globals", luaB_globals},
|