authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-05-15 21:56:28 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-05-15 21:56:28 -07:00
log4fdaa8e521fce2b66f6db19b976960f751c2cbbd
tree2e58d782a59a5ceb42d33f95c966fe1b6570d9a2
parent293beec93d44150d1fb0fd60711b0d61b82791ca
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

add readUntilDelimiterAlloc and readUntilDelimiterArrayList


1 files changed, 18 insertions(+), 0 deletions(-)

nio.zig+18
......@@ -107,6 +107,24 @@ pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type {
107107 return (try readArray(self, 1))[0];
108108 }
109109
110 /// Returned slice is not suffixed by needle but array_list will contain it.
111 pub fn readUntilDelimiterArrayList(self: Self, array_list: *std.ArrayList(u8), needle: u8, max_size: usize) ![]u8 {
112 const initial_len = array_list.items.len;
113 for (0..max_size) |i| {
114 try array_list.append(try readByte(self));
115 if (array_list.items[array_list.items.len - 1] == needle) return array_list.items[initial_len..][0..i];
116 }
117 return error.StreamTooLong;
118 }
119
120 /// Returned slice is suffixed by needle.
121 pub fn readUntilDelimiterAlloc(self: Self, allocator: std.mem.Allocator, needle: u8, max_size: usize) ![]u8 {
122 var list: std.ArrayList(u8) = .init(allocator);
123 errdefer list.deinit();
124 _ = try readUntilDelimiterArrayList(self, &list, needle, max_size);
125 return list.toOwnedSlice();
126 }
127
110128 pub fn readUntilDelimitersBuf(self: Self, buffer: []u8, needle: []const u8) ![]u8 {
111129 var real_len: usize = 0;
112130 for (0..buffer.len) |_| {