vim-patch:8.2.1461: Vim9: string indexes are counted in bytes

Problem:    Vim9: string indexes are counted in bytes.
Solution:   Use character indexes. (closes vim/vim#6574)

e3c37d8ebf

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq
2023-05-04 17:10:58 +08:00
parent 38f9ee6366
commit dd3d857c39
2 changed files with 23 additions and 0 deletions

View File

@@ -1152,6 +1152,8 @@ text column numbers start with one! Example, to get the byte under the
cursor: > cursor: >
:let c = getline(".")[col(".") - 1] :let c = getline(".")[col(".") - 1]
Index zero gives the first byte. Careful: text column numbers start with one!
If the length of the String is less than the index, the result is an empty If the length of the String is less than the index, the result is an empty
String. A negative index always results in an empty string (reason: backward String. A negative index always results in an empty string (reason: backward
compatibility). Use [-1:] to get the last byte. compatibility). Use [-1:] to get the last byte.

View File

@@ -7264,6 +7264,27 @@ int check_luafunc_name(const char *const str, const bool paren)
return (int)(p - str); return (int)(p - str);
} }
/// Return the character "str[index]" where "index" is the character index. If
/// "index" is out of range NULL is returned.
char *char_from_string(char *str, varnumber_T index)
{
size_t nbyte = 0;
varnumber_T nchar = index;
if (str == NULL || index < 0) {
return NULL;
}
size_t slen = strlen(str);
while (nchar > 0 && nbyte < slen) {
nbyte += (size_t)utf_ptr2len(str + nbyte);
nchar--;
}
if (nbyte >= slen) {
return NULL;
}
return xstrnsave(str + nbyte, (size_t)utf_ptr2len(str + nbyte));
}
/// Handle: /// Handle:
/// - expr[expr], expr[expr:expr] subscript /// - expr[expr], expr[expr:expr] subscript
/// - ".name" lookup /// - ".name" lookup