From 3ca61b3354c02e7f961e3cd6808a94fd9b740586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 11 Jul 2017 22:28:08 +0200 Subject: vis: cleanup register related API Also expose all register slots through the Lua API. --- text.h | 6 ++++++ vis-lua.c | 45 ++++++++++++++++++++++++++++++--------------- vis-registers.c | 38 +++++++++++++++++++++++++++----------- vis.h | 21 ++++++++++++++------- 4 files changed, 77 insertions(+), 33 deletions(-) diff --git a/text.h b/text.h index e76ad5b..06b7843 100644 --- a/text.h +++ b/text.h @@ -30,6 +30,12 @@ typedef struct Text Text; typedef struct Piece Piece; typedef struct TextSave TextSave; +/** A contiguous part of the text. */ +typedef struct { + const char *data; /**< Content, might not be NUL-terminated. */ + size_t len; /**< Length in bytes. */ +} TextString; + /** * Iterator used to navigate the buffer content. * diff --git a/vis-lua.c b/vis-lua.c index 8371348..a87b177 100644 --- a/vis-lua.c +++ b/vis-lua.c @@ -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; } diff --git a/vis-registers.c b/vis-registers.c index 742194b..503c50b 100644 --- a/vis-registers.c +++ b/vis-registers.c @@ -226,23 +226,39 @@ static Register *register_from(Vis *vis, enum VisRegister id) { return NULL; } -bool vis_register_put(Vis *vis, enum VisRegister id, const char *data, size_t len) { +bool vis_register_set(Vis *vis, enum VisRegister id, Array *data) { Register *reg = register_from(vis, id); if (!reg) return false; - return register_put(vis, reg, data, len); -} - -const char *vis_register_get(Vis *vis, enum VisRegister id, size_t *len) { - return vis_register_slot_get(vis, id, 0, len); + size_t len = array_length(data); + for (size_t i = 0; i < len; i++) { + Buffer *buf = register_buffer(reg, i); + if (!buf) + return false; + TextString *string = array_get(data, i); + if (!buffer_put(buf, string->data, string->len)) + return false; + } + return register_resize(reg, len); } -const char *vis_register_slot_get(Vis *vis, enum VisRegister id, size_t slot, size_t *len) { +Array vis_register_get(Vis *vis, enum VisRegister id) { + Array data; + array_init_sized(&data, sizeof(TextString)); Register *reg = register_from(vis, id); - if (reg) - return register_slot_get(vis, reg, slot, len); - *len = 0; - return NULL; + if (reg) { + size_t len = array_length(®->values); + array_reserve(&data, len); + for (size_t i = 0; i < len; i++) { + Buffer *buf = array_get(®->values, i); + TextString string = { + .data = buffer_content(buf), + .len = buffer_length(buf), + }; + array_add(&data, &string); + } + } + return data; } const RegisterDef vis_registers[] = { diff --git a/vis.h b/vis.h index 87349e1..6641266 100644 --- a/vis.h +++ b/vis.h @@ -772,13 +772,20 @@ enum VisRegister vis_register_from(Vis*, char reg); */ void vis_register(Vis*, enum VisRegister); enum VisRegister vis_register_used(Vis*); -/** Get register content. */ -const char *vis_register_get(Vis*, enum VisRegister, size_t *len); -const char *vis_register_slot_get(Vis*, enum VisRegister, size_t slot, size_t *len); -/** Set register content. */ -bool vis_register_put(Vis*, enum VisRegister, const char *data, size_t len); -bool vis_register_slot_put(Vis*, enum VisRegister, size_t slot, const char *data, size_t len); - +/** + * Get register content. + * @return An array of ``TextString`` structs. + * @rst + * .. warning:: The caller must eventually free the array ressources using + * ``array_release``. + * @endrst + */ +Array vis_register_get(Vis*, enum VisRegister); +/** + * Set register content. + * @param data The array comprised of ``TextString`` structs. + */ +bool vis_register_set(Vis*, enum VisRegister, Array *data); /** * @} * @defgroup vis_macros -- cgit v1.2.3