summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--jv.c22
-rw-r--r--tests/all.test4
2 files changed, 18 insertions, 8 deletions
diff --git a/jv.c b/jv.c
index 85830f4e..22e2eb62 100644
--- a/jv.c
+++ b/jv.c
@@ -656,14 +656,20 @@ jv jv_string_split(jv j, jv sep) {
assert(jv_get_refcnt(a) == 1);
- for (p = jstr; p < jend; p = s + seplen) {
- s = _jq_memmem(p, jend - p, sepstr, seplen);
- if (s == NULL)
- s = jend;
- a = jv_array_append(a, jv_string_sized(p, s - p));
- // Add an empty string to denote that j ends on a sep
- if (s + seplen == jend)
- a = jv_array_append(a, jv_string(""));
+ if (seplen == 0) {
+ int c;
+ while ((jstr = jvp_utf8_next(jstr, jend, &c)))
+ a = jv_array_append(a, jv_string_append_codepoint(jv_string(""), c));
+ } else {
+ for (p = jstr; p < jend; p = s + seplen) {
+ s = _jq_memmem(p, jend - p, sepstr, seplen);
+ if (s == NULL)
+ s = jend;
+ a = jv_array_append(a, jv_string_sized(p, s - p));
+ // Add an empty string to denote that j ends on a sep
+ if (s + seplen == jend && seplen != 0)
+ a = jv_array_append(a, jv_string(""));
+ }
}
jv_free(j);
jv_free(sep);
diff --git a/tests/all.test b/tests/all.test
index 814d1e37..e412c626 100644
--- a/tests/all.test
+++ b/tests/all.test
@@ -900,6 +900,10 @@ sub("^(?<head>.)"; "Head=\(.head) Tail=")
["a,b, c, d, e,f",", a,b, c, d, e,f, "]
[["a,b","c","d","e,f"],["","a,b","c","d","e,f",""]]
+split("")
+"abc"
+["a","b","c"]
+
########################
[.[]|[[sub(", *";":")], [gsub(", *";":")], [scan(", *")]]]
["a,b, c, d, e,f",", a,b, c, d, e,f, "]