]> granicus.if.org Git - vim/commitdiff
patch 8.2.3663: using %S in printf() does not work correctly v8.2.3663
authorpresuku <presuku@users.noreply.github.com>
Wed, 24 Nov 2021 15:32:57 +0000 (15:32 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 24 Nov 2021 15:32:57 +0000 (15:32 +0000)
Problem:    Using %S in printf() does not work correctly.
Solution:   Fix the problem and add more tests. (closes #9208)

src/strings.c
src/testdir/test_expr.vim
src/version.c

index bc88ce5f6ed5fb4b9c8881982540b9b023cbc857..847d74379741332ef3de75e8901404e579f8d7d0 100644 (file)
@@ -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;
 
index 97009742785240459ed4e3424194cccfc8d75058..323ce2626dc034ba0c90303d03bb49e194e7c049 100644 (file)
@@ -302,6 +302,66 @@ function Test_printf_misc()
   call assert_equal('[あいうえお]', printf('[%10.10S]', 'あいうえお'))
   call assert_equal('[あいうえお]', printf('[%10.12S]', 'あいうえお'))
 
+  call assert_equal('あいう', printf('%S', 'あいう'))
+  call assert_equal('あいう', printf('%#S', 'あいう'))
+
+  call assert_equal('あb', printf('%2S', 'あb'))
+  call assert_equal('あb', printf('%.4S', 'あb'))
+  call assert_equal('あ', printf('%.2S', 'あb'))
+  call assert_equal(' あb', printf('%4S', 'あb'))
+  call assert_equal('0あb', printf('%04S', 'あb'))
+  call assert_equal('あb ', printf('%-4S', 'あb'))
+  call assert_equal('あ  ', printf('%-4.2S', 'あb'))
+
+  call assert_equal('aい', printf('%2S', 'aい'))
+  call assert_equal('aい', printf('%.4S', 'aい'))
+  call assert_equal('a', printf('%.2S', 'aい'))
+  call assert_equal(' aい', printf('%4S', 'aい'))
+  call assert_equal('0aい', printf('%04S', 'aい'))
+  call assert_equal('aい ', printf('%-4S', 'aい'))
+  call assert_equal('a   ', printf('%-4.2S', 'aい'))
+
+  call assert_equal('[あいう]', printf('[%05S]', 'あいう'))
+  call assert_equal('[あいう]', printf('[%06S]', 'あいう'))
+  call assert_equal('[0あいう]', printf('[%07S]', 'あいう'))
+
+  call assert_equal('[あiう]', printf('[%05S]', 'あiう'))
+  call assert_equal('[0あiう]', printf('[%06S]', 'あiう'))
+  call assert_equal('[00あiう]', printf('[%07S]', 'あiう'))
+
+  call assert_equal('[0あい]', printf('[%05.4S]', 'あいう'))
+  call assert_equal('[00あい]', printf('[%06.4S]', 'あいう'))
+  call assert_equal('[000あい]', printf('[%07.4S]', 'あいう'))
+
+  call assert_equal('[00あi]', printf('[%05.4S]', 'あiう'))
+  call assert_equal('[000あi]', printf('[%06.4S]', 'あiう'))
+  call assert_equal('[0000あi]', printf('[%07.4S]', 'あiう'))
+
+  call assert_equal('[0あい]', printf('[%05.5S]', 'あいう'))
+  call assert_equal('[00あい]', printf('[%06.5S]', 'あいう'))
+  call assert_equal('[000あい]', printf('[%07.5S]', 'あいう'))
+
+  call assert_equal('[あiう]', printf('[%05.5S]', 'あiう'))
+  call assert_equal('[0あiう]', printf('[%06.5S]', 'あiう'))
+  call assert_equal('[00あiう]', printf('[%07.5S]', 'あiう'))
+
+  call assert_equal('[0000000000]', printf('[%010.0S]', 'あいう'))
+  call assert_equal('[0000000000]', printf('[%010.1S]', 'あいう'))
+  call assert_equal('[00000000あ]', printf('[%010.2S]', 'あいう'))
+  call assert_equal('[00000000あ]', printf('[%010.3S]', 'あいう'))
+  call assert_equal('[000000あい]', printf('[%010.4S]', 'あいう'))
+  call assert_equal('[000000あい]', printf('[%010.5S]', 'あいう'))
+  call assert_equal('[0000あいう]', printf('[%010.6S]', 'あいう'))
+  call assert_equal('[0000あいう]', printf('[%010.7S]', 'あいう'))
+
+  call assert_equal('[0000000000]', printf('[%010.1S]', 'あiう'))
+  call assert_equal('[00000000あ]', printf('[%010.2S]', 'あiう'))
+  call assert_equal('[0000000あi]', printf('[%010.3S]', 'あiう'))
+  call assert_equal('[0000000あi]', printf('[%010.4S]', 'あiう'))
+  call assert_equal('[00000あiう]', printf('[%010.5S]', 'あiう'))
+  call assert_equal('[00000あiう]', printf('[%010.6S]', 'あiう'))
+  call assert_equal('[00000あiう]', printf('[%010.7S]', 'あiう'))
+
   call assert_equal('1%', printf('%d%%', 1))
 endfunc
 
index 58a18560404387fc59ab91dc732d0f4b317a3a1a..b4e24644573fbddc300d12c0fd6d084571747454 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3663,
 /**/
     3662,
 /**/