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:
1 parent
a7b22539a4
commit
8619f8a8ac
2 files changed
+25
-3
No files matched your search
@@ -1273,15 +1273,21 @@ jv jv_string_indexes(jv j, jv k) {
|
|||||||
assert(JVP_HAS_KIND(k, JV_KIND_STRING));
|
assert(JVP_HAS_KIND(k, JV_KIND_STRING));
|
||||||
const char *jstr = jv_string_value(j);
|
const char *jstr = jv_string_value(j);
|
||||||
const char *idxstr = jv_string_value(k);
|
const char *idxstr = jv_string_value(k);
|
||||||
const char *p;
|
const char *p, *lp;
|
||||||
int jlen = jv_string_length_bytes(jv_copy(j));
|
int jlen = jv_string_length_bytes(jv_copy(j));
|
||||||
int idxlen = jv_string_length_bytes(jv_copy(k));
|
int idxlen = jv_string_length_bytes(jv_copy(k));
|
||||||
jv a = jv_array();
|
jv a = jv_array();
|
||||||
|
|
||||||
if (idxlen != 0) {
|
if (idxlen != 0) {
|
||||||
p = jstr;
|
int n = 0;
|
||||||
|
p = lp = jstr;
|
||||||
while ((p = _jq_memmem(p, (jstr + jlen) - p, idxstr, idxlen)) != NULL) {
|
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++;
|
p++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1416,6 +1416,22 @@ indices(", ")
|
|||||||
"a,b, cd,e, fgh, ijkl"
|
"a,b, cd,e, fgh, ijkl"
|
||||||
[3,9,14]
|
[3,9,14]
|
||||||
|
|
||||||
|
index("!")
|
||||||
|
"здравствуй мир!"
|
||||||
|
14
|
||||||
|
|
||||||
|
.[:rindex("x")]
|
||||||
|
"正xyz"
|
||||||
|
"正"
|
||||||
|
|
||||||
|
indices("o")
|
||||||
|
"🇬🇧oo"
|
||||||
|
[2,3]
|
||||||
|
|
||||||
|
indices("o")
|
||||||
|
"ƒoo"
|
||||||
|
[1,2]
|
||||||
|
|
||||||
[.[]|split(",")]
|
[.[]|split(",")]
|
||||||
["a, bc, def, ghij, jklmn, a,b, c,d, e,f", "a,b,c,d, e,f,g,h"]
|
["a, bc, def, ghij, jklmn, a,b, c,d, e,f", "a,b,c,d, e,f,g,h"]
|
||||||
[["a"," bc"," def"," ghij"," jklmn"," a","b"," c","d"," e","f"],["a","b","c","d"," e","f","g","h"]]
|
[["a"," bc"," def"," ghij"," jklmn"," a","b"," c","d"," e","f"],["a","b","c","d"," e","f","g","h"]]
|
||||||
|
|||||||
Reference in new issue
Block a user