| ... | @@ -1728,25 +1728,22 @@ pub const Writer = struct { | ... | @@ -1728,25 +1728,22 @@ pub const Writer = struct { |
| 1728 | iovecs[len] = .{ .base = buffered.ptr, .len = buffered.len }; | 1728 | iovecs[len] = .{ .base = buffered.ptr, .len = buffered.len }; |
| 1729 | len += 1; | 1729 | len += 1; |
| 1730 | } | 1730 | } |
| 1731 | for (data) |d| { | 1731 | for (data[0 .. data.len - 1]) |d| { |
| 1732 | if (d.len == 0) continue; | 1732 | if (d.len == 0) continue; |
| 1733 | iovecs[len] = .{ .base = d.ptr, .len = d.len }; | 1733 | iovecs[len] = .{ .base = d.ptr, .len = d.len }; |
| 1734 | len += 1; | 1734 | len += 1; |
| 1735 | if (iovecs.len - len == 0) break; | 1735 | if (iovecs.len - len == 0) break; |
| 1736 | } | 1736 | } |
| 1737 | if (len == 0) return 0; | | |
| 1738 | const pattern = data[data.len - 1]; | 1737 | const pattern = data[data.len - 1]; |
| 1739 | switch (splat) { | 1738 | if (iovecs.len - len != 0) switch (splat) { |
| 1740 | 0 => if (iovecs[len - 1].base == pattern.ptr) { | 1739 | 0 => {}, |
| 1741 | len -= 1; | 1740 | 1 => if (pattern.len != 0) { |
| | 1741 | iovecs[len] = .{ .base = pattern.ptr, .len = pattern.len }; |
| | 1742 | len += 1; |
| 1742 | }, | 1743 | }, |
| 1743 | 1 => {}, | | |
| 1744 | else => switch (pattern.len) { | 1744 | else => switch (pattern.len) { |
| 1745 | 0 => {}, | 1745 | 0 => {}, |
| 1746 | 1 => memset: { | 1746 | 1 => { |
| 1747 | // Replace the 1-byte buffer with a bigger one. | | |
| 1748 | if (iovecs[len - 1].base == pattern.ptr) len -= 1; | | |
| 1749 | if (iovecs.len - len == 0) break :memset; | | |
| 1750 | const splat_buffer_candidate = io_w.buffer[io_w.end..]; | 1747 | const splat_buffer_candidate = io_w.buffer[io_w.end..]; |
| 1751 | var backup_buffer: [64]u8 = undefined; | 1748 | var backup_buffer: [64]u8 = undefined; |
| 1752 | const splat_buffer = if (splat_buffer_candidate.len >= backup_buffer.len) | 1749 | const splat_buffer = if (splat_buffer_candidate.len >= backup_buffer.len) |
| ... | @@ -1770,13 +1767,14 @@ pub const Writer = struct { | ... | @@ -1770,13 +1767,14 @@ pub const Writer = struct { |
| 1770 | len += 1; | 1767 | len += 1; |
| 1771 | } | 1768 | } |
| 1772 | }, | 1769 | }, |
| 1773 | else => for (0..splat - 1) |_| { | 1770 | else => for (0..splat) |_| { |
| 1774 | if (iovecs.len - len == 0) break; | | |
| 1775 | iovecs[len] = .{ .base = pattern.ptr, .len = pattern.len }; | 1771 | iovecs[len] = .{ .base = pattern.ptr, .len = pattern.len }; |
| 1776 | len += 1; | 1772 | len += 1; |
| | 1773 | if (iovecs.len - len == 0) break; |
| 1777 | }, | 1774 | }, |
| 1778 | }, | 1775 | }, |
| 1779 | } | 1776 | }; |
| | 1777 | if (len == 0) return 0; |
| 1780 | switch (w.mode) { | 1778 | switch (w.mode) { |
| 1781 | .positional, .positional_reading => { | 1779 | .positional, .positional_reading => { |
| 1782 | const n = std.posix.pwritev(handle, iovecs[0..len], w.pos) catch |err| switch (err) { | 1780 | const n = std.posix.pwritev(handle, iovecs[0..len], w.pos) catch |err| switch (err) { |