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:
| M | register.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(®->buf, len)) + if (!buffer_grow(®->buf, len+1)) return false; reg->buf.len = text_bytes_get(txt, range->start, len, reg->buf.data); - return true; + return buffer_append(®->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(®->buf, reg->buf.len + len)) + if (!buffer_grow(®->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(®->buf, "\0", 1); } default: return false;