+
+static struct bytestring _splitstr(struct bytestring whole,
+ struct bytestring delim, size_t start)
+{
+ struct bytestring remainder, nextdelim;
+
+ assert(start <= whole.len);
+
+ remainder = bytestring_slice(whole, start, whole.len);
+ nextdelim = bytestring_bytestring(remainder, delim);
+ if (nextdelim.ptr)
+ return bytestring_slice(whole, start,
+ nextdelim.ptr - whole.ptr);
+ else
+ return remainder;
+}
+
+struct bytestring bytestring_splitstr_first(struct bytestring whole,
+ struct bytestring delim)
+{
+ if (whole.len == 0)
+ return bytestring_NULL;
+
+ return _splitstr(whole, delim, 0);
+}
+
+struct bytestring bytestring_splitstr_next(struct bytestring whole,
+ struct bytestring delim,
+ struct bytestring prev)
+{
+ if (!prev.ptr)
+ return bytestring_NULL;
+
+ /* prev has to be a substring of whole */
+ assert(prev.ptr >= whole.ptr);
+
+ if ((prev.ptr + prev.len) == (whole.ptr + whole.len))
+ return bytestring_NULL;
+
+ return _splitstr(whole, delim,
+ (prev.ptr - whole.ptr) + prev.len + delim.len);
+}