aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c64
1 files changed, 48 insertions, 16 deletions
diff --git a/lapi.c b/lapi.c
index 65654138..86acf301 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.36 1999/02/12 19:23:02 roberto Exp roberto $ 2** $Id: lapi.c,v 1.37 1999/02/22 19:13:12 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*/
@@ -25,7 +25,7 @@
25 25
26 26
27char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n" 27char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n"
28 "$Autores: " LUA_AUTHORS " $"; 28 "$Authors: " LUA_AUTHORS " $";
29 29
30 30
31 31
@@ -70,12 +70,8 @@ void luaA_packresults (void)
70} 70}
71 71
72 72
73int luaA_passresults (void) 73int luaA_passresults (void) {
74{ 74 L->Cstack.base = L->Cstack.lua2C; /* position of first result */
75 luaD_checkstack(L->Cstack.num);
76 memcpy(L->stack.top, L->Cstack.lua2C+L->stack.stack,
77 L->Cstack.num*sizeof(TObject));
78 L->stack.top += L->Cstack.num;
79 return L->Cstack.num; 75 return L->Cstack.num;
80} 76}
81 77
@@ -87,24 +83,29 @@ static void checkCparams (int nParams)
87} 83}
88 84
89 85
90static lua_Object put_luaObject (TObject *o) 86static lua_Object put_luaObject (TObject *o) {
91{
92 luaD_openstack((L->stack.top-L->stack.stack)-L->Cstack.base); 87 luaD_openstack((L->stack.top-L->stack.stack)-L->Cstack.base);
93 L->stack.stack[L->Cstack.base++] = *o; 88 L->stack.stack[L->Cstack.base++] = *o;
94 return L->Cstack.base; /* this is +1 real position (see Ref) */ 89 return L->Cstack.base; /* this is +1 real position (see Ref) */
95} 90}
96 91
97 92
98static lua_Object put_luaObjectonTop (void) 93static lua_Object put_luaObjectonTop (void) {
99{
100 luaD_openstack((L->stack.top-L->stack.stack)-L->Cstack.base); 94 luaD_openstack((L->stack.top-L->stack.stack)-L->Cstack.base);
101 L->stack.stack[L->Cstack.base++] = *(--L->stack.top); 95 L->stack.stack[L->Cstack.base++] = *(--L->stack.top);
102 return L->Cstack.base; /* this is +1 real position (see Ref) */ 96 return L->Cstack.base; /* this is +1 real position (see Ref) */
103} 97}
104 98
105 99
106lua_Object lua_pop (void) 100static void top2LC (int n) {
107{ 101 /* Put the 'n' elements on the top as the Lua2C contents */
102 L->Cstack.base = (L->stack.top-L->stack.stack); /* new base */
103 L->Cstack.lua2C = L->Cstack.base-n; /* position of the new results */
104 L->Cstack.num = n; /* number of results */
105}
106
107
108lua_Object lua_pop (void) {
108 checkCparams(1); 109 checkCparams(1);
109 return put_luaObjectonTop(); 110 return put_luaObjectonTop();
110} 111}
@@ -436,6 +437,11 @@ TaggedString *luaA_nextvar (TaggedString *g) {
436 } 437 }
437 while (g && g->u.s.globalval.ttype == LUA_T_NIL) /* skip globals with nil */ 438 while (g && g->u.s.globalval.ttype == LUA_T_NIL) /* skip globals with nil */
438 g = (TaggedString *)g->head.next; 439 g = (TaggedString *)g->head.next;
440 if (g) {
441 ttype(L->stack.top) = LUA_T_STRING; tsvalue(L->stack.top) = g;
442 incr_top;
443 luaA_pushobject(&g->u.s.globalval);
444 }
439 return g; 445 return g;
440} 446}
441 447
@@ -444,11 +450,37 @@ char *lua_nextvar (char *varname) {
444 TaggedString *g = (varname == NULL) ? NULL : luaS_new(varname); 450 TaggedString *g = (varname == NULL) ? NULL : luaS_new(varname);
445 g = luaA_nextvar(g); 451 g = luaA_nextvar(g);
446 if (g) { 452 if (g) {
447 luaA_pushobject(&g->u.s.globalval); 453 top2LC(2);
448 return g->str; 454 return g->str;
449 } 455 }
450 else 456 else {
457 top2LC(0);
451 return NULL; 458 return NULL;
459 }
460}
461
462
463int luaA_next (Hash *t, int i) {
464 Node *n;
465 int tsize = nhash(t);
466 while (i < tsize && ttype(val(n=node(t, i))) == LUA_T_NIL) i++;
467 if (i >= tsize)
468 return 0;
469 else {
470 luaA_pushobject(ref(n));
471 luaA_pushobject(val(n));
472 return i+1;
473 }
474}
475
476
477int lua_next (lua_Object o, int i) {
478 TObject *t = Address(o);
479 if (ttype(t) != LUA_T_ARRAY)
480 lua_error("API error: object is not a table in `lua_next'");
481 i = luaA_next(avalue(t), i);
482 top2LC((i==0) ? 0 : 2);
483 return i;
452} 484}
453 485
454 486