diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/evalfunc.c | 26 | ||||
| -rw-r--r-- | src/testdir/test_expr_utf8.vim | 8 | ||||
| -rw-r--r-- | src/version.c | 2 |
3 files changed, 33 insertions, 3 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c index 34369d77a..8fcdedbc0 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -1575,7 +1575,7 @@ static funcentry_T global_functions[] = ret_number, f_str2nr}, {"strcharlen", 1, 1, FEARG_1, NULL, ret_number, f_strcharlen}, - {"strcharpart", 2, 3, FEARG_1, NULL, + {"strcharpart", 2, 4, FEARG_1, NULL, ret_string, f_strcharpart}, {"strchars", 1, 2, FEARG_1, NULL, ret_number, f_strchars}, @@ -9316,6 +9316,7 @@ f_strcharpart(typval_T *argvars, typval_T *rettv) int nchar; int nbyte = 0; int charlen; + int skipcc = FALSE; int len = 0; int slen; int error = FALSE; @@ -9326,10 +9327,24 @@ f_strcharpart(typval_T *argvars, typval_T *rettv) nchar = (int)tv_get_number_chk(&argvars[1], &error); if (!error) { + if (argvars[2].v_type != VAR_UNKNOWN + && argvars[3].v_type != VAR_UNKNOWN) + { + skipcc = tv_get_bool(&argvars[3]); + if (skipcc < 0 || skipcc > 1) + { + semsg(_(e_using_number_as_bool_nr), skipcc); + return; + } + } + if (nchar > 0) while (nchar > 0 && nbyte < slen) { - nbyte += MB_CPTR2LEN(p + nbyte); + if (skipcc) + nbyte += mb_ptr2len(p + nbyte); + else + nbyte += MB_CPTR2LEN(p + nbyte); --nchar; } else @@ -9344,7 +9359,12 @@ f_strcharpart(typval_T *argvars, typval_T *rettv) if (off < 0) len += 1; else - len += MB_CPTR2LEN(p + off); + { + if (skipcc) + len += mb_ptr2len(p + off); + else + len += MB_CPTR2LEN(p + off); + } --charlen; } } diff --git a/src/testdir/test_expr_utf8.vim b/src/testdir/test_expr_utf8.vim index b5937b208..c6d2e4ed7 100644 --- a/src/testdir/test_expr_utf8.vim +++ b/src/testdir/test_expr_utf8.vim @@ -31,6 +31,14 @@ func Test_strcharpart() call assert_equal('a', strcharpart('àxb', 0, 1)) call assert_equal('̀', strcharpart('àxb', 1, 1)) call assert_equal('x', strcharpart('àxb', 2, 1)) + + + call assert_equal('a', strcharpart('àxb', 0, 1, 0)) + call assert_equal('à', strcharpart('àxb', 0, 1, 1)) + call assert_equal('x', strcharpart('àxb', 1, 1, 1)) + + call assert_fails("let v = strcharpart('abc', 0, 0, [])", 'E745:') + call assert_fails("let v = strcharpart('abc', 0, 0, 2)", 'E1023:') endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 918a34c98..0b1ece6a6 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2607, +/**/ 2606, /**/ 2605, |
