Add charmap pragma

This commit is contained in:
drmortalwombat 2021-09-23 08:26:46 +02:00
parent 4ca77ba41a
commit 123da8c155
5 changed files with 55 additions and 1 deletions

5
include/petscii.h Normal file
View File

@ -0,0 +1,5 @@
/* petscii upper charset */
#pragma charmap(97, 65, 26)
#pragma charmap(65, 97, 26)

View File

@ -48,6 +48,7 @@ enum ErrorID
EERR_ASM_INVALD_OPERAND, EERR_ASM_INVALD_OPERAND,
EERR_ASM_INVALID_INSTRUCTION, EERR_ASM_INVALID_INSTRUCTION,
EERR_ASM_INVALID_MODE, EERR_ASM_INVALID_MODE,
EERR_PRAGMA_PARAMETER,
EERR_INVALID_PREPROCESSOR, EERR_INVALID_PREPROCESSOR,
}; };

View File

@ -2531,6 +2531,47 @@ void Parser::ParsePragma(void)
} }
ConsumeToken(TK_CLOSE_PARENTHESIS); ConsumeToken(TK_CLOSE_PARENTHESIS);
} }
else if (!strcmp(mScanner->mTokenIdent->mString, "charmap"))
{
mScanner->NextToken();
ConsumeToken(TK_OPEN_PARENTHESIS);
if (mScanner->mToken == TK_INTEGER)
{
int cindex = mScanner->mTokenInteger;
mScanner->NextToken();
ConsumeToken(TK_COMMA);
if (mScanner->mToken == TK_INTEGER)
{
int ccode = mScanner->mTokenInteger;
int ccount = 1;
mScanner->NextToken();
if (ConsumeTokenIf(TK_COMMA))
{
if (mScanner->mToken == TK_INTEGER)
{
ccount = mScanner->mTokenInteger;
mScanner->NextToken();
}
else
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Character run expected");
}
for (int i = 0; i < ccount; i++)
{
mScanner->mCharMap[cindex] = ccode;
cindex = (cindex + 1) & 255;
ccode = (ccode + 1) & 255;
}
}
else
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Character code expected");
}
else
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Character index expected");
ConsumeToken(TK_CLOSE_PARENTHESIS);
}
else else
{ {
mScanner->NextToken(); mScanner->NextToken();

View File

@ -259,6 +259,9 @@ Scanner::Scanner(Errors* errors, Preprocessor* preprocessor)
mDefines = new MacroDict(); mDefines = new MacroDict();
mDefineArguments = nullptr; mDefineArguments = nullptr;
for (int i = 0; i < 256; i++)
mCharMap[i] = i;
NextChar(); NextChar();
NextToken(); NextToken();
@ -1079,7 +1082,7 @@ void Scanner::StringToken(char terminator)
} }
} }
mTokenString[n++] = mTokenChar; mTokenString[n++] = mCharMap[mTokenChar];
} }
mTokenString[n] = 0; mTokenString[n] = 0;
@ -1147,6 +1150,8 @@ void Scanner::CharToken(void)
} }
} }
mTokenChar = mCharMap[mTokenChar];
mTokenInteger = mTokenChar; mTokenInteger = mTokenChar;
if (mLine[mOffset] && mLine[mOffset] == '\'') if (mLine[mOffset] && mLine[mOffset] == '\'')

View File

@ -180,6 +180,8 @@ public:
int mOffset; int mOffset;
const char * mLine; const char * mLine;
char mCharMap[256];
const Ident * mTokenIdent; const Ident * mTokenIdent;
char mTokenString[1024], mTokenChar; char mTokenString[1024], mTokenChar;