aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-31 17:23:40 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-31 17:23:40 -0300
commitf0b3cd1d6f35ba34091450d5e3057269114a17b6 (patch)
treeceffcf31f1823709b7ab4e63801e5e483abf8490 /lapi.c
parentfb5e6d5ac498649b8e1b6bf068d18078ef70d523 (diff)
downloadlua-f0b3cd1d6f35ba34091450d5e3057269114a17b6.tar.gz
lua-f0b3cd1d6f35ba34091450d5e3057269114a17b6.tar.bz2
lua-f0b3cd1d6f35ba34091450d5e3057269114a17b6.zip
new API functions `pop', `insert', and `move'
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/lapi.c b/lapi.c
index 75159082..5364c040 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.90 2000/08/29 20:43:28 roberto Exp roberto $ 2** $Id: lapi.c,v 1.91 2000/08/31 14:08:27 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -65,7 +65,25 @@ void lua_settop (lua_State *L, int index) {
65 if (index >= 0) 65 if (index >= 0)
66 luaD_adjusttop(L, L->Cbase, index); 66 luaD_adjusttop(L, L->Cbase, index);
67 else 67 else
68 L->top += index; /* index is negative */ 68 L->top = L->top+index+1; /* index is negative */
69}
70
71
72void lua_move (lua_State *L, int index) {
73 TObject *p = Index(L, index);
74 TObject temp = *p;
75 while (++p < L->top) *(p-1) = *p;
76 *(L->top-1) = temp;
77}
78
79
80void lua_insert (lua_State *L, int index) {
81 TObject temp = *(L->top-1);
82 TObject *p = Index(L, index);
83 TObject *q;
84 for (q = L->top-1; q>p; q--)
85 *q = *(q-1);
86 *p = temp;
69} 87}
70 88
71 89
@@ -218,8 +236,7 @@ void lua_gettable (lua_State *L) {
218 236
219 237
220void lua_rawget (lua_State *L) { 238void lua_rawget (lua_State *L) {
221 if (ttype(L->top - 2) != TAG_TABLE) 239 LUA_ASSERT(ttype(L->top-2) == TAG_TABLE, "not a table");
222 lua_error(L, "indexed expression not a table");
223 *(L->top - 2) = *luaH_get(L, hvalue(L->top - 2), L->top - 1); 240 *(L->top - 2) = *luaH_get(L, hvalue(L->top - 2), L->top - 1);
224 L->top--; 241 L->top--;
225} 242}
@@ -278,8 +295,7 @@ void lua_settable (lua_State *L) {
278 295
279 296
280void lua_rawset (lua_State *L) { 297void lua_rawset (lua_State *L) {
281 if (ttype(L->top-3) != TAG_TABLE) 298 LUA_ASSERT(ttype(L->top-3) == TAG_TABLE, "not a table");
282 lua_error(L, "indexed expression not a table");
283 *luaH_set(L, hvalue(L->top-3), L->top-2) = *(L->top-1); 299 *luaH_set(L, hvalue(L->top-3), L->top-2) = *(L->top-1);
284 L->top -= 3; 300 L->top -= 3;
285} 301}
@@ -287,8 +303,7 @@ void lua_rawset (lua_State *L) {
287 303
288void lua_setglobals (lua_State *L) { 304void lua_setglobals (lua_State *L) {
289 TObject *newtable = --L->top; 305 TObject *newtable = --L->top;
290 if (ttype(newtable) != TAG_TABLE) 306 LUA_ASSERT(ttype(newtable) == TAG_TABLE, "not a table");
291 lua_error(L, "Lua API error - invalid value for global table");
292 L->gt = hvalue(newtable); 307 L->gt = hvalue(newtable);
293} 308}
294 309
@@ -350,9 +365,7 @@ void lua_settag (lua_State *L, int tag) {
350 365
351void lua_unref (lua_State *L, int ref) { 366void lua_unref (lua_State *L, int ref) {
352 if (ref >= 0) { 367 if (ref >= 0) {
353 if (ref >= L->refSize || L->refArray[ref].st >= 0) 368 LUA_ASSERT(ref < L->refSize && L->refArray[ref].st < 0, "invalid ref");
354 lua_error(L, "Lua API error - "
355 "invalid argument for function `lua_unref'");
356 L->refArray[ref].st = L->refFree; 369 L->refArray[ref].st = L->refFree;
357 L->refFree = ref; 370 L->refFree = ref;
358 } 371 }
@@ -362,8 +375,7 @@ void lua_unref (lua_State *L, int ref) {
362int lua_next (lua_State *L) { 375int lua_next (lua_State *L) {
363 const TObject *t = Index(L, -2); 376 const TObject *t = Index(L, -2);
364 Node *n; 377 Node *n;
365 if (ttype(t) != TAG_TABLE) 378 LUA_ASSERT(ttype(t) == TAG_TABLE, "object is not a table in `lua_next'");
366 lua_error(L, "Lua API error - object is not a table in `lua_next'");
367 n = luaH_next(L, hvalue(t), Index(L, -1)); 379 n = luaH_next(L, hvalue(t), Index(L, -1));
368 if (n) { 380 if (n) {
369 *(L->top-1) = *key(n); 381 *(L->top-1) = *key(n);