authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-07 23:09:14-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-07 23:09:14-07:00
log5955ba4f53d2bf90093417f6eb4967cec1eeb3e5
tree91c00d1cacb117755739c160e2f4179576aa3b5d
parent720cd43fc14cc7e362b3a0bfb6d4b86b3de82299

std.fs.File.Writer: implement positional writing for Windows


1 files changed, 45 insertions(+), 17 deletions(-)

lib/std/fs/File.zig+45-17
......@@ -1665,32 +1665,60 @@ pub const Writer = struct {
16651665 const handle = w.file.handle;
16661666 const buffered = io_w.buffered();
16671667 if (is_windows) switch (w.mode) {
1668 .positional, .positional_reading => @panic("TODO"),
1668 .positional, .positional_reading => {
1669 if (buffered.len != 0) {
1670 const n = windows.WriteFile(handle, buffered, w.pos) catch |err| {
1671 w.err = err;
1672 return error.WriteFailed;
1673 };
1674 w.pos += n;
1675 return io_w.consume(n);
1676 }
1677 for (data[0 .. data.len - 1]) |buf| {
1678 if (buf.len == 0) continue;
1679 const n = windows.WriteFile(handle, buf, w.pos) catch |err| {
1680 w.err = err;
1681 return error.WriteFailed;
1682 };
1683 w.pos += n;
1684 return io_w.consume(n);
1685 }
1686 const pattern = data[data.len - 1];
1687 if (pattern.len == 0 or splat == 0) return 0;
1688 const n = windows.WriteFile(handle, pattern, w.pos) catch |err| {
1689 w.err = err;
1690 return error.WriteFailed;
1691 };
1692 w.pos += n;
1693 return io_w.consume(n);
1694 },
16691695 .streaming, .streaming_reading => {
1670 var i: usize = 0;
1671 while (i < buffered.len) {
1672 const n = windows.WriteFile(handle, buffered[i..], null) catch |err| {
1696 if (buffered.len != 0) {
1697 const n = windows.WriteFile(handle, buffered, null) catch |err| {
16731698 w.err = err;
1674 w.pos += i;
1675 _ = io_w.consume(i);
16761699 return error.WriteFailed;
16771700 };
1678 i += n;
1679 if (data.len > 0 and buffered.len - i < n) {
1680 w.pos += i;
1681 return io_w.consume(i);
1682 }
1701 w.pos += n;
1702 return io_w.consume(n);
16831703 }
1684 if (i != 0 or data.len == 0 or (data.len == 1 and splat == 0)) {
1685 w.pos += i;
1686 return io_w.consume(i);
1704 for (data[0 .. data.len - 1]) |buf| {
1705 if (buf.len == 0) continue;
1706 const n = windows.WriteFile(handle, buf, null) catch |err| {
1707 w.err = err;
1708 return error.WriteFailed;
1709 };
1710 w.pos += n;
1711 return io_w.consume(n);
16871712 }
1688 const n = windows.WriteFile(handle, data[0], null) catch |err| {
1713 const pattern = data[data.len - 1];
1714 if (pattern.len == 0 or splat == 0) return 0;
1715 const n = windows.WriteFile(handle, pattern, null) catch |err| {
1716 std.debug.print("windows write file failed3: {t}\n", .{err});
16891717 w.err = err;
1690 return 0;
1718 return error.WriteFailed;
16911719 };
16921720 w.pos += n;
1693 return n;
1721 return io_w.consume(n);
16941722 },
16951723 .failure => return error.WriteFailed,
16961724 };