aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/strings.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-05-04 18:29:18 +0800
committerGitHub <noreply@github.com>2023-05-04 18:29:18 +0800
commit7ae57435be1af17cfb053087e08c6ba313522990 (patch)
treeb198a34d1a29f25bb8d2f207f857be06a7838d8d /src/nvim/strings.c
parent38f9ee63660740ce1976173a8513b57bc41d94a3 (diff)
parent8752da89b83281426e81e5c4a392308848f4bfb6 (diff)
downloadrneovim-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.c22
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--;
}