Skip to content

Commit 9700149

Browse files
committed
std.fs.File: fix streaming seekBy ignoring buffer
streaming seekBy completely ignored the buffer. the new logic checks if the seek offset is smaller than the buffer and adds the offset to r.interface.seek. otherwise the old logic is invoked.
1 parent d91610b commit 9700149

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

lib/std/fs/File.zig

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,14 +1206,20 @@ pub const Reader = struct {
12061206
}
12071207
};
12081208
var remaining = std.math.cast(u64, offset) orelse return seek_err;
1209-
while (remaining > 0) {
1210-
remaining -= discard(&r.interface, .limited64(remaining)) catch |err| {
1211-
r.seek_err = err;
1212-
return err;
1213-
};
1209+
const bufferedLen = r.interface.bufferedLen();
1210+
if (remaining < bufferedLen) {
1211+
r.interface.seek += @intCast(remaining);
1212+
} else {
1213+
remaining -= bufferedLen;
1214+
while (remaining > 0) {
1215+
remaining -= discard(&r.interface, .limited64(remaining)) catch |err| {
1216+
r.seek_err = err;
1217+
return err;
1218+
};
1219+
}
1220+
r.interface.seek = 0;
1221+
r.interface.end = 0;
12141222
}
1215-
r.interface.seek = 0;
1216-
r.interface.end = 0;
12171223
},
12181224
.failure => return r.seek_err.?,
12191225
}

lib/std/fs/test.zig

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2139,21 +2139,26 @@ test "seek keeping partial buffer" {
21392139

21402140
try testing.expectEqualStrings("6789", &buf);
21412141
}
2142-
21432142
test "seekBy streaming" {
21442143
var tmp_dir = testing.tmpDir(.{});
21452144
defer tmp_dir.cleanup();
21462145

21472146
try tmp_dir.dir.writeFile(.{ .sub_path = "blah.txt", .data = "let's test seekBy" });
21482147
const f = try tmp_dir.dir.openFile("blah.txt", .{ .mode = .read_only });
21492148
defer f.close();
2150-
var reader = f.readerStreaming(&.{});
2151-
try reader.seekBy(2);
2149+
var read_buf: [10]u8 = undefined;
2150+
var buffer: [10]u8 = undefined;
21522151

2153-
var buffer: [20]u8 = undefined;
2154-
const n = try reader.interface.readSliceShort(&buffer);
2155-
try testing.expectEqual(15, n);
2156-
try testing.expectEqualStrings("t's test seekBy", buffer[0..15]);
2152+
var reader = f.readerStreaming(&read_buf);
2153+
const n1 = try reader.interface.readSliceShort(buffer[0..2]);
2154+
try testing.expectEqual(2, n1);
2155+
try testing.expectEqualStrings("le", buffer[0..2]);
2156+
2157+
// seek past bufferedLen: causing discard
2158+
try reader.seekBy(10);
2159+
const n2 = try reader.interface.readSliceShort(&buffer);
2160+
try testing.expectEqual(5, n2);
2161+
try testing.expectEqualStrings("eekBy", buffer[0..5]);
21572162
}
21582163

21592164
test "seekBy positional" {

0 commit comments

Comments
 (0)