Fix petscii characters changed includes and pragmas

This commit is contained in:
drmortalwombat 2021-10-10 17:30:57 +02:00
parent 11af372509
commit 0e59af5122
4 changed files with 56 additions and 12 deletions

View File

@ -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;
}

View File

@ -21,6 +21,9 @@ protected:
bool ConsumeToken(Token token);
bool ConsumeTokenIf(Token token);
char mCharMap[256];
void ParsePragma(void);
Declaration* ParseBaseTypeDeclaration(uint32 flags);

View File

@ -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:

View File

@ -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;