| ... | @@ -1665,32 +1665,60 @@ pub const Writer = struct { | ... | @@ -1665,32 +1665,60 @@ pub const Writer = struct { |
| 1665 | const handle = w.file.handle; | 1665 | const handle = w.file.handle; |
| 1666 | const buffered = io_w.buffered(); | 1666 | const buffered = io_w.buffered(); |
| 1667 | if (is_windows) switch (w.mode) { | 1667 | 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 | }, |
| 1669 | .streaming, .streaming_reading => { | 1695 | .streaming, .streaming_reading => { |
| 1670 | var i: usize = 0; | 1696 | if (buffered.len != 0) { |
| 1671 | while (i < buffered.len) { | 1697 | const n = windows.WriteFile(handle, buffered, null) catch |err| { |
| 1672 | const n = windows.WriteFile(handle, buffered[i..], null) catch |err| { | | |
| 1673 | w.err = err; | 1698 | w.err = err; |
| 1674 | w.pos += i; | | |
| 1675 | _ = io_w.consume(i); | | |
| 1676 | return error.WriteFailed; | 1699 | return error.WriteFailed; |
| 1677 | }; | 1700 | }; |
| 1678 | i += n; | 1701 | w.pos += n; |
| 1679 | if (data.len > 0 and buffered.len - i < n) { | 1702 | return io_w.consume(n); |
| 1680 | w.pos += i; | | |
| 1681 | return io_w.consume(i); | | |
| 1682 | } | | |
| 1683 | } | 1703 | } |
| 1684 | if (i != 0 or data.len == 0 or (data.len == 1 and splat == 0)) { | 1704 | for (data[0 .. data.len - 1]) |buf| { |
| 1685 | w.pos += i; | 1705 | if (buf.len == 0) continue; |
| 1686 | return io_w.consume(i); | 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); |
| 1687 | } | 1712 | } |
| 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}); |
| 1689 | w.err = err; | 1717 | w.err = err; |
| 1690 | return 0; | 1718 | return error.WriteFailed; |
| 1691 | }; | 1719 | }; |
| 1692 | w.pos += n; | 1720 | w.pos += n; |
| 1693 | return n; | 1721 | return io_w.consume(n); |
| 1694 | }, | 1722 | }, |
| 1695 | .failure => return error.WriteFailed, | 1723 | .failure => return error.WriteFailed, |
| 1696 | }; | 1724 | }; |