| ... | @@ -691,8 +691,9 @@ fn transStringLiteral( | ... | @@ -691,8 +691,9 @@ fn transStringLiteral( |
| 691 | const bytes_ptr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len); | 691 | const bytes_ptr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len); |
| 692 | const str = bytes_ptr[0..len]; | 692 | const str = bytes_ptr[0..len]; |
| 693 | | 693 | |
| | 694 | var char_buf: [4]u8 = undefined; |
| 694 | len = 0; | 695 | len = 0; |
| 695 | for (str) |c| len += escapeChar(c).len; | 696 | for (str) |c| len += escapeChar(c, &char_buf).len; |
| 696 | | 697 | |
| 697 | const buf = try rp.c.a().alloc(u8, len + "c\"\"".len); | 698 | const buf = try rp.c.a().alloc(u8, len + "c\"\"".len); |
| 698 | buf[0] = 'c'; | 699 | buf[0] = 'c'; |
| ... | @@ -725,33 +726,35 @@ fn transStringLiteral( | ... | @@ -725,33 +726,35 @@ fn transStringLiteral( |
| 725 | | 726 | |
| 726 | fn escapedStringLen(s: []const u8) usize { | 727 | fn escapedStringLen(s: []const u8) usize { |
| 727 | var len: usize = 0; | 728 | var len: usize = 0; |
| 728 | for (s) |c| len += escapeChar(c).len; | 729 | var char_buf: [4]u8 = undefined; |
| | 730 | for (s) |c| len += escapeChar(c, &char_buf).len; |
| 729 | return len; | 731 | return len; |
| 730 | } | 732 | } |
| 731 | | 733 | |
| 732 | fn writeEscapedString(buf: []u8, s: []const u8) void { | 734 | fn writeEscapedString(buf: []u8, s: []const u8) void { |
| | 735 | var char_buf: [4]u8 = undefined; |
| 733 | var i: usize = 0; | 736 | var i: usize = 0; |
| 734 | for (s) |c| { | 737 | for (s) |c| { |
| 735 | const escaped = escapeChar(c); | 738 | const escaped = escapeChar(c, &char_buf); |
| 736 | std.mem.copy(u8, buf[i..], escaped); | 739 | std.mem.copy(u8, buf[i..], escaped); |
| 737 | i += escaped.len; | 740 | i += escaped.len; |
| 738 | } | 741 | } |
| 739 | } | 742 | } |
| 740 | | 743 | |
| 741 | fn escapeChar(c: u8) []const u8 { | 744 | // Returns either a string literal or a slice of `buf`. |
| | 745 | fn escapeChar(c: u8, char_buf: *[4]u8) []const u8 { |
| 742 | // TODO: https://github.com/ziglang/zig/issues/2749 | 746 | // TODO: https://github.com/ziglang/zig/issues/2749 |
| 743 | switch (c) { | 747 | const escaped = switch (c) { |
| 744 | // Printable ASCII except for ' " \ | 748 | // Printable ASCII except for ' " \ |
| 745 | ' ', '!', '#'...'&', '('...'[', ']'...'~' => return ([_]u8{c})[0..], | 749 | ' ', '!', '#'...'&', '('...'[', ']'...'~' => ([_]u8{c})[0..], |
| 746 | '\'', '\"', '\\' => return ([_]u8{ '\\', c })[0..], | 750 | '\'', '\"', '\\' => ([_]u8{ '\\', c })[0..], |
| 747 | '\n' => return "\\n"[0..], | 751 | '\n' => return "\\n"[0..], |
| 748 | '\r' => return "\\r"[0..], | 752 | '\r' => return "\\r"[0..], |
| 749 | '\t' => return "\\t"[0..], | 753 | '\t' => return "\\t"[0..], |
| 750 | else => { | 754 | else => return std.fmt.bufPrint(char_buf[0..], "\\x{x:2}", c) catch unreachable, |
| 751 | var buf: [4]u8 = undefined; | 755 | }; |
| 752 | return std.fmt.bufPrint(buf[0..], "\\x{x:2}", c) catch unreachable; | 756 | std.mem.copy(u8, char_buf, escaped); |
| 753 | }, | 757 | return char_buf[0..escaped.len]; |
| 754 | } | | |
| 755 | } | 758 | } |
| 756 | | 759 | |
| 757 | fn transCCast( | 760 | fn transCCast( |