seqlua

annotate seqlualib.c @ 54:92ce3958aca7

Reverted last two commits
author jbe
date Wed Aug 27 00:10:47 2014 +0200 (2014-08-27)
parents 3362ec36cb09
children da4b9d6a5b7e
rev   line source
jbe@0 1 #include <lua.h>
jbe@0 2 #include <lauxlib.h>
jbe@0 3 #include "seqlualib.h"
jbe@35 4 #include <string.h>
jbe@0 5
jbe@30 6 #define SEQLUA_ITERTYPE_IPAIRS 1
jbe@30 7 #define SEQLUA_ITERTYPE_CALL 2
jbe@30 8 #define SEQLUA_ITERTYPE_INDEX 3
jbe@30 9 #define SEQLUA_ITERTYPE_RAW 4
jbe@0 10
jbe@54 11 void seqlua_iterinit(lua_State *L, seqlua_Iterator *iter, int idx) {
jbe@30 12 if (luaL_getmetafield(L, idx, "__ipairs")) {
jbe@54 13 lua_pushvalue(L, idx);
jbe@30 14 lua_call(L, 1, 3);
jbe@35 15 if (lua_type(L, -3) == LUA_TSTRING) {
jbe@35 16 const char *method = lua_tostring(L, -3);
jbe@35 17 if (!strcmp(method, "raw")) {
jbe@35 18 iter->itertype = SEQLUA_ITERTYPE_RAW;
jbe@35 19 } else if (!strcmp(method, "index")) {
jbe@35 20 iter->itertype = SEQLUA_ITERTYPE_INDEX;
jbe@35 21 } else if (!strcmp(method, "call")) {
jbe@35 22 iter->itertype = SEQLUA_ITERTYPE_CALL;
jbe@35 23 } else {
jbe@35 24 luaL_error(L, "Unexpected string returned by __ipairs metamethod");
jbe@35 25 }
jbe@35 26 iter->idx = lua_gettop(L) - 1;
jbe@35 27 } else {
jbe@35 28 iter->itertype = SEQLUA_ITERTYPE_IPAIRS;
jbe@35 29 }
jbe@30 30 } else {
jbe@30 31 if (lua_type(L, idx) == LUA_TFUNCTION) {
jbe@54 32 iter->itertype = SEQLUA_ITERTYPE_CALL;
jbe@32 33 } else if (luaL_getmetafield(L, idx, "__index")) {
jbe@30 34 lua_pop(L, 1);
jbe@30 35 iter->itertype = SEQLUA_ITERTYPE_INDEX;
jbe@54 36 } else {
jbe@54 37 luaL_checktype(L, idx, LUA_TTABLE);
jbe@54 38 iter->itertype = SEQLUA_ITERTYPE_RAW;
jbe@30 39 }
jbe@30 40 // always occupy 3 stack indicies
jbe@54 41 lua_pushnil(L);
jbe@30 42 lua_pushnil(L);
jbe@30 43 lua_pushnil(L);
jbe@30 44 iter->idx = idx;
jbe@30 45 }
jbe@0 46 iter->L = L;
jbe@0 47 iter->i = 0;
jbe@0 48 }
jbe@0 49
jbe@0 50 int seqlua_iternext(seqlua_Iterator *iter) {
jbe@0 51 lua_State *L = iter->L;
jbe@0 52 lua_Integer i = ++iter->i;
jbe@0 53 switch (iter->itertype) {
jbe@30 54 case SEQLUA_ITERTYPE_IPAIRS:
jbe@30 55 lua_pushvalue(L, -3);
jbe@30 56 lua_pushvalue(L, -3);
jbe@30 57 lua_pushvalue(L, -3);
jbe@30 58 lua_call(L, 2, 2);
jbe@30 59 if (lua_isnil(L, -2)) {
jbe@30 60 lua_pop(L, 5);
jbe@30 61 return 0;
jbe@30 62 }
jbe@30 63 lua_remove(L, -3);
jbe@30 64 return 1;
jbe@30 65 case SEQLUA_ITERTYPE_CALL:
jbe@8 66 lua_pushvalue(L, iter->idx);
jbe@0 67 lua_call(L, 0, 1);
jbe@0 68 break;
jbe@30 69 case SEQLUA_ITERTYPE_INDEX:
jbe@0 70 lua_pushinteger(L, i);
jbe@8 71 lua_gettable(L, iter->idx);
jbe@32 72 break;
jbe@0 73 case SEQLUA_ITERTYPE_RAW:
jbe@8 74 lua_rawgeti(L, iter->idx, i);
jbe@8 75 break;
jbe@0 76 }
jbe@0 77 if (lua_isnil(L, -1)) {
jbe@30 78 lua_pop(L, 4);
jbe@0 79 return 0;
jbe@0 80 }
jbe@0 81 return 1;
jbe@0 82 }
jbe@0 83

Impressum / About Us