diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-06-09 17:43:46 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-09 17:43:46 +0800 |
commit | 106922898ad1510954737d38e7f8db78559ae6bd (patch) | |
tree | 05c95cb03be4dbfa9b9bc21bc20fe13c85885ccb /src/nvim/strings.c | |
parent | e5e0bda41b640d324350c5147b956e37e9f8b32c (diff) | |
download | rneovim-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.c | 10 |
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); |