aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/strings.c14
-rw-r--r--src/nvim/testdir/test_expr.vim3
2 files changed, 13 insertions, 4 deletions
diff --git a/src/nvim/strings.c b/src/nvim/strings.c
index 3ba9354c67..2f5491fda5 100644
--- a/src/nvim/strings.c
+++ b/src/nvim/strings.c
@@ -953,11 +953,17 @@ int vim_vsnprintf_typval(
- mb_string2cells((char_u *)str_arg));
}
if (precision) {
- const char *p1 = str_arg;
- for (size_t i = 0; i < precision && *p1; i++) {
- p1 += mb_ptr2len((const char_u *)p1);
+ char_u *p1;
+ size_t i = 0;
+
+ for (p1 = (char_u *)str_arg; *p1;
+ p1 += mb_ptr2len(p1)) {
+ i += (size_t)utf_ptr2cells(p1);
+ if (i > precision) {
+ break;
+ }
}
- str_arg_l = precision = (size_t)(p1 - str_arg);
+ str_arg_l = precision = (size_t)(p1 - (char_u *)str_arg);
}
}
break;
diff --git a/src/nvim/testdir/test_expr.vim b/src/nvim/testdir/test_expr.vim
index 4f99625e73..dd546dbf71 100644
--- a/src/nvim/testdir/test_expr.vim
+++ b/src/nvim/testdir/test_expr.vim
@@ -279,6 +279,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