Home
cc1: Fix parsing of octal escape sequences - scc - simple c99 compiler HTML git clone git://git.simple-cc.org/scc DIR Log DIR Files DIR Refs DIR Submodules DIR README DIR LICENSE --- DIR commit 9057ad5dbe07ea11e717cc08f69a26bd7e6abc60 DIR parent 03dbb2f6ade20e9de9f3128f92c5a5496cf4183b HTML Author: Roberto E. Vargas Caballero <k0ga@shike2.com> Date: Mon, 7 Oct 2024 17:10:00 +0200 cc1: Fix parsing of octal escape sequences The octal escape sequences begins with a \ followed with a number from 0 to 7 (as much 3 digits), but the code was expecting \0 (due to a confusion with octal int constants that must begin with a 0). Diffstat: M src/cmd/cc/cc1/lex.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) --- DIR diff --git a/src/cmd/cc/cc1/lex.c b/src/cmd/cc/cc1/lex.c @@ -485,7 +485,7 @@ number(void) static int escape(void) { - int c, base; + int c, d, i, cnt, base; switch (*++input->p) { case 'a': @@ -521,23 +521,37 @@ escape(void) case 'x': if (!isxdigit(*++input->p)) warn("\\x used with no following hex digits"); + cnt = 2; base = 16; break; case '0': - if (!strchr("01234567", *++input->p)) - warn("\\0 used with no following octal digits"); + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + cnt = 3; base = 8; break; default: warn("unknown escape sequence"); return ' '; } - errno = 0; - /* FIXME: We don't check that there is an actual number */ - c = strtoul(input->p, &input->p, base); - if (errno || c > 255) - warn("character constant out of range"); + + for (c = i = 0; i < cnt; ++i) { + static char digits[] = "0123456789ABCDEF"; + char *p = strchr(digits, toupper(*input->p)); + + if (!p || (d = p - digits) > base) + break; + c *= base; + c += d; + ++input->p; + } --input->p; + return c; }