Skip to content

Commit 9abc323

Browse files
committed
std.fs.File.Reader: fix missed advance writer positions
1 parent f97c91d commit 9abc323

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

lib/std/Io/Writer.zig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,8 @@ pub fn advance(w: *Writer, n: usize) void {
440440
/// After calling `writableVector`, this function tracks how many bytes were
441441
/// written to it.
442442
pub fn advanceVector(w: *Writer, n: usize) usize {
443-
return consume(w, n);
443+
if (w.vtable != VectorWrapper.vtable) advance(w, n);
444+
return n;
444445
}
445446

446447
/// The `data` parameter is mutable because this function needs to mutate the

lib/std/fs/File.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,7 +1430,7 @@ pub const Reader = struct {
14301430
return error.EndOfStream;
14311431
}
14321432
r.pos += n;
1433-
return n;
1433+
return w.advanceVector(n);
14341434
},
14351435
.streaming_reading => {
14361436
if (is_windows) {
@@ -1453,7 +1453,7 @@ pub const Reader = struct {
14531453
return error.EndOfStream;
14541454
}
14551455
r.pos += n;
1456-
return n;
1456+
return w.advanceVector(n);
14571457
},
14581458
.failure => return error.ReadFailed,
14591459
}

lib/std/fs/test.zig

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,3 +2071,33 @@ test "invalid UTF-8/WTF-8 paths" {
20712071
}
20722072
}.impl);
20732073
}
2074+
2075+
test "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+
}

0 commit comments

Comments
 (0)