comparison 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
comparison
equal deleted inserted replaced
26263:96a2fb08d98a 26264:ce6490cd6282
2141 str_arg_l = (q == NULL) ? precision 2141 str_arg_l = (q == NULL) ? precision
2142 : (size_t)(q - str_arg); 2142 : (size_t)(q - str_arg);
2143 } 2143 }
2144 if (fmt_spec == 'S') 2144 if (fmt_spec == 'S')
2145 { 2145 {
2146 size_t base_width = min_field_width; 2146 char_u *p1;
2147 size_t pad_cell = 0; 2147 size_t i;
2148 2148 int cell;
2149 if (precision) 2149
2150 for (i = 0, p1 = (char_u *)str_arg; *p1;
2151 p1 += mb_ptr2len(p1))
2150 { 2152 {
2151 char_u *p1; 2153 cell = mb_ptr2cells(p1);
2152 size_t i = 0; 2154 if (precision_specified && i + cell > precision)
2153 2155 break;
2154 for (p1 = (char_u *)str_arg; *p1; 2156 i += cell;
2155 p1 += mb_ptr2len(p1))
2156 {
2157 i += (size_t)mb_ptr2cells(p1);
2158 if (i > precision)
2159 break;
2160 }
2161 pad_cell = min_field_width - precision;
2162 base_width = str_arg_l = precision =
2163 p1 - (char_u *)str_arg;
2164 } 2157 }
2158
2159 str_arg_l = p1 - (char_u *)str_arg;
2165 if (min_field_width != 0) 2160 if (min_field_width != 0)
2166 min_field_width = base_width + pad_cell; 2161 min_field_width += str_arg_l - i;
2167 } 2162 }
2168 break; 2163 break;
2169 2164
2170 default: 2165 default:
2171 break; 2166 break;