diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-05-04 17:42:34 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2023-05-04 17:49:56 +0800 |
commit | 3724e65c30f7d1ef803ac4e34eab7d4a9531b1a8 (patch) | |
tree | 6ddfb2294ae444c18f81f670500ea3f0f6fb5d88 /src/nvim/strings.c | |
parent | b441dafdf53e367c7d43177274bd781c5c73e6e0 (diff) | |
download | rneovim-3724e65c30f7d1ef803ac4e34eab7d4a9531b1a8.tar.gz rneovim-3724e65c30f7d1ef803ac4e34eab7d4a9531b1a8.tar.bz2 rneovim-3724e65c30f7d1ef803ac4e34eab7d4a9531b1a8.zip |
vim-patch:8.2.2607: strcharpart() cannot include composing characters
Problem: strcharpart() cannot include composing characters.
Solution: Add the {skipcc} argument.
https://github.com/vim/vim/commit/02b4d9b18a03549b68e364e428392b7a62766c74
Co-authored-by: Bram Moolenaar <Bram@vim.org>
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--; } |