Appends to w contents by reading from the stream until delimiter is found.
Does not write the delimiter itself.
Does not discard the delimiter from the Reader.
Returns number of bytes streamed, which may be zero. End of stream can be detected by checking if the next byte in the stream is the delimiter.
Asserts buffer capacity of at least one. This function performs better with larger buffers.
pub fn streamDelimiterLimit(
r: *Reader,
w: *Writer,
delimiter: u8,
limit: Limit,
) StreamDelimiterLimitError!usize
pub fn streamDelimiterLimit(
r: *Reader,
w: *Writer,
delimiter: u8,
limit: Limit,
) StreamDelimiterLimitError!usize {
var remaining = @backingInt(limit);
while (remaining != 0) {
const available = Limit.limited(remaining).slice(r.peekGreedy(1) catch |err| switch (err) {
error.ReadFailed => |e| return e,
error.EndOfStream => return @backingInt(limit) - remaining,
});
if (std.mem.findScalar(u8, available, delimiter)) |delimiter_index| {
try w.writeAll(available[0..delimiter_index]);
r.toss(delimiter_index);
remaining -= delimiter_index;
return @backingInt(limit) - remaining;
}
try w.writeAll(available);
r.toss(available.len);
remaining -= available.len;
}
return error.StreamTooLong;
}