zig/lib/std/Io/Reader/Limited.zig
Andrew Kelley b824ca8494 Revert "Fix infinite loop in Reader.Limited"
This reverts commit 27aba2d776caf59bb6569934626af587fdba9c75.

I'd like to review this contribution more carefully, particularly with
the alternate implementation that is also open as a pull request
(#25109).

Reopens #25093
2025-10-07 14:35:08 -07:00

59 lines
1.7 KiB
Zig

const Limited = @This();
const std = @import("../../std.zig");
const Reader = std.Io.Reader;
const Writer = std.Io.Writer;
const Limit = std.Io.Limit;
unlimited: *Reader,
remaining: Limit,
interface: Reader,
pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited {
return .{
.unlimited = reader,
.remaining = limit,
.interface = .{
.vtable = &.{
.stream = stream,
.discard = discard,
},
.buffer = buffer,
.seek = 0,
.end = 0,
},
};
}
fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
const l: *Limited = @fieldParentPtr("interface", r);
const combined_limit = limit.min(l.remaining);
const n = try l.unlimited.stream(w, combined_limit);
l.remaining = l.remaining.subtract(n).?;
return n;
}
test stream {
var orig_buf: [10]u8 = undefined;
@memcpy(&orig_buf, "test bytes");
var fixed: std.Io.Reader = .fixed(&orig_buf);
var limit_buf: [1]u8 = undefined;
var limited: std.Io.Reader.Limited = .init(&fixed, @enumFromInt(4), &limit_buf);
var result_buf: [10]u8 = undefined;
var fixed_writer: std.Io.Writer = .fixed(&result_buf);
const streamed = try limited.interface.stream(&fixed_writer, @enumFromInt(7));
try std.testing.expect(streamed == 4);
try std.testing.expectEqualStrings("test", result_buf[0..streamed]);
}
fn discard(r: *Reader, limit: Limit) Reader.Error!usize {
const l: *Limited = @fieldParentPtr("interface", r);
const combined_limit = limit.min(l.remaining);
const n = try l.unlimited.discard(combined_limit);
l.remaining = l.remaining.subtract(n).?;
return n;
}