diff --git a/AnyReadable.zig b/AnyReadable.zig index a1caf3ece11fbd97ec7f1b352b8ee28edcf94cd2..d7be8a84f3520f4cb5d34e6c02acfcb69af94845 100644 --- a/AnyReadable.zig +++ b/AnyReadable.zig @@ -23,6 +23,7 @@ pub const readUntilDelimitersArrayList = R.readUntilDelimitersArrayList; pub const readAlloc = R.readAlloc; pub const readInt = R.readInt; pub const readUntilDelimitersAlloc = R.readUntilDelimitersAlloc; +pub const readUntilDelimiterOrEof = R.readUntilDelimiterOrEof; pub const Error = ReadError; // std compat pub const ReadError = anyerror; diff --git a/buffered_reader.zig b/buffered_reader.zig index 9c49b40a0a088fd7c681bf12c58cffe4b1d635f3..70417d39422b509fdc314253f00ea57dbc2da07f 100644 --- a/buffered_reader.zig +++ b/buffered_reader.zig @@ -34,6 +34,7 @@ pub fn BufferedReader(comptime buffer_size: usize, comptime ReaderType: type) ty pub const readAlloc = R.readAlloc; pub const readInt = R.readInt; pub const readUntilDelimitersAlloc = R.readUntilDelimitersAlloc; + pub const readUntilDelimiterOrEof = R.readUntilDelimiterOrEof; pub const ReadError = ReaderType.ReadError; pub fn read(self: *Self, dest: []u8) ReadError!usize { diff --git a/fixed_buffer_stream.zig b/fixed_buffer_stream.zig index 5a15ca4e3a671fa23f4573bd179319cac1766a0a..580a51e4a83627416a113744d53b874563408f2a 100644 --- a/fixed_buffer_stream.zig +++ b/fixed_buffer_stream.zig @@ -43,6 +43,7 @@ pub fn FixedBufferStream(comptime Buffer: type) type { pub const readAlloc = R.readAlloc; pub const readInt = R.readInt; pub const readUntilDelimitersAlloc = R.readUntilDelimitersAlloc; + pub const readUntilDelimiterOrEof = R.readUntilDelimiterOrEof; pub const ReadError = error{}; pub fn read(self: *Self, dest: []u8) ReadError!usize { diff --git a/nio.zig b/nio.zig index a23bd677b1af2e95ac70e1eec85ecfa95de0ee8d..65c0906a9bf5a28af3c6eb63494a595ca103f817 100644 --- a/nio.zig +++ b/nio.zig @@ -181,6 +181,19 @@ pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type { _ = try readUntilDelimitersArrayList(self, &list, needle, max_size); return list.toOwnedSlice(); } + + /// Returned slice is not suffixed by needle but buf will contain it. + pub fn readUntilDelimiterOrEof(self: Self, buf: []u8, needle: u8) !?[]u8 { + for (buf, 0..) |*c, i| { + const b = try readByte(self); + c.* = b; + if (b == needle) { + if (i == 0) return null; + return buf[0..i]; + } + } + return error.StreamTooLong; + } }; }