From 3b2c862320f5001746282186b6c0565ff4716dfa Mon Sep 17 00:00:00 2001 From: ISSOtm Date: Tue, 11 Feb 2020 09:35:19 +0100 Subject: [PATCH] Make more RGBASM errors print their line number Fixes #379. --- src/asm/fstack.c | 7 +++-- src/asm/lexer.c | 72 +++++++++++++++++++++++++----------------------- src/asm/main.c | 16 +++++------ 3 files changed, 50 insertions(+), 45 deletions(-) diff --git a/src/asm/fstack.c b/src/asm/fstack.c index 7ee2d329..2e9c4832 100644 --- a/src/asm/fstack.c +++ b/src/asm/fstack.c @@ -396,7 +396,9 @@ void fstk_RunInclude(char *tzFileName) oFailedOnMissingInclude = true; return; } - err(1, "Unable to open included file '%s'", tzFileName); + yyerror("Unable to open included file '%s': %s", tzFileName, + strerror(errno)); + return; } pushcontext(); @@ -540,7 +542,8 @@ void fstk_Init(char *pFileName) } else { pCurrentFile = fopen(pFileName, "rb"); if (pCurrentFile == NULL) - err(1, "Unable to open file '%s'", pFileName); + yyerror("Unable to open file '%s': %s", pFileName, + strerror(errno)); } nFileStackDepth = 0; diff --git a/src/asm/lexer.c b/src/asm/lexer.c index 69f3be1e..557e99aa 100644 --- a/src/asm/lexer.c +++ b/src/asm/lexer.c @@ -366,71 +366,73 @@ uint32_t lex_FloatAlloc(const struct sLexFloat *token) * Make sure that only non-zero ASCII characters are used. Also, check if the * start is greater than the end of the range. */ -void lex_CheckCharacterRange(uint16_t start, uint16_t end) +bool lex_CheckCharacterRange(uint16_t start, uint16_t end) { if (start > end || start < 1 || end > 127) { - errx(1, "Invalid character range (start: %u, end: %u)", - start, end); + yyerror("Invalid character range (start: %u, end: %u)", + start, end); + return false; } + return true; } void lex_FloatDeleteRange(uint32_t id, uint16_t start, uint16_t end) { - lex_CheckCharacterRange(start, end); - - while (start <= end) { - tFloatingChars[start] &= ~id; - start++; + if (lex_CheckCharacterRange(start, end)) { + while (start <= end) { + tFloatingChars[start] &= ~id; + start++; + } } } void lex_FloatAddRange(uint32_t id, uint16_t start, uint16_t end) { - lex_CheckCharacterRange(start, end); - - while (start <= end) { - tFloatingChars[start] |= id; - start++; + if (lex_CheckCharacterRange(start, end)) { + while (start <= end) { + tFloatingChars[start] |= id; + start++; + } } } void lex_FloatDeleteFirstRange(uint32_t id, uint16_t start, uint16_t end) { - lex_CheckCharacterRange(start, end); - - while (start <= end) { - tFloatingFirstChar[start] &= ~id; - start++; + if (lex_CheckCharacterRange(start, end)) { + while (start <= end) { + tFloatingFirstChar[start] &= ~id; + start++; + } } } void lex_FloatAddFirstRange(uint32_t id, uint16_t start, uint16_t end) { - lex_CheckCharacterRange(start, end); - - while (start <= end) { - tFloatingFirstChar[start] |= id; - start++; + if (lex_CheckCharacterRange(start, end)) { + while (start <= end) { + tFloatingFirstChar[start] |= id; + start++; + } } } void lex_FloatDeleteSecondRange(uint32_t id, uint16_t start, uint16_t end) { - lex_CheckCharacterRange(start, end); - - while (start <= end) { - tFloatingSecondChar[start] &= ~id; - start++; + if (lex_CheckCharacterRange(start, end)) { + while (start <= end) { + tFloatingSecondChar[start] &= ~id; + start++; + } } } void lex_FloatAddSecondRange(uint32_t id, uint16_t start, uint16_t end) { - lex_CheckCharacterRange(start, end); - - while (start <= end) { - tFloatingSecondChar[start] |= id; - start++; + if (lex_CheckCharacterRange(start, end)) { + while (start <= end) { + tFloatingSecondChar[start] |= id; + start++; + } } } @@ -824,7 +826,7 @@ scanagain: nLineNo++; goto scanagain; } else { - errx(1, "Expected a new line after the continuation character."); + yyerror("Expected a new line after the continuation character."); } } } @@ -974,7 +976,7 @@ static uint32_t yylex_MACROARGS(void) ch = 0; break; } else { - errx(1, "Expected a new line after the continuation character."); + yyerror("Expected a new line after the continuation character."); } } break; diff --git a/src/asm/main.c b/src/asm/main.c index 4cc49c8d..412d5423 100644 --- a/src/asm/main.c +++ b/src/asm/main.c @@ -142,7 +142,7 @@ void opt_Parse(char *s) newopt.gbgfx[2] = s[3]; newopt.gbgfx[3] = s[4]; } else { - errx(1, "Must specify exactly 4 characters for option 'g'"); + yyerror("Must specify exactly 4 characters for option 'g'"); } break; case 'b': @@ -150,7 +150,7 @@ void opt_Parse(char *s) newopt.binary[0] = s[1]; newopt.binary[1] = s[2]; } else { - errx(1, "Must specify exactly 2 characters for option 'b'"); + yyerror("Must specify exactly 2 characters for option 'b'"); } break; case 'z': @@ -159,16 +159,16 @@ void opt_Parse(char *s) unsigned int fillchar; result = sscanf(&s[1], "%x", &fillchar); - if (!((result == EOF) || (result == 1))) - errx(1, "Invalid argument for option 'z'"); - - newopt.fillchar = fillchar; + if (result != EOF && result != 1) + yyerror("Invalid argument for option 'z'"); + else + newopt.fillchar = fillchar; } else { - errx(1, "Invalid argument for option 'z'"); + yyerror("Invalid argument for option 'z'"); } break; default: - fatalerror("Unknown option"); + yyerror("Unknown option"); break; }