diff --git a/jv.c b/jv.c index 85830f4e97..22e2eb6261 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 814d1e3724..e412c6267a 100644 --- a/tests/all.test +++ b/tests/all.test @@ -900,6 +900,10 @@ sub("^(?.)"; "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, "]