aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-07-11 22:28:08 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-07-11 22:38:20 +0200
commit3ca61b3354c02e7f961e3cd6808a94fd9b740586 (patch)
treebfe5e89e393c9c1f78ff5549e6c054420888e741
parentebee314027fb8ba47052dc016bc44758fa58f5fc (diff)
downloadvis-3ca61b3354c02e7f961e3cd6808a94fd9b740586.tar.gz
vis-3ca61b3354c02e7f961e3cd6808a94fd9b740586.tar.xz
vis: cleanup register related API
Also expose all register slots through the Lua API.
-rw-r--r--text.h6
-rw-r--r--vis-lua.c45
-rw-r--r--vis-registers.c38
-rw-r--r--vis.h21
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(&reg->values);
+ array_reserve(&data, len);
+ for (size_t i = 0; i < len; i++) {
+ Buffer *buf = array_get(&reg->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