commit a7f863def1771a2b54c59f3fbacdeba1337e2971
parent 6baaac7d96c00edf9270affd321a9c624af49a36
Author: m21c <ho*******@gmail.com>
Date: Mon, 22 Jun 2026 23:35:04 +0200
codegen: map char for char-literals
Diffstat:
| M | compiler.c | | | 64 | ++++++++++++++++++++++++++++++---------------------------------- |
1 file changed, 30 insertions(+), 34 deletions(-)
diff --git a/compiler.c b/compiler.c
@@ -6492,6 +6492,32 @@ cgnumber(CodeGen *cg, Node *expr)
}
static void
+cgmapchar(CodeGen *cg, char ch)
+{
+ #define mapchar(from, to) \
+ case from: cgprintf(cg, to); return
+ switch (ch) {
+ mapchar('\\', "\\\\");
+ mapchar('\"', "\\\"");
+ mapchar('\'', "\\\'");
+ mapchar('\n', "\\n");
+ mapchar('\t', "\\t");
+ mapchar('\r', "\\r");
+ mapchar('\b', "\\b");
+ mapchar('\f', "\\f");
+ mapchar('\v', "\\v");
+ mapchar('\0', "\\0");
+ default:
+ if (ch < 32 || (uint8_t) ch >= 127)
+ cgprintf(cg, '\\x%02x', (uint8_t) ch);
+ else
+ cgprintf(cg, "%c", ch);
+ break;
+ }
+ #undef mapchar
+}
+
+static void
cgdeclaration(CodeGen *cg, Node *expr)
{
Decl *decl = expr->u.declref;
@@ -6579,8 +6605,9 @@ codegen(CodeGen *cg, Node *expr)
cgprintf(cg, "%s", getstring(idents, expr->u.key));
break;
case CHAR:
- /* @todo print char value properly */
- cgprintf(cg, "'%c'", (uchar) expr->u.u);
+ cgprintf(cg, "'");
+ cgmapchar(cg, (uchar) expr->u.u);
+ cgprintf(cg, "'");
break;
case TYPE:
break;
@@ -6599,38 +6626,7 @@ codegen(CodeGen *cg, Node *expr)
* (null-char at the end) which is not printed */
assert(length);
for (i = 0; i < length - 1; ++i) {
- switch (string[i]) {
- case '\\':
- cgprintf(cg, "\\\\");
- break;
- case '"':
- cgprintf(cg, "\\\"");
- break;
- case '\n':
- cgprintf(cg, "\\n");
- break;
- case '\t':
- cgprintf(cg, "\\t");
- break;
- case '\r':
- cgprintf(cg, "\\r");
- break;
- case '\b':
- cgprintf(cg, "\\b");
- break;
- case '\f':
- cgprintf(cg, "\\f");
- break;
- case '\v':
- cgprintf(cg, "\\v");
- break;
- case '\0':
- cgprintf(cg, "\\0");
- break;
- default:
- cgprintf(cg, "%c", string[i]);
- break;
- }
+ cgmapchar(cg, string[i]);
}
} while (0);
cgprintf(cg, "\"");