From f0e0c0991c5a3d50582678e1b05d83d375057709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 30 Jan 2016 19:46:18 +0100 Subject: Cleanup register implementation --- main.c | 6 +++--- register.c | 20 ++++++++++++-------- register.h | 7 +++---- vis-core.h | 1 + vis-operators.c | 7 +++++-- vis.c | 5 +++-- vis.h | 4 ++-- 7 files changed, 29 insertions(+), 21 deletions(-) diff --git a/main.c b/main.c index dab27ea..03a1362 100644 --- a/main.c +++ b/main.c @@ -1396,9 +1396,9 @@ static const char *delete(Vis *vis, const char *keys, const Arg *arg) { static const char *insert_register(Vis *vis, const char *keys, const Arg *arg) { enum VisRegister regid; keys = key2register(vis, keys, ®id); - Register *reg = vis_register_get(vis, regid); - if (reg) - vis_insert_key(vis, reg->data, reg->len); + size_t len; + const char *data = vis_register_get(vis, regid, &len); + vis_insert_key(vis, data, len); return keys; } diff --git a/register.c b/register.c index b1a4453..30ad19c 100644 --- a/register.c +++ b/register.c @@ -7,22 +7,26 @@ #include "util.h" void register_release(Register *reg) { - buffer_release((Buffer*)reg); + buffer_release(®->buf); +} + +const char *register_get(Register *reg, size_t *len) { + *len = reg->buf.len; + return reg->buf.data; } bool register_put(Register *reg, Text *txt, Filerange *range) { - size_t len = range->end - range->start; - if (!buffer_grow((Buffer*)reg, len)) + size_t len = text_range_size(range); + if (!buffer_grow(®->buf, len)) return false; - reg->len = text_bytes_get(txt, range->start, len, reg->data); + reg->buf.len = text_bytes_get(txt, range->start, len, reg->buf.data); return true; } bool register_append(Register *reg, Text *txt, Filerange *range) { - size_t rem = reg->size - reg->len; - size_t len = range->end - range->start; - if (len > rem && !buffer_grow((Buffer*)reg, reg->size + len - rem)) + size_t len = text_range_size(range); + if (!buffer_grow(®->buf, reg->buf.len + len)) return false; - reg->len += text_bytes_get(txt, range->start, len, reg->data + reg->len); + reg->buf.len += text_bytes_get(txt, range->start, len, reg->buf.data + reg->buf.len); return true; } diff --git a/register.h b/register.h index 5909c9a..22edd22 100644 --- a/register.h +++ b/register.h @@ -4,16 +4,15 @@ #include #include #include "buffer.h" +#include "text-util.h" -/* definition has to match Buffer */ typedef struct { - char *data; /* NULL if empty */ - size_t len; /* current length of data */ - size_t size; /* maximal capacity of the register */ + Buffer buf; bool linewise; /* place register content on a new line when inserting? */ } Register; void register_release(Register *reg); +const char *register_get(Register *reg, size_t *len); bool register_put(Register *reg, Text *txt, Filerange *range); bool register_append(Register *reg, Text *txt, Filerange *range); diff --git a/vis-core.h b/vis-core.h index 91bdf58..f78e8af 100644 --- a/vis-core.h +++ b/vis-core.h @@ -3,6 +3,7 @@ #include #include "vis.h" +#include "register.h" #include "text.h" #include "text-regex.h" #include "map.h" diff --git a/vis-operators.c b/vis-operators.c index c4165d9..fe410dc 100644 --- a/vis-operators.c +++ b/vis-operators.c @@ -51,9 +51,12 @@ static size_t op_put(Vis *vis, Text *txt, OperatorContext *c) { break; } + size_t len; + const char *data = register_get(c->reg, &len); + for (int i = 0; i < c->count; i++) { - text_insert(txt, pos, c->reg->data, c->reg->len); - pos += c->reg->len; + text_insert(txt, pos, data, len); + pos += len; } if (c->reg->linewise) { diff --git a/vis.c b/vis.c index 2c0d625..c7089ca 100644 --- a/vis.c +++ b/vis.c @@ -1002,9 +1002,10 @@ void vis_register_set(Vis *vis, enum VisRegister reg) { vis->action.reg = &vis->registers[reg]; } -Register *vis_register_get(Vis *vis, enum VisRegister reg) { +const char *vis_register_get(Vis *vis, enum VisRegister reg, size_t *len) { if (reg < LENGTH(vis->registers)) - return &vis->registers[reg]; + return register_get(&vis->registers[reg], len); + *len = 0; return NULL; } diff --git a/vis.h b/vis.h index f749a63..fe30fa4 100644 --- a/vis.h +++ b/vis.h @@ -11,7 +11,6 @@ typedef struct Win Win; #include "ui.h" #include "view.h" -#include "register.h" typedef struct { void (*vis_start)(Vis*); @@ -355,7 +354,8 @@ enum VisRegister { /* set the register to use, if none is given the DEFAULT register is used */ void vis_register_set(Vis*, enum VisRegister); -Register *vis_register_get(Vis*, enum VisRegister); +/* get register content */ +const char *vis_register_get(Vis*, enum VisRegister, size_t *len); /* repeat last operator, possibly with a new count if one was provided in the meantime */ void vis_repeat(Vis*); -- cgit v1.2.3