diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-12-15 12:38:51 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-12-15 12:47:50 +0100 |
| commit | f2ea65a0c03ff7cd17c7da1586fa68dcfa8f1fa9 (patch) | |
| tree | 2a738be37430226c3f107186d2a499e6eb4408a3 | |
| parent | 904a7a4abd511426e2430fdd016fca22e84583c2 (diff) | |
| download | vis-f2ea65a0c03ff7cd17c7da1586fa68dcfa8f1fa9.tar.gz vis-f2ea65a0c03ff7cd17c7da1586fa68dcfa8f1fa9.tar.xz | |
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.
| -rw-r--r-- | register.c | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -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; |
