diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2014-12-06 20:19:08 -0500 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2014-12-06 20:19:08 -0500 |
commit | 01fc0efdcaeefab5510a9c37ba4dd28e5638263a (patch) | |
tree | 9f4864aa53657d5ce5932c509c28c3069340ca88 | |
parent | dcee93f8eae0ecc246280e8eb67d89ffe7f26b4a (diff) | |
parent | cea5092f40610216a83b6ab0a56d94295ce1e88a (diff) | |
download | rneovim-01fc0efdcaeefab5510a9c37ba4dd28e5638263a.tar.gz rneovim-01fc0efdcaeefab5510a9c37ba4dd28e5638263a.tar.bz2 rneovim-01fc0efdcaeefab5510a9c37ba4dd28e5638263a.zip |
Merge pull request #1341 from splinterofchaos/api-nul
Api: Improve Nul handling
-rw-r--r-- | src/nvim/api/buffer.c | 20 | ||||
-rw-r--r-- | test/functional/api/buffer_spec.lua | 5 | ||||
-rw-r--r-- | test/functional/api/vim_spec.lua | 9 |
3 files changed, 32 insertions, 2 deletions
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index 982003a31a..0292e82038 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -132,7 +132,12 @@ ArrayOf(String) buffer_get_line_slice(Buffer buffer, } const char *bufstr = (char *) ml_get_buf(buf, (linenr_T) lnum, false); - rv.items[i] = STRING_OBJ(cstr_to_string(bufstr)); + Object str = STRING_OBJ(cstr_to_string(bufstr)); + + // Vim represents NULs as NLs, but this may confuse clients. + strchrsub(str.data.string.data, '\n', '\0'); + + rv.items[i] = str; } end: @@ -201,7 +206,18 @@ void buffer_set_line_slice(Buffer buffer, } String l = replacement.items[i].data.string; - lines[i] = xmemdupz(l.data, l.size); + + // Fill lines[i] with l's contents. Disallow newlines in the middle of a + // line and convert NULs to newlines to avoid truncation. + lines[i] = xmallocz(l.size); + for (size_t j = 0; j < l.size; j++) { + if (l.data[j] == '\n') { + api_set_error(err, Exception, _("string cannot contain newlines")); + new_len = i + 1; + goto end; + } + lines[i][j] = (char) (l.data[j] == '\0' ? '\n' : l.data[j]); + } } try_start(); diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index 169d605b63..b85594f7af 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -34,6 +34,11 @@ describe('buffer_* functions', function() curbuf('del_line', 0) eq('', curbuf('get_line', 0)) end) + + it('can handle NULs', function() + curbuf('set_line', 0, 'ab\0cd') + eq('ab\0cd', curbuf('get_line', 0)) + end) end) diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index f34df8cefb..2c17a2acd0 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -36,6 +36,10 @@ describe('vim_* functions', function() -- 19 * 2 (each japanese character occupies two cells) eq(44, nvim('strwidth', 'neovimのデザインかなりまともなのになってる。')) end) + + it('cannot handle NULs', function() + eq(0, nvim('strwidth', '\0abc')) + end) end) describe('{get,set}_current_line', function() @@ -52,6 +56,11 @@ describe('vim_* functions', function() eq({1, 2, {['3'] = 1}}, nvim('get_var', 'lua')) eq({1, 2, {['3'] = 1}}, nvim('eval', 'g:lua')) end) + + it('truncates values with NULs in them', function() + nvim('set_var', 'xxx', 'ab\0cd') + eq('ab', nvim('get_var', 'xxx')) + end) end) describe('{get,set}_option', function() |