From 9f2210c8ee567c75f43d18313b668aee06eda597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Wed, 19 Apr 2017 20:05:19 +0200 Subject: vis: start cleaning up register related code Now that register.h is no longer used by view.h we can move the struct and function declarations to vis-core.h. --- Makefile | 4 +- register.c | 178 ---------------------------------------- register.h | 37 --------- view.h | 1 - vis-core.h | 30 ++++++- vis-lua.c | 4 +- vis-registers.c | 249 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ vis.c | 57 ------------- vis.h | 3 + 9 files changed, 284 insertions(+), 279 deletions(-) delete mode 100644 register.c delete mode 100644 register.h create mode 100644 vis-registers.c diff --git a/Makefile b/Makefile index 3ac5334..dd896e2 100644 --- a/Makefile +++ b/Makefile @@ -2,10 +2,10 @@ REGEX_SRC ?= text-regex.c -SRC = array.c buffer.c libutf.c main.c map.c register.c ring-buffer.c \ +SRC = array.c buffer.c libutf.c main.c map.c ring-buffer.c \ sam.c text.c text-motions.c text-objects.c text-util.c \ ui-terminal.c view.c vis.c vis-lua.c vis-modes.c vis-motions.c \ - vis-operators.c vis-prompt.c vis-text-objects.c $(REGEX_SRC) + vis-operators.c vis-registers.c vis-prompt.c vis-text-objects.c $(REGEX_SRC) ELF = vis vis-menu vis-digraph EXECUTABLES = $(ELF) vis-clipboard vis-complete vis-open diff --git a/register.c b/register.c deleted file mode 100644 index b55a059..0000000 --- a/register.c +++ /dev/null @@ -1,178 +0,0 @@ -#include -#include - -#include "vis-core.h" -#include "text.h" -#include "util.h" -#include "register.h" -#include "buffer.h" - -static Buffer *register_buffer(Register *reg, size_t slot) { - Buffer *buf = array_get(®->values, slot); - if (buf) - return buf; - if (array_resize(®->values, slot) && (buf = array_get(®->values, slot))) - return buf; - Buffer new; - buffer_init(&new); - if (!array_add(®->values, &new)) - return NULL; - size_t capacity = array_capacity(®->values); - for (size_t i = array_length(®->values); i < capacity; i++) { - if (!array_add(®->values, &new)) - return NULL; - } - return array_get(®->values, slot); -} - -static ssize_t read_buffer(void *context, char *data, size_t len) { - buffer_append(context, data, len); - return len; -} - -bool register_init(Register *reg) { - Buffer buf; - buffer_init(&buf); - array_init_sized(®->values, sizeof(Buffer)); - return array_add(®->values, &buf); -} - -void register_release(Register *reg) { - if (!reg) - return; - size_t n = array_capacity(®->values); - for (size_t i = 0; i < n; i++) - buffer_release(array_get(®->values, i)); - array_release(®->values); -} - -const char *register_slot_get(Vis *vis, Register *reg, size_t slot, size_t *len) { - if (len) - *len = 0; - switch (reg->type) { - case REGISTER_NORMAL: - { - Buffer *buf = array_get(®->values, slot); - if (!buf) - return NULL; - buffer_terminate(buf); - if (len) - *len = buffer_length0(buf); - return buffer_content0(buf); - } - case REGISTER_CLIPBOARD: - { - Buffer buferr; - buffer_init(&buferr); - Buffer *buf = array_get(®->values, slot); - if (!buf) - return NULL; - buffer_clear(buf); - - int status = vis_pipe(vis, vis->win->file, - &(Filerange){ .start = 0, .end = 0 }, - (const char*[]){ VIS_CLIPBOARD, "--paste", NULL }, - buf, read_buffer, &buferr, read_buffer); - - if (status != 0) - vis_info_show(vis, "Command failed %s", buffer_content0(&buferr)); - buffer_release(&buferr); - if (len) - *len = buffer_length0(buf); - return buffer_content0(buf); - } - case REGISTER_BLACKHOLE: - default: - return NULL; - } -} - -const char *register_get(Vis *vis, Register *reg, size_t *len) { - return register_slot_get(vis, reg, 0, len); -} - -bool register_slot_put(Vis *vis, Register *reg, size_t slot, const char *data, size_t len) { - if (reg->type != REGISTER_NORMAL) - return false; - Buffer *buf = register_buffer(reg, slot); - return buf && buffer_put(buf, data, len); -} - -bool register_put(Vis *vis, Register *reg, const char *data, size_t len) { - return register_slot_put(vis, reg, 0, data, len) && - register_resize(reg, 1); -} - -bool register_put0(Vis *vis, Register *reg, const char *data) { - return register_put(vis, reg, data, strlen(data)+1); -} - -static bool register_slot_append_range(Register *reg, size_t slot, Text *txt, Filerange *range) { - switch (reg->type) { - case REGISTER_NORMAL: - { - Buffer *buf = register_buffer(reg, slot); - if (!buf) - return false; - size_t len = text_range_size(range); - if (len == SIZE_MAX || !buffer_grow(buf, len+1)) - return false; - if (buf->len > 0 && buf->data[buf->len-1] == '\0') - buf->len--; - buf->len += text_bytes_get(txt, range->start, len, buf->data + buf->len); - return buffer_append(buf, "\0", 1); - } - default: - return false; - } -} - -bool register_slot_put_range(Vis *vis, Register *reg, size_t slot, Text *txt, Filerange *range) { - if (reg->append) - return register_slot_append_range(reg, slot, txt, range); - - switch (reg->type) { - case REGISTER_NORMAL: - { - Buffer *buf = register_buffer(reg, slot); - if (!buf) - return false; - size_t len = text_range_size(range); - if (len == SIZE_MAX || !buffer_reserve(buf, len+1)) - return false; - buf->len = text_bytes_get(txt, range->start, len, buf->data); - return buffer_append(buf, "\0", 1); - } - case REGISTER_CLIPBOARD: - { - Buffer buferr; - buffer_init(&buferr); - - int status = vis_pipe(vis, vis->win->file, range, - (const char*[]){ VIS_CLIPBOARD, "--copy", NULL }, - NULL, NULL, &buferr, read_buffer); - - if (status != 0) - vis_info_show(vis, "Command failed %s", buffer_content0(&buferr)); - buffer_release(&buferr); - return status == 0; - } - case REGISTER_BLACKHOLE: - return true; - default: - return false; - } -} - -bool register_put_range(Vis *vis, Register *reg, Text *txt, Filerange *range) { - return register_slot_put_range(vis, reg, 0, txt, range) && - register_resize(reg, 1); -} - -size_t register_count(Register *reg) { - return array_length(®->values); -} - -bool register_resize(Register *reg, size_t count) { - return array_truncate(®->values, count); -} diff --git a/register.h b/register.h deleted file mode 100644 index 379da87..0000000 --- a/register.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef REGISTER_H -#define REGISTER_H - -#include -#include -#include "vis.h" -#include "array.h" -#include "text-util.h" - -typedef struct { - Array values; - bool linewise; /* place register content on a new line when inserting? */ - bool append; - enum { - REGISTER_NORMAL, - REGISTER_BLACKHOLE, - REGISTER_CLIPBOARD, - } type; -} Register; - -bool register_init(Register*); -void register_release(Register*); - -const char *register_get(Vis*, Register*, size_t *len); -const char *register_slot_get(Vis*, Register*, size_t slot, size_t *len); - -bool register_put0(Vis*, Register*, const char *data); -bool register_put(Vis*, Register*, const char *data, size_t len); -bool register_slot_put(Vis*, Register*, size_t slot, const char *data, size_t len); - -bool register_put_range(Vis*, Register*, Text*, Filerange*); -bool register_slot_put_range(Vis*, Register*, size_t slot, Text*, Filerange*); - -size_t register_count(Register*); -bool register_resize(Register*, size_t count); - -#endif diff --git a/view.h b/view.h index 262c581..a6d455e 100644 --- a/view.h +++ b/view.h @@ -10,7 +10,6 @@ typedef struct Selection Selection; #include "text.h" #include "ui.h" -#include "register.h" typedef struct { char data[16]; /* utf8 encoded character displayed in this cell (might be more than diff --git a/vis-core.h b/vis-core.h index b0caee1..4df0cd4 100644 --- a/vis-core.h +++ b/vis-core.h @@ -5,12 +5,13 @@ #include "vis.h" #include "sam.h" #include "vis-lua.h" -#include "register.h" #include "text.h" +#include "text-util.h" #include "map.h" #include "ring-buffer.h" #include "array.h" #include "buffer.h" +#include "util.h" /* a mode contains a set of key bindings which are currently valid. * @@ -38,6 +39,17 @@ struct Mode { bool visual; /* whether text selection is possible in this mode */ }; +typedef struct { + Array values; + bool linewise; /* place register content on a new line when inserting? */ + bool append; + enum { + REGISTER_NORMAL, + REGISTER_BLACKHOLE, + REGISTER_CLIPBOARD, + } type; +} Register; + struct OperatorContext { int count; /* how many times should the command be executed? */ Register *reg; /* always non-NULL, set to a default register */ @@ -258,4 +270,20 @@ Win *window_new_file(Vis*, File*, enum UiOption); const char *file_name_get(File*); void file_name_set(File*, const char *name); +bool register_init(Register*); +void register_release(Register*); + +const char *register_get(Vis*, Register*, size_t *len); +const char *register_slot_get(Vis*, Register*, size_t slot, size_t *len); + +bool register_put0(Vis*, Register*, const char *data); +bool register_put(Vis*, Register*, const char *data, size_t len); +bool register_slot_put(Vis*, Register*, size_t slot, const char *data, size_t len); + +bool register_put_range(Vis*, Register*, Text*, Filerange*); +bool register_slot_put_range(Vis*, Register*, size_t slot, Text*, Filerange*); + +size_t register_count(Register*); +bool register_resize(Register*, size_t count); + #endif diff --git a/vis-lua.c b/vis-lua.c index 80e3e38..ed7ac38 100644 --- a/vis-lua.c +++ b/vis-lua.c @@ -1432,11 +1432,9 @@ static int registers_newindex(lua_State *L) { if (strlen(symbol) != 1) return 0; enum VisRegister reg = vis_register_from(vis, symbol[0]); - if (reg >= VIS_REG_INVALID) - return 0; size_t len; const char *value = luaL_checklstring(L, 3, &len); - register_put(vis, &vis->registers[reg], value, len+1); + vis_register_put(vis, reg, value, len+1); return 0; } diff --git a/vis-registers.c b/vis-registers.c new file mode 100644 index 0000000..f0ebb15 --- /dev/null +++ b/vis-registers.c @@ -0,0 +1,249 @@ +#include +#include + +#include "vis-core.h" + +static Buffer *register_buffer(Register *reg, size_t slot) { + Buffer *buf = array_get(®->values, slot); + if (buf) + return buf; + if (array_resize(®->values, slot) && (buf = array_get(®->values, slot))) + return buf; + Buffer new; + buffer_init(&new); + if (!array_add(®->values, &new)) + return NULL; + size_t capacity = array_capacity(®->values); + for (size_t i = array_length(®->values); i < capacity; i++) { + if (!array_add(®->values, &new)) + return NULL; + } + return array_get(®->values, slot); +} + +static ssize_t read_buffer(void *context, char *data, size_t len) { + buffer_append(context, data, len); + return len; +} + +bool register_init(Register *reg) { + Buffer buf; + buffer_init(&buf); + array_init_sized(®->values, sizeof(Buffer)); + return array_add(®->values, &buf); +} + +void register_release(Register *reg) { + if (!reg) + return; + size_t n = array_capacity(®->values); + for (size_t i = 0; i < n; i++) + buffer_release(array_get(®->values, i)); + array_release(®->values); +} + +const char *register_slot_get(Vis *vis, Register *reg, size_t slot, size_t *len) { + if (len) + *len = 0; + switch (reg->type) { + case REGISTER_NORMAL: + { + Buffer *buf = array_get(®->values, slot); + if (!buf) + return NULL; + buffer_terminate(buf); + if (len) + *len = buffer_length0(buf); + return buffer_content0(buf); + } + case REGISTER_CLIPBOARD: + { + Buffer buferr; + buffer_init(&buferr); + Buffer *buf = array_get(®->values, slot); + if (!buf) + return NULL; + buffer_clear(buf); + + int status = vis_pipe(vis, vis->win->file, + &(Filerange){ .start = 0, .end = 0 }, + (const char*[]){ VIS_CLIPBOARD, "--paste", NULL }, + buf, read_buffer, &buferr, read_buffer); + + if (status != 0) + vis_info_show(vis, "Command failed %s", buffer_content0(&buferr)); + buffer_release(&buferr); + if (len) + *len = buffer_length0(buf); + return buffer_content0(buf); + } + case REGISTER_BLACKHOLE: + default: + return NULL; + } +} + +const char *register_get(Vis *vis, Register *reg, size_t *len) { + return register_slot_get(vis, reg, 0, len); +} + +bool register_slot_put(Vis *vis, Register *reg, size_t slot, const char *data, size_t len) { + if (reg->type != REGISTER_NORMAL) + return false; + Buffer *buf = register_buffer(reg, slot); + return buf && buffer_put(buf, data, len); +} + +bool register_put(Vis *vis, Register *reg, const char *data, size_t len) { + return register_slot_put(vis, reg, 0, data, len) && + register_resize(reg, 1); +} + +bool register_put0(Vis *vis, Register *reg, const char *data) { + return register_put(vis, reg, data, strlen(data)+1); +} + +static bool register_slot_append_range(Register *reg, size_t slot, Text *txt, Filerange *range) { + switch (reg->type) { + case REGISTER_NORMAL: + { + Buffer *buf = register_buffer(reg, slot); + if (!buf) + return false; + size_t len = text_range_size(range); + if (len == SIZE_MAX || !buffer_grow(buf, len+1)) + return false; + if (buf->len > 0 && buf->data[buf->len-1] == '\0') + buf->len--; + buf->len += text_bytes_get(txt, range->start, len, buf->data + buf->len); + return buffer_append(buf, "\0", 1); + } + default: + return false; + } +} + +bool register_slot_put_range(Vis *vis, Register *reg, size_t slot, Text *txt, Filerange *range) { + if (reg->append) + return register_slot_append_range(reg, slot, txt, range); + + switch (reg->type) { + case REGISTER_NORMAL: + { + Buffer *buf = register_buffer(reg, slot); + if (!buf) + return false; + size_t len = text_range_size(range); + if (len == SIZE_MAX || !buffer_reserve(buf, len+1)) + return false; + buf->len = text_bytes_get(txt, range->start, len, buf->data); + return buffer_append(buf, "\0", 1); + } + case REGISTER_CLIPBOARD: + { + Buffer buferr; + buffer_init(&buferr); + + int status = vis_pipe(vis, vis->win->file, range, + (const char*[]){ VIS_CLIPBOARD, "--copy", NULL }, + NULL, NULL, &buferr, read_buffer); + + if (status != 0) + vis_info_show(vis, "Command failed %s", buffer_content0(&buferr)); + buffer_release(&buferr); + return status == 0; + } + case REGISTER_BLACKHOLE: + return true; + default: + return false; + } +} + +bool register_put_range(Vis *vis, Register *reg, Text *txt, Filerange *range) { + return register_slot_put_range(vis, reg, 0, txt, range) && + register_resize(reg, 1); +} + +size_t register_count(Register *reg) { + return array_length(®->values); +} + +bool register_resize(Register *reg, size_t count) { + return array_truncate(®->values, count); +} + +enum VisRegister vis_register_from(Vis *vis, char reg) { + switch (reg) { + case '+': return VIS_REG_CLIPBOARD; + case '@': return VIS_MACRO_LAST_RECORDED; + } + + if ('a' <= reg && reg <= 'z') + return VIS_REG_a + reg - 'a'; + if ('A' <= reg && reg <= 'Z') + return VIS_REG_A + reg - 'A'; + for (size_t i = 0; i < LENGTH(vis_registers); i++) { + if (vis_registers[i].name == reg) + return i; + } + return VIS_REG_INVALID; +} + +void vis_register(Vis *vis, enum VisRegister reg) { + if (VIS_REG_A <= reg && reg <= VIS_REG_Z) { + vis->action.reg = &vis->registers[VIS_REG_a + reg - VIS_REG_A]; + vis->action.reg->append = true; + } else if (reg < LENGTH(vis->registers)) { + vis->action.reg = &vis->registers[reg]; + vis->action.reg->append = false; + } +} + +static Register *register_from(Vis *vis, enum VisRegister id) { + if (VIS_REG_A <= id && id <= VIS_REG_Z) + id = VIS_REG_a + id - VIS_REG_A; + if (id < LENGTH(vis->registers)) + return &vis->registers[id]; + return NULL; +} + +bool vis_register_put(Vis *vis, enum VisRegister id, const char *data, size_t len) { + 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); +} + +const char *vis_register_slot_get(Vis *vis, enum VisRegister id, size_t slot, size_t *len) { + Register *reg = register_from(vis, id); + if (reg) + return register_slot_get(vis, reg, slot, len); + *len = 0; + return NULL; +} + +const RegisterDef vis_registers[] = { + [VIS_REG_DEFAULT] = { '"', VIS_HELP("Unnamed register") }, + [VIS_REG_ZERO] = { '0', VIS_HELP("Yank register") }, + [VIS_REG_1] = { '1', VIS_HELP("1st sub-expression match") }, + [VIS_REG_2] = { '2', VIS_HELP("2nd sub-expression match") }, + [VIS_REG_3] = { '3', VIS_HELP("3rd sub-expression match") }, + [VIS_REG_4] = { '4', VIS_HELP("4th sub-expression match") }, + [VIS_REG_5] = { '5', VIS_HELP("5th sub-expression match") }, + [VIS_REG_6] = { '6', VIS_HELP("6th sub-expression match") }, + [VIS_REG_7] = { '7', VIS_HELP("7th sub-expression match") }, + [VIS_REG_8] = { '8', VIS_HELP("8th sub-expression match") }, + [VIS_REG_9] = { '9', VIS_HELP("9th sub-expression match") }, + [VIS_REG_AMPERSAND] = { '&', VIS_HELP("Last regex match") }, + [VIS_REG_BLACKHOLE] = { '_', VIS_HELP("/dev/null register") }, + [VIS_REG_CLIPBOARD] = { '*', VIS_HELP("System clipboard register, see vis-clipboard(1)") }, + [VIS_REG_DOT] = { '.', VIS_HELP("Last inserted text") }, + [VIS_REG_SEARCH] = { '/', VIS_HELP("Last search pattern") }, + [VIS_REG_COMMAND] = { ':', VIS_HELP("Last :-command") }, + [VIS_REG_SHELL] = { '!', VIS_HELP("Last shell command given to either <, >, |, or !") }, +}; diff --git a/vis.c b/vis.c index a6a48da..644fe08 100644 --- a/vis.c +++ b/vis.c @@ -33,27 +33,6 @@ const MarkDef vis_marks[] = { [VIS_MARK_SELECTION_END] = { '>', VIS_HELP("Last selection end") }, }; -const RegisterDef vis_registers[] = { - [VIS_REG_DEFAULT] = { '"', VIS_HELP("Unnamed register") }, - [VIS_REG_ZERO] = { '0', VIS_HELP("Yank register") }, - [VIS_REG_1] = { '1', VIS_HELP("1st sub-expression match") }, - [VIS_REG_2] = { '2', VIS_HELP("2nd sub-expression match") }, - [VIS_REG_3] = { '3', VIS_HELP("3rd sub-expression match") }, - [VIS_REG_4] = { '4', VIS_HELP("4th sub-expression match") }, - [VIS_REG_5] = { '5', VIS_HELP("5th sub-expression match") }, - [VIS_REG_6] = { '6', VIS_HELP("6th sub-expression match") }, - [VIS_REG_7] = { '7', VIS_HELP("7th sub-expression match") }, - [VIS_REG_8] = { '8', VIS_HELP("8th sub-expression match") }, - [VIS_REG_9] = { '9', VIS_HELP("9th sub-expression match") }, - [VIS_REG_AMPERSAND] = { '&', VIS_HELP("Last regex match") }, - [VIS_REG_BLACKHOLE] = { '_', VIS_HELP("/dev/null register") }, - [VIS_REG_CLIPBOARD] = { '*', VIS_HELP("System clipboard register, see vis-clipboard(1)") }, - [VIS_REG_DOT] = { '.', VIS_HELP("Last inserted text") }, - [VIS_REG_SEARCH] = { '/', VIS_HELP("Last search pattern") }, - [VIS_REG_COMMAND] = { ':', VIS_HELP("Last :-command") }, - [VIS_REG_SHELL] = { '!', VIS_HELP("Last shell command given to either <, >, |, or !") }, -}; - static void macro_replay(Vis *vis, const Macro *macro); static void macro_replay_internal(Vis *vis, const Macro *macro); static void vis_keys_push(Vis *vis, const char *input, size_t pos, bool record); @@ -1565,42 +1544,6 @@ void vis_count_set(Vis *vis, int count) { vis->action.count = (count >= 0 ? count : VIS_COUNT_UNKNOWN); } -enum VisRegister vis_register_from(Vis *vis, char reg) { - switch (reg) { - case '+': return VIS_REG_CLIPBOARD; - case '@': return VIS_MACRO_LAST_RECORDED; - } - - if ('a' <= reg && reg <= 'z') - return VIS_REG_a + reg - 'a'; - if ('A' <= reg && reg <= 'Z') - return VIS_REG_A + reg - 'A'; - for (size_t i = 0; i < LENGTH(vis_registers); i++) { - if (vis_registers[i].name == reg) - return i; - } - return VIS_REG_INVALID; -} - -void vis_register(Vis *vis, enum VisRegister reg) { - if (VIS_REG_A <= reg && reg <= VIS_REG_Z) { - vis->action.reg = &vis->registers[VIS_REG_a + reg - VIS_REG_A]; - vis->action.reg->append = true; - } else if (reg < LENGTH(vis->registers)) { - vis->action.reg = &vis->registers[reg]; - vis->action.reg->append = false; - } -} - -const char *vis_register_get(Vis *vis, enum VisRegister reg, size_t *len) { - if (VIS_REG_A <= reg && reg <= VIS_REG_Z) - reg = VIS_REG_a + reg - VIS_REG_A; - if (reg < LENGTH(vis->registers)) - return register_get(vis, &vis->registers[reg], len); - *len = 0; - return NULL; -} - void vis_exit(Vis *vis, int status) { vis->running = false; vis->exit_status = status; diff --git a/vis.h b/vis.h index c612a36..ea02307 100644 --- a/vis.h +++ b/vis.h @@ -463,6 +463,9 @@ enum VisRegister vis_register_from(Vis*, char reg); void vis_register(Vis*, enum VisRegister); /* 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); +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); /* start a macro recording, fails if a recording is already on going */ bool vis_macro_record(Vis*, enum VisRegister); -- cgit v1.2.3