diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-05-04 18:29:18 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-04 18:29:18 +0800 |
commit | 7ae57435be1af17cfb053087e08c6ba313522990 (patch) | |
tree | b198a34d1a29f25bb8d2f207f857be06a7838d8d /src/nvim/strings.c | |
parent | 38f9ee63660740ce1976173a8513b57bc41d94a3 (diff) | |
parent | 8752da89b83281426e81e5c4a392308848f4bfb6 (diff) | |
download | rneovim-7ae57435be1af17cfb053087e08c6ba313522990.tar.gz rneovim-7ae57435be1af17cfb053087e08c6ba313522990.tar.bz2 rneovim-7ae57435be1af17cfb053087e08c6ba313522990.zip |
Merge pull request #23470 from zeertzjq/vim-8.2.2344
vim-patch:8.2.{1461,1462,1466,2344,2607,2756}
Diffstat (limited to 'src/nvim/strings.c')
-rw-r--r-- | src/nvim/strings.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/nvim/strings.c b/src/nvim/strings.c index 61e00f85dc..5231ec0841 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -1834,12 +1834,26 @@ void f_strcharpart(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) const size_t slen = strlen(p); int nbyte = 0; + varnumber_T skipcc = false; bool error = false; varnumber_T nchar = 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 && (size_t)nbyte < slen) { - nbyte += utf_ptr2len(p + nbyte); + if (skipcc) { + nbyte += utfc_ptr2len(p + nbyte); + } else { + nbyte += utf_ptr2len(p + nbyte); + } nchar--; } } else { @@ -1855,7 +1869,11 @@ void f_strcharpart(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) if (off < 0) { len += 1; } else { - len += utf_ptr2len(p + off); + if (skipcc) { + len += utfc_ptr2len(p + off); + } else { + len += utf_ptr2len(p + off); + } } charlen--; } |