fix(grid): don't use utfc_ptr2char_len() when printing until NUL (#19456)

This commit is contained in:
zeertzjq 2022-07-22 06:41:51 +08:00 committed by GitHub
parent 946c8fd288
commit 8af3d641da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 12 deletions

View File

@ -230,16 +230,12 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row, int col
&& *ptr != NUL) { && *ptr != NUL) {
c = *ptr; c = *ptr;
// check if this is the first byte of a multibyte // check if this is the first byte of a multibyte
if (len > 0) { mbyte_blen = len > 0
mbyte_blen = utfc_ptr2len_len(ptr, (int)((text + len) - ptr)); ? utfc_ptr2len_len(ptr, (int)((text + len) - ptr))
} else { : utfc_ptr2len((char *)ptr);
mbyte_blen = utfc_ptr2len((char *)ptr); u8c = len >= 0
} ? utfc_ptr2char_len(ptr, u8cc, (int)((text + len) - ptr))
if (len >= 0) { : utfc_ptr2char(ptr, u8cc);
u8c = utfc_ptr2char_len(ptr, u8cc, (int)((text + len) - ptr));
} else {
u8c = utfc_ptr2char(ptr, u8cc);
}
mbyte_cells = utf_char2cells(u8c); mbyte_cells = utf_char2cells(u8c);
if (p_arshape && !p_tbidi && ARABIC_CHAR(u8c)) { if (p_arshape && !p_tbidi && ARABIC_CHAR(u8c)) {
// Do Arabic shaping. // Do Arabic shaping.
@ -248,8 +244,9 @@ void grid_puts_len(ScreenGrid *grid, char_u *text, int textlen, int row, int col
nc = NUL; nc = NUL;
nc1 = NUL; nc1 = NUL;
} else { } else {
nc = utfc_ptr2char_len(ptr + mbyte_blen, pcc, nc = len >= 0
(int)((text + len) - ptr - mbyte_blen)); ? utfc_ptr2char_len(ptr + mbyte_blen, pcc, (int)((text + len) - ptr - mbyte_blen))
: utfc_ptr2char(ptr + mbyte_blen, pcc);
nc1 = pcc[0]; nc1 = pcc[0];
} }
pc = prev_c; pc = prev_c;

View File

@ -1,5 +1,6 @@
local helpers = require('test.functional.helpers')(after_each) local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen') local Screen = require('test.functional.ui.screen')
local assert_alive = helpers.assert_alive
local clear = helpers.clear local clear = helpers.clear
local command = helpers.command local command = helpers.command
local feed = helpers.feed local feed = helpers.feed
@ -368,3 +369,11 @@ describe('global statusline', function()
eq(1, meths.get_option('cmdheight')) eq(1, meths.get_option('cmdheight'))
end) end)
end) end)
it('statusline does not crash if it has Arabic characters #19447', function()
clear()
meths.set_option('statusline', 'غً')
meths.set_option('laststatus', 2)
command('redraw!')
assert_alive()
end)