Files
cc65/test/val/bug2609.c
Gorilla Sapiens 6a17aedd81 conform to 6.4.4.4 for hex and octal escapes
fixes problem noted in #2610
2025-05-02 05:03:55 +00:00

73 lines
1.6 KiB
C

/* Bug #2609 - charmap translation violates C specification 6.4.4.4 Character constant */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#pragma charmap (0x07, 0x62) /* map \a to b */
static_assert('\a' == 0x62);
static_assert('\07' == 0x07);
static_assert('\x07' == 0x07);
#pragma charmap (0x07, 0x63) /* map \a to c */
static_assert('\a' == 0x63);
static_assert('\07' == 0x07);
static_assert('\x07' == 0x07);
#pragma charmap (0x07, 0x07) /* map \a back to x07 */
static_assert('\a' == 0x07);
static_assert('\07' == 0x07);
static_assert('\x07' == 0x07);
#pragma charmap (0x07, 0x61) /* map \a to a */
char *s = "\07\a\x07";
char t[] = { 7, 0x61, 7, 0 };
static_assert('\a' == 0x61);
static_assert('\07' == 0x07);
static_assert('\x07' == 0x07);
char c_back_a = '\a';
char c_hex_07 = '\x07';
char c_oct_07 = '\07';
int i_back_a = '\a';
int i_hex_07 = '\x07';
int i_oct_07 = '\07';
#define TEST(a,b) \
if (a != b) { printf("\n\n !FAIL! %s = %04x not %04x\n\n", #a, a, b); return EXIT_FAILURE; }
int main (void) {
int i;
TEST(c_back_a, 0x61)
TEST(c_hex_07, 0x07)
TEST(c_oct_07, 07)
TEST(i_back_a, 0x61)
TEST(i_hex_07, 0x07)
TEST(i_oct_07, 07)
assert('\a' == 0x61);
assert('\07' == 0x07);
assert('\x07' == 0x07);
if (strcmp(s,t) || s[0] == s[1]) {
printf("\n\n !FAIL! strcmp\n");
for (i = 0; i < 4; i++) {
printf("%02x ", s[i]);
}
printf("\n");
for (i = 0; i < 4; i++) {
printf("%02x ", t[i]);
}
printf("\n");
printf("\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}