diff options
author | bfredl <bjorn.linse@gmail.com> | 2022-01-27 08:50:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-27 08:50:38 +0100 |
commit | c4b906f34104019e109919b4537ce8c11205394a (patch) | |
tree | e5ffdfc33cd2bd78da972bae44995bb4f639b4c1 /src/nvim/strings.c | |
parent | 1270949c11536248015fb7efad9f37f5f36399c4 (diff) | |
parent | 658ef9c01ee2e89b5a29f8fb018ac959ae2f4a90 (diff) | |
download | rneovim-c4b906f34104019e109919b4537ce8c11205394a.tar.gz rneovim-c4b906f34104019e109919b4537ce8c11205394a.tar.bz2 rneovim-c4b906f34104019e109919b4537ce8c11205394a.zip |
Merge pull request #17110 from zeertzjq/vim-8.2.3630
vim-patch:8.2.{3630,3663}: printf() with %S does not handle multi-byte correctly
Diffstat (limited to 'src/nvim/strings.c')
-rw-r--r-- | src/nvim/strings.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/src/nvim/strings.c b/src/nvim/strings.c index e2a8108c45..291138ef23 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -1001,22 +1001,20 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap, t - str_arg); } if (fmt_spec == 'S') { - if (min_field_width != 0) { - min_field_width += (strlen(str_arg) - - mb_string2cells((char_u *)str_arg)); - } - if (precision) { - char_u *p1; - size_t i = 0; - - for (p1 = (char_u *)str_arg; *p1; - p1 += utfc_ptr2len(p1)) { - i += (size_t)utf_ptr2cells(p1); - if (i > precision) { - break; - } + char_u *p1; + size_t i; + + for (i = 0, p1 = (char_u *)str_arg; *p1; p1 += utfc_ptr2len(p1)) { + size_t cell = (size_t)utf_ptr2cells(p1); + if (precision_specified && i + cell > precision) { + break; } - str_arg_l = (size_t)(p1 - (char_u *)str_arg); + i += cell; + } + + str_arg_l = (size_t)(p1 - (char_u *)str_arg); + if (min_field_width != 0) { + min_field_width += str_arg_l - i; } } break; |