/*****************************************************************************/
/* */
-/* scanner.c */
+/* scanner.c */
/* */
-/* Configuration file scanner for the ld65 linker */
+/* Configuration file scanner for the ld65 linker */
/* */
/* */
/* */
/*****************************************************************************/
-/* Data */
+/* Data */
/*****************************************************************************/
/* Current token and attributes */
-cfgtok_t CfgTok;
+cfgtok_t CfgTok;
StrBuf CfgSVal = STATIC_STRBUF_INITIALIZER;
unsigned long CfgIVal;
FilePos CfgErrorPos;
/* Input source for the configuration */
-static const char* CfgName = 0;
+static const char* CfgName = 0;
/* Other input stuff */
-static int C = ' ';
+static int C = ' ';
static FilePos InputPos;
-static FILE* InputFile = 0;
+static FILE* InputFile = 0;
/*****************************************************************************/
-/* Error handling */
+/* Error handling */
/*****************************************************************************/
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
/* Count columns */
if (C != EOF) {
- ++InputPos.Col;
+ ++InputPos.Col;
}
/* Count lines */
if (C == '\n') {
- ++InputPos.Line;
- InputPos.Col = 0;
+ ++InputPos.Line;
+ InputPos.Col = 0;
}
}
/* Return the value for a numeric digit */
{
if (isdigit (C)) {
- return C - '0';
+ return C - '0';
} else {
- return toupper (C) - 'A' + 10;
+ return toupper (C) - 'A' + 10;
}
}
Again:
/* Skip whitespace */
while (isspace (C)) {
- NextChar ();
+ NextChar ();
}
/* Remember the current position */
/* Identifier? */
if (C == '_' || IsAlpha (C)) {
- /* Read the identifier */
- SB_Clear (&CfgSVal);
- while (C == '_' || IsAlNum (C)) {
+ /* Read the identifier */
+ SB_Clear (&CfgSVal);
+ while (C == '_' || IsAlNum (C)) {
SB_AppendChar (&CfgSVal, C);
- NextChar ();
- }
- SB_Terminate (&CfgSVal);
- CfgTok = CFGTOK_IDENT;
- return;
+ NextChar ();
+ }
+ SB_Terminate (&CfgSVal);
+ CfgTok = CFGTOK_IDENT;
+ return;
}
/* Hex number? */
if (C == '$') {
- NextChar ();
- if (!isxdigit (C)) {
- CfgError (&CfgErrorPos, "Hex digit expected");
- }
- CfgIVal = 0;
- while (isxdigit (C)) {
- CfgIVal = CfgIVal * 16 + DigitVal (C);
- NextChar ();
- }
- CfgTok = CFGTOK_INTCON;
- return;
+ NextChar ();
+ if (!isxdigit (C)) {
+ CfgError (&CfgErrorPos, "Hex digit expected");
+ }
+ CfgIVal = 0;
+ while (isxdigit (C)) {
+ CfgIVal = CfgIVal * 16 + DigitVal (C);
+ NextChar ();
+ }
+ CfgTok = CFGTOK_INTCON;
+ return;
}
/* Decimal number? */
if (isdigit (C)) {
- CfgIVal = 0;
- while (isdigit (C)) {
- CfgIVal = CfgIVal * 10 + DigitVal (C);
- NextChar ();
- }
- CfgTok = CFGTOK_INTCON;
- return;
+ CfgIVal = 0;
+ while (isdigit (C)) {
+ CfgIVal = CfgIVal * 10 + DigitVal (C);
+ NextChar ();
+ }
+ CfgTok = CFGTOK_INTCON;
+ return;
}
/* Other characters */
CfgTok = CFGTOK_DIV;
break;
- case '(':
- NextChar ();
- CfgTok = CFGTOK_LPAR;
- break;
-
- case ')':
- NextChar ();
- CfgTok = CFGTOK_RPAR;
- break;
-
- case '{':
- NextChar ();
- CfgTok = CFGTOK_LCURLY;
- break;
-
- case '}':
- NextChar ();
- CfgTok = CFGTOK_RCURLY;
- break;
-
- case ';':
- NextChar ();
- CfgTok = CFGTOK_SEMI;
- break;
-
- case '.':
- NextChar ();
- CfgTok = CFGTOK_DOT;
- break;
-
- case ',':
- NextChar ();
- CfgTok = CFGTOK_COMMA;
- break;
-
- case '=':
- NextChar ();
- CfgTok = CFGTOK_EQ;
- break;
+ case '(':
+ NextChar ();
+ CfgTok = CFGTOK_LPAR;
+ break;
+
+ case ')':
+ NextChar ();
+ CfgTok = CFGTOK_RPAR;
+ break;
+
+ case '{':
+ NextChar ();
+ CfgTok = CFGTOK_LCURLY;
+ break;
+
+ case '}':
+ NextChar ();
+ CfgTok = CFGTOK_RCURLY;
+ break;
+
+ case ';':
+ NextChar ();
+ CfgTok = CFGTOK_SEMI;
+ break;
+
+ case '.':
+ NextChar ();
+ CfgTok = CFGTOK_DOT;
+ break;
+
+ case ',':
+ NextChar ();
+ CfgTok = CFGTOK_COMMA;
+ break;
+
+ case '=':
+ NextChar ();
+ CfgTok = CFGTOK_EQ;
+ break;
case ':':
- NextChar ();
- CfgTok = CFGTOK_COLON;
- break;
+ NextChar ();
+ CfgTok = CFGTOK_COLON;
+ break;
case '\"':
StrVal ();
- break;
+ break;
case '#':
- /* Comment */
- while (C != '\n' && C != EOF) {
- NextChar ();
- }
- if (C != EOF) {
- goto Again;
- }
- CfgTok = CFGTOK_EOF;
- break;
+ /* Comment */
+ while (C != '\n' && C != EOF) {
+ NextChar ();
+ }
+ if (C != EOF) {
+ goto Again;
+ }
+ CfgTok = CFGTOK_EOF;
+ break;
case '%':
- NextChar ();
- switch (C) {
+ NextChar ();
+ switch (C) {
- case 'O':
- NextChar ();
- if (OutputName) {
+ case 'O':
+ NextChar ();
+ if (OutputName) {
SB_CopyStr (&CfgSVal, OutputName);
- } else {
- SB_Clear (&CfgSVal);
- }
+ } else {
+ SB_Clear (&CfgSVal);
+ }
SB_Terminate (&CfgSVal);
OutputNameUsed = 1;
- CfgTok = CFGTOK_STRCON;
- break;
-
- case 'S':
- NextChar ();
- CfgIVal = StartAddr;
- CfgTok = CFGTOK_INTCON;
- break;
-
- default:
- CfgError (&CfgErrorPos, "Invalid format specification");
- }
- break;
+ CfgTok = CFGTOK_STRCON;
+ break;
+
+ case 'S':
+ NextChar ();
+ CfgIVal = StartAddr;
+ CfgTok = CFGTOK_INTCON;
+ break;
+
+ default:
+ CfgError (&CfgErrorPos, "Invalid format specification");
+ }
+ break;
case EOF:
- CfgTok = CFGTOK_EOF;
- break;
+ CfgTok = CFGTOK_EOF;
+ break;
- default:
- CfgError (&CfgErrorPos, "Invalid character `%c'", C);
+ default:
+ CfgError (&CfgErrorPos, "Invalid character `%c'", C);
}
}
/* Skip a token, print an error message if not found */
{
if (CfgTok != T) {
- CfgError (&CfgErrorPos, "%s", Msg);
+ CfgError (&CfgErrorPos, "%s", Msg);
}
CfgNextTok ();
}
/* Consume a comma if there is one */
{
if (CfgTok == CFGTOK_COMMA) {
- CfgNextTok ();
+ CfgNextTok ();
}
}
/* Consume an equal sign if there is one */
{
if (CfgTok == CFGTOK_EQ) {
- CfgNextTok ();
+ CfgNextTok ();
}
}
/* Make sure the next token is an integer */
{
if (CfgTok != CFGTOK_INTCON) {
- CfgError (&CfgErrorPos, "Integer constant expected");
+ CfgError (&CfgErrorPos, "Integer constant expected");
}
}
/* Make sure the next token is a string constant */
{
if (CfgTok != CFGTOK_STRCON) {
- CfgError (&CfgErrorPos, "String constant expected");
+ CfgError (&CfgErrorPos, "String constant expected");
}
}
/* Make sure the next token is an identifier */
{
if (CfgTok != CFGTOK_IDENT) {
- CfgError (&CfgErrorPos, "Identifier expected");
+ CfgError (&CfgErrorPos, "Identifier expected");
}
}
/* Check the range of CfgIVal */
{
if (CfgIVal < Lo || CfgIVal > Hi) {
- CfgError (&CfgErrorPos, "Range error");
+ CfgError (&CfgErrorPos, "Range error");
}
}
/* We need an identifier */
if (CfgTok == CFGTOK_IDENT) {
- /* Make it upper case */
+ /* Make it upper case */
SB_ToUpper (&CfgSVal);
- /* Linear search */
- for (I = 0; I < Size; ++I) {
- if (SB_CompareStr (&CfgSVal, Table[I].Ident) == 0) {
- CfgTok = Table[I].Tok;
- return;
- }
- }
+ /* Linear search */
+ for (I = 0; I < Size; ++I) {
+ if (SB_CompareStr (&CfgSVal, Table[I].Ident) == 0) {
+ CfgTok = Table[I].Tok;
+ return;
+ }
+ }
}
/* Map an identifier or integer to a boolean token */
{
static const IdentTok Booleans [] = {
- { "YES", CFGTOK_TRUE },
- { "NO", CFGTOK_FALSE },
+ { "YES", CFGTOK_TRUE },
+ { "NO", CFGTOK_FALSE },
{ "TRUE", CFGTOK_TRUE },
{ "FALSE", CFGTOK_FALSE },
};
/* If we have an identifier, map it to a boolean token */
if (CfgTok == CFGTOK_IDENT) {
- CfgSpecialToken (Booleans, ENTRY_COUNT (Booleans), "Boolean");
+ CfgSpecialToken (Booleans, ENTRY_COUNT (Booleans), "Boolean");
} else {
- /* We expected an integer here */
- if (CfgTok != CFGTOK_INTCON) {
- CfgError (&CfgErrorPos, "Boolean value expected");
- }
- CfgTok = (CfgIVal == 0)? CFGTOK_FALSE : CFGTOK_TRUE;
+ /* We expected an integer here */
+ if (CfgTok != CFGTOK_INTCON) {
+ CfgError (&CfgErrorPos, "Boolean value expected");
+ }
+ CfgTok = (CfgIVal == 0)? CFGTOK_FALSE : CFGTOK_TRUE;
}
}
/* Close the input file if we had one */
if (InputFile) {
(void) fclose (InputFile);
- InputFile = 0;
+ InputFile = 0;
}
}
-
-
-