| ... | ... | @@ -86,6 +86,35 @@ pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type { |
| 86 | 86 | try readAllArrayList(self, &array_list, max_size); |
| 87 | 87 | return try array_list.toOwnedSlice(); |
| 88 | 88 | } |
| 89 | |
| 90 | pub fn readArray(self: Self, comptime N: usize) ![N]u8 { |
| 91 | var buffer: [N]u8 = undefined; |
| 92 | if (try readAll(self, &buffer) != N) return error.EndOfStream; |
| 93 | return buffer; |
| 94 | } |
| 95 | |
| 96 | pub fn readByte(self: Self) !u8 { |
| 97 | return (try readArray(self, 1))[0]; |
| 98 | } |
| 99 | |
| 100 | pub fn readUntilDelimitersBuf(self: Self, buffer: []u8, needle: []const u8) ![]u8 { |
| 101 | var real_len: usize = 0; |
| 102 | for (0..buffer.len) |_| { |
| 103 | buffer[real_len] = try readByte(self); |
| 104 | real_len += 1; |
| 105 | if (real_len < needle.len) continue; |
| 106 | if (std.mem.endsWith(u8, buffer[0..real_len], needle)) return buffer[0 .. real_len - needle.len]; |
| 107 | } |
| 108 | return error.StreamTooLong; |
| 109 | } |
| 110 | |
| 111 | pub fn readUntilDelimitersArrayList(self: Self, array_list: *std.ArrayList(u8), needle: []const u8, max_size: usize) !usize { |
| 112 | for (0..max_size) |i| { |
| 113 | try array_list.append(try readByte(self)); |
| 114 | if (std.mem.endsWith(u8, array_list.items, needle)) return i + 1 - needle.len; |
| 115 | } |
| 116 | return error.StreamTooLong; |
| 117 | } |
| 89 | 118 | }; |
| 90 | 119 | } |
| 91 | 120 | |