ref: 3b2c862320f5001746282186b6c0565ff4716dfa
parent: 230f849229f8443703ab281bd1f1cd3ef4eb6d6e
author: ISSOtm <[email protected]>
date: Tue Feb 11 04:35:19 EST 2020
Make more RGBASM errors print their line number Fixes #379.
--- a/src/asm/fstack.c
+++ b/src/asm/fstack.c
@@ -396,7 +396,9 @@
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 @@
} 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;
--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -366,71 +366,73 @@
* 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 @@
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 @@
ch = 0;
break;
} else {
- errx(1, "Expected a new line after the continuation character.");
+ yyerror("Expected a new line after the continuation character.");
}
}
break;
--- a/src/asm/main.c
+++ b/src/asm/main.c
@@ -142,7 +142,7 @@
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 @@
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 @@
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;
}