Fix petscii characters changed includes and pragmas
This commit is contained in:
parent
11af372509
commit
0e59af5122
|
@ -12,6 +12,9 @@ Parser::Parser(Errors* errors, Scanner* scanner, CompilationUnits* compilationUn
|
|||
mCodeSection = compilationUnits->mSectionCode;
|
||||
mDataSection = compilationUnits->mSectionData;
|
||||
mBSSection = compilationUnits->mSectionBSS;
|
||||
|
||||
for (int i = 0; i < 256; i++)
|
||||
mCharMap[i] = i;
|
||||
}
|
||||
|
||||
Parser::~Parser(void)
|
||||
|
@ -638,7 +641,14 @@ Expression* Parser::ParseInitExpression(Declaration* dtype)
|
|||
|
||||
if (strlen(mScanner->mTokenString) < dtype->mSize)
|
||||
{
|
||||
strcpy_s((char *)d, dec->mSize, mScanner->mTokenString);
|
||||
int i = 0;
|
||||
while (i < dec->mSize && mScanner->mTokenString[i])
|
||||
{
|
||||
d[i] = mCharMap[mScanner->mTokenString[i]];
|
||||
i++;
|
||||
}
|
||||
if (i < dec->mSize)
|
||||
d[i] = 0;
|
||||
}
|
||||
else
|
||||
mErrors->Error(mScanner->mLocation, EERR_CONSTANT_INITIALIZER, "String constant is too large for char array");
|
||||
|
@ -920,6 +930,16 @@ Expression* Parser::ParseSimpleExpression(void)
|
|||
case TK_STATIC:
|
||||
exp = ParseDeclarationExpression();
|
||||
break;
|
||||
case TK_CHARACTER:
|
||||
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
|
||||
dec->mInteger = mCharMap[mScanner->mTokenInteger];
|
||||
dec->mBase = TheUnsignedIntTypeDeclaration;
|
||||
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
|
||||
exp->mDecValue = dec;
|
||||
exp->mDecType = dec->mBase;
|
||||
|
||||
mScanner->NextToken();
|
||||
break;
|
||||
case TK_INTEGER:
|
||||
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
|
||||
dec->mInteger = mScanner->mTokenInteger;
|
||||
|
@ -988,7 +1008,14 @@ Expression* Parser::ParseSimpleExpression(void)
|
|||
dec->mBase->mFlags |= DTF_DEFINED;
|
||||
uint8* d = new uint8[dec->mSize];
|
||||
dec->mData = d;
|
||||
memcpy(d, mScanner->mTokenString, dec->mSize);
|
||||
|
||||
int i = 0;
|
||||
while (mScanner->mTokenString[i])
|
||||
{
|
||||
d[i] = mCharMap[mScanner->mTokenString[i]];
|
||||
i++;
|
||||
}
|
||||
d[i] = 0;
|
||||
|
||||
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
|
||||
exp->mDecValue = dec;
|
||||
|
@ -1002,7 +1029,13 @@ Expression* Parser::ParseSimpleExpression(void)
|
|||
int s = strlen(mScanner->mTokenString);
|
||||
uint8* d = new uint8[dec->mSize + s];
|
||||
memcpy(d, dec->mData, dec->mSize - 1);
|
||||
memcpy(d + dec->mSize - 1, mScanner->mTokenString, s + 1);
|
||||
int i = 0;
|
||||
while (mScanner->mTokenString[i])
|
||||
{
|
||||
d[i + dec->mSize] = mCharMap[mScanner->mTokenString[i]];
|
||||
i++;
|
||||
}
|
||||
d[i + dec->mSize] = 0;
|
||||
dec->mSize += s;
|
||||
delete[] dec->mData;
|
||||
dec->mData = d;
|
||||
|
@ -1896,6 +1929,16 @@ Expression* Parser::ParseAssemblerBaseOperand(void)
|
|||
exp->mDecValue = dec;
|
||||
exp->mDecType = dec->mBase;
|
||||
|
||||
mScanner->NextToken();
|
||||
break;
|
||||
case TK_CHARACTER:
|
||||
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
|
||||
dec->mInteger = mCharMap[mScanner->mTokenInteger];
|
||||
dec->mBase = TheUnsignedIntTypeDeclaration;
|
||||
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
|
||||
exp->mDecValue = dec;
|
||||
exp->mDecType = dec->mBase;
|
||||
|
||||
mScanner->NextToken();
|
||||
break;
|
||||
|
||||
|
@ -2631,7 +2674,7 @@ void Parser::ParsePragma(void)
|
|||
|
||||
for (int i = 0; i < ccount; i++)
|
||||
{
|
||||
mScanner->mCharMap[cindex] = ccode;
|
||||
mCharMap[cindex] = ccode;
|
||||
cindex = (cindex + 1) & 255;
|
||||
ccode = (ccode + 1) & 255;
|
||||
}
|
||||
|
|
|
@ -21,6 +21,9 @@ protected:
|
|||
bool ConsumeToken(Token token);
|
||||
bool ConsumeTokenIf(Token token);
|
||||
|
||||
char mCharMap[256];
|
||||
|
||||
|
||||
void ParsePragma(void);
|
||||
|
||||
Declaration* ParseBaseTypeDeclaration(uint32 flags);
|
||||
|
|
|
@ -50,6 +50,7 @@ const char* TokenNames[] = {
|
|||
"__asm",
|
||||
|
||||
"number",
|
||||
"char",
|
||||
"string literal",
|
||||
"identifier",
|
||||
"'true'",
|
||||
|
@ -270,9 +271,6 @@ Scanner::Scanner(Errors* errors, Preprocessor* preprocessor)
|
|||
mDefines = new MacroDict();
|
||||
mDefineArguments = nullptr;
|
||||
|
||||
for (int i = 0; i < 256; i++)
|
||||
mCharMap[i] = i;
|
||||
|
||||
NextChar();
|
||||
NextToken();
|
||||
|
||||
|
@ -1233,7 +1231,7 @@ void Scanner::StringToken(char terminator)
|
|||
}
|
||||
}
|
||||
|
||||
mTokenString[n++] = mCharMap[mTokenChar];
|
||||
mTokenString[n++] = mTokenChar;
|
||||
}
|
||||
|
||||
mTokenString[n] = 0;
|
||||
|
@ -1301,13 +1299,13 @@ void Scanner::CharToken(void)
|
|||
}
|
||||
}
|
||||
|
||||
mTokenChar = mCharMap[mTokenChar];
|
||||
mTokenChar = mTokenChar;
|
||||
|
||||
mTokenInteger = mTokenChar;
|
||||
|
||||
if (mLine[mOffset] && mLine[mOffset] == '\'')
|
||||
{
|
||||
mToken = TK_INTEGERU;
|
||||
mToken = TK_CHARACTER;
|
||||
mOffset++;
|
||||
NextChar();
|
||||
}
|
||||
|
@ -1540,6 +1538,7 @@ int64 Scanner::PrepParseSimple(void)
|
|||
|
||||
switch (mToken)
|
||||
{
|
||||
case TK_CHARACTER:
|
||||
case TK_INTEGER:
|
||||
case TK_INTEGERU:
|
||||
case TK_INTEGERL:
|
||||
|
|
|
@ -49,6 +49,7 @@ enum Token
|
|||
TK_ASM,
|
||||
|
||||
TK_NUMBER,
|
||||
TK_CHARACTER,
|
||||
TK_STRING,
|
||||
TK_IDENT,
|
||||
TK_TRUE,
|
||||
|
@ -189,8 +190,6 @@ public:
|
|||
int mOffset;
|
||||
const char * mLine;
|
||||
|
||||
char mCharMap[256];
|
||||
|
||||
const Ident * mTokenIdent;
|
||||
char mTokenString[1024], mTokenChar;
|
||||
|
||||
|
|
Loading…
Reference in New Issue