aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/strings.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-06-09 17:43:46 +0800
committerGitHub <noreply@github.com>2023-06-09 17:43:46 +0800
commit106922898ad1510954737d38e7f8db78559ae6bd (patch)
tree05c95cb03be4dbfa9b9bc21bc20fe13c85885ccb /src/nvim/strings.c
parente5e0bda41b640d324350c5147b956e37e9f8b32c (diff)
downloadrneovim-106922898ad1510954737d38e7f8db78559ae6bd.tar.gz
rneovim-106922898ad1510954737d38e7f8db78559ae6bd.tar.bz2
rneovim-106922898ad1510954737d38e7f8db78559ae6bd.zip
vim-patch:9.0.1617: charidx() result is not consistent with byteidx() (#23963)
Problem: charidx() and utf16idx() result is not consistent with byteidx(). Solution: When the index is equal to the length of the text return the lenght of the text instead of -1. (Yegappan Lakshmanan, closes vim/vim#12503) https://github.com/vim/vim/commit/577922b917e48285a7a312daf7b5bbc6e272939c Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Diffstat (limited to 'src/nvim/strings.c')
-rw-r--r--src/nvim/strings.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/nvim/strings.c b/src/nvim/strings.c
index 4e521b14f7..a0d62f5df5 100644
--- a/src/nvim/strings.c
+++ b/src/nvim/strings.c
@@ -1603,6 +1603,11 @@ void f_charidx(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
int len;
for (p = str, len = 0; utf16idx ? idx >= 0 : p <= str + idx; len++) {
if (*p == NUL) {
+ // If the index is exactly the number of bytes or utf-16 code units
+ // in the string then return the length of the string in characters.
+ if (utf16idx ? (idx == 0) : (p == (str + idx))) {
+ rettv->vval.v_number = len;
+ }
return;
}
if (utf16idx) {
@@ -2047,6 +2052,11 @@ void f_utf16idx(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
int len;
for (p = str, len = 0; charidx ? idx >= 0 : p <= str + idx; len++) {
if (*p == NUL) {
+ // If the index is exactly the number of bytes or characters in the
+ // string then return the length of the string in utf-16 code units.
+ if (charidx ? (idx == 0) : (p == (str + idx))) {
+ rettv->vval.v_number = len;
+ }
return;
}
const int clen = ptr2len(p);