| author | |
| committer | |
| log | 9abc3232a8c02f0fc6bef6ad0bad56a3804e6bc3 |
| tree | 6e5e4ca81c2cad3dfe4f886059d5025c00e7e22c |
| parent | f97c91ddb5ef600fce294c1bbd28e3f6f2185e5e |
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 were | 440 | /// After calling `writableVector`, this function tracks how many bytes were |
| 441 | /// written to it. | 441 | /// written to it. |
| 442 | pub fn advanceVector(w: *Writer, n: usize) usize { | 442 | 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; | ||
| 444 | } | 445 | } |
| 445 | 446 | ||
| 446 | /// The `data` parameter is mutable because this function needs to mutate the | 447 | /// 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 | |||
| 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 | } |