authorgravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2022-09-05 21:32:20-07:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-07 14:46:58+03:00
loge283a40d17bbbeeafda84fad9b75bbc458950934
tree8750bfe9dfcda5321848d2d055510aea821f054b
parente2bb92b2e27dc54852a0227345e294ae383358fd

translate-c: convert tabs to `\t` in object-like macro string literals

Closes #12549

3 files changed, 21 insertions(+), 1 deletions(-)

src/translate_c.zig+8-1
......@@ -5799,7 +5799,7 @@ fn zigifyEscapeSequences(ctx: *Context, m: *MacroCtx) ![]const u8 {
57995799 }
58005800 }
58015801 for (source) |c| {
5802 if (c == '\\') {
5802 if (c == '\\' or c == '\t') {
58035803 break;
58045804 }
58055805 } else return source;
......@@ -5876,6 +5876,13 @@ fn zigifyEscapeSequences(ctx: *Context, m: *MacroCtx) ![]const u8 {
58765876 state = .Start;
58775877 },
58785878 .Start => {
5879 if (c == '\t') {
5880 bytes[i] = '\\';
5881 i += 1;
5882 bytes[i] = 't';
5883 i += 1;
5884 continue;
5885 }
58795886 if (c == '\\') {
58805887 state = .Escape;
58815888 }
test/behavior/translate_c_macros.h+2
......@@ -50,3 +50,5 @@ typedef _Bool uintptr_t;
5050#define CAST_TO_UINTPTR(X) (uintptr_t)(X)
5151
5252#define LARGE_INT 18446744073709550592
53
54#define EMBEDDED_TAB "hello "
test/behavior/translate_c_macros.zig+11
......@@ -2,6 +2,7 @@ const builtin = @import("builtin");
22const std = @import("std");
33const expect = std.testing.expect;
44const expectEqual = std.testing.expectEqual;
5const expectEqualStrings = std.testing.expectEqualStrings;
56
67const h = @cImport(@cInclude("behavior/translate_c_macros.h"));
78
......@@ -123,3 +124,13 @@ test "large integer macro" {
123124
124125 try expectEqual(@as(c_ulonglong, 18446744073709550592), h.LARGE_INT);
125126}
127
128test "string literal macro with embedded tab character" {
129 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
130 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
131 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
132 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
133 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
134
135 try expectEqualStrings("hello\t", h.EMBEDDED_TAB);
136}