aboutsummaryrefslogtreecommitdiff
path: root/ltablib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-01-27 11:46:16 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-01-27 11:46:16 -0200
commit41ed3c47719b29dd02dc9fcf07f79dc6f2c4381d (patch)
tree0481135889c06eded52f6573f203742ab64186c1 /ltablib.c
parent635b7c707d146ab56127260601b6fb84c0c140f3 (diff)
downloadlua-41ed3c47719b29dd02dc9fcf07f79dc6f2c4381d.tar.gz
lua-41ed3c47719b29dd02dc9fcf07f79dc6f2c4381d.tar.bz2
lua-41ed3c47719b29dd02dc9fcf07f79dc6f2c4381d.zip
getn/setn in C moved to lauxlib
Diffstat (limited to 'ltablib.c')
-rw-r--r--ltablib.c65
1 files changed, 7 insertions, 58 deletions
diff --git a/ltablib.c b/ltablib.c
index 504081bc..c0e773aa 100644
--- a/ltablib.c
+++ b/ltablib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltablib.c,v 1.17 2002/12/04 17:38:31 roberto Exp roberto $ 2** $Id: ltablib.c,v 1.18 2002/12/20 10:26:33 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*/
@@ -15,52 +15,7 @@
15#include "lualib.h" 15#include "lualib.h"
16 16
17 17
18 18#define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))
19static int checkint (lua_State *L) {
20 int n = (int)lua_tonumber(L, -1);
21 if (n == 0 && !lua_isnumber(L, -1)) n = -1;
22 lua_pop(L, 1);
23 return n;
24}
25
26
27static void aux_setn (lua_State *L, int t, int n) {
28 lua_pushliteral(L, "n");
29 lua_rawget(L, t);
30 if (checkint(L) >= 0) {
31 lua_pushliteral(L, "n"); /* use it */
32 lua_pushnumber(L, n);
33 lua_rawset(L, t);
34 }
35 else { /* use N */
36 lua_pushvalue(L, t);
37 lua_pushnumber(L, n);
38 lua_rawset(L, lua_upvalueindex(1)); /* N[t] = n */
39 }
40}
41
42
43static int aux_getn (lua_State *L, int t) {
44 int n;
45 luaL_checktype(L, t, LUA_TTABLE);
46 lua_pushliteral(L, "n"); /* try t.n */
47 lua_rawget(L, t);
48 if ((n = checkint(L)) >= 0) return n;
49 lua_pushvalue(L, t); /* try N[t] */
50 lua_rawget(L, lua_upvalueindex(1));
51 if ((n = checkint(L)) >= 0) return n;
52 else { /* must count elements */
53 n = 0;
54 for (;;) {
55 lua_rawgeti(L, t, ++n);
56 if (lua_isnil(L, -1)) break;
57 lua_pop(L, 1);
58 }
59 lua_pop(L, 1);
60 aux_setn(L, t, n - 1);
61 return n - 1;
62 }
63}
64 19
65 20
66static int luaB_foreachi (lua_State *L) { 21static int luaB_foreachi (lua_State *L) {
@@ -106,7 +61,7 @@ static int luaB_getn (lua_State *L) {
106 61
107static int luaB_setn (lua_State *L) { 62static int luaB_setn (lua_State *L) {
108 luaL_checktype(L, 1, LUA_TTABLE); 63 luaL_checktype(L, 1, LUA_TTABLE);
109 aux_setn(L, 1, luaL_checkint(L, 2)); 64 luaL_setn(L, 1, luaL_checkint(L, 2));
110 return 0; 65 return 0;
111} 66}
112 67
@@ -122,7 +77,7 @@ static int luaB_tinsert (lua_State *L) {
122 if (pos > n) n = pos; /* `grow' array if necessary */ 77 if (pos > n) n = pos; /* `grow' array if necessary */
123 v = 3; /* function may be called with more than 3 args */ 78 v = 3; /* function may be called with more than 3 args */
124 } 79 }
125 aux_setn(L, 1, n); /* new size */ 80 luaL_setn(L, 1, n); /* new size */
126 while (--n >= pos) { /* move up elements */ 81 while (--n >= pos) { /* move up elements */
127 lua_rawgeti(L, 1, n); 82 lua_rawgeti(L, 1, n);
128 lua_rawseti(L, 1, n+1); /* t[n+1] = t[n] */ 83 lua_rawseti(L, 1, n+1); /* t[n+1] = t[n] */
@@ -137,7 +92,7 @@ static int luaB_tremove (lua_State *L) {
137 int n = aux_getn(L, 1); 92 int n = aux_getn(L, 1);
138 int pos = luaL_optint(L, 2, n); 93 int pos = luaL_optint(L, 2, n);
139 if (n <= 0) return 0; /* table is `empty' */ 94 if (n <= 0) return 0; /* table is `empty' */
140 aux_setn(L, 1, n-1); /* t.n = n-1 */ 95 luaL_setn(L, 1, n-1); /* t.n = n-1 */
141 lua_rawgeti(L, 1, pos); /* result = t[pos] */ 96 lua_rawgeti(L, 1, pos); /* result = t[pos] */
142 for ( ;pos<n; pos++) { 97 for ( ;pos<n; pos++) {
143 lua_rawgeti(L, 1, pos+1); 98 lua_rawgeti(L, 1, pos+1);
@@ -156,7 +111,7 @@ static int str_concat (lua_State *L) {
156 int i = luaL_optint(L, 3, 1); 111 int i = luaL_optint(L, 3, 1);
157 int n = luaL_optint(L, 4, 0); 112 int n = luaL_optint(L, 4, 0);
158 luaL_checktype(L, 1, LUA_TTABLE); 113 luaL_checktype(L, 1, LUA_TTABLE);
159 if (n == 0) n = aux_getn(L, 1); 114 if (n == 0) n = luaL_getn(L, 1);
160 luaL_buffinit(L, &b); 115 luaL_buffinit(L, &b);
161 for (; i <= n; i++) { 116 for (; i <= n; i++) {
162 lua_rawgeti(L, 1, i); 117 lua_rawgeti(L, 1, i);
@@ -289,13 +244,7 @@ static const luaL_reg tab_funcs[] = {
289 244
290 245
291LUALIB_API int lua_tablibopen (lua_State *L) { 246LUALIB_API int lua_tablibopen (lua_State *L) {
292 lua_newtable(L); /* create N (table to store num. elements in tables) */ 247 luaL_openlib(L, LUA_TABLIBNAME, tab_funcs, 0);
293 lua_pushvalue(L, -1); /* `N' will be its own metatable */
294 lua_setmetatable(L, -2);
295 lua_pushliteral(L, "__mode");
296 lua_pushliteral(L, "k");
297 lua_rawset(L, -3); /* metatable(N).__mode = "k" */
298 luaL_openlib(L, LUA_TABLIBNAME, tab_funcs, 1);
299 return 1; 248 return 1;
300} 249}
301 250