vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit dfc918977edf4142e6c9095f37af2b8ac44eda82
parent 24965fe25cec393b1a034d844e233a3fdc5f0a54
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Thu, 15 Dec 2016 12:38:51 +0100

vis: always store registers values NUL terminated

Previously we only made sure that the register content is NUL terminated
when reading it out. This made it impossible to distinguish between an
empty register and one which stores a single NUL byte. Now the in memory
representation of a non-empty register is always NUL terminated. When
appending we temporarily remove the trailing NUL byte and restore
it later.

This should fix put commands of a previously yanked single NUL byte.

Diffstat:
Mregister.c | 10++++++----
1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/register.c b/register.c @@ -60,10 +60,10 @@ bool register_put_range(Vis *vis, Register *reg, Text *txt, Filerange *range) { case REGISTER_NORMAL: { size_t len = text_range_size(range); - if (!buffer_grow(&reg->buf, len)) + if (!buffer_grow(&reg->buf, len+1)) return false; reg->buf.len = text_bytes_get(txt, range->start, len, reg->buf.data); - return true; + return buffer_append(&reg->buf, "\0", 1); } case REGISTER_CLIPBOARD: { @@ -89,10 +89,12 @@ bool register_append_range(Register *reg, Text *txt, Filerange *range) { case REGISTER_NORMAL: { size_t len = text_range_size(range); - if (!buffer_grow(&reg->buf, reg->buf.len + len)) + if (!buffer_grow(&reg->buf, reg->buf.len + len + 1)) return false; + if (reg->buf.len > 0 && reg->buf.data[reg->buf.len-1] == '\0') + reg->buf.len--; reg->buf.len += text_bytes_get(txt, range->start, len, reg->buf.data + reg->buf.len); - return true; + return buffer_append(&reg->buf, "\0", 1); } default: return false;