| ... | @@ -601,20 +601,35 @@ pub const StringEscapeWriter = struct { | ... | @@ -601,20 +601,35 @@ pub const StringEscapeWriter = struct { |
| 601 | fn drain(w: *Writer, data: []const []const u8, splat: usize) Io.Writer.Error!usize { | 601 | fn drain(w: *Writer, data: []const []const u8, splat: usize) Io.Writer.Error!usize { |
| 602 | const sew: *StringEscapeWriter = @alignCast(@fieldParentPtr("writer", w)); | 602 | const sew: *StringEscapeWriter = @alignCast(@fieldParentPtr("writer", w)); |
| 603 | const out = sew.out; | 603 | const out = sew.out; |
| 604 | _ = try stringEscapeCounting(w.buffered(), out); | 604 | try stringEscape(w.buffered(), out); |
| 605 | w.end = 0; | 605 | w.end = 0; |
| 606 | var n: usize = 0; | 606 | var n: usize = 0; |
| 607 | for (data[0 .. data.len - 1]) |bytes| { | 607 | for (data[0 .. data.len - 1]) |bytes| { |
| 608 | n += try stringEscapeCounting(bytes, out); | 608 | try stringEscape(bytes, out); |
| | 609 | n += bytes.len; |
| 609 | } | 610 | } |
| 610 | const pattern = data[data.len - 1]; | 611 | const pattern = data[data.len - 1]; |
| 611 | for (0..splat) |_| { | 612 | for (0..splat) |_| { |
| 612 | n += try stringEscapeCounting(pattern, out); | 613 | try stringEscape(pattern, out); |
| | 614 | n += pattern.len; |
| 613 | } | 615 | } |
| 614 | return n; | 616 | return n; |
| 615 | } | 617 | } |
| 616 | }; | 618 | }; |
| 617 | | 619 | |
| | 620 | test StringEscapeWriter { |
| | 621 | const bytes = "\x7f\t\n\r\\\"abc"; |
| | 622 | const escaped = "\\x7f\\t\\n\\r\\\\\\\"abc"; |
| | 623 | |
| | 624 | var out_buf: [escaped.len]u8 = undefined; |
| | 625 | var out: Io.Writer = .fixed(&out_buf); |
| | 626 | var w: StringEscapeWriter = .init(&out, &.{}); |
| | 627 | |
| | 628 | const n = try w.writer.write(bytes); |
| | 629 | try std.testing.expectEqual(bytes.len, n); |
| | 630 | try std.testing.expectEqualStrings(escaped, out.buffered()); |
| | 631 | } |
| | 632 | |
| 618 | /// Print as escaped contents of a single-quoted string. | 633 | /// Print as escaped contents of a single-quoted string. |
| 619 | pub fn charEscape(codepoint: u21, w: *Writer) Writer.Error!void { | 634 | pub fn charEscape(codepoint: u21, w: *Writer) Writer.Error!void { |
| 620 | switch (codepoint) { | 635 | switch (codepoint) { |