X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcc65%2Fscanner.c;h=73ce35aed1db9887338b47ef4d4b3a0aacda35fe;hb=763a35911411adbe46e07b57b6161205a51e16b6;hp=e87126f4101c9d6fb4d9566e248046ed2df1d479;hpb=7596da75f024b9c6e74735d60bff847ca173483a;p=cc65 diff --git a/src/cc65/scanner.c b/src/cc65/scanner.c index e87126f41..73ce35aed 100644 --- a/src/cc65/scanner.c +++ b/src/cc65/scanner.c @@ -243,61 +243,87 @@ static void SetTok (int tok) static int ParseChar (void) /* Parse a character. Converts \n into EOL, etc. */ { - int i; - unsigned val; + int I; + unsigned Val; int C; /* Check for escape chars */ if (CurC == '\\') { NextChar (); switch (CurC) { + case '?': + C = '\?'; + break; + case 'a': + C = '\a'; + break; case 'b': C = '\b'; - break; + break; case 'f': - C = '\f'; - break; + C = '\f'; + break; case 'r': - C = '\r'; - break; + C = '\r'; + break; case 'n': - C = '\n'; - break; + C = '\n'; + break; case 't': - C = '\t'; - break; + C = '\t'; + break; + case 'v': + C = '\v'; + break; case '\"': - C = '\"'; - break; + C = '\"'; + break; case '\'': - C = '\''; - break; + C = '\''; + break; case '\\': - C = '\\'; - break; + C = '\\'; + break; case 'x': case 'X': - /* Hex character constant */ - NextChar (); - val = HexVal (CurC) << 4; - NextChar (); - C = val | HexVal (CurC); /* Do not translate */ - break; + /* Hex character constant */ + NextChar (); + Val = HexVal (CurC) << 4; + NextChar (); + C = Val | HexVal (CurC); /* Do not translate */ + break; case '0': case '1': case '2': case '3': + case '4': + case '5': + case '6': + case '7': /* Octal constant */ - i = 0; - C = CurC - '0'; - while (NextC >= '0' && NextC <= '7' && i++ < 4) { + I = 0; + Val = CurC - '0'; + while (NextC >= '0' && NextC <= '7' && ++I <= 3) { NextChar (); - C = (C << 3) | (CurC - '0'); + Val = (Val << 3) | (CurC - '0'); } + C = (int) Val; + if (Val >= 256) { + Error ("Character constant out of range"); + C = ' '; + } break; default: Error ("Illegal character constant"); C = ' '; + /* Try to do error recovery, otherwise the compiler will spit + * out thousands of errors in this place and abort. + */ + if (CurC != '\'' && CurC != '\0') { + while (NextC != '\'' && NextC != '\"' && NextC != '\0') { + NextChar (); + } + } break; } } else {