seqlua

view seqlualib.c @ 24:28d472cc7a9b

Removed seqlua_iterclosure header in seqlualib.h
author jbe
date Thu Aug 21 20:20:20 2014 +0200 (2014-08-21)
parents 29792283522f
children 367fc70acc15
line source
1 #include <lua.h>
2 #include <lauxlib.h>
3 #include "seqlualib.h"
5 #define SEQLUA_ITERTYPE_FUNC 1
6 #define SEQLUA_ITERTYPE_META 2
7 #define SEQLUA_ITERTYPE_RAW 3
9 void seqlua_iterinit(lua_State *L, seqlua_Iterator *iter, int idx) {
10 luaL_checkany(L, idx); // provides better error message
11 iter->L = L;
12 iter->idx = idx;
13 if (
14 lua_type(L, idx) == LUA_TFUNCTION ||
15 (luaL_getmetafield(L, idx, "__call") && (lua_pop(L, 1), 1))
16 ) {
17 iter->itertype = SEQLUA_ITERTYPE_FUNC;
18 } else if (luaL_getmetafield(L, idx, "__index") && (lua_pop(L, 1), 1)) {
19 iter->itertype = SEQLUA_ITERTYPE_META;
20 } else {
21 luaL_checktype(L, idx, LUA_TTABLE);
22 iter->itertype = SEQLUA_ITERTYPE_RAW;
23 }
24 iter->i = 0;
25 }
27 int seqlua_iternext(seqlua_Iterator *iter) {
28 lua_State *L = iter->L;
29 lua_Integer i = ++iter->i;
30 switch (iter->itertype) {
31 case SEQLUA_ITERTYPE_FUNC:
32 lua_pushvalue(L, iter->idx);
33 lua_call(L, 0, 1);
34 break;
35 case SEQLUA_ITERTYPE_META:
36 lua_pushinteger(L, i);
37 lua_gettable(L, iter->idx);
38 break;
39 case SEQLUA_ITERTYPE_RAW:
40 lua_rawgeti(L, iter->idx, i);
41 break;
42 }
43 if (lua_isnil(L, -1)) {
44 lua_pop(L, 1);
45 return 0;
46 }
47 return 1;
48 }

Impressum / About Us