aboutsummaryrefslogtreecommitdiff
path: root/ltablib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-09-20 14:56:47 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-09-20 14:56:47 -0300
commit0fae476ed4fd899809897d72343bc5b61afff158 (patch)
tree582bdcc70f52b2c15eb2aa7dcad87ee3c321390e /ltablib.c
parent361a9adba7aff402b7e5f559a361ff5f86f62415 (diff)
downloadlua-0fae476ed4fd899809897d72343bc5b61afff158.tar.gz
lua-0fae476ed4fd899809897d72343bc5b61afff158.tar.bz2
lua-0fae476ed4fd899809897d72343bc5b61afff158.zip
new function 'table.maxn'
Diffstat (limited to 'ltablib.c')
-rw-r--r--ltablib.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/ltablib.c b/ltablib.c
index 9d123605..a8214d29 100644
--- a/ltablib.c
+++ b/ltablib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltablib.c,v 1.34 2005/08/15 14:12:32 roberto Exp roberto $ 2** $Id: ltablib.c,v 1.35 2005/08/26 17:36:32 roberto Exp roberto $
3** Library for Table Manipulation 3** Library for Table Manipulation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -40,9 +40,7 @@ static int foreach (lua_State *L) {
40 luaL_checktype(L, 1, LUA_TTABLE); 40 luaL_checktype(L, 1, LUA_TTABLE);
41 luaL_checktype(L, 2, LUA_TFUNCTION); 41 luaL_checktype(L, 2, LUA_TFUNCTION);
42 lua_pushnil(L); /* first key */ 42 lua_pushnil(L); /* first key */
43 for (;;) { 43 while (lua_next(L, 1)) {
44 if (lua_next(L, 1) == 0)
45 return 0;
46 lua_pushvalue(L, 2); /* function */ 44 lua_pushvalue(L, 2); /* function */
47 lua_pushvalue(L, -3); /* key */ 45 lua_pushvalue(L, -3); /* key */
48 lua_pushvalue(L, -3); /* value */ 46 lua_pushvalue(L, -3); /* value */
@@ -51,6 +49,23 @@ static int foreach (lua_State *L) {
51 return 1; 49 return 1;
52 lua_pop(L, 2); /* remove value and result */ 50 lua_pop(L, 2); /* remove value and result */
53 } 51 }
52 return 0;
53}
54
55
56static int maxn (lua_State *L) {
57 lua_Number max = 0;
58 luaL_checktype(L, 1, LUA_TTABLE);
59 lua_pushnil(L); /* first key */
60 while (lua_next(L, 1)) {
61 lua_pop(L, 1); /* remove value */
62 if (lua_type(L, -1) == LUA_TNUMBER) {
63 lua_Number v = lua_tonumber(L, -1);
64 if (v > max) max = v;
65 }
66 }
67 lua_pushnumber(L, max);
68 return 1;
54} 69}
55 70
56 71
@@ -241,6 +256,7 @@ static const luaL_Reg tab_funcs[] = {
241 {"foreach", foreach}, 256 {"foreach", foreach},
242 {"foreachi", foreachi}, 257 {"foreachi", foreachi},
243 {"getn", getn}, 258 {"getn", getn},
259 {"maxn", maxn},
244 {"insert", tinsert}, 260 {"insert", tinsert},
245 {"remove", tremove}, 261 {"remove", tremove},
246 {"setn", setn}, 262 {"setn", setn},