diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index b2ec04b..b035372 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -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; } diff --git a/oscar64/Parser.h b/oscar64/Parser.h index 19f1a29..d283396 100644 --- a/oscar64/Parser.h +++ b/oscar64/Parser.h @@ -21,6 +21,9 @@ protected: bool ConsumeToken(Token token); bool ConsumeTokenIf(Token token); + char mCharMap[256]; + + void ParsePragma(void); Declaration* ParseBaseTypeDeclaration(uint32 flags); diff --git a/oscar64/Scanner.cpp b/oscar64/Scanner.cpp index 718bc1c..b08b117 100644 --- a/oscar64/Scanner.cpp +++ b/oscar64/Scanner.cpp @@ -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: diff --git a/oscar64/Scanner.h b/oscar64/Scanner.h index 32bcf88..89b9621 100644 --- a/oscar64/Scanner.h +++ b/oscar64/Scanner.h @@ -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;