1
0
mirror of https://github.com/cc65/cc65.git synced 2024-07-05 06:28:57 +00:00

Fixed a bug: Octal character constants were not handled correctly.

git-svn-id: svn://svn.cc65.org/cc65/trunk@2893 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2004-03-02 19:42:07 +00:00
parent 6577ca9cb3
commit f2a74164a2

View File

@ -55,65 +55,86 @@
static int ParseChar (StrBuf* B) static int ParseChar (StrBuf* B)
/* Parse a character. Converts \n into EOL, etc. */ /* Parse a character. Converts \n into EOL, etc. */
{ {
unsigned I; unsigned I;
unsigned Val;
int C; int C;
/* Check for escape chars */ /* Check for escape chars */
if ((C = SB_Get (B)) == '\\') { if ((C = SB_Get (B)) == '\\') {
switch (SB_Get (B)) { switch (SB_Peek (B)) {
case '?':
C = '?';
SB_Skip (B);
break;
case 'a': case 'a':
C = '\a'; C = '\a';
SB_Skip (B);
break; break;
case 'b': case 'b':
C = '\b'; C = '\b';
SB_Skip (B);
break; break;
case 'f': case 'f':
C = '\f'; C = '\f';
SB_Skip (B);
break; break;
case 'r': case 'r':
C = '\r'; C = '\r';
SB_Skip (B);
break; break;
case 'n': case 'n':
C = '\n'; C = '\n';
SB_Skip (B);
break; break;
case 't': case 't':
C = '\t'; C = '\t';
SB_Skip (B);
break; break;
case 'v': case 'v':
C = '\v'; C = '\v';
SB_Skip (B);
break; break;
case '\"': case '\"':
C = '\"'; C = '\"';
SB_Skip (B);
break; break;
case '\'': case '\'':
C = '\''; C = '\'';
SB_Skip (B);
break; break;
case '\\': case '\\':
C = '\\'; C = '\\';
break; SB_Skip (B);
case '\?':
C = '\?';
break; break;
case 'x': case 'x':
case 'X': case 'X':
/* Hex character constant */ /* Hex character constant */
SB_Skip (B);
C = HexVal (SB_Get (B)) << 4; C = HexVal (SB_Get (B)) << 4;
C |= HexVal (SB_Get (B)); C |= HexVal (SB_Get (B));
break; break;
case '0': case '0':
/* Octal constant */
C = 0;
goto Octal;
case '1': case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
/* Octal constant */ /* Octal constant */
C = 1; I = 0;
Octal: I = 0; Val = SB_Get (B) - '0';
while (SB_Peek (B) >= '0' && SB_Peek (B) <= '7' && I++ < 4) { while (SB_Peek (B) >= '0' && SB_Peek (B) <= '7' && ++I <= 3) {
C = (C << 3) | (SB_Get (B) - '0'); Val = (Val << 3) | (SB_Get (B) - '0');
} }
C = (int) Val;
if (Val > 256) {
Error ("Character constant out of range");
C = ' ';
}
break; break;
default: default:
Error ("Illegal character constant"); Error ("Illegal character constant 0x%02X", SB_Get (B));
C = ' '; C = ' ';
break; break;
} }