Make fatalerror and yyerror consistent

There are two ways in which the assembly process can fail:

1. If there is a really big problem that compromises the whole process,
   the assembler has to stop right there and generate an error message.
   This happens with unterminated REPT loops, macros, etc.

2. If the problem isn't that big and the process can still continue,
   even though the final result is invalid, the assembler can try to
   continue and warn the user about all errors it finds in the code.

This patch clarifies the use of each function and replaces the function
used in two places by the correct one.

Signed-off-by: Antonio Niño Díaz <antonio_nd@outlook.com>
This commit is contained in:
Antonio Niño Díaz
2017-04-29 15:02:57 +01:00
parent 4228e3e890
commit ff2321a8ce
3 changed files with 21 additions and 3 deletions

View File

@@ -26,8 +26,25 @@ extern void opt_Push(void);
extern void opt_Pop(void); extern void opt_Pop(void);
extern void opt_Parse(char *s); extern void opt_Parse(char *s);
/*
* Used for errors that compromise the whole assembly process by affecting the
* folliwing code, potencially making the assembler generate errors caused by
* the first one and unrelated to the code that the assembler complains about.
* It is also used when the assembler goes into an invalid state (for example,
* when it fails to allocate memory).
*/
noreturn void fatalerror(const char *fmt, ...); noreturn void fatalerror(const char *fmt, ...);
/*
* Used for errors that make it impossible to assemble correctly, but don't
* affect the following code. The code will fail to assemble but the user will
* get a list of all errors at the end, making it easier to fix all of them at
* once.
*/
void yyerror(const char *fmt, ...); void yyerror(const char *fmt, ...);
/*
* Used to warn the user about problems that don't prevent the generation of
* valid code.
*/
void warning(const char *fmt, ...); void warning(const char *fmt, ...);
#define YY_FATAL_ERROR fatalerror #define YY_FATAL_ERROR fatalerror

View File

@@ -535,7 +535,7 @@ yylex_ReadBracketedSymbol(char *dest, size_t index)
if (*pLexBuffer == '}') if (*pLexBuffer == '}')
pLexBuffer++; pLexBuffer++;
else else
yyerror("Missing }"); fatalerror("Missing }");
return length; return length;
} }
@@ -601,7 +601,7 @@ yylex_ReadQuotedString()
if (*pLexBuffer == '"') if (*pLexBuffer == '"')
pLexBuffer++; pLexBuffer++;
else else
yyerror("Unterminated string"); fatalerror("Unterminated string");
} }
ULONG ULONG

View File

@@ -480,7 +480,8 @@ checksectionoverflow(ULONG delta_size)
/* /*
* This check is here to trap broken code that generates * This check is here to trap broken code that generates
* sections that are too big and to prevent the assembler from * sections that are too big and to prevent the assembler from
* generating huge object files. * generating huge object files or trying to allocate too much
* memory.
* The real check must be done at the linking stage. * The real check must be done at the linking stage.
*/ */
fatalerror("Section '%s' is too big (max size = 0x%X bytes).", fatalerror("Section '%s' is too big (max size = 0x%X bytes).",