From f2ea65a0c03ff7cd17c7da1586fa68dcfa8f1fa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 15 Dec 2016 12:38:51 +0100 Subject: 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. --- register.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'register.c') diff --git a/register.c b/register.c index 16a7233..4e65403 100644 --- 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; -- cgit v1.2.3