authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-07-21 14:35:45+03:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-23 14:49:19-04:00
log57aa8997bd0b651d56a22efee46598fff167253d
tree8a09d59e15b0c5df10c1aaf8b9d76e5db57ac86c
parent16be70cbbf8e6dc658b9fcacd3366df8f83fffa8

fix escape sequence rendering


2 files changed, 50 insertions(+), 9 deletions(-)

src/ast_render.cpp+16-9
...@@ -319,6 +319,9 @@ static bool is_digit(uint8_t c) {...@@ -319,6 +319,9 @@ static bool is_digit(uint8_t c) {
319}319}
320320
321static bool is_printable(uint8_t c) {321static bool is_printable(uint8_t c) {
322 if (c == 0) {
323 return false;
324 }
322 static const uint8_t printables[] =325 static const uint8_t printables[] =
323 " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.~`!@#$%^&*()_-+=\\{}[];'\"?/<>,:";326 " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.~`!@#$%^&*()_-+=\\{}[];'\"?/<>,:";
324 for (size_t i = 0; i < array_length(printables); i += 1) {327 for (size_t i = 0; i < array_length(printables); i += 1) {
...@@ -337,20 +340,12 @@ static void string_literal_escape(Buf *source, Buf *dest) {...@@ -337,20 +340,12 @@ static void string_literal_escape(Buf *source, Buf *dest) {
337 buf_append_str(dest, "\\\"");340 buf_append_str(dest, "\\\"");
338 } else if (c == '\\') {341 } else if (c == '\\') {
339 buf_append_str(dest, "\\\\");342 buf_append_str(dest, "\\\\");
340 } else if (c == '\a') {
341 buf_append_str(dest, "\\a");
342 } else if (c == '\b') {
343 buf_append_str(dest, "\\b");
344 } else if (c == '\f') {
345 buf_append_str(dest, "\\f");
346 } else if (c == '\n') {343 } else if (c == '\n') {
347 buf_append_str(dest, "\\n");344 buf_append_str(dest, "\\n");
348 } else if (c == '\r') {345 } else if (c == '\r') {
349 buf_append_str(dest, "\\r");346 buf_append_str(dest, "\\r");
350 } else if (c == '\t') {347 } else if (c == '\t') {
351 buf_append_str(dest, "\\t");348 buf_append_str(dest, "\\t");
352 } else if (c == '\v') {
353 buf_append_str(dest, "\\v");
354 } else if (is_printable(c)) {349 } else if (is_printable(c)) {
355 buf_append_char(dest, c);350 buf_append_char(dest, c);
356 } else {351 } else {
...@@ -630,7 +625,19 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {...@@ -630,7 +625,19 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
630 case NodeTypeCharLiteral:625 case NodeTypeCharLiteral:
631 {626 {
632 uint8_t c = node->data.char_literal.value;627 uint8_t c = node->data.char_literal.value;
633 if (is_printable(c)) {628 if (c == '\'') {
629 fprintf(ar->f, "'\\''");
630 } else if (c == '\"') {
631 fprintf(ar->f, "'\\\"'");
632 } else if (c == '\\') {
633 fprintf(ar->f, "'\\\\'");
634 } else if (c == '\n') {
635 fprintf(ar->f, "'\\n'");
636 } else if (c == '\r') {
637 fprintf(ar->f, "'\\r'");
638 } else if (c == '\t') {
639 fprintf(ar->f, "'\\t'");
640 } else if (is_printable(c)) {
634 fprintf(ar->f, "'%c'", c);641 fprintf(ar->f, "'%c'", c);
635 } else {642 } else {
636 fprintf(ar->f, "'\\x%02x'", (int)c);643 fprintf(ar->f, "'\\x%02x'", (int)c);
test/translate_c.zig+34
...@@ -1780,6 +1780,40 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1780,6 +1780,40 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1780 \\}1780 \\}
1781 );1781 );
17821782
1783 cases.addC("escape sequences",
1784 \\const char *escapes() {
1785 \\char a = '\'',
1786 \\ b = '\\',
1787 \\ c = '\a',
1788 \\ d = '\b',
1789 \\ e = '\f',
1790 \\ f = '\n',
1791 \\ g = '\r',
1792 \\ h = '\t',
1793 \\ i = '\v',
1794 \\ j = '\0',
1795 \\ k = '\"';
1796 \\ return "\'\\\a\b\f\n\r\t\v\0\"";
1797 \\}
1798 \\
1799 ,
1800 \\pub export fn escapes() [*c]const u8 {
1801 \\ var a: u8 = u8('\'');
1802 \\ var b: u8 = u8('\\');
1803 \\ var c: u8 = u8('\x07');
1804 \\ var d: u8 = u8('\x08');
1805 \\ var e: u8 = u8('\x0c');
1806 \\ var f: u8 = u8('\n');
1807 \\ var g: u8 = u8('\r');
1808 \\ var h: u8 = u8('\t');
1809 \\ var i: u8 = u8('\x0b');
1810 \\ var j: u8 = u8('\x00');
1811 \\ var k: u8 = u8('\"');
1812 \\ return c"\'\\\x07\x08\x0c\n\r\t\x0b\x00\"";
1813 \\}
1814 \\
1815 );
1816
1783 /////////////// Cases for only stage1 because stage2 behavior is better ////////////////1817 /////////////// Cases for only stage1 because stage2 behavior is better ////////////////
1784 cases.addC("Parameterless function prototypes",1818 cases.addC("Parameterless function prototypes",
1785 \\void foo() {}1819 \\void foo() {}