| ... | ... | @@ -2742,29 +2742,26 @@ pub const Allocating = struct { |
| 2742 | 2742 | |
| 2743 | 2743 | fn drain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { |
| 2744 | 2744 | const a: *Allocating = @fieldParentPtr("writer", w); |
| 2745 | | const pattern = data[data.len - 1]; |
| 2746 | | const splat_len = pattern.len * splat; |
| 2747 | | const start_len = a.writer.end; |
| 2748 | 2745 | assert(data.len != 0); |
| 2749 | | for (data) |bytes| { |
| 2750 | | a.ensureUnusedCapacity(bytes.len + splat_len + 1) catch return error.WriteFailed; |
| 2746 | const count = countSplat(data, splat); |
| 2747 | a.ensureUnusedCapacity(count + 1) catch return error.WriteFailed; |
| 2748 | for (data[0 .. data.len - 1]) |bytes| { |
| 2751 | 2749 | @memcpy(a.writer.buffer[a.writer.end..][0..bytes.len], bytes); |
| 2752 | 2750 | a.writer.end += bytes.len; |
| 2753 | 2751 | } |
| 2754 | | if (splat == 0) { |
| 2755 | | a.writer.end -= pattern.len; |
| 2756 | | } else switch (pattern.len) { |
| 2752 | const pattern = data[data.len - 1]; |
| 2753 | switch (pattern.len) { |
| 2757 | 2754 | 0 => {}, |
| 2758 | 2755 | 1 => { |
| 2759 | | @memset(a.writer.buffer[a.writer.end..][0 .. splat - 1], pattern[0]); |
| 2760 | | a.writer.end += splat - 1; |
| 2756 | @memset(a.writer.buffer[a.writer.end..][0..splat], pattern[0]); |
| 2757 | a.writer.end += splat; |
| 2761 | 2758 | }, |
| 2762 | | else => for (0..splat - 1) |_| { |
| 2759 | else => for (0..splat) |_| { |
| 2763 | 2760 | @memcpy(a.writer.buffer[a.writer.end..][0..pattern.len], pattern); |
| 2764 | 2761 | a.writer.end += pattern.len; |
| 2765 | 2762 | }, |
| 2766 | 2763 | } |
| 2767 | | return a.writer.end - start_len; |
| 2764 | return count; |
| 2768 | 2765 | } |
| 2769 | 2766 | |
| 2770 | 2767 | fn sendFile(w: *Writer, file_reader: *File.Reader, limit: Limit) FileError!usize { |