authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-20 22:31:49-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-21 13:08:43+02:00
log9abc3232a8c02f0fc6bef6ad0bad56a3804e6bc3
tree6e5e4ca81c2cad3dfe4f886059d5025c00e7e22c
parentf97c91ddb5ef600fce294c1bbd28e3f6f2185e5e

std.fs.File.Reader: fix missed advance writer positions


3 files changed, 34 insertions(+), 3 deletions(-)

lib/std/Io/Writer.zig+2-1
...@@ -440,7 +440,8 @@ pub fn advance(w: *Writer, n: usize) void {...@@ -440,7 +440,8 @@ pub fn advance(w: *Writer, n: usize) void {
440/// After calling `writableVector`, this function tracks how many bytes were440/// After calling `writableVector`, this function tracks how many bytes were
441/// written to it.441/// written to it.
442pub fn advanceVector(w: *Writer, n: usize) usize {442pub fn advanceVector(w: *Writer, n: usize) usize {
443 return consume(w, n);443 if (w.vtable != VectorWrapper.vtable) advance(w, n);
444 return n;
444}445}
445446
446/// The `data` parameter is mutable because this function needs to mutate the447/// The `data` parameter is mutable because this function needs to mutate the
lib/std/fs/File.zig+2-2
...@@ -1430,7 +1430,7 @@ pub const Reader = struct {...@@ -1430,7 +1430,7 @@ pub const Reader = struct {
1430 return error.EndOfStream;1430 return error.EndOfStream;
1431 }1431 }
1432 r.pos += n;1432 r.pos += n;
1433 return n;1433 return w.advanceVector(n);
1434 },1434 },
1435 .streaming_reading => {1435 .streaming_reading => {
1436 if (is_windows) {1436 if (is_windows) {
...@@ -1453,7 +1453,7 @@ pub const Reader = struct {...@@ -1453,7 +1453,7 @@ pub const Reader = struct {
1453 return error.EndOfStream;1453 return error.EndOfStream;
1454 }1454 }
1455 r.pos += n;1455 r.pos += n;
1456 return n;1456 return w.advanceVector(n);
1457 },1457 },
1458 .failure => return error.ReadFailed,1458 .failure => return error.ReadFailed,
1459 }1459 }
lib/std/fs/test.zig+30
...@@ -2071,3 +2071,33 @@ test "invalid UTF-8/WTF-8 paths" {...@@ -2071,3 +2071,33 @@ test "invalid UTF-8/WTF-8 paths" {
2071 }2071 }
2072 }.impl);2072 }.impl);
2073}2073}
2074
2075test "read file non vectored" {
2076 var tmp_dir = std.testing.tmpDir(.{});
2077 defer tmp_dir.cleanup();
2078
2079 const contents = "hello, world!\n";
2080
2081 const file = try tmp_dir.dir.createFile("input.txt", .{ .read = true });
2082 defer file.close();
2083 {
2084 var file_writer: std.fs.File.Writer = .init(file, &.{});
2085 try file_writer.interface.writeAll(contents);
2086 try file_writer.interface.flush();
2087 }
2088
2089 var file_reader: std.fs.File.Reader = .init(file, &.{});
2090
2091 var write_buffer: [100]u8 = undefined;
2092 var w: std.Io.Writer = .fixed(&write_buffer);
2093
2094 var i: usize = 0;
2095 while (true) {
2096 i += file_reader.interface.stream(&w, .limited(3)) catch |err| switch (err) {
2097 error.EndOfStream => break,
2098 else => |e| return e,
2099 };
2100 }
2101 try std.testing.expectEqualStrings(contents, w.buffered());
2102 try std.testing.expectEqual(contents.len, i);
2103}