| ... | @@ -107,6 +107,24 @@ pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type { | ... | @@ -107,6 +107,24 @@ pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type { |
| 107 | return (try readArray(self, 1))[0]; | 107 | return (try readArray(self, 1))[0]; |
| 108 | } | 108 | } |
| 109 | | 109 | |
| | 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 | |
| 110 | pub fn readUntilDelimitersBuf(self: Self, buffer: []u8, needle: []const u8) ![]u8 { | 128 | pub fn readUntilDelimitersBuf(self: Self, buffer: []u8, needle: []const u8) ![]u8 { |
| 111 | var real_len: usize = 0; | 129 | var real_len: usize = 0; |
| 112 | for (0..buffer.len) |_| { | 130 | for (0..buffer.len) |_| { |