Check that file reader has capacity before priming

pull/9515/head
Daniel Wennberg 2025-11-07 20:29:16 -08:00
parent 12c8b6c1aa
commit cf126baeb5
1 changed files with 36 additions and 1 deletions

View File

@ -1427,7 +1427,12 @@ pub const LineIterator = struct {
//
// This will also optimize reads down the line as we're
// more likely to beworking with buffered data.
//
// fillMore asserts that the buffer has available capacity,
// so skip this if it's full.
if (self.r.bufferedLen() < self.r.buffer.len) {
self.r.fillMore() catch {};
}
var writer: std.Io.Writer = .fixed(self.entry[2..]);
@ -1590,3 +1595,33 @@ test "LineIterator with CRLF line endings" {
try testing.expectEqual(@as(?[]const u8, null), iter.next());
try testing.expectEqual(@as(?[]const u8, null), iter.next());
}
test "LineIterator with buffered reader" {
const testing = std.testing;
var f: std.Io.Reader = .fixed("A\nB = C\n");
var buf: [2]u8 = undefined;
var r = f.limited(.unlimited, &buf);
const reader = &r.interface;
var iter: LineIterator = .init(reader);
try testing.expectEqualStrings("--A", iter.next().?);
try testing.expectEqualStrings("--B=C", iter.next().?);
try testing.expectEqual(@as(?[]const u8, null), iter.next());
try testing.expectEqual(@as(?[]const u8, null), iter.next());
}
test "LineIterator with buffered and primed reader" {
const testing = std.testing;
var f: std.Io.Reader = .fixed("A\nB = C\n");
var buf: [2]u8 = undefined;
var r = f.limited(.unlimited, &buf);
const reader = &r.interface;
try reader.fill(buf.len);
var iter: LineIterator = .init(reader);
try testing.expectEqualStrings("--A", iter.next().?);
try testing.expectEqualStrings("--B=C", iter.next().?);
try testing.expectEqual(@as(?[]const u8, null), iter.next());
try testing.expectEqual(@as(?[]const u8, null), iter.next());
}