diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-31 18:01:43 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-31 18:01:43 -0300 |
commit | 9a21e81907e49b79ec44677660acf9e35ad308bb (patch) | |
tree | b9abf9711461f3c0d798f8b9e23a4926961b6713 /lapi.c | |
parent | f0b3cd1d6f35ba34091450d5e3057269114a17b6 (diff) | |
download | lua-9a21e81907e49b79ec44677660acf9e35ad308bb.tar.gz lua-9a21e81907e49b79ec44677660acf9e35ad308bb.tar.bz2 lua-9a21e81907e49b79ec44677660acf9e35ad308bb.zip |
more builtin functions using official API
Diffstat (limited to 'lapi.c')
-rw-r--r-- | lapi.c | 48 |
1 files changed, 43 insertions, 5 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 1.91 2000/08/31 14:08:27 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.92 2000/08/31 20:23:40 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 | */ |
@@ -167,6 +167,23 @@ void *lua_touserdata (lua_State *L, int index) { | |||
167 | access(L, index, (ttype(o) == TAG_USERDATA), NULL, tsvalue(o)->u.d.value); | 167 | access(L, index, (ttype(o) == TAG_USERDATA), NULL, tsvalue(o)->u.d.value); |
168 | } | 168 | } |
169 | 169 | ||
170 | const void *lua_topointer (lua_State *L, int index) { | ||
171 | const TObject *o = Index(L, index); | ||
172 | switch (ttype(o)) { | ||
173 | case TAG_NUMBER: case TAG_NIL: | ||
174 | return NULL; | ||
175 | case TAG_STRING: | ||
176 | return tsvalue(o)->str; | ||
177 | case TAG_USERDATA: | ||
178 | return tsvalue(o)->u.d.value; | ||
179 | case TAG_TABLE: | ||
180 | return hvalue(o); | ||
181 | case TAG_CCLOSURE: case TAG_LCLOSURE: | ||
182 | return clvalue(o); | ||
183 | default: return NULL; | ||
184 | } | ||
185 | } | ||
186 | |||
170 | 187 | ||
171 | 188 | ||
172 | /* | 189 | /* |
@@ -236,7 +253,7 @@ void lua_gettable (lua_State *L) { | |||
236 | 253 | ||
237 | 254 | ||
238 | void lua_rawget (lua_State *L) { | 255 | void lua_rawget (lua_State *L) { |
239 | LUA_ASSERT(ttype(L->top-2) == TAG_TABLE, "not a table"); | 256 | LUA_ASSERT(ttype(L->top-2) == TAG_TABLE, "table expected"); |
240 | *(L->top - 2) = *luaH_get(L, hvalue(L->top - 2), L->top - 1); | 257 | *(L->top - 2) = *luaH_get(L, hvalue(L->top - 2), L->top - 1); |
241 | L->top--; | 258 | L->top--; |
242 | } | 259 | } |
@@ -295,7 +312,7 @@ void lua_settable (lua_State *L) { | |||
295 | 312 | ||
296 | 313 | ||
297 | void lua_rawset (lua_State *L) { | 314 | void lua_rawset (lua_State *L) { |
298 | LUA_ASSERT(ttype(L->top-3) == TAG_TABLE, "not a table"); | 315 | LUA_ASSERT(ttype(L->top-3) == TAG_TABLE, "table expected"); |
299 | *luaH_set(L, hvalue(L->top-3), L->top-2) = *(L->top-1); | 316 | *luaH_set(L, hvalue(L->top-3), L->top-2) = *(L->top-1); |
300 | L->top -= 3; | 317 | L->top -= 3; |
301 | } | 318 | } |
@@ -303,7 +320,7 @@ void lua_rawset (lua_State *L) { | |||
303 | 320 | ||
304 | void lua_setglobals (lua_State *L) { | 321 | void lua_setglobals (lua_State *L) { |
305 | TObject *newtable = --L->top; | 322 | TObject *newtable = --L->top; |
306 | LUA_ASSERT(ttype(newtable) == TAG_TABLE, "not a table"); | 323 | LUA_ASSERT(ttype(newtable) == TAG_TABLE, "table expected"); |
307 | L->gt = hvalue(newtable); | 324 | L->gt = hvalue(newtable); |
308 | } | 325 | } |
309 | 326 | ||
@@ -375,7 +392,7 @@ void lua_unref (lua_State *L, int ref) { | |||
375 | int lua_next (lua_State *L) { | 392 | int lua_next (lua_State *L) { |
376 | const TObject *t = Index(L, -2); | 393 | const TObject *t = Index(L, -2); |
377 | Node *n; | 394 | Node *n; |
378 | LUA_ASSERT(ttype(t) == TAG_TABLE, "object is not a table in `lua_next'"); | 395 | LUA_ASSERT(ttype(t) == TAG_TABLE, "table expected"); |
379 | n = luaH_next(L, hvalue(t), Index(L, -1)); | 396 | n = luaH_next(L, hvalue(t), Index(L, -1)); |
380 | if (n) { | 397 | if (n) { |
381 | *(L->top-1) = *key(n); | 398 | *(L->top-1) = *key(n); |
@@ -389,3 +406,24 @@ int lua_next (lua_State *L) { | |||
389 | } | 406 | } |
390 | } | 407 | } |
391 | 408 | ||
409 | |||
410 | int lua_getn (lua_State *L, int index) { | ||
411 | Hash *h = hvalue(Index(L, index)); | ||
412 | const TObject *value = luaH_getstr(h, luaS_new(L, "n")); /* value = h.n */ | ||
413 | if (ttype(value) == TAG_NUMBER) | ||
414 | return (int)nvalue(value); | ||
415 | else { | ||
416 | Number max = 0; | ||
417 | int i = h->size; | ||
418 | Node *n = h->node; | ||
419 | while (i--) { | ||
420 | if (ttype(key(n)) == TAG_NUMBER && | ||
421 | ttype(val(n)) != TAG_NIL && | ||
422 | nvalue(key(n)) > max) | ||
423 | max = nvalue(key(n)); | ||
424 | n++; | ||
425 | } | ||
426 | return (int)max; | ||
427 | } | ||
428 | } | ||
429 | |||