Aria

A low-level systems programming language
git clone git://git.m21c.me/Aria.git
Log | Files | Refs | README | LICENSE

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:
Mcompiler.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, "\"");