aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/message.c4
-rw-r--r--src/nvim/version.c2
-rw-r--r--test/unit/message_spec.lua28
3 files changed, 22 insertions, 12 deletions
diff --git a/src/nvim/message.c b/src/nvim/message.c
index 57f7369e73..689e8893bd 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -274,9 +274,9 @@ void trunc_string(char_u *s, char_u *buf, int room, int buflen)
for (;;) {
do {
half = half - (*mb_head_off)(s, s + half - 1) - 1;
- } while (utf_iscomposing(utf_ptr2char(s + half)) && half > 0);
+ } while (half > 0 && utf_iscomposing(utf_ptr2char(s + half)));
n = ptr2cells(s + half);
- if (len + n > room) {
+ if (len + n > room || half == 0) {
break;
}
len += n;
diff --git a/src/nvim/version.c b/src/nvim/version.c
index b755404a58..abd3b7dfc3 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -372,7 +372,7 @@ static int included_patches[] = {
2071,
// 2070 NA
// 2069,
- // 2068,
+ 2068,
2067,
2066,
2065,
diff --git a/test/unit/message_spec.lua b/test/unit/message_spec.lua
index 23d342c027..afb572347f 100644
--- a/test/unit/message_spec.lua
+++ b/test/unit/message_spec.lua
@@ -4,22 +4,28 @@ local ffi = helpers.ffi
local eq = helpers.eq
local to_cstr = helpers.to_cstr
-local cimp = helpers.cimport('./src/nvim/message.h')
+local cimp = helpers.cimport('./src/nvim/message.h', './src/nvim/memory.h',
+ './src/nvim/strings.h')
describe('trunc_string', function()
- local buffer = ffi.typeof('char_u[40]')
-
- local function test_inplace(s, expected)
- local buf = buffer()
+ local buflen = 40
+ local function test_inplace(s, expected, room)
+ room = room and room or 20
+ local buf = cimp.xmalloc(ffi.sizeof('char_u') * buflen)
ffi.C.strcpy(buf, s)
- cimp.trunc_string(buf, buf, 20, 40)
+ cimp.trunc_string(buf, buf, room, buflen)
eq(expected, ffi.string(buf))
+ cimp.xfree(buf)
end
- local function test_copy(s, expected)
- local buf = buffer()
- cimp.trunc_string(to_cstr(s), buf, 20, 40)
+ local function test_copy(s, expected, room)
+ room = room and room or 20
+ local buf = cimp.xmalloc(ffi.sizeof('char_u') * buflen)
+ local str = cimp.vim_strsave(to_cstr(s))
+ cimp.trunc_string(str, buf, room, buflen)
eq(expected, ffi.string(buf))
+ cimp.xfree(buf)
+ cimp.xfree(str)
end
local permutations = {
@@ -37,6 +43,10 @@ describe('trunc_string', function()
t.func('a short text', 'a short text')
end)
+ it('with a string of length == 1/2 room', function()
+ t.func('a text that fits', 'a text that fits', 34)
+ end)
+
it('with a string exactly the truncate size', function()
t.func('a text tha just fits', 'a text tha just fits')
end)