mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
std.fs.File.Reader: fix seekBy
Tested locally: stage3/bin/zig build test -Dskip-release -Dskip-non-native closes #24495 closes #24498 closes #24713
This commit is contained in:
parent
a495628862
commit
5e986fef1f
2 changed files with 19 additions and 6 deletions
|
|
@ -1247,12 +1247,10 @@ pub const Reader = struct {
|
|||
};
|
||||
var remaining = std.math.cast(u64, offset) orelse return seek_err;
|
||||
while (remaining > 0) {
|
||||
const n = discard(&r.interface, .limited64(remaining)) catch |err| {
|
||||
remaining -= discard(&r.interface, .limited64(remaining)) catch |err| {
|
||||
r.seek_err = err;
|
||||
return err;
|
||||
};
|
||||
r.pos += n;
|
||||
remaining -= n;
|
||||
}
|
||||
r.interface.seek = 0;
|
||||
r.interface.end = 0;
|
||||
|
|
@ -1436,9 +1434,8 @@ pub const Reader = struct {
|
|||
fallback: {
|
||||
if (r.size_err == null and r.seek_err == null) break :fallback;
|
||||
var trash_buffer: [128]u8 = undefined;
|
||||
const trash = &trash_buffer;
|
||||
if (is_windows) {
|
||||
const n = windows.ReadFile(file.handle, trash, null) catch |err| {
|
||||
const n = windows.ReadFile(file.handle, limit.slice(&trash_buffer), null) catch |err| {
|
||||
r.err = err;
|
||||
return error.ReadFailed;
|
||||
};
|
||||
|
|
@ -1453,7 +1450,7 @@ pub const Reader = struct {
|
|||
var iovecs_i: usize = 0;
|
||||
var remaining = @intFromEnum(limit);
|
||||
while (remaining > 0 and iovecs_i < iovecs.len) {
|
||||
iovecs[iovecs_i] = .{ .base = trash, .len = @min(trash.len, remaining) };
|
||||
iovecs[iovecs_i] = .{ .base = &trash_buffer, .len = @min(trash_buffer.len, remaining) };
|
||||
remaining -= iovecs[iovecs_i].len;
|
||||
iovecs_i += 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2129,3 +2129,19 @@ test "seek keeping partial buffer" {
|
|||
|
||||
try testing.expectEqualStrings("6789", &buf);
|
||||
}
|
||||
|
||||
test "seekBy" {
|
||||
var tmp_dir = testing.tmpDir(.{});
|
||||
defer tmp_dir.cleanup();
|
||||
|
||||
try tmp_dir.dir.writeFile(.{ .sub_path = "blah.txt", .data = "let's test seekBy" });
|
||||
const f = try tmp_dir.dir.openFile("blah.txt", .{ .mode = .read_only });
|
||||
defer f.close();
|
||||
var reader = f.readerStreaming(&.{});
|
||||
try reader.seekBy(2);
|
||||
|
||||
var buffer: [20]u8 = undefined;
|
||||
const n = try reader.interface.readSliceShort(&buffer);
|
||||
try testing.expectEqual(15, n);
|
||||
try testing.expectEqualStrings("t's test seekBy", buffer[0..15]);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue