seqlua

view seqlualib.c @ 34:2a43e8ffbced

Bugfix in seqlua.c
author jbe
date Sun Aug 24 22:21:46 2014 +0200 (2014-08-24)
parents 3ff7cec8d3ce
children 332216604f83
line source
1 #include <lua.h>
2 #include <lauxlib.h>
3 #include "seqlualib.h"
5 #define SEQLUA_ITERTYPE_IPAIRS 1
6 #define SEQLUA_ITERTYPE_CALL 2
7 #define SEQLUA_ITERTYPE_INDEX 3
8 #define SEQLUA_ITERTYPE_RAW 4
10 void seqlua_iterinit(lua_State *L, seqlua_Iterator *iter, int idx) {
11 if (luaL_getmetafield(L, idx, "__ipairs")) {
12 lua_pushvalue(L, idx);
13 lua_call(L, 1, 3);
14 iter->itertype = SEQLUA_ITERTYPE_IPAIRS;
15 } else {
16 if (lua_type(L, idx) == LUA_TFUNCTION) {
17 iter->itertype = SEQLUA_ITERTYPE_CALL;
18 } else if (luaL_getmetafield(L, idx, "__index")) {
19 lua_pop(L, 1);
20 iter->itertype = SEQLUA_ITERTYPE_INDEX;
21 } else {
22 luaL_checktype(L, idx, LUA_TTABLE);
23 iter->itertype = SEQLUA_ITERTYPE_RAW;
24 }
25 // always occupy 3 stack indicies
26 lua_pushnil(L);
27 lua_pushnil(L);
28 lua_pushnil(L);
29 iter->idx = idx;
30 }
31 iter->L = L;
32 iter->i = 0;
33 }
35 int seqlua_iternext(seqlua_Iterator *iter) {
36 lua_State *L = iter->L;
37 lua_Integer i = ++iter->i;
38 switch (iter->itertype) {
39 case SEQLUA_ITERTYPE_IPAIRS:
40 lua_pushvalue(L, -3);
41 lua_pushvalue(L, -3);
42 lua_pushvalue(L, -3);
43 lua_call(L, 2, 2);
44 if (lua_isnil(L, -2)) {
45 lua_pop(L, 5);
46 return 0;
47 }
48 lua_remove(L, -3);
49 return 1;
50 case SEQLUA_ITERTYPE_CALL:
51 lua_pushvalue(L, iter->idx);
52 lua_call(L, 0, 1);
53 break;
54 case SEQLUA_ITERTYPE_INDEX:
55 lua_pushinteger(L, i);
56 lua_gettable(L, iter->idx);
57 break;
58 case SEQLUA_ITERTYPE_RAW:
59 lua_rawgeti(L, iter->idx, i);
60 break;
61 }
62 if (lua_isnil(L, -1)) {
63 lua_pop(L, 4);
64 return 0;
65 }
66 return 1;
67 }

Impressum / About Us