Revert "Alternative export method of arrays from C to Lua"
This reverts commit 4ab499fe26
.
Conflicts:
lua.h
This commit is contained in:
parent
adebbb5df2
commit
b92a07c2ed
1
client.h
1
client.h
|
@ -51,7 +51,6 @@ int luaA_client_newindex(lua_State *);
|
||||||
int luaA_client_userdata_new(lua_State *, client_t *);
|
int luaA_client_userdata_new(lua_State *, client_t *);
|
||||||
|
|
||||||
DO_SLIST(client_t, client, client_unref)
|
DO_SLIST(client_t, client, client_unref)
|
||||||
DO_LUA_EXPORT_ARRAY(client, "client_array", client_t, client_array_t, luaA_client_userdata_new)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
|
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
|
||||||
|
|
95
lua.h
95
lua.h
|
@ -259,100 +259,5 @@ luaA_generic_pairs(lua_State *L)
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DO_LUA_EXPORT_ARRAY(pfx, typename, type, atype, ctor) \
|
|
||||||
static inline int \
|
|
||||||
luaA_##pfx##_array_index(lua_State *L) \
|
|
||||||
{ \
|
|
||||||
atype *value = lua_touserdata(L, 1); \
|
|
||||||
type **obj; \
|
|
||||||
int idx; \
|
|
||||||
\
|
|
||||||
if ((obj = lua_touserdata(L, 2))) \
|
|
||||||
{ \
|
|
||||||
for (idx = 0; idx < value->len; idx++) \
|
|
||||||
if (value->tab[idx] == *obj) \
|
|
||||||
return ctor(L, value->tab[idx]); \
|
|
||||||
return 0; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
idx = luaL_checknumber(L, 2) - 1; \
|
|
||||||
if (idx < 0 || idx >= value->len) \
|
|
||||||
return 0; \
|
|
||||||
\
|
|
||||||
return ctor(L, value->tab[idx]); \
|
|
||||||
} \
|
|
||||||
static inline int \
|
|
||||||
luaA_##pfx##_array_newindex(lua_State *L) \
|
|
||||||
{ \
|
|
||||||
atype *value = lua_touserdata(L, 1); \
|
|
||||||
int idx = luaL_checknumber(L, 2); \
|
|
||||||
type **elem = luaL_checkudata(L, 3, #pfx); \
|
|
||||||
pfx##_array_splice(value, idx - 1, 1, elem, 1); \
|
|
||||||
return 0; \
|
|
||||||
} \
|
|
||||||
static inline int \
|
|
||||||
luaA_##pfx##_array_len(lua_State *L) \
|
|
||||||
{ \
|
|
||||||
atype *value = lua_touserdata(L, 1); \
|
|
||||||
lua_pushnumber(L, value->len); \
|
|
||||||
return 1; \
|
|
||||||
} \
|
|
||||||
static inline int \
|
|
||||||
luaA_##pfx##_array_tostring(lua_State *L) \
|
|
||||||
{ \
|
|
||||||
atype *value = lua_touserdata(L, 1); \
|
|
||||||
lua_pushfstring(L, "["typename" udata(%p)]", value); \
|
|
||||||
return 1; \
|
|
||||||
} \
|
|
||||||
static inline int \
|
|
||||||
luaA_##pfx##_array_next(lua_State *L) \
|
|
||||||
{ \
|
|
||||||
atype *value = lua_touserdata(L, 1); \
|
|
||||||
if(value) \
|
|
||||||
{ \
|
|
||||||
lua_settop(L, 2); \
|
|
||||||
if(lua_isnumber(L, 2)) \
|
|
||||||
{ \
|
|
||||||
int idx = lua_tonumber(L, 2); \
|
|
||||||
if(idx >= 0 && idx < value->len) \
|
|
||||||
{ \
|
|
||||||
lua_pushnumber(L, idx + 1); \
|
|
||||||
ctor(L, value->tab[idx]); \
|
|
||||||
return 2; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
else if(lua_isnil(L, 2)) \
|
|
||||||
{ \
|
|
||||||
if(value->len) \
|
|
||||||
{ \
|
|
||||||
lua_pushnumber(L, 1); \
|
|
||||||
ctor(L, value->tab[0]); \
|
|
||||||
return 2; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
return 0; \
|
|
||||||
} \
|
|
||||||
static inline void \
|
|
||||||
luaA_##pfx##_array_export(lua_State *L, atype *arr) \
|
|
||||||
{ \
|
|
||||||
lua_pushlightuserdata(L, arr); \
|
|
||||||
lua_newtable(L); \
|
|
||||||
lua_pushcfunction(L, luaA_##pfx##_array_index); \
|
|
||||||
lua_setfield(L, -2, "__index"); \
|
|
||||||
lua_pushcfunction(L, luaA_##pfx##_array_tostring); \
|
|
||||||
lua_setfield(L, -2, "__tostring"); \
|
|
||||||
lua_pushcfunction(L, luaA_##pfx##_array_next); \
|
|
||||||
lua_setfield(L, -2, "__next"); \
|
|
||||||
lua_pushcfunction(L, luaA_##pfx##_array_next); \
|
|
||||||
lua_pushcclosure(L, luaA_generic_pairs, 1); \
|
|
||||||
lua_setfield(L, -2, "__pairs"); \
|
|
||||||
lua_pushcfunction(L, luaA_##pfx##_array_newindex); \
|
|
||||||
lua_setfield(L, -2, "__newindex"); \
|
|
||||||
lua_pushcfunction(L, luaA_##pfx##_array_len); \
|
|
||||||
lua_setfield(L, -2, "__len"); \
|
|
||||||
lua_setmetatable(L, -2); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
|
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
|
||||||
|
|
11
tag.c
11
tag.c
|
@ -349,6 +349,8 @@ luaA_tag_index(lua_State *L)
|
||||||
size_t len;
|
size_t len;
|
||||||
tag_t **tag = luaA_checkudata(L, 1, "tag");
|
tag_t **tag = luaA_checkudata(L, 1, "tag");
|
||||||
const char *attr;
|
const char *attr;
|
||||||
|
client_array_t *clients;
|
||||||
|
int i;
|
||||||
|
|
||||||
if(luaA_usemetatable(L, 1, 2))
|
if(luaA_usemetatable(L, 1, 2))
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -381,7 +383,14 @@ luaA_tag_index(lua_State *L)
|
||||||
lua_pushnumber(L, (*tag)->ncol);
|
lua_pushnumber(L, (*tag)->ncol);
|
||||||
break;
|
break;
|
||||||
case A_TK_CLIENTS:
|
case A_TK_CLIENTS:
|
||||||
luaA_client_array_export(L, &(*tag)->clients);
|
clients = &(*tag)->clients;
|
||||||
|
luaA_otable_new(L);
|
||||||
|
for(i = 0; i < clients->len; i++)
|
||||||
|
{
|
||||||
|
luaA_client_userdata_new(L, clients->tab[i]);
|
||||||
|
luaA_client_userdata_new(L, clients->tab[i]);
|
||||||
|
lua_rawset(L, -3);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue