Mercurial > vim
diff src/strings.c @ 26264:ce6490cd6282 v8.2.3663
patch 8.2.3663: using %S in printf() does not work correctly
Commit: https://github.com/vim/vim/commit/1f2453fec6f8f0f315f00ca7b562a02090cb1e37
Author: presuku <presuku@users.noreply.github.com>
Date: Wed Nov 24 15:32:57 2021 +0000
patch 8.2.3663: using %S in printf() does not work correctly
Problem: Using %S in printf() does not work correctly.
Solution: Fix the problem and add more tests. (closes https://github.com/vim/vim/issues/9208)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 24 Nov 2021 16:45:03 +0100 |
parents | 2093cc976da8 |
children | 2126feddeda6 |
line wrap: on
line diff
--- a/src/strings.c +++ b/src/strings.c @@ -2143,27 +2143,22 @@ vim_vsnprintf_typval( } if (fmt_spec == 'S') { - size_t base_width = min_field_width; - size_t pad_cell = 0; + char_u *p1; + size_t i; + int cell; - if (precision) - { - char_u *p1; - size_t i = 0; - - for (p1 = (char_u *)str_arg; *p1; + for (i = 0, p1 = (char_u *)str_arg; *p1; p1 += mb_ptr2len(p1)) - { - i += (size_t)mb_ptr2cells(p1); - if (i > precision) - break; - } - pad_cell = min_field_width - precision; - base_width = str_arg_l = precision = - p1 - (char_u *)str_arg; + { + cell = mb_ptr2cells(p1); + if (precision_specified && i + cell > precision) + break; + i += cell; } + + str_arg_l = p1 - (char_u *)str_arg; if (min_field_width != 0) - min_field_width = base_width + pad_cell; + min_field_width += str_arg_l - i; } break;