Use codepoint index for indices/1, index/ 1 and rindex/1 (#3065)

Previsouly byte index was used.

Fixes #1430 #1624 #3064
This commit is contained in:
Mattias Wadman authored and GitHub committed 2024-11-17 10:22:05 +01:00
1 parent a7b22539a4
commit 8619f8a8ac
2 files changed
+25 -3

No files matched your search

+9 -3
View File
@@ -1273,15 +1273,21 @@ jv jv_string_indexes(jv j, jv k) {
assert(JVP_HAS_KIND(k, JV_KIND_STRING));
const char *jstr = jv_string_value(j);
const char *idxstr = jv_string_value(k);
const char *p;
const char *p, *lp;
int jlen = jv_string_length_bytes(jv_copy(j));
int idxlen = jv_string_length_bytes(jv_copy(k));
jv a = jv_array();
if (idxlen != 0) {
p = jstr;
int n = 0;
p = lp = jstr;
while ((p = _jq_memmem(p, (jstr + jlen) - p, idxstr, idxlen)) != NULL) {
a = jv_array_append(a, jv_number(p - jstr));
while (lp < p) {
lp += jvp_utf8_decode_length(*lp);
n++;
}
a = jv_array_append(a, jv_number(n));
p++;
}
}