]> granicus.if.org Git - vim/commitdiff
patch 8.1.2083: multi-byte chars do not work properly with "%.*S" in printf() v8.1.2083
authorBram Moolenaar <Bram@vim.org>
Fri, 27 Sep 2019 11:32:06 +0000 (13:32 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 27 Sep 2019 11:32:06 +0000 (13:32 +0200)
Problem:    Multi-byte chars do not work properly with "%.*S" in printf().
Solution:   Use mb_ptr2cells(). Daniel Hahler, closes #4989)

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

index b40753415bd74003bf58713556b90b4999e13612..dd5f3f519b18de03ee0baebd2d8df80e72054910 100644 (file)
@@ -4405,12 +4405,16 @@ vim_vsnprintf_typval(
                                     - mb_string2cells((char_u *)str_arg, -1);
                        if (precision)
                        {
-                           char_u *p1 = (char_u *)str_arg;
-                           size_t i;
-
-                           for (i = 0; i < precision && *p1; i++)
-                               p1 += mb_ptr2len(p1);
+                           char_u  *p1;
+                           size_t  i = 0;
 
+                           for (p1 = (char_u *)str_arg; *p1;
+                                                         p1 += mb_ptr2len(p1))
+                           {
+                               i += (size_t)mb_ptr2cells(p1);
+                               if (i > precision)
+                                   break;
+                           }
                            str_arg_l = precision = p1 - (char_u *)str_arg;
                        }
                    }
index 365a81344f1fb0027fbc2cba7db4e5049cc39bf3..253cd49bc9cd20044d4eaba7083ab774a8d67776 100644 (file)
@@ -248,6 +248,9 @@ function Test_printf_misc()
   call assert_equal('abc ', printf('%-4s', 'abc'))
   call assert_equal('abc ', printf('%-4S', 'abc'))
 
+  call assert_equal('🐍', printf('%.2S', '🐍🐍'))
+  call assert_equal('', printf('%.1S', '🐍🐍'))
+
   call assert_equal('1%', printf('%d%%', 1))
 endfunc
 
index fa4e956b203641b4ec0acaa12ac8fd9f79cecdb5..98ddcca846b13d4074f0b2b528e19f7bd3f655fd 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2083,
 /**/
     2082,
 /**/