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 {...@@ -868,6 +868,7 @@ pub fn PollFiles(comptime StreamEnum: type) type {
868868
869test {869test {
870 _ = Reader;870 _ = Reader;
871 _ = Reader.Limited;
871 _ = Writer;872 _ = Writer;
872 _ = @import("Io/bit_reader.zig");873 _ = @import("Io/bit_reader.zig");
873 _ = @import("Io/bit_writer.zig");874 _ = @import("Io/bit_writer.zig");
lib/std/Io/Reader.zig+1-1
...@@ -99,7 +99,7 @@ pub const ShortError = error{...@@ -99,7 +99,7 @@ pub const ShortError = error{
9999
100pub const failing: Reader = .{100pub const failing: Reader = .{
101 .vtable = &.{101 .vtable = &.{
102 .read = failingStream,102 .stream = failingStream,
103 .discard = failingDiscard,103 .discard = failingDiscard,
104 },104 },
105 .buffer = &.{},105 .buffer = &.{},
lib/std/Io/Reader/Limited.zig+22-6
...@@ -25,18 +25,34 @@ pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited {...@@ -25,18 +25,34 @@ pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited {
25 };25 };
26}26}
2727
28fn stream(context: ?*anyopaque, w: *Writer, limit: Limit) Reader.StreamError!usize {28fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
29 const l: *Limited = @alignCast(@ptrCast(context));29 const l: *Limited = @fieldParentPtr("interface", r);
30 const combined_limit = limit.min(l.remaining);30 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);
32 l.remaining = l.remaining.subtract(n).?;32 l.remaining = l.remaining.subtract(n).?;
33 return n;33 return n;
34}34}
3535
36fn discard(context: ?*anyopaque, limit: Limit) Reader.Error!usize {36test stream {
37 const l: *Limited = @alignCast(@ptrCast(context));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);
38 const combined_limit = limit.min(l.remaining);54 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);
40 l.remaining = l.remaining.subtract(n).?;56 l.remaining = l.remaining.subtract(n).?;
41 return n;57 return n;
42}58}