Function streamDelimiterLimit [src]
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.
Prototype
pub fn streamDelimiterLimit( r: *Reader, w: *Writer, delimiter: u8, limit: Limit, ) StreamDelimiterLimitError!usize
Parameters
r: *Reader
w: *Writer
delimiter: u8
limit: Limit
Possible Errors
The delimiter was not found within the limit.
Example
test streamDelimiterLimit {
var out_buffer: [10]u8 = undefined;
var r: Reader = .fixed("foo\nbars");
var w: Writer = .fixed(&out_buffer);
try testing.expectError(error.StreamTooLong, r.streamDelimiterLimit(&w, '\n', .limited(2)));
try testing.expectEqual(1, try r.streamDelimiterLimit(&w, '\n', .limited(3)));
try testing.expectEqualStrings("\n", try r.take(1));
try testing.expectEqual(4, try r.streamDelimiterLimit(&w, '\n', .unlimited));
try testing.expectEqualStrings("foobars", w.buffered());
}
Source
pub fn streamDelimiterLimit(
r: *Reader,
w: *Writer,
delimiter: u8,
limit: Limit,
) StreamDelimiterLimitError!usize {
var remaining = @intFromEnum(limit);
while (remaining != 0) {
const available = Limit.limited(remaining).slice(r.peekGreedy(1) catch |err| switch (err) {
error.ReadFailed => return error.ReadFailed,
error.EndOfStream => return @intFromEnum(limit) - remaining,
});
if (std.mem.indexOfScalar(u8, available, delimiter)) |delimiter_index| {
try w.writeAll(available[0..delimiter_index]);
r.toss(delimiter_index);
remaining -= delimiter_index;
return @intFromEnum(limit) - remaining;
}
try w.writeAll(available);
r.toss(available.len);
remaining -= available.len;
}
return error.StreamTooLong;
}