diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-07-11 22:28:08 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-07-11 22:38:20 +0200 |
| commit | 3ca61b3354c02e7f961e3cd6808a94fd9b740586 (patch) | |
| tree | bfe5e89e393c9c1f78ff5549e6c054420888e741 /vis-lua.c | |
| parent | ebee314027fb8ba47052dc016bc44758fa58f5fc (diff) | |
| download | vis-3ca61b3354c02e7f961e3cd6808a94fd9b740586.tar.gz vis-3ca61b3354c02e7f961e3cd6808a94fd9b740586.tar.xz | |
vis: cleanup register related API
Also expose all register slots through the Lua API.
Diffstat (limited to 'vis-lua.c')
| -rw-r--r-- | vis-lua.c | 45 |
1 files changed, 30 insertions, 15 deletions
@@ -704,10 +704,10 @@ static int mark_names_iter(lua_State *L) { * @function register_names * @return the new iterator * @usage - * for reg in vis:register_names() do - * local value = vis.registers[reg] - * if value then - * -- do something with register value + * for name in vis:register_names() do + * local reg = vis.registers[name] + * for i = 1, #reg do + * -- do something with register value reg[i] * end * end */ @@ -1476,19 +1476,22 @@ static const struct luaL_Reg ui_funcs[] = { }; static int registers_index(lua_State *L) { + lua_newtable(L); Vis *vis = lua_touserdata(L, lua_upvalueindex(1)); const char *symbol = luaL_checkstring(L, 2); if (strlen(symbol) != 1) - goto err; + return 1; enum VisRegister reg = vis_register_from(vis, symbol[0]); if (reg >= VIS_REG_INVALID) - goto err; - size_t len; - const char *value = vis_register_get(vis, reg, &len); - lua_pushlstring(L, value ? value : "" , len); - return 1; -err: - lua_pushnil(L); + return 1; + Array data = vis_register_get(vis, reg); + for (size_t i = 0, len = array_length(&data); i < len; i++) { + TextString *string = array_get(&data, i); + lua_pushunsigned(L, i+1); + lua_pushlstring(L, string->data, string->len); + lua_settable(L, -3); + } + array_release(&data); return 1; } @@ -1498,9 +1501,21 @@ static int registers_newindex(lua_State *L) { if (strlen(symbol) != 1) return 0; enum VisRegister reg = vis_register_from(vis, symbol[0]); - size_t len; - const char *value = luaL_checklstring(L, 3, &len); - vis_register_put(vis, reg, value, len+1); + Array data; + array_init_sized(&data, sizeof(TextString)); + + if (lua_istable(L, 3)) { + lua_pushnil(L); + while (lua_next(L, 3)) { + TextString string; + string.data = luaL_checklstring(L, -1, &string.len); + array_add(&data, &string); + lua_pop(L, 1); + } + } + + vis_register_set(vis, reg, &data); + array_release(&data); return 0; } |
