authorgravatar for 117967760+mochalins@users.noreply.github.commochalins <117967760+mochalins@users.noreply.github.com> 2025-07-11 16:13:32+09:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-11 17:46:14+02:00
log61eff7b6ddbe67f519169a5625cab8d0e7e41016
tree09de81e7fa5d8f1ef9d1b2708e3a47f27c820b57
parent2cda4cfb394c1834036022a2d54638785a7af35a

std: Fix `Io.Reader.Limited` and add test


3 files changed, 24 insertions(+), 7 deletions(-)

lib/std/Io.zig+1
......@@ -868,6 +868,7 @@ pub fn PollFiles(comptime StreamEnum: type) type {
868868
869869test {
870870 _ = Reader;
871 _ = Reader.Limited;
871872 _ = Writer;
872873 _ = @import("Io/bit_reader.zig");
873874 _ = @import("Io/bit_writer.zig");
lib/std/Io/Reader.zig+1-1
......@@ -99,7 +99,7 @@ pub const ShortError = error{
9999
100100pub const failing: Reader = .{
101101 .vtable = &.{
102 .read = failingStream,
102 .stream = failingStream,
103103 .discard = failingDiscard,
104104 },
105105 .buffer = &.{},
lib/std/Io/Reader/Limited.zig+22-6
......@@ -25,18 +25,34 @@ pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited {
2525 };
2626}
2727
28fn stream(context: ?*anyopaque, w: *Writer, limit: Limit) Reader.StreamError!usize {
29 const l: *Limited = @alignCast(@ptrCast(context));
28fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
29 const l: *Limited = @fieldParentPtr("interface", r);
3030 const combined_limit = limit.min(l.remaining);
31 const n = try l.unlimited_reader.read(w, combined_limit);
31 const n = try l.unlimited.stream(w, combined_limit);
3232 l.remaining = l.remaining.subtract(n).?;
3333 return n;
3434}
3535
36fn discard(context: ?*anyopaque, limit: Limit) Reader.Error!usize {
37 const l: *Limited = @alignCast(@ptrCast(context));
36test stream {
37 var orig_buf: [10]u8 = undefined;
38 @memcpy(&orig_buf, "test bytes");
39 var fixed: std.Io.Reader = .fixed(&orig_buf);
40
41 var limit_buf: [1]u8 = undefined;
42 var limited: std.Io.Reader.Limited = .init(&fixed, @enumFromInt(4), &limit_buf);
43
44 var result_buf: [10]u8 = undefined;
45 var fixed_writer: std.Io.Writer = .fixed(&result_buf);
46 const streamed = try limited.interface.stream(&fixed_writer, @enumFromInt(7));
47
48 try std.testing.expect(streamed == 4);
49 try std.testing.expectEqualStrings("test", result_buf[0..streamed]);
50}
51
52fn discard(r: *Reader, limit: Limit) Reader.Error!usize {
53 const l: *Limited = @fieldParentPtr("interface", r);
3854 const combined_limit = limit.min(l.remaining);
39 const n = try l.unlimited_reader.discard(combined_limit);
55 const n = try l.unlimited.discard(combined_limit);
4056 l.remaining = l.remaining.subtract(n).?;
4157 return n;
4258}