aboutsummaryrefslogtreecommitdiff
path: root/lib/std/fs
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-07-07 23:09:14 -0700
committerAndrew Kelley <andrew@ziglang.org>2025-07-07 23:09:14 -0700
commit5955ba4f53d2bf90093417f6eb4967cec1eeb3e5 (patch)
tree91c00d1cacb117755739c160e2f4179576aa3b5d /lib/std/fs
parent720cd43fc14cc7e362b3a0bfb6d4b86b3de82299 (diff)
downloadzig-5955ba4f53d2bf90093417f6eb4967cec1eeb3e5.tar.gz
zig-5955ba4f53d2bf90093417f6eb4967cec1eeb3e5.zip
std.fs.File.Writer: implement positional writing for Windows
Diffstat (limited to 'lib/std/fs')
-rw-r--r--lib/std/fs/File.zig62
1 files changed, 45 insertions, 17 deletions
diff --git a/lib/std/fs/File.zig b/lib/std/fs/File.zig
index bd78eab655..c962b63182 100644
--- a/lib/std/fs/File.zig
+++ b/lib/std/fs/File.zig
@@ -1665,32 +1665,60 @@ pub const Writer = struct {
const handle = w.file.handle;
const buffered = io_w.buffered();
if (is_windows) switch (w.mode) {
- .positional, .positional_reading => @panic("TODO"),
+ .positional, .positional_reading => {
+ if (buffered.len != 0) {
+ const n = windows.WriteFile(handle, buffered, w.pos) catch |err| {
+ w.err = err;
+ return error.WriteFailed;
+ };
+ w.pos += n;
+ return io_w.consume(n);
+ }
+ for (data[0 .. data.len - 1]) |buf| {
+ if (buf.len == 0) continue;
+ const n = windows.WriteFile(handle, buf, w.pos) catch |err| {
+ w.err = err;
+ return error.WriteFailed;
+ };
+ w.pos += n;
+ return io_w.consume(n);
+ }
+ const pattern = data[data.len - 1];
+ if (pattern.len == 0 or splat == 0) return 0;
+ const n = windows.WriteFile(handle, pattern, w.pos) catch |err| {
+ w.err = err;
+ return error.WriteFailed;
+ };
+ w.pos += n;
+ return io_w.consume(n);
+ },
.streaming, .streaming_reading => {
- var i: usize = 0;
- while (i < buffered.len) {
- const n = windows.WriteFile(handle, buffered[i..], null) catch |err| {
+ if (buffered.len != 0) {
+ const n = windows.WriteFile(handle, buffered, null) catch |err| {
w.err = err;
- w.pos += i;
- _ = io_w.consume(i);
return error.WriteFailed;
};
- i += n;
- if (data.len > 0 and buffered.len - i < n) {
- w.pos += i;
- return io_w.consume(i);
- }
+ w.pos += n;
+ return io_w.consume(n);
}
- if (i != 0 or data.len == 0 or (data.len == 1 and splat == 0)) {
- w.pos += i;
- return io_w.consume(i);
+ for (data[0 .. data.len - 1]) |buf| {
+ if (buf.len == 0) continue;
+ const n = windows.WriteFile(handle, buf, null) catch |err| {
+ w.err = err;
+ return error.WriteFailed;
+ };
+ w.pos += n;
+ return io_w.consume(n);
}
- const n = windows.WriteFile(handle, data[0], null) catch |err| {
+ const pattern = data[data.len - 1];
+ if (pattern.len == 0 or splat == 0) return 0;
+ const n = windows.WriteFile(handle, pattern, null) catch |err| {
+ std.debug.print("windows write file failed3: {t}\n", .{err});
w.err = err;
- return 0;
+ return error.WriteFailed;
};
w.pos += n;
- return n;
+ return io_w.consume(n);
},
.failure => return error.WriteFailed,
};