seqlua

annotate seqlua.c @ 23:29792283522f

Removed iterator(...) function; ipairs doesn't accept iterator triplets anymore
author jbe
date Thu Aug 21 20:01:52 2014 +0200 (2014-08-21)
parents 12a7a8f5a77d
children 44880bcfc323
rev   line source
jbe@0 1 #include <lua.h>
jbe@0 2 #include <lauxlib.h>
jbe@8 3
jbe@0 4 static int seqlua_ipairsaux_raw(lua_State *L) {
jbe@0 5 lua_Integer i;
jbe@0 6 luaL_checktype(L, 1, LUA_TTABLE);
jbe@0 7 i = luaL_checkinteger(L, 2) + 1;
jbe@0 8 lua_pushinteger(L, i);
jbe@0 9 lua_rawgeti(L, 1, i); // TODO: Lua 5.3 returns type
jbe@0 10 return lua_isnil(L, -1) ? 1 : 2;
jbe@0 11 }
jbe@0 12
jbe@0 13 static int seqlua_ipairsaux_meta(lua_State *L) {
jbe@0 14 lua_Integer i;
jbe@0 15 i = luaL_checkinteger(L, 2) + 1;
jbe@0 16 lua_pushinteger(L, i);
jbe@0 17 lua_pushinteger(L, i);
jbe@0 18 lua_gettable(L, 1); // TODO: Lua 5.3 returns type
jbe@0 19 return lua_isnil(L, -1) ? 1 : 2;
jbe@0 20 }
jbe@0 21
jbe@0 22 static int seqlua_ipairsaux_func(lua_State *L) {
jbe@0 23 lua_pushinteger(L, luaL_checkinteger(L, 2) + 1);
jbe@0 24 lua_insert(L, 1);
jbe@0 25 lua_settop(L, 2);
jbe@0 26 lua_call(L, 0, LUA_MULTRET);
jbe@0 27 if (lua_isnoneornil(L, 2)) {
jbe@0 28 lua_settop(L, 0);
jbe@0 29 lua_pushnil(L);
jbe@0 30 return 1;
jbe@0 31 } else {
jbe@0 32 return lua_gettop(L);
jbe@0 33 }
jbe@0 34 }
jbe@0 35
jbe@0 36 static int seqlua_ipairs(lua_State *L) {
jbe@8 37 luaL_checkany(L, 1); // provides better error message
jbe@23 38 if (
jbe@23 39 lua_type(L, 1) == LUA_TFUNCTION ||
jbe@23 40 (luaL_getmetafield(L, 1, "__call") && (lua_pop(L, 1), 1))
jbe@23 41 ) {
jbe@0 42 lua_pushcfunction(L, seqlua_ipairsaux_func);
jbe@0 43 } else if (luaL_getmetafield(L, 1, "__index")) {
jbe@0 44 lua_pushcfunction(L, seqlua_ipairsaux_meta);
jbe@0 45 } else {
jbe@0 46 luaL_checktype(L, 1, LUA_TTABLE);
jbe@0 47 lua_pushcfunction(L, seqlua_ipairsaux_raw);
jbe@0 48 }
jbe@0 49 lua_pushvalue(L, 1);
jbe@0 50 lua_pushinteger(L, 0);
jbe@0 51 return 3;
jbe@0 52 }
jbe@0 53
jbe@0 54 int luaopen_seqlua(lua_State *L) {
jbe@0 55 lua_pushcfunction(L, seqlua_ipairs);
jbe@0 56 lua_setglobal(L, "ipairs");
jbe@0 57 return 1;
jbe@0 58 }

Impressum / About Us