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