diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-04-14 22:54:24 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-04-14 22:54:24 +0200 |
commit | 5d18e0eca59ffbba22c7f7c91c9f99d672095728 (patch) | |
tree | e57bfffeff8ab16cc123eb5beab2b43b1a38f835 | |
parent | b22bd46b9681d73d095f2eadff8163d3a6cf416b (diff) | |
download | vim-git-5d18e0eca59ffbba22c7f7c91c9f99d672095728.tar.gz |
patch 7.4.1742v7.4.1742
Problem: strgetchar() does not work correctly.
Solution: use mb_cptr2len(). Add a test. (Naruhiko Nishino)
-rw-r--r-- | src/eval.c | 43 | ||||
-rw-r--r-- | src/testdir/test_expr_utf8.vim | 4 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 27 insertions, 22 deletions
diff --git a/src/eval.c b/src/eval.c index 5ced88ef0..bd4a11a8a 100644 --- a/src/eval.c +++ b/src/eval.c @@ -13048,26 +13048,6 @@ f_getpid(typval_T *argvars UNUSED, typval_T *rettv) rettv->vval.v_number = mch_get_pid(); } -static void getpos_both(typval_T *argvars, typval_T *rettv, int getcurpos); - -/* - * "getcurpos()" function - */ - static void -f_getcurpos(typval_T *argvars, typval_T *rettv) -{ - getpos_both(argvars, rettv, TRUE); -} - -/* - * "getpos(string)" function - */ - static void -f_getpos(typval_T *argvars, typval_T *rettv) -{ - getpos_both(argvars, rettv, FALSE); -} - static void getpos_both( typval_T *argvars, @@ -13110,6 +13090,25 @@ getpos_both( rettv->vval.v_number = FALSE; } + +/* + * "getcurpos()" function + */ + static void +f_getcurpos(typval_T *argvars, typval_T *rettv) +{ + getpos_both(argvars, rettv, TRUE); +} + +/* + * "getpos(string)" function + */ + static void +f_getpos(typval_T *argvars, typval_T *rettv) +{ + getpos_both(argvars, rettv, FALSE); +} + /* * "getqflist()" and "getloclist()" functions */ @@ -19574,7 +19573,7 @@ f_strgetchar(typval_T *argvars, typval_T *rettv) return; #ifdef FEAT_MBYTE { - int byteidx = 0; + int byteidx = 0; while (charidx >= 0 && byteidx < len) { @@ -19584,7 +19583,7 @@ f_strgetchar(typval_T *argvars, typval_T *rettv) break; } --charidx; - byteidx += mb_char2len(str[byteidx]); + byteidx += mb_cptr2len(str + byteidx); } } #else diff --git a/src/testdir/test_expr_utf8.vim b/src/testdir/test_expr_utf8.vim index ec36deca9..c512ddf43 100644 --- a/src/testdir/test_expr_utf8.vim +++ b/src/testdir/test_expr_utf8.vim @@ -12,6 +12,10 @@ func Test_strgetchar() call assert_equal(char2nr('a'), strgetchar('àxb', 0)) call assert_equal(char2nr('̀'), strgetchar('àxb', 1)) call assert_equal(char2nr('x'), strgetchar('àxb', 2)) + + call assert_equal(char2nr('あ'), strgetchar('あaい', 0)) + call assert_equal(char2nr('a'), strgetchar('あaい', 1)) + call assert_equal(char2nr('い'), strgetchar('あaい', 2)) endfunc func Test_strcharpart() diff --git a/src/version.c b/src/version.c index 07f1a0d63..4c00d3169 100644 --- a/src/version.c +++ b/src/version.c @@ -749,6 +749,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1742, +/**/ 1741, /**/ 1740, |