From 066a5e0fec286feac1a46dde15365d009c32bfe3 Mon Sep 17 00:00:00 2001 From: acqn Date: Sun, 24 Jul 2022 16:38:41 +0800 Subject: [PATCH 1/2] Fixed #pragma charmap for string literals. --- src/cc65/expr.c | 2 ++ src/cc65/litpool.c | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/cc65/expr.c b/src/cc65/expr.c index eb0afb38b..a506fa5a1 100644 --- a/src/cc65/expr.c +++ b/src/cc65/expr.c @@ -1263,6 +1263,8 @@ static void Primary (ExprDesc* E) /* String literal */ if ((Flags & E_EVAL_UNEVAL) != E_EVAL_UNEVAL) { E->V.LVal = UseLiteral (CurTok.SVal); + /* Translate into target charset */ + TranslateLiteral (E->V.LVal); } else { E->V.LVal = CurTok.SVal; } diff --git a/src/cc65/litpool.c b/src/cc65/litpool.c index 95228179d..d741f87d0 100644 --- a/src/cc65/litpool.c +++ b/src/cc65/litpool.c @@ -126,9 +126,6 @@ static void FreeLiteral (Literal* L) static void OutputLiteral (Literal* L) /* Output one literal to the currently active data segment */ { - /* Translate the literal into the target charset */ - TranslateLiteral (L); - /* Define the label for the literal */ g_defliterallabel (L->Label); @@ -387,9 +384,6 @@ static void OutputReadOnlyLiterals (Collection* Literals) continue; } - /* Translate the literal into the target charset */ - TranslateLiteral (L); - /* Check if this literal is part of another one. Since the literals ** are sorted by size (larger ones first), it can only be part of a ** literal with a smaller index. From 9f767770ac014211a9d684987fc44b188817ef7d Mon Sep 17 00:00:00 2001 From: acqn Date: Tue, 26 Jul 2022 15:19:48 +0800 Subject: [PATCH 2/2] Added test case for #pragma charmap. --- test/val/bug1373.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 test/val/bug1373.c diff --git a/test/val/bug1373.c b/test/val/bug1373.c new file mode 100644 index 000000000..f13f375c1 --- /dev/null +++ b/test/val/bug1373.c @@ -0,0 +1,54 @@ + +/* #1373 - #pragma charmap works in unexpected ways */ + +#include +#include + +char res0[10]; +char res1[10]; +char res2[10]; +char res3[10]; +char res4[10]; + +int err = 0; + +#pragma charmap(0x61, 0x44) +#define STRING_A "abABa" + +extern char mappedA[10]; + +#pragma charmap(0x61, 0x61) +char notmappedA[10] = "abABa"; + +void test(void); + +#pragma charmap(0x61, 0x42) +int main(void) +{ + char mappedB[10] = STRING_A; + sprintf(res0, "abABa"); /* expected: BbABB */ + +#pragma charmap(0x61, 0x61) + sprintf(res1, mappedA); /* expected: CbABC */ + sprintf(res2, STRING_A); /* expected: abABa */ + sprintf(res3, mappedB); /* expected: BbABB */ + +#pragma charmap(0x61, 0x43) + sprintf(res4, notmappedA); /* expected: abABa */ + + test(); + + return err; +} + +char mappedA[10] = "abABa"; + +#pragma charmap(0x61, 0x61) +void test(void) +{ + puts(res0); if (strcmp(res0, "BbABB") != 0) { puts("expected: BbABB"); err++; } + puts(res1); if (strcmp(res1, "CbABC") != 0) { puts("expected: CbABC"); err++; } + puts(res2); if (strcmp(res2, "abABa") != 0) { puts("expected: abABa"); err++; } + puts(res3); if (strcmp(res3, "BbABB") != 0) { puts("expected: BbABB"); err++; } + puts(res4); if (strcmp(res4, "abABa") != 0) { puts("expected: abABa"); err++; } +}