aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-01-30 19:46:18 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-01-30 19:59:48 +0100
commitf0e0c0991c5a3d50582678e1b05d83d375057709 (patch)
treebf0f29bbdbe8f495b4d95eb0fe533915fcccacef
parent979ab795bc9d19524be524c79265c6b952199a22 (diff)
downloadvis-f0e0c0991c5a3d50582678e1b05d83d375057709.tar.gz
vis-f0e0c0991c5a3d50582678e1b05d83d375057709.tar.xz
Cleanup register implementation
-rw-r--r--main.c6
-rw-r--r--register.c20
-rw-r--r--register.h7
-rw-r--r--vis-core.h1
-rw-r--r--vis-operators.c7
-rw-r--r--vis.c5
-rw-r--r--vis.h4
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, &regid);
- 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(&reg->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(&reg->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(&reg->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 <stddef.h>
#include <stdbool.h>
#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 <setjmp.h>
#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*);