From 0e0183020dc232306b126176c9b36d049fe37cb0 Mon Sep 17 00:00:00 2001 From: cuz Date: Sat, 9 Oct 2004 14:32:27 +0000 Subject: [PATCH] Fixed a escape char const problem git-svn-id: svn://svn.cc65.org/cc65/trunk@3235 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/cc65/scanner.c | 58 +++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/cc65/scanner.c b/src/cc65/scanner.c index 840d0b559..b0bb8a9bc 100644 --- a/src/cc65/scanner.c +++ b/src/cc65/scanner.c @@ -250,9 +250,8 @@ static void SetTok (int tok) static int ParseChar (void) /* Parse a character. Converts escape chars into character codes. */ { - int I; - unsigned Val; int C; + int HadError; /* Check for escape chars */ if (CurC == '\\') { @@ -294,20 +293,23 @@ static int ParseChar (void) case 'x': case 'X': /* Hex character constant */ - NextChar (); - if (!IsXDigit (CurC)) { + if (!IsXDigit (NextC)) { Error ("\\x used with no following hex digits"); C = ' '; - } - I = 0; - C = 0; - while (IsXDigit (CurC)) { - if (++I <= 2) { - C = (C << 4) | HexVal (CurC); - } else if (I == 3) { - Error ("Too many digits in hex character constant"); + } else { + HadError = 0; + C = 0; + while (IsXDigit (NextC)) { + if ((C << 4) >= 256) { + if (!HadError) { + Error ("Hex character constant out of range"); + HadError = 1; + } + } else { + C = (C << 4) | HexVal (NextC); + } + NextChar (); } - NextChar (); } break; case '0': @@ -318,22 +320,24 @@ static int ParseChar (void) case '5': case '6': case '7': - /* Octal constant ### FIXME: Eat all available octal chars! */ - I = 0; - Val = CurC - '0'; - while (IsODigit (NextC) && ++I <= 3) { - NextChar (); - Val = (Val << 3) | (CurC - '0'); - } - C = (int) Val; - if (Val >= 256) { - Error ("Character constant out of range: %u", Val); - C = ' '; - } - break; + /* Octal constant */ + HadError = 0; + C = HexVal (CurC); + while (IsODigit (NextC)) { + if ((C << 3) >= 256) { + if (!HadError) { + Error ("Octal character constant out of range"); + HadError = 1; + } + } else { + C = (C << 3) | HexVal (NextC); + } + NextChar (); + } + break; default: Error ("Illegal character constant"); - C = ' '; + C = ' '; /* Try to do error recovery, otherwise the compiler will spit * out thousands of errors in this place and abort. */ -- 2.39.5