changeset 8993:2085167ab1b0 v7.4.1782

commit https://github.com/vim/vim/commit/fca66003053f8c0da5161d1fe4b75b3a389934b5 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Apr 23 15:30:09 2016 +0200 patch 7.4.1782 Problem: strcharpart() does not work properly with some multi-byte characters. Solution: Use mb_cptr2len() instead of mb_char2len(). (Hirohito Higashi)
author Christian Brabandt <cb@256bit.org>
date Sat, 23 Apr 2016 15:45:04 +0200
parents d4e6dccc4840
children c48891ecfef2
files src/eval.c src/testdir/test_expr_utf8.vim src/version.c
diffstat 3 files changed, 14 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -19764,7 +19764,7 @@ f_strcharpart(typval_T *argvars, typval_
 	if (nchar > 0)
 	    while (nchar > 0 && nbyte < slen)
 	    {
-		nbyte += mb_char2len(p[nbyte]);
+		nbyte += mb_cptr2len(p + nbyte);
 		--nchar;
 	    }
 	else
@@ -19779,7 +19779,7 @@ f_strcharpart(typval_T *argvars, typval_
 		if (off < 0)
 		    len += 1;
 		else
-		    len += mb_char2len(p[off]);
+		    len += mb_cptr2len(p + off);
 		--charlen;
 	    }
 	}
--- a/src/testdir/test_expr_utf8.vim
+++ b/src/testdir/test_expr_utf8.vim
@@ -23,6 +23,16 @@ func Test_strcharpart()
   call assert_equal('á', strcharpart('áxb', 0, 1))
   call assert_equal('x', strcharpart('áxb', 1, 1))
 
+  call assert_equal('いうeお', strcharpart('あいうeお', 1))
+  call assert_equal('い', strcharpart('あいうeお', 1, 1))
+  call assert_equal('いう', strcharpart('あいうeお', 1, 2))
+  call assert_equal('いうe', strcharpart('あいうeお', 1, 3))
+  call assert_equal('いうeお', strcharpart('あいうeお', 1, 4))
+  call assert_equal('eお', strcharpart('あいうeお', 3))
+  call assert_equal('e', strcharpart('あいうeお', 3, 1))
+
+  call assert_equal('あ', strcharpart('あいうeお', -3, 4))
+
   call assert_equal('a', strcharpart('àxb', 0, 1))
   call assert_equal('̀', strcharpart('àxb', 1, 1))
   call assert_equal('x', strcharpart('àxb', 2, 1))
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1782,
+/**/
     1781,
 /**/
     1780,