Make newlines explicit in error messages

In preparation for a change a PR is about to make
This commit is contained in:
ISSOtm
2020-09-27 10:54:06 +02:00
parent c0808246e5
commit a1286e6f0e
15 changed files with 288 additions and 319 deletions

View File

@@ -62,6 +62,6 @@ noreturn_ void fatalerror(const char *fmt, ...);
* 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 error(const char *fmt, ...);
#endif

View File

@@ -51,11 +51,11 @@ size_t symvaluetostring(char *dest, size_t maxLength, char *symName,
size_t i;
if (mode)
yyerror("Print types are only allowed for numbers");
error("Print types are only allowed for numbers\n");
for (i = 0; src[i] != 0; i++) {
if (i >= maxLength)
fatalerror("Symbol value too long to fit buffer");
fatalerror("Symbol value too long to fit buffer\n");
dest[i] = src[i];
}
@@ -85,11 +85,11 @@ size_t symvaluetostring(char *dest, size_t maxLength, char *symName,
}
if (fullLength < 0) {
fatalerror("snprintf encoding error");
fatalerror("snprintf encoding error\n");
} else {
length = (size_t)fullLength;
if (length > maxLength)
fatalerror("Symbol value too long to fit buffer");
fatalerror("Symbol value too long to fit buffer\n");
}
}
@@ -161,7 +161,7 @@ static void copyrept(void)
}
if (level != 0)
fatalerror("Unterminated REPT block");
fatalerror("Unterminated REPT block\n");
len = src - pCurrentBuffer->pBuffer - 4;
@@ -171,7 +171,7 @@ static void copyrept(void)
tzNewMacro = malloc(ulNewMacroSize + 1);
if (tzNewMacro == NULL)
fatalerror("Not enough memory for REPT block.");
fatalerror("Not enough memory for REPT block.\n");
uint32_t i;
@@ -231,7 +231,7 @@ static void copymacro(void)
}
if (level != 0)
fatalerror("Unterminated MACRO definition.");
fatalerror("Unterminated MACRO definition.\n");
len = src - pCurrentBuffer->pBuffer - 4;
@@ -240,7 +240,7 @@ static void copymacro(void)
tzNewMacro = (char *)malloc(ulNewMacroSize + 1);
if (tzNewMacro == NULL)
fatalerror("Not enough memory for MACRO definition.");
fatalerror("Not enough memory for MACRO definition.\n");
uint32_t i;
@@ -329,7 +329,7 @@ static void if_skip_to_else(void)
}
if (level != 0)
fatalerror("Unterminated IF construct");
fatalerror("Unterminated IF construct\n");
int32_t len = src - pCurrentBuffer->pBuffer;
@@ -374,7 +374,7 @@ static void if_skip_to_endc(void)
}
if (level != 0)
fatalerror("Unterminated IF construct");
fatalerror("Unterminated IF construct\n");
int32_t len = src - pCurrentBuffer->pBuffer;
@@ -392,7 +392,7 @@ static size_t strlenUTF8(const char *s)
while (*s) {
switch (decode(&state, &codep, (uint8_t)*s)) {
case 1:
fatalerror("STRLEN: Invalid UTF-8 character");
fatalerror("STRLEN: Invalid UTF-8 character\n");
break;
case 0:
len++;
@@ -403,7 +403,7 @@ static size_t strlenUTF8(const char *s)
/* Check for partial code point. */
if (state != 0)
fatalerror("STRLEN: Invalid UTF-8 character");
fatalerror("STRLEN: Invalid UTF-8 character\n");
return len;
}
@@ -418,7 +418,7 @@ static void strsubUTF8(char *dest, const char *src, uint32_t pos, uint32_t len)
uint32_t curLen = 0;
if (pos < 1) {
warning(WARNING_BUILTIN_ARG, "STRSUB: Position starts at 1");
warning(WARNING_BUILTIN_ARG, "STRSUB: Position starts at 1\n");
pos = 1;
}
@@ -426,7 +426,7 @@ static void strsubUTF8(char *dest, const char *src, uint32_t pos, uint32_t len)
while (src[srcIndex] && curPos < pos) {
switch (decode(&state, &codep, (uint8_t)src[srcIndex])) {
case 1:
fatalerror("STRSUB: Invalid UTF-8 character");
fatalerror("STRSUB: Invalid UTF-8 character\n");
break;
case 0:
curPos++;
@@ -436,14 +436,15 @@ static void strsubUTF8(char *dest, const char *src, uint32_t pos, uint32_t len)
}
if (!src[srcIndex] && len)
warning(WARNING_BUILTIN_ARG, "STRSUB: Position %lu is past the end of the string",
warning(WARNING_BUILTIN_ARG,
"STRSUB: Position %lu is past the end of the string\n",
(unsigned long)pos);
/* Copy from source to destination. */
while (src[srcIndex] && destIndex < MAXSTRLEN && curLen < len) {
switch (decode(&state, &codep, (uint8_t)src[srcIndex])) {
case 1:
fatalerror("STRSUB: Invalid UTF-8 character");
fatalerror("STRSUB: Invalid UTF-8 character\n");
break;
case 0:
curLen++;
@@ -453,11 +454,11 @@ static void strsubUTF8(char *dest, const char *src, uint32_t pos, uint32_t len)
}
if (curLen < len)
warning(WARNING_BUILTIN_ARG, "STRSUB: Length too big: %lu", (unsigned long)len);
warning(WARNING_BUILTIN_ARG, "STRSUB: Length too big: %lu\n", (unsigned long)len);
/* Check for partial code point. */
if (state != 0)
fatalerror("STRSUB: Invalid UTF-8 character");
fatalerror("STRSUB: Invalid UTF-8 character\n");
dest[destIndex] = 0;
}
@@ -466,13 +467,12 @@ static inline void failAssert(enum AssertionType type)
{
switch (type) {
case ASSERT_FATAL:
fatalerror("Assertion failed");
fatalerror("Assertion failed\n");
case ASSERT_ERROR:
yyerror("Assertion failed");
error("Assertion failed\n");
break;
case ASSERT_WARN:
warning(WARNING_ASSERT,
"Assertion failed");
warning(WARNING_ASSERT, "Assertion failed\n");
break;
}
}
@@ -481,17 +481,18 @@ static inline void failAssertMsg(enum AssertionType type, char const *msg)
{
switch (type) {
case ASSERT_FATAL:
fatalerror("Assertion failed: %s", msg);
fatalerror("Assertion failed: %s\n", msg);
case ASSERT_ERROR:
yyerror("Assertion failed: %s", msg);
error("Assertion failed: %s\n", msg);
break;
case ASSERT_WARN:
warning(WARNING_ASSERT,
"Assertion failed: %s", msg);
warning(WARNING_ASSERT, "Assertion failed: %s\n", msg);
break;
}
}
#define yyerror(str) error(str "\n")
%}
%union
@@ -674,7 +675,7 @@ line : label
;
scoped_label_bare : T_LABEL {
warning(WARNING_OBSOLETE, "Non-local labels without a colon are deprecated");
warning(WARNING_OBSOLETE, "Non-local labels without a colon are deprecated\n");
strcpy($$, $1);
}
| T_LOCAL_ID {
@@ -784,17 +785,15 @@ simple_pseudoop : include
align : T_OP_ALIGN uconst {
if ($2 > 16)
yyerror("Alignment must be between 0 and 16, not %u",
$2);
error("Alignment must be between 0 and 16, not %u\n", $2);
else
sect_AlignPC($2, 0);
}
| T_OP_ALIGN uconst ',' uconst {
if ($2 > 16)
yyerror("Alignment must be between 0 and 16, not %u",
$2);
error("Alignment must be between 0 and 16, not %u\n", $2);
else if ($4 >= 1 << $2)
yyerror("Offset must be between 0 and %u, not %u",
error("Offset must be between 0 and %u, not %u\n",
(1 << $2) - 1, $4);
else
sect_AlignPC($2, $4);
@@ -827,10 +826,10 @@ pops : T_POP_POPS { out_PopSection(); }
pushs : T_POP_PUSHS { out_PushSection(); }
;
fail : T_POP_FAIL string { fatalerror("%s", $2); }
fail : T_POP_FAIL string { fatalerror("%s\n", $2); }
;
warn : T_POP_WARN string { warning(WARNING_USER, "%s", $2); }
warn : T_POP_WARN string { warning(WARNING_USER, "%s\n", $2); }
;
assert_type : /* empty */ { $$ = ASSERT_ERROR; }
@@ -844,7 +843,7 @@ assert : T_POP_ASSERT assert_type relocexpr
if (!rpn_isKnown(&$3)) {
if (!out_CreateAssert($2, &$3, "",
sect_GetOutputOffset()))
yyerror("Assertion creation failed: %s",
error("Assertion creation failed: %s\n",
strerror(errno));
} else if ($3.nVal == 0) {
failAssert($2);
@@ -856,7 +855,7 @@ assert : T_POP_ASSERT assert_type relocexpr
if (!rpn_isKnown(&$3)) {
if (!out_CreateAssert($2, &$3, $5,
sect_GetOutputOffset()))
yyerror("Assertion creation failed: %s",
error("Assertion creation failed: %s\n",
strerror(errno));
} else if ($3.nVal == 0) {
failAssertMsg($2, $5);
@@ -949,21 +948,24 @@ ds : T_POP_DS uconst { out_Skip($2, true); }
/* Authorize empty entries if there is only one */
db : T_POP_DB constlist_8bit_entry ',' constlist_8bit {
if (nListCountEmpty > 0)
warning(WARNING_EMPTY_ENTRY, "Empty entry in list of 8-bit elements (treated as padding).");
warning(WARNING_EMPTY_ENTRY,
"Empty entry in list of 8-bit elements (treated as padding).\n");
}
| T_POP_DB constlist_8bit_entry
;
dw : T_POP_DW constlist_16bit_entry ',' constlist_16bit {
if (nListCountEmpty > 0)
warning(WARNING_EMPTY_ENTRY, "Empty entry in list of 16-bit elements (treated as padding).");
warning(WARNING_EMPTY_ENTRY,
"Empty entry in list of 16-bit elements (treated as padding).\n");
}
| T_POP_DW constlist_16bit_entry
;
dl : T_POP_DL constlist_32bit_entry ',' constlist_32bit {
if (nListCountEmpty > 0)
warning(WARNING_EMPTY_ENTRY, "Empty entry in list of 32-bit elements (treated as padding).");
warning(WARNING_EMPTY_ENTRY,
"Empty entry in list of 32-bit elements (treated as padding).\n");
}
| T_POP_DL constlist_32bit_entry
;
@@ -987,10 +989,11 @@ export : export_token export_list
export_token : T_POP_EXPORT
| T_POP_GLOBAL {
warning(WARNING_OBSOLETE, "`GLOBAL` is a deprecated synonym for `EXPORT`");
warning(WARNING_OBSOLETE,
"`GLOBAL` is a deprecated synonym for `EXPORT`\n");
}
| T_POP_XDEF {
warning(WARNING_OBSOLETE, "`XDEF` is a deprecated synonym for `EXPORT`");
warning(WARNING_OBSOLETE, "`XDEF` is a deprecated synonym for `EXPORT`\n");
}
;
@@ -1034,10 +1037,10 @@ incbin : T_POP_INCBIN string {
charmap : T_POP_CHARMAP string ',' const {
if ($4 < INT8_MIN || $4 > UINT8_MAX)
warning(WARNING_TRUNCATION, "Expression must be 8-bit");
warning(WARNING_TRUNCATION, "Expression must be 8-bit\n");
if (charmap_Add($2, (uint8_t)$4) == -1)
yyerror("Error adding new charmap mapping: %s\n", strerror(errno));
error("Error adding new charmap mapping: %s\n", strerror(errno));
}
;
@@ -1075,7 +1078,7 @@ if : T_POP_IF const {
elif : T_POP_ELIF const {
if (nIFDepth <= 0)
fatalerror("Found ELIF outside an IF construct");
fatalerror("Found ELIF outside an IF construct\n");
if (skipElif) {
/*
@@ -1107,7 +1110,7 @@ elif : T_POP_ELIF const {
else : T_POP_ELSE {
if (nIFDepth <= 0)
fatalerror("Found ELSE outside an IF construct");
fatalerror("Found ELSE outside an IF construct\n");
/* Continue parsing at ENDC keyword */
if_skip_to_endc();
@@ -1116,7 +1119,7 @@ else : T_POP_ELSE {
endc : T_POP_ENDC {
if (nIFDepth <= 0)
fatalerror("Found ENDC outside an IF construct");
fatalerror("Found ENDC outside an IF construct\n");
nIFDepth--;
}
@@ -1126,7 +1129,7 @@ const_3bit : const {
int32_t value = $1;
if ((value < 0) || (value > 7)) {
yyerror("Immediate value must be 3-bit");
error("Immediate value must be 3-bit\n");
$$ = 0;
} else {
$$ = value & 0x7;
@@ -1177,7 +1180,7 @@ constlist_32bit_entry : /* empty */ {
reloc_8bit : relocexpr {
if(rpn_isKnown(&$1)
&& ($1.nVal < -128 || $1.nVal > 255))
warning(WARNING_TRUNCATION, "Expression must be 8-bit");
warning(WARNING_TRUNCATION, "Expression must be 8-bit\n");
$$ = $1;
}
;
@@ -1185,7 +1188,7 @@ reloc_8bit : relocexpr {
reloc_8bit_no_str : relocexpr_no_str {
if(rpn_isKnown(&$1)
&& ($1.nVal < -128 || $1.nVal > 255))
warning(WARNING_TRUNCATION, "Expression must be 8-bit");
warning(WARNING_TRUNCATION, "Expression must be 8-bit\n");
$$ = $1;
}
;
@@ -1193,7 +1196,7 @@ reloc_8bit_no_str : relocexpr_no_str {
reloc_16bit : relocexpr {
if (rpn_isKnown(&$1)
&& ($1.nVal < -32768 || $1.nVal > 65535))
warning(WARNING_TRUNCATION, "Expression must be 16-bit");
warning(WARNING_TRUNCATION, "Expression must be 16-bit\n");
$$ = $1;
}
;
@@ -1342,14 +1345,14 @@ relocexpr_no_str : scoped_id { rpn_Symbol(&$$, $1); }
uconst : const {
$$ = $1;
if ($$ < 0)
fatalerror("Constant mustn't be negative: %d",
fatalerror("Constant mustn't be negative: %d\n",
$1);
}
;
const : relocexpr {
if (!rpn_isKnown(&$1)) {
yyerror("Expected constant expression: %s",
error("Expected constant expression: %s\n",
$1.reason);
$$ = 0;
} else {
@@ -1360,28 +1363,25 @@ const : relocexpr {
string : T_STRING {
if (snprintf($$, MAXSTRLEN + 1, "%s", $1) > MAXSTRLEN)
warning(WARNING_LONG_STR, "String is too long '%s'",
$1);
warning(WARNING_LONG_STR, "String is too long '%s'\n", $1);
}
| T_OP_STRSUB '(' string ',' uconst ',' uconst ')' {
strsubUTF8($$, $3, $5, $7);
}
| T_OP_STRCAT '(' string ',' string ')' {
if (snprintf($$, MAXSTRLEN + 1, "%s%s", $3, $5) > MAXSTRLEN)
warning(WARNING_LONG_STR, "STRCAT: String too long '%s%s'",
warning(WARNING_LONG_STR, "STRCAT: String too long '%s%s'\n",
$3, $5);
}
| T_OP_STRUPR '(' string ')' {
if (snprintf($$, MAXSTRLEN + 1, "%s", $3) > MAXSTRLEN)
warning(WARNING_LONG_STR, "STRUPR: String too long '%s'",
$3);
warning(WARNING_LONG_STR, "STRUPR: String too long '%s'\n", $3);
upperstring($$);
}
| T_OP_STRLWR '(' string ')' {
if (snprintf($$, MAXSTRLEN + 1, "%s", $3) > MAXSTRLEN)
warning(WARNING_LONG_STR, "STRUPR: String too long '%s'",
$3);
warning(WARNING_LONG_STR, "STRUPR: String too long '%s'\n", $3);
lowerstring($$);
}
@@ -1410,7 +1410,7 @@ sectiontype : T_SECT_WRAM0 { $$ = SECTTYPE_WRAM0; }
sectorg : /* empty */ { $$ = -1; }
| '[' uconst ']' {
if ($2 < 0 || $2 >= 0x10000) {
yyerror("Address $%x is not 16-bit", $2);
error("Address $%x is not 16-bit\n", $2);
$$ = -1;
} else {
$$ = $2;
@@ -1425,19 +1425,17 @@ sectattrs : /* empty */ {
}
| sectattrs ',' T_OP_ALIGN '[' uconst ']' {
if ($5 > 16)
yyerror("Alignment must be between 0 and 16, not %u",
$5);
error("Alignment must be between 0 and 16, not %u\n", $5);
else
$$.alignment = $5;
}
| sectattrs ',' T_OP_ALIGN '[' uconst ',' uconst ']' {
if ($5 > 16) {
yyerror("Alignment must be between 0 and 16, not %u",
$5);
error("Alignment must be between 0 and 16, not %u\n", $5);
} else {
$$.alignment = $5;
if ($7 >= 1 << $$.alignment)
yyerror("Alignment offset must not be greater than alignment (%u < %u)",
error("Alignment offset must not be greater than alignment (%u < %u)\n",
$7, 1 << $$.alignment);
else
$$.alignOfs = $7;
@@ -1701,7 +1699,7 @@ z80_ld_r : T_Z80_LD reg_r ',' reloc_8bit {
}
| T_Z80_LD reg_r ',' reg_r {
if (($2 == REG_HL_IND) && ($4 == REG_HL_IND))
yyerror("LD [HL],[HL] not a valid instruction");
error("LD [HL],[HL] not a valid instruction\n");
else
out_AbsByte(0x40 | ($2 << 3) | $4);
}
@@ -1711,13 +1709,13 @@ z80_ld_a : T_Z80_LD reg_r ',' c_ind {
if ($2 == REG_A)
out_AbsByte(0xF2);
else
yyerror("Destination operand must be A");
error("Destination operand must be A\n");
}
| T_Z80_LD reg_r ',' reg_rr {
if ($2 == REG_A)
out_AbsByte(0x0A | ($4 << 4));
else
yyerror("Destination operand must be A");
error("Destination operand must be A\n");
}
| T_Z80_LD reg_r ',' op_mem_ind {
if ($2 == REG_A) {
@@ -1731,7 +1729,7 @@ z80_ld_a : T_Z80_LD reg_r ',' c_ind {
out_RelWord(&$4);
}
} else {
yyerror("Destination operand must be A");
error("Destination operand must be A\n");
rpn_Free(&$4);
}
}

View File

@@ -61,19 +61,19 @@ struct Charmap *charmap_New(const char *name, const char *baseName)
base = charmap_Get(baseName);
if (base == NULL)
yyerror("Base charmap '%s' doesn't exist", baseName);
error("Base charmap '%s' doesn't exist\n", baseName);
}
struct Charmap *charmap = charmap_Get(name);
if (charmap != NULL) {
yyerror("Charmap '%s' already exists", name);
error("Charmap '%s' already exists\n", name);
return NULL;
}
charmap = malloc(sizeof(*charmap));
if (charmap == NULL)
fatalerror("Failed to create charmap: %s", strerror(errno));
fatalerror("Failed to create charmap: %s\n", strerror(errno));
/* Init the new charmap's fields */
snprintf(charmap->name, sizeof(charmap->name), "%s", name);
@@ -100,7 +100,7 @@ void charmap_Set(const char *name)
struct Charmap *charmap = charmap_Get(name);
if (charmap == NULL)
yyerror("Charmap '%s' doesn't exist", name);
error("Charmap '%s' doesn't exist\n", name);
else
currentCharmap = charmap;
}
@@ -111,7 +111,7 @@ void charmap_Push(void)
stackEntry = malloc(sizeof(struct CharmapStackEntry));
if (stackEntry == NULL)
fatalerror("No memory for charmap stack");
fatalerror("No memory for charmap stack\n");
stackEntry->charmap = currentCharmap;
stackEntry->next = charmapStack;
@@ -122,7 +122,7 @@ void charmap_Push(void)
void charmap_Pop(void)
{
if (charmapStack == NULL)
fatalerror("No entries in the charmap stack");
fatalerror("No entries in the charmap stack\n");
struct CharmapStackEntry *top = charmapStack;
@@ -182,7 +182,8 @@ int32_t charmap_Convert(char **input)
output = malloc(strlen(*input));
if (output == NULL)
fatalerror("Not enough memory for buffer");
fatalerror("Not enough memory for charmap conversion buffer: %s\n",
strerror(errno));
length = 0;

View File

@@ -70,7 +70,7 @@ static void pushcontext(void)
struct sContext **ppFileStack;
if (++nFileStackDepth > nMaxRecursionDepth)
fatalerror("Recursion limit (%u) exceeded", nMaxRecursionDepth);
fatalerror("Recursion limit (%u) exceeded\n", nMaxRecursionDepth);
ppFileStack = &pFileStack;
while (*ppFileStack)
@@ -79,7 +79,7 @@ static void pushcontext(void)
*ppFileStack = malloc(sizeof(struct sContext));
if (*ppFileStack == NULL)
fatalerror("No memory for context");
fatalerror("No memory for context\n");
(*ppFileStack)->FlexHandle = CurrentFlexHandle;
(*ppFileStack)->next = NULL;
@@ -104,7 +104,7 @@ static void pushcontext(void)
(*ppFileStack)->nREPTBodyLastLine = nCurrentREPTBodyLastLine;
break;
default:
fatalerror("%s: Internal error.", __func__);
fatalerror("%s: Internal error.\n", __func__);
}
(*ppFileStack)->uniqueID = macro_GetUniqueID();
@@ -147,7 +147,7 @@ static int32_t popcontext(void)
*/
sprintf(pREPTIterationWritePtr, "%lu",
nREPTIterationNo);
fatalerror("Cannot write REPT count to file path");
fatalerror("Cannot write REPT count to file path\n");
}
nLineNo = nCurrentREPTBodyFirstLine;
@@ -208,7 +208,7 @@ static int32_t popcontext(void)
nCurrentREPTBodyFirstLine = pLastFile->nREPTBodyFirstLine;
break;
default:
fatalerror("%s: Internal error.", __func__);
fatalerror("%s: Internal error.\n", __func__);
}
macro_SetUniqueID(pLastFile->uniqueID);
@@ -237,7 +237,7 @@ int32_t fstk_GetLine(void)
case STAT_isREPTBlock:
break; /* Peek top file of the stack */
default:
fatalerror("%s: Internal error.", __func__);
fatalerror("%s: Internal error.\n", __func__);
}
pLastFile = pFileStack;
@@ -254,7 +254,7 @@ int32_t fstk_GetLine(void)
* This is only reached if the lexer is in REPT or MACRO mode but there
* are no saved contexts with the origin of said REPT or MACRO.
*/
fatalerror("%s: Internal error.", __func__);
fatalerror("%s: Internal error.\n", __func__);
}
int yywrap(void)
@@ -290,8 +290,7 @@ void fstk_DumpToStr(char *buf, size_t buflen)
retcode = snprintf(&buf[buflen - len], len, "%s(%" PRId32 ") -> ",
pLastFile->tzFileName, pLastFile->nLine);
if (retcode < 0)
fatalerror("Failed to dump file stack to string: %s",
strerror(errno));
fatalerror("Failed to dump file stack to string: %s\n", strerror(errno));
else if (retcode >= len)
len = 0;
else
@@ -302,15 +301,14 @@ void fstk_DumpToStr(char *buf, size_t buflen)
retcode = snprintf(&buf[buflen - len], len, "%s(%" PRId32 ")",
tzCurrentFileName, nLineNo);
if (retcode < 0)
fatalerror("Failed to dump file stack to string: %s",
strerror(errno));
fatalerror("Failed to dump file stack to string: %s\n", strerror(errno));
else if (retcode >= len)
len = 0;
else
len -= retcode;
if (!len)
warning(WARNING_LONG_STR, "File stack dump too long, got truncated");
warning(WARNING_LONG_STR, "File stack dump too long, got truncated\n");
}
/*
@@ -333,7 +331,7 @@ void fstk_DumpStringExpansions(void)
void fstk_AddIncludePath(char *s)
{
if (NextIncPath == MAXINCPATHS)
fatalerror("Too many include directories passed from command line");
fatalerror("Too many include directories passed from command line\n");
// Find last occurrence of slash; is it at the end of the string?
char const *lastSlash = strrchr(s, '/');
@@ -341,7 +339,7 @@ void fstk_AddIncludePath(char *s)
if (snprintf(IncludePaths[NextIncPath++], _MAX_PATH, pattern,
s) >= _MAX_PATH)
fatalerror("Include path too long '%s'", s);
fatalerror("Include path too long '%s'\n", s);
}
static void printdep(const char *fileName)
@@ -425,8 +423,7 @@ void fstk_RunInclude(char *tzFileName)
oFailedOnMissingInclude = true;
return;
}
yyerror("Unable to open included file '%s': %s", tzFileName,
strerror(errno));
error("Unable to open included file '%s': %s\n", tzFileName, strerror(errno));
return;
}
@@ -456,11 +453,11 @@ void fstk_RunMacro(char *s, struct MacroArgs *args)
int nPrintedChars;
if (sym == NULL) {
yyerror("Macro \"%s\" not defined", s);
error("Macro \"%s\" not defined\n", s);
return;
}
if (sym->type != SYM_MACRO) {
yyerror("\"%s\" is not a macro", s);
error("\"%s\" is not a macro\n", s);
return;
}
@@ -474,7 +471,7 @@ void fstk_RunMacro(char *s, struct MacroArgs *args)
"%s::%s", sym->fileName, s);
if (nPrintedChars > _MAX_PATH) {
popcontext();
fatalerror("File name + macro name is too large to fit into buffer");
fatalerror("File name + macro name is too large to fit into buffer\n");
}
pCurrentMacro = sym;
@@ -505,8 +502,7 @@ void fstk_RunRept(uint32_t count, int32_t nReptLineNo)
nLineNo = nReptLineNo;
if (strlen(tzCurrentFileName) + strlen(tzReptStr) > _MAX_PATH)
fatalerror("Cannot append \"%s\" to file path",
tzReptStr);
fatalerror("Cannot append \"%s\" to file path\n", tzReptStr);
strcat(tzCurrentFileName, tzReptStr);
CurrentFlexHandle =
@@ -530,7 +526,7 @@ void fstk_Init(char *pFileName)
// minus 2 to account for trailing "\"\0"
// minus 1 to avoid a buffer overflow in extreme cases
while (*c && fileNameIndex < sizeof(tzSymFileName) - 2 - 1) {
if (*c == '"') {
tzSymFileName[fileNameIndex++] = '\\';
}
@@ -550,8 +546,7 @@ void fstk_Init(char *pFileName)
} else {
pCurrentFile = fopen(pFileName, "rb");
if (pCurrentFile == NULL)
fatalerror("Unable to open file '%s': %s", pFileName,
strerror(errno));
fatalerror("Unable to open file '%s': %s\n", pFileName, strerror(errno));
}
nFileStackDepth = 0;

View File

@@ -110,7 +110,7 @@ static int32_t ascii2bin(char *s)
* There are no digits after the radix prefix
* (or the string is empty, which shouldn't happen).
*/
yyerror("Invalid integer constant");
error("Invalid integer constant\n");
} else if (radix == 4) {
int32_t size = 0;
int32_t c;
@@ -126,7 +126,7 @@ static int32_t ascii2bin(char *s)
* the Game Boy tile width, produces a nonsensical result.
*/
if (size > 8) {
warning(WARNING_LARGE_CONSTANT, "Graphics constant '%s' is too long",
warning(WARNING_LARGE_CONSTANT, "Graphics constant '%s' is too long\n",
start);
}
} else {
@@ -143,7 +143,7 @@ static int32_t ascii2bin(char *s)
}
if (overflow)
warning(WARNING_LARGE_CONSTANT, "Integer constant '%s' is too large",
warning(WARNING_LARGE_CONSTANT, "Integer constant '%s' is too large\n",
start);
}
@@ -176,7 +176,7 @@ uint32_t ParseNumber(char *s, uint32_t size)
char dest[256];
if (size > 255)
fatalerror("Number token too long");
fatalerror("Number token too long\n");
strncpy(dest, s, size);
dest[size] = 0;
@@ -201,10 +201,10 @@ char const *AppendMacroArg(char whichArg, char *dest, size_t *destIndex)
else if (whichArg >= '1' && whichArg <= '9')
marg = macro_GetArg(whichArg - '0');
else
fatalerror("Invalid macro argument '\\%c' in symbol", whichArg);
fatalerror("Invalid macro argument '\\%c' in symbol\n", whichArg);
if (!marg)
fatalerror("Macro argument '\\%c' not defined", whichArg);
fatalerror("Macro argument '\\%c' not defined\n", whichArg);
char ch;
@@ -217,7 +217,7 @@ char const *AppendMacroArg(char whichArg, char *dest, size_t *destIndex)
|| ch == '#'
|| ch == '.') {
if (*destIndex >= MAXSYMLEN)
fatalerror("Symbol too long");
fatalerror("Symbol too long\n");
dest[*destIndex] = ch;
(*destIndex)++;
@@ -256,7 +256,7 @@ uint32_t ParseSymbol(char *src, uint32_t size)
break;
} else {
if (destIndex >= MAXSYMLEN)
fatalerror("Symbol too long");
fatalerror("Symbol too long\n");
dest[destIndex++] = ch;
}
}
@@ -311,9 +311,9 @@ uint32_t PutMacroArg(char *src, uint32_t size)
if (s != NULL)
yyunputstr(s);
else
yyerror("Macro argument '\\%c' not defined", src[1]);
error("Macro argument '\\%c' not defined\n", src[1]);
} else {
yyerror("Invalid macro argument '\\%c'", src[1]);
error("Invalid macro argument '\\%c'\n", src[1]);
}
return 0;
}
@@ -330,7 +330,7 @@ uint32_t PutUniqueID(char *src, uint32_t size)
if (s != NULL)
yyunputstr(s);
else
yyerror("Macro unique label string not defined");
error("Macro unique label string not defined\n");
return 0;
}

View File

@@ -89,7 +89,7 @@ void yyunputbytes(uint32_t count)
void yyunput(char c)
{
if (pLexBuffer <= pLexBufferRealStart)
fatalerror("Buffer safety margin exceeded");
fatalerror("Buffer safety margin exceeded\n");
*(--pLexBuffer) = c;
}
@@ -107,7 +107,7 @@ void yyunputstr(const char *s)
* Refer to https://github.com/rednex/rgbds/pull/411#discussion_r319779797
*/
if (pLexBuffer - pLexBufferRealStart < len)
fatalerror("Buffer safety margin exceeded");
fatalerror("Buffer safety margin exceeded\n");
pLexBuffer -= len;
@@ -121,15 +121,14 @@ void yyunputstr(const char *s)
void lex_BeginStringExpansion(const char *tzName)
{
if (++nNbStringExpansions > nMaxRecursionDepth)
fatalerror("Recursion limit (%u) exceeded", nMaxRecursionDepth);
fatalerror("Recursion limit (%u) exceeded\n", nMaxRecursionDepth);
struct sStringExpansionPos *pNewStringExpansion =
malloc(sizeof(*pNewStringExpansion));
char *tzNewExpansionName = strdup(tzName);
if (!pNewStringExpansion || !tzNewExpansionName)
fatalerror("Could not allocate memory to expand '%s'",
tzName);
fatalerror("Could not allocate memory to expand '%s'\n", tzName);
pNewStringExpansion->tzName = tzNewExpansionName;
pNewStringExpansion->pBuffer = pLexBufferRealStart;
@@ -196,14 +195,14 @@ YY_BUFFER_STATE yy_scan_bytes(char const *mem, uint32_t size)
YY_BUFFER_STATE pBuffer = malloc(sizeof(struct yy_buffer_state));
if (pBuffer == NULL)
fatalerror("%s: Out of memory!", __func__);
fatalerror("%s: Out of memory!\n", __func__);
size_t capacity = size + 3; /* space for 2 newlines and terminator */
pBuffer->pBufferRealStart = malloc(capacity + SAFETYMARGIN);
if (pBuffer->pBufferRealStart == NULL)
fatalerror("%s: Out of memory for buffer!", __func__);
fatalerror("%s: Out of memory for buffer!\n", __func__);
pBuffer->pBufferStart = pBuffer->pBufferRealStart + SAFETYMARGIN;
pBuffer->pBuffer = pBuffer->pBufferRealStart + SAFETYMARGIN;
@@ -221,7 +220,7 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
YY_BUFFER_STATE pBuffer = malloc(sizeof(struct yy_buffer_state));
if (pBuffer == NULL)
fatalerror("%s: Out of memory!", __func__);
fatalerror("%s: Out of memory!\n", __func__);
size_t size = 0, capacity = -1;
char *buf = NULL;
@@ -263,7 +262,7 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
buf = realloc(buf, capacity + SAFETYMARGIN + 3);
if (buf == NULL)
fatalerror("%s: Out of memory for buffer!",
fatalerror("%s: Out of memory for buffer!\n",
__func__);
}
@@ -271,7 +270,7 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
size_t read_count = fread(bufpos, 1, capacity - size, f);
if (read_count == 0 && !feof(f))
fatalerror("%s: fread error", __func__);
fatalerror("%s: fread error\n", __func__);
size += read_count;
} while (!feof(f));
@@ -320,7 +319,7 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
if (mem != pBuffer->pBuffer + size) {
nLineNo = lineCount + 1;
fatalerror("Found null character");
fatalerror("Found null character\n");
}
/* Remove comments */
@@ -343,7 +342,8 @@ YY_BUFFER_STATE yy_create_buffer(FILE *f)
*mem++ = ' ';
/* Comments that start with * at the start of a line */
} else if ((mem[0] == '\n') && (mem[1] == '*')) {
warning(WARNING_OBSOLETE, "'*' is deprecated for comments, please use ';' instead");
warning(WARNING_OBSOLETE,
"'*' is deprecated for comments, please use ';' instead\n");
mem++;
while (!((*mem == '\n') || (*mem == '\0')))
*mem++ = ' ';
@@ -372,7 +372,7 @@ uint32_t lex_FloatAlloc(const struct sLexFloat *token)
bool lex_CheckCharacterRange(uint16_t start, uint16_t end)
{
if (start > end || start < 1 || end > 127) {
yyerror("Invalid character range (start: %" PRIu16 ", end: %" PRIu16 ")",
error("Invalid character range (start: %" PRIu16 ", end: %" PRIu16 ")\n",
start, end);
return false;
}
@@ -442,7 +442,7 @@ void lex_FloatAddSecondRange(uint32_t id, uint16_t start, uint16_t end)
static struct sLexFloat *lexgetfloat(uint32_t nFloatMask)
{
if (nFloatMask == 0)
fatalerror("Internal error in %s", __func__);
fatalerror("Internal error in %s\n", __func__);
int32_t i = 0;
@@ -496,11 +496,11 @@ void lex_AddStrings(const struct sLexInitString *lex)
*ppHash = malloc(sizeof(struct sLexString));
if (*ppHash == NULL)
fatalerror("Out of memory!");
fatalerror("Out of memory!\n");
(*ppHash)->tzName = (char *)strdup(lex->tzName);
if ((*ppHash)->tzName == NULL)
fatalerror("Out of memory!");
fatalerror("Out of memory!\n");
(*ppHash)->nNameLength = strlen(lex->tzName);
(*ppHash)->nToken = lex->nToken;
@@ -595,12 +595,12 @@ size_t CopyMacroArg(char *dest, size_t maxLength, char c)
return 0;
if (s == NULL)
fatalerror("Macro argument '\\%c' not defined", c);
fatalerror("Macro argument '\\%c' not defined\n", c);
// TODO: `strncpy`, nay?
for (i = 0; s[i] != 0; i++) {
if (i >= maxLength)
fatalerror("Macro argument too long to fit buffer");
fatalerror("Macro argument too long to fit buffer\n");
dest[i] = s[i];
}
@@ -611,7 +611,7 @@ size_t CopyMacroArg(char *dest, size_t maxLength, char c)
static inline void yylex_StringWriteChar(char *s, size_t index, char c)
{
if (index >= MAXSTRLEN)
fatalerror("String too long");
fatalerror("String too long\n");
s[index] = c;
}
@@ -619,7 +619,7 @@ static inline void yylex_StringWriteChar(char *s, size_t index, char c)
static inline void yylex_SymbolWriteChar(char *s, size_t index, char c)
{
if (index >= MAXSYMLEN)
fatalerror("Symbol too long");
fatalerror("Symbol too long\n");
s[index] = c;
}
@@ -657,7 +657,7 @@ size_t yylex_ReadBracketedSymbol(char *dest, size_t index)
if (length != 0)
i += length;
else
fatalerror("Illegal character escape '%c'", ch);
fatalerror("Illegal character escape '%c'\n", ch);
} else if (ch == '{') {
/* Handle nested symbols */
++pLexBuffer;
@@ -679,12 +679,11 @@ size_t yylex_ReadBracketedSymbol(char *dest, size_t index)
const char *designatedMode;
if (i != 1)
fatalerror("Print types are exactly 1 character long");
fatalerror("Print types are exactly 1 character long\n");
designatedMode = strchr(acceptedModes, sym[i - 1]);
if (!designatedMode)
fatalerror("Illegal print type '%c'",
sym[i - 1]);
fatalerror("Illegal print type '%c'\n", sym[i - 1]);
mode = formatSpecifiers[designatedMode - acceptedModes];
/* Begin writing the symbol again */
i = 0;
@@ -703,7 +702,7 @@ size_t yylex_ReadBracketedSymbol(char *dest, size_t index)
if (*pLexBuffer == '}')
pLexBuffer++;
else
fatalerror("Missing }");
fatalerror("Missing }\n");
return length;
}
@@ -752,8 +751,7 @@ static void yylex_ReadQuotedString(void)
if (length != 0)
index += length;
else
fatalerror("Illegal character escape '%c'",
ch);
fatalerror("Illegal character escape '%c'\n", ch);
ch = 0;
break;
@@ -774,7 +772,7 @@ static void yylex_ReadQuotedString(void)
if (*pLexBuffer == '"')
pLexBuffer++;
else
fatalerror("Unterminated string");
fatalerror("Unterminated string\n");
}
static uint32_t yylex_NORMAL(void)
@@ -818,7 +816,7 @@ scanagain:
nLineNo++;
goto scanagain;
} else {
yyerror("Expected a new line after the continuation character.");
error("Expected a new line after the continuation character.\n");
pLexBuffer++;
}
}
@@ -883,7 +881,7 @@ scanagain:
if (ch != 0
&& ch != '\n'
&& !(ch >= 0x20 && ch <= 0x7E))
fatalerror("Found garbage character: 0x%02X", ch);
fatalerror("Found garbage character: 0x%02X\n", ch);
return ch;
}
@@ -973,7 +971,7 @@ static uint32_t yylex_MACROARGS(void)
ch = 0;
break;
} else {
yyerror("Expected a new line after the continuation character.");
error("Expected a new line after the continuation character.\n");
}
}
break;
@@ -990,8 +988,7 @@ static uint32_t yylex_MACROARGS(void)
if (length != 0)
index += length;
else
fatalerror("Illegal character escape '%c'",
ch);
fatalerror("Illegal character escape '%c'\n", ch);
ch = 0;
break;
@@ -1022,7 +1019,7 @@ static uint32_t yylex_MACROARGS(void)
return ',';
}
fatalerror("Internal error in %s", __func__);
fatalerror("Internal error in %s\n", __func__);
}
int yylex(void)
@@ -1037,7 +1034,7 @@ int yylex(void)
returnedChar = yylex_MACROARGS();
break;
default:
fatalerror("%s: Internal error.", __func__);
fatalerror("%s: Internal error.\n", __func__);
}
/* Check if string expansions were fully read */

View File

@@ -48,7 +48,7 @@ struct MacroArgs *macro_NewArgs(void)
struct MacroArgs *args = malloc(SIZEOF_ARGS(INITIAL_ARG_SIZE));
if (!args)
fatalerror("Unable to register macro arguments: %s", strerror(errno));
fatalerror("Unable to register macro arguments: %s\n", strerror(errno));
args->nbArgs = 0;
args->shift = 0;
@@ -60,16 +60,16 @@ void macro_AppendArg(struct MacroArgs **argPtr, char *s)
{
#define macArgs (*argPtr)
if (macArgs->nbArgs == MAXMACROARGS)
yyerror("A maximum of " EXPAND_AND_STR(MAXMACROARGS)
" arguments is allowed");
error("A maximum of " EXPAND_AND_STR(MAXMACROARGS)
" arguments is allowed\n");
if (macArgs->nbArgs >= macArgs->capacity) {
macArgs->capacity *= 2;
/* Check that overflow didn't roll us back */
if (macArgs->capacity <= macArgs->nbArgs)
fatalerror("Failed to add new macro argument: possible capacity overflow");
fatalerror("Failed to add new macro argument: possible capacity overflow\n");
macArgs = realloc(macArgs, SIZEOF_ARGS(macArgs->capacity));
if (!macArgs)
fatalerror("Error adding new macro argument: %s", strerror(errno));
fatalerror("Error adding new macro argument: %s\n", strerror(errno));
}
macArgs->args[macArgs->nbArgs++] = s;
#undef macArgs

View File

@@ -150,7 +150,7 @@ void opt_Parse(char *s)
newopt.gbgfx[2] = s[3];
newopt.gbgfx[3] = s[4];
} else {
yyerror("Must specify exactly 4 characters for option 'g'");
error("Must specify exactly 4 characters for option 'g'\n");
}
break;
case 'b':
@@ -158,11 +158,11 @@ void opt_Parse(char *s)
newopt.binary[0] = s[1];
newopt.binary[1] = s[2];
} else {
yyerror("Must specify exactly 2 characters for option 'b'");
error("Must specify exactly 2 characters for option 'b'\n");
}
break;
case 'z':
warning(WARNING_OBSOLETE, "Option 'z' is a deprecated alias for 'p'");
warning(WARNING_OBSOLETE, "Option 'z' is a deprecated alias for 'p'\n");
/* fallthrough */
case 'p':
if (strlen(&s[1]) <= 2) {
@@ -171,15 +171,15 @@ void opt_Parse(char *s)
result = sscanf(&s[1], "%x", &fillchar);
if (result != EOF && result != 1)
yyerror("Invalid argument for option 'z'");
error("Invalid argument for option 'z'\n");
else
newopt.fillchar = fillchar;
} else {
yyerror("Invalid argument for option 'z'");
error("Invalid argument for option 'z'\n");
}
break;
default:
yyerror("Unknown option");
error("Unknown option\n");
break;
}
@@ -193,7 +193,7 @@ void opt_Push(void)
pOpt = malloc(sizeof(struct sOptionStackEntry));
if (pOpt == NULL)
fatalerror("No memory for option stack");
fatalerror("No memory for option stack\n");
pOpt->Options = CurrentOptions;
pOpt->next = pOptionStack;
@@ -203,7 +203,7 @@ void opt_Push(void)
void opt_Pop(void)
{
if (pOptionStack == NULL)
fatalerror("No entries in the option stack");
fatalerror("No entries in the option stack\n");
struct sOptionStackEntry *pOpt;
@@ -220,17 +220,17 @@ void opt_AddDefine(char *s)
if (cldefines_index >= cldefines_numindices) {
/* Check for overflows */
if ((cldefines_numindices * 2) < cldefines_numindices)
fatalerror("No memory for command line defines");
fatalerror("No memory for command line defines\n");
if ((cldefines_bufsize * 2) < cldefines_bufsize)
fatalerror("No memory for command line defines");
fatalerror("No memory for command line defines\n");
cldefines_numindices *= 2;
cldefines_bufsize *= 2;
cldefines = realloc(cldefines, cldefines_bufsize);
if (!cldefines)
fatalerror("No memory for command line defines");
fatalerror("No memory for command line defines\n");
}
equals = strchr(s, '=');
if (equals) {
@@ -344,7 +344,7 @@ int main(int argc, char *argv[])
cldefines_bufsize = cldefines_numindices * cldefine_entrysize;
cldefines = malloc(cldefines_bufsize);
if (!cldefines)
fatalerror("No memory for command line defines");
fatalerror("No memory for command line defines\n");
#if defined(YYDEBUG) && YYDEBUG
yydebug = 1;

View File

@@ -146,7 +146,7 @@ static uint32_t getsectid(struct Section const *sect)
sec = sec->next;
}
fatalerror("Unknown section '%s'", sect->name);
fatalerror("Unknown section '%s'\n", sect->name);
}
static uint32_t getSectIDIfAny(struct Section const *sect)
@@ -311,12 +311,11 @@ static struct Patch *allocpatch(uint32_t type, struct Expression const *expr,
uint32_t rpnSize = expr->isKnown ? 5 : expr->nRPNPatchSize;
if (!patch)
fatalerror("No memory for patch: %s", strerror(errno));
fatalerror("No memory for patch: %s\n", strerror(errno));
patch->pRPN = malloc(sizeof(*patch->pRPN) * rpnSize);
if (!patch->pRPN)
fatalerror("No memory for patch's RPN expression: %s",
strerror(errno));
fatalerror("No memory for patch's RPN expression: %s\n", strerror(errno));
patch->type = type;
fstk_DumpToStr(patch->tzFilename, sizeof(patch->tzFilename));

View File

@@ -31,7 +31,7 @@
/* If we had `asprintf` this would be great, but alas. */ \
_expr->reason = malloc(128); /* Use an initial reasonable size */ \
if (!_expr->reason) \
fatalerror("Can't allocate err string: %s", strerror(errno)); \
fatalerror("Can't allocate err string: %s\n", strerror(errno)); \
int size = snprintf(_expr->reason, 128, __VA_ARGS__); \
if (size >= 128) { /* If this wasn't enough, try again */ \
_expr->reason = realloc(_expr->reason, size + 1); \
@@ -51,8 +51,8 @@ static uint8_t *reserveSpace(struct Expression *expr, uint32_t size)
* To avoid generating humongous object files, cap the
* size of RPN expressions
*/
fatalerror("RPN expression cannot grow larger than %lu bytes",
(unsigned long)MAXRPNLEN);
fatalerror("RPN expression cannot grow larger than "
EXPAND_AND_STR(MAXRPNLEN) " bytes\n");
else if (expr->nRPNCapacity > MAXRPNLEN / 2)
expr->nRPNCapacity = MAXRPNLEN;
else
@@ -60,8 +60,7 @@ static uint8_t *reserveSpace(struct Expression *expr, uint32_t size)
expr->tRPN = realloc(expr->tRPN, expr->nRPNCapacity);
if (!expr->tRPN)
fatalerror("Failed to grow RPN expression: %s",
strerror(errno));
fatalerror("Failed to grow RPN expression: %s\n", strerror(errno));
}
uint8_t *ptr = expr->tRPN + expr->nRPNLength;
@@ -108,17 +107,15 @@ void rpn_Symbol(struct Expression *expr, char *tzSym)
struct Symbol *sym = sym_FindSymbol(tzSym);
if (sym_IsPC(sym) && !sect_GetSymbolSection()) {
yyerror("PC has no value outside a section");
error("PC has no value outside a section\n");
rpn_Number(expr, 0);
} else if (!sym || !sym_IsConstant(sym)) {
rpn_Init(expr);
expr->isSymbol = true;
sym_Ref(tzSym);
makeUnknown(expr, sym_IsPC(sym)
? "PC is not constant at assembly time"
: "'%s' is not constant at assembly time",
tzSym);
makeUnknown(expr, sym_IsPC(sym) ? "PC is not constant at assembly time"
: "'%s' is not constant at assembly time", tzSym);
expr->nRPNPatchSize += 5; /* 1-byte opcode + 4-byte symbol ID */
size_t nameLen = strlen(tzSym) + 1; /* Don't forget NUL! */
@@ -145,7 +142,7 @@ void rpn_BankSelf(struct Expression *expr)
rpn_Init(expr);
if (!pCurrentSection) {
yyerror("PC has no bank outside a section");
error("PC has no bank outside a section\n");
expr->nVal = 1;
} else if (pCurrentSection->bank == -1) {
makeUnknown(expr, "Current section's bank is not known");
@@ -168,7 +165,7 @@ void rpn_BankSymbol(struct Expression *expr, char const *tzSym)
rpn_Init(expr);
if (sym && !sym_IsLabel(sym)) {
yyerror("BANK argument must be a label");
error("BANK argument must be a label\n");
} else {
sym_Ref(tzSym);
if (!sym)
@@ -223,8 +220,7 @@ void rpn_CheckHRAM(struct Expression *expr, const struct Expression *src)
/* That range is valid, but only keep the lower byte */
expr->nVal &= 0xFF;
} else if (expr->nVal < 0 || expr->nVal > 0xFF) {
yyerror("Source address $%" PRIx32 " not between $FF00 to $FFFF",
expr->nVal);
error("Source address $%" PRIx32 " not between $FF00 to $FFFF\n", expr->nVal);
}
}
@@ -235,8 +231,7 @@ void rpn_CheckRST(struct Expression *expr, const struct Expression *src)
if (rpn_isKnown(expr)) {
/* A valid RST address must be masked with 0x38 */
if (expr->nVal & ~0x38)
yyerror("Invalid address $%" PRIx32 " for RST",
expr->nVal);
error("Invalid address $%" PRIx32 " for RST\n", expr->nVal);
/* The target is in the "0x38" bits, all other bits are set */
expr->nVal |= 0xC7;
} else {
@@ -263,7 +258,7 @@ static int32_t shift(int32_t shiftee, int32_t amount)
if (amount >= 0) {
// Left shift
if (amount >= 32) {
warning(WARNING_SHIFT_AMOUNT, "Shifting left by large amount %" PRId32,
warning(WARNING_SHIFT_AMOUNT, "Shifting left by large amount %" PRId32 "\n",
amount);
return 0;
@@ -279,8 +274,8 @@ static int32_t shift(int32_t shiftee, int32_t amount)
// Right shift
amount = -amount;
if (amount >= 32) {
warning(WARNING_SHIFT_AMOUNT, "Shifting right by large amount %" PRId32,
amount);
warning(WARNING_SHIFT_AMOUNT,
"Shifting right by large amount %" PRId32 "\n", amount);
return shiftee < 0 ? -1 : 0;
} else if (shiftee >= 0) {
@@ -376,18 +371,20 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr,
break;
case RPN_SHL:
if (src2->nVal < 0)
warning(WARNING_SHIFT_AMOUNT, "Shifting left by negative amount %" PRId32,
warning(WARNING_SHIFT_AMOUNT,
"Shifting left by negative amount %" PRId32 "\n",
src2->nVal);
expr->nVal = shift(src1->nVal, src2->nVal);
break;
case RPN_SHR:
if (src1->nVal < 0)
warning(WARNING_SHIFT, "Shifting negative value %" PRId32,
warning(WARNING_SHIFT, "Shifting negative value %" PRId32 "\n",
src1->nVal);
if (src2->nVal < 0)
warning(WARNING_SHIFT_AMOUNT, "Shifting right by negative amount %" PRId32,
warning(WARNING_SHIFT_AMOUNT,
"Shifting right by negative amount %" PRId32 "\n",
src2->nVal);
expr->nVal = shift(src1->nVal, -src2->nVal);
@@ -397,11 +394,11 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr,
break;
case RPN_DIV:
if (src2->nVal == 0)
fatalerror("Division by zero");
fatalerror("Division by zero\n");
if (src1->nVal == INT32_MIN
&& src2->nVal == -1) {
warning(WARNING_DIV, "Division of min value by -1");
if (src1->nVal == INT32_MIN && src2->nVal == -1) {
warning(WARNING_DIV, "Division of %" PRId32 " by -1 yields %"
PRId32 "\n", INT32_MIN, INT32_MIN);
expr->nVal = INT32_MIN;
} else {
expr->nVal = src1->nVal / src2->nVal;
@@ -409,7 +406,7 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr,
break;
case RPN_MOD:
if (src2->nVal == 0)
fatalerror("Division by zero");
fatalerror("Division by zero\n");
if (src1->nVal == INT32_MIN && src2->nVal == -1)
expr->nVal = 0;
@@ -427,7 +424,7 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr,
case RPN_RST:
case RPN_CONST:
case RPN_SYM:
fatalerror("%d is not a binary operator", op);
fatalerror("%d is not a binary operator\n", op);
}
} else if (op == RPN_SUB && isDiffConstant(src1, src2)) {

View File

@@ -40,7 +40,7 @@ struct UnionStackEntry {
static inline void checksection(void)
{
if (pCurrentSection == NULL)
fatalerror("Code generation before SECTION directive");
fatalerror("Code generation before SECTION directive\n");
}
/*
@@ -52,7 +52,7 @@ static inline void checkcodesection(void)
checksection();
if (!sect_HasData(pCurrentSection->type))
fatalerror("Section '%s' cannot contain code or data (not ROM0 or ROMX)",
fatalerror("Section '%s' cannot contain code or data (not ROM0 or ROMX)\n",
pCurrentSection->name);
}
@@ -61,8 +61,8 @@ static inline void checkSectionSize(struct Section const *sect, uint32_t size)
uint32_t maxSize = maxsize[sect->type];
if (size > maxSize)
fatalerror("Section '%s' grew too big (max size = 0x%" PRIX32 " bytes, reached 0x%" PRIX32 ").",
sect->name, maxSize, size);
fatalerror("Section '%s' grew too big (max size = 0x%" PRIX32
" bytes, reached 0x%" PRIX32 ").\n", sect->name, maxSize, size);
}
/*
@@ -110,16 +110,16 @@ static struct Section *getSection(char const *name, enum SectionType type,
if (bank != -1) {
if (type != SECTTYPE_ROMX && type != SECTTYPE_VRAM
&& type != SECTTYPE_SRAM && type != SECTTYPE_WRAMX)
yyerror("BANK only allowed for ROMX, WRAMX, SRAM, or VRAM sections");
error("BANK only allowed for ROMX, WRAMX, SRAM, or VRAM sections\n");
else if (bank < bankranges[type][0]
|| bank > bankranges[type][1])
yyerror("%s bank value $%" PRIx32 " out of range ($%" PRIx32 " to $%" PRIx32 ")",
typeNames[type], bank,
error("%s bank value $%" PRIx32 " out of range ($%" PRIx32 " to $%"
PRIx32 ")\n", typeNames[type], bank,
bankranges[type][0], bankranges[type][1]);
}
if (alignOffset >= 1 << alignment) {
yyerror("Alignment offset must not be greater than alignment (%" PRIu16 " < %u)",
error("Alignment offset must not be greater than alignment (%" PRIu16 " < %u)\n",
alignOffset, 1U << alignment);
alignOffset = 0;
}
@@ -130,18 +130,19 @@ static struct Section *getSection(char const *name, enum SectionType type,
if (org != -1) {
if ((org - alignOffset) & mask)
yyerror("Section \"%s\"'s fixed address doesn't match its alignment",
error("Section \"%s\"'s fixed address doesn't match its alignment\n",
name);
alignment = 0; /* Ignore it if it's satisfied */
} else if (startaddr[type] & mask) {
yyerror("Section \"%s\"'s alignment cannot be attained in %s",
error("Section \"%s\"'s alignment cannot be attained in %s\n",
name, typeNames[type]);
}
}
if (org != -1) {
if (org < startaddr[type] || org > endaddr(type))
yyerror("Section \"%s\"'s fixed address %#" PRIx32 " is outside of range [%#" PRIx16 "; %#" PRIx16 "]",
error("Section \"%s\"'s fixed address %#" PRIx32
" is outside of range [%#" PRIx16 "; %#" PRIx16 "]\n",
name, org, startaddr[type], endaddr(type));
}
@@ -154,16 +155,16 @@ static struct Section *getSection(char const *name, enum SectionType type,
unsigned int nbSectErrors = 0;
#define fail(...) \
do { \
yyerror(__VA_ARGS__); \
error(__VA_ARGS__); \
nbSectErrors++; \
} while (0)
if (type != sect->type)
fail("Section \"%s\" already exists but with type %s",
fail("Section \"%s\" already exists but with type %s\n",
sect->name, typeNames[sect->type]);
if (sect->modifier != mod)
fail("Section \"%s\" already declared as %s section",
fail("Section \"%s\" already declared as %s section\n",
sect->name, sectionModNames[sect->modifier]);
/*
* Normal sections need to have exactly identical constraints;
@@ -176,18 +177,18 @@ static struct Section *getSection(char const *name, enum SectionType type,
* `EndLoadSection` if modifying the following check!
*/
if (sect_HasData(type))
fail("Cannot declare ROM sections as UNION");
fail("Cannot declare ROM sections as UNION\n");
if (org != -1) {
/* If both are fixed, they must be the same */
if (sect->org != -1 && sect->org != org)
fail("Section \"%s\" already declared as fixed at different address $%" PRIx32,
fail("Section \"%s\" already declared as fixed at different address $%"
PRIx32 "\n",
sect->name, sect->org);
else if (sect->align != 0
&& (mask(sect->align)
& (org - sect->alignOfs)))
fail("Section \"%s\" already declared as aligned to %u bytes (offset %" PRIu16 ")",
sect->name, 1U << sect->align,
sect->alignOfs);
fail("Section \"%s\" already declared as aligned to %u bytes (offset %"
PRIu16 ")\n", sect->name, 1U << sect->align, sect->alignOfs);
else
/* Otherwise, just override */
sect->org = org;
@@ -196,16 +197,15 @@ static struct Section *getSection(char const *name, enum SectionType type,
if (sect->org != -1) {
if ((sect->org - alignOffset)
& mask(alignment))
fail("Section \"%s\" already declared as fixed at incompatible address $%" PRIx32,
sect->name,
sect->org);
fail("Section \"%s\" already declared as fixed at incompatible address $%"
PRIx32 "\n", sect->name, sect->org);
/* Check if alignment offsets are compatible */
} else if ((alignOffset & mask(sect->align))
!= (sect->alignOfs
& mask(alignment))) {
fail("Section \"%s\" already declared with incompatible %" PRIu8 "-byte alignment (offset %" PRIu16 ")",
sect->name, sect->align,
sect->alignOfs);
fail("Section \"%s\" already declared with incompatible %"
PRIu8 "-byte alignment (offset %" PRIu16 ")\n",
sect->name, sect->align, sect->alignOfs);
} else if (alignment > sect->align) {
/*
* If the section is not fixed,
@@ -220,42 +220,42 @@ static struct Section *getSection(char const *name, enum SectionType type,
sect->bank = bank;
/* If both specify a bank, it must be the same one */
else if (bank != -1 && sect->bank != bank)
fail("Section \"%s\" already declared with different bank %" PRIu32,
sect->name, sect->bank);
fail("Section \"%s\" already declared with different bank %"
PRIu32 "\n", sect->name, sect->bank);
} else { /* Section fragments are handled identically in RGBASM */
/* However, concaternating non-fragments will be made an error */
if (sect->modifier != SECTION_FRAGMENT || mod != SECTION_FRAGMENT)
warning(WARNING_OBSOLETE, "Concatenation of non-fragment sections is deprecated");
warning(WARNING_OBSOLETE,
"Concatenation of non-fragment sections is deprecated\n");
if (org != sect->org) {
if (sect->org == -1)
fail("Section \"%s\" already declared as floating",
fail("Section \"%s\" already declared as floating\n",
sect->name);
else
fail("Section \"%s\" already declared as fixed at $%" PRIx32,
sect->name, sect->org);
fail("Section \"%s\" already declared as fixed at $%"
PRIx32 "\n", sect->name, sect->org);
}
if (bank != sect->bank) {
if (sect->bank == -1)
fail("Section \"%s\" already declared as floating bank",
fail("Section \"%s\" already declared as floating bank\n",
sect->name);
else
fail("Section \"%s\" already declared as fixed at bank %" PRIu32,
sect->name, sect->bank);
fail("Section \"%s\" already declared as fixed at bank %"
PRIu32 "\n", sect->name, sect->bank);
}
if (alignment != sect->align) {
if (sect->align == 0)
fail("Section \"%s\" already declared as unaligned",
fail("Section \"%s\" already declared as unaligned\n",
sect->name);
else
fail("Section \"%s\" already declared as aligned to %u bytes",
sect->name,
1U << sect->align);
fail("Section \"%s\" already declared as aligned to %u bytes\n",
sect->name, 1U << sect->align);
}
}
if (nbSectErrors)
fatalerror("Cannot create section \"%s\" (%u errors)",
fatalerror("Cannot create section \"%s\" (%u errors)\n",
sect->name, nbSectErrors);
#undef fail
return sect;
@@ -263,11 +263,11 @@ static struct Section *getSection(char const *name, enum SectionType type,
sect = malloc(sizeof(*sect));
if (sect == NULL)
fatalerror("Not enough memory for section");
fatalerror("Not enough memory for section: %s\n", strerror(errno));
sect->name = strdup(name);
if (sect->name == NULL)
fatalerror("Not enough memory for sectionname");
fatalerror("Not enough memory for section name: %s\n", strerror(errno));
sect->type = type;
sect->modifier = mod;
@@ -286,7 +286,7 @@ static struct Section *getSection(char const *name, enum SectionType type,
sectsize = maxsize[type];
sect->data = malloc(sectsize);
if (sect->data == NULL)
fatalerror("Not enough memory for section");
fatalerror("Not enough memory for section: %s\n", strerror(errno));
} else {
sect->data = NULL;
}
@@ -307,7 +307,7 @@ static struct Section *getSection(char const *name, enum SectionType type,
static void changeSection(void)
{
if (unionStack)
fatalerror("Cannot change the section within a UNION");
fatalerror("Cannot change the section within a UNION\n");
sym_SetCurrentSymbolScope(NULL);
}
@@ -319,7 +319,7 @@ void out_NewSection(char const *name, uint32_t type, uint32_t org,
struct SectionSpec const *attribs, enum SectionModifier mod)
{
if (currentLoadSection)
fatalerror("Cannot change the section within a `LOAD` block");
fatalerror("Cannot change the section within a `LOAD` block\n");
struct Section *sect = getSection(name, type, org, attribs, mod);
@@ -337,7 +337,7 @@ void out_SetLoadSection(char const *name, uint32_t type, uint32_t org,
checkcodesection();
if (currentLoadSection)
fatalerror("`LOAD` blocks cannot be nested");
fatalerror("`LOAD` blocks cannot be nested\n");
struct Section *sect = getSection(name, type, org, attribs, false);
@@ -350,7 +350,7 @@ void out_SetLoadSection(char const *name, uint32_t type, uint32_t org,
void out_EndLoadSection(void)
{
if (!currentLoadSection)
yyerror("Found `ENDL` outside of a `LOAD` block");
error("Found `ENDL` outside of a `LOAD` block\n");
currentLoadSection = NULL;
changeSection();
@@ -382,13 +382,13 @@ void sect_AlignPC(uint8_t alignment, uint16_t offset)
if (sect->org != -1) {
if ((sym_GetPCValue() - offset) % (1 << alignment))
yyerror("Section's fixed address fails required alignment (PC = $%04" PRIx32 ")",
sym_GetPCValue());
error("Section's fixed address fails required alignment (PC = $%04"
PRIx32 ")\n", sym_GetPCValue());
} else if (sect->align != 0) {
if ((((sect->alignOfs + curOffset) % (1 << sect->align))
- offset) % (1 << alignment)) {
yyerror("Section's alignment fails required alignment (offset from section start = $%04" PRIx32 ")",
curOffset);
error("Section's alignment fails required alignment (offset from section start = $%04"
PRIx32 ")\n", curOffset);
} else if (alignment > sect->align) {
sect->align = alignment;
sect->alignOfs =
@@ -438,13 +438,13 @@ static inline void createPatch(enum PatchType type,
void sect_StartUnion(void)
{
if (!pCurrentSection)
fatalerror("UNIONs must be inside a SECTION");
fatalerror("UNIONs must be inside a SECTION\n");
if (sect_HasData(pCurrentSection->type))
fatalerror("Cannot use UNION inside of ROM0 or ROMX sections");
fatalerror("Cannot use UNION inside of ROM0 or ROMX sections\n");
struct UnionStackEntry *entry = malloc(sizeof(*entry));
if (!entry)
fatalerror("Failed to allocate new union stack entry: %s", strerror(errno));
fatalerror("Failed to allocate new union stack entry: %s\n", strerror(errno));
entry->start = curOffset;
entry->size = 0;
entry->next = unionStack;
@@ -463,14 +463,14 @@ static void endUnionMember(void)
void sect_NextUnionMember(void)
{
if (!unionStack)
fatalerror("Found NEXTU outside of a UNION construct");
fatalerror("Found NEXTU outside of a UNION construct\n");
endUnionMember();
}
void sect_EndUnion(void)
{
if (!unionStack)
fatalerror("Found ENDU outside of a UNION construct");
fatalerror("Found ENDU outside of a UNION construct\n");
endUnionMember();
curOffset += unionStack->size;
struct UnionStackEntry *next = unionStack->next;
@@ -482,7 +482,7 @@ void sect_EndUnion(void)
void sect_CheckUnionClosed(void)
{
if (unionStack)
fatalerror("Unterminated UNION construct!");
fatalerror("Unterminated UNION construct!\n");
}
/*
@@ -514,7 +514,7 @@ void out_Skip(int32_t skip, bool ds)
reserveSpace(skip);
if (!ds && sect_HasData(pCurrentSection->type))
warning(WARNING_EMPTY_DATA_DIRECTIVE, "db/dw/dl directive without data in ROM");
warning(WARNING_EMPTY_DATA_DIRECTIVE, "db/dw/dl directive without data in ROM\n");
if (!sect_HasData(pCurrentSection->type)) {
growSection(skip);
@@ -636,7 +636,7 @@ void out_PCRelByte(struct Expression *expr)
offset = sym_GetValue(sym) - (sym_GetValue(pc) + 1);
if (offset < -128 || offset > 127) {
yyerror("jr target out of reach (expected -129 < %" PRId16 " < 128)",
error("jr target out of reach (expected -129 < %" PRId16 " < 128)\n",
offset);
writebyte(0);
} else {
@@ -652,8 +652,7 @@ void out_PCRelByte(struct Expression *expr)
void out_BinaryFile(char const *s, int32_t startPos)
{
if (startPos < 0) {
yyerror("Start position cannot be negative (%" PRId32 ")",
startPos);
error("Start position cannot be negative (%" PRId32 ")\n", startPos);
startPos = 0;
}
@@ -664,8 +663,7 @@ void out_BinaryFile(char const *s, int32_t startPos)
oFailedOnMissingInclude = true;
return;
}
fatalerror("Error opening INCBIN file '%s': %s", s,
strerror(errno));
fatalerror("Error opening INCBIN file '%s': %s\n", s, strerror(errno));
}
int32_t fsize = -1;
@@ -676,7 +674,7 @@ void out_BinaryFile(char const *s, int32_t startPos)
fsize = ftell(f);
if (startPos >= fsize) {
yyerror("Specified start position is greater than length of file");
error("Specified start position is greater than length of file\n");
return;
}
@@ -684,7 +682,7 @@ void out_BinaryFile(char const *s, int32_t startPos)
reserveSpace(fsize - startPos);
} else {
if (errno != ESPIPE)
yyerror("Error determining size of INCBIN file '%s': %s",
error("Error determining size of INCBIN file '%s': %s\n",
s, strerror(errno));
/* The file isn't seekable, so we'll just skip bytes */
while (startPos--)
@@ -698,8 +696,7 @@ void out_BinaryFile(char const *s, int32_t startPos)
}
if (ferror(f))
yyerror("Error reading INCBIN file '%s': %s", s,
strerror(errno));
error("Error reading INCBIN file '%s': %s\n", s, strerror(errno));
fclose(f);
}
@@ -707,14 +704,12 @@ void out_BinaryFile(char const *s, int32_t startPos)
void out_BinaryFileSlice(char const *s, int32_t start_pos, int32_t length)
{
if (start_pos < 0) {
yyerror("Start position cannot be negative (%" PRId32 ")",
start_pos);
error("Start position cannot be negative (%" PRId32 ")\n", start_pos);
start_pos = 0;
}
if (length < 0) {
yyerror("Number of bytes to read cannot be negative (%" PRId32 ")",
length);
error("Number of bytes to read cannot be negative (%" PRId32 ")\n", length);
length = 0;
}
if (length == 0) /* Don't even bother with 0-byte slices */
@@ -727,8 +722,7 @@ void out_BinaryFileSlice(char const *s, int32_t start_pos, int32_t length)
oFailedOnMissingInclude = true;
return;
}
fatalerror("Error opening INCBIN file '%s': %s", s,
strerror(errno));
fatalerror("Error opening INCBIN file '%s': %s\n", s, strerror(errno));
}
checkcodesection();
@@ -740,17 +734,17 @@ void out_BinaryFileSlice(char const *s, int32_t start_pos, int32_t length)
fsize = ftell(f);
if (start_pos >= fsize) {
yyerror("Specified start position is greater than length of file");
error("Specified start position is greater than length of file\n");
return;
}
if ((start_pos + length) > fsize)
fatalerror("Specified range in INCBIN is out of bounds");
fatalerror("Specified range in INCBIN is out of bounds\n");
fseek(f, start_pos, SEEK_SET);
} else {
if (errno != ESPIPE)
yyerror("Error determining size of INCBIN file '%s': %s",
error("Error determining size of INCBIN file '%s': %s\n",
s, strerror(errno));
/* The file isn't seekable, so we'll just skip bytes */
while (start_pos--)
@@ -765,10 +759,9 @@ void out_BinaryFileSlice(char const *s, int32_t start_pos, int32_t length)
if (byte != EOF) {
writebyte(byte);
} else if (ferror(f)) {
yyerror("Error reading INCBIN file '%s': %s", s,
strerror(errno));
error("Error reading INCBIN file '%s': %s\n", s, strerror(errno));
} else {
yyerror("Premature end of file (%" PRId32 " bytes left to read)",
error("Premature end of file (%" PRId32 " bytes left to read)\n",
todo + 1);
}
}
@@ -785,7 +778,7 @@ void out_PushSection(void)
sect = malloc(sizeof(struct SectionStackEntry));
if (sect == NULL)
fatalerror("No memory for section stack");
fatalerror("No memory for section stack: %s<\n", strerror(errno));
sect->pSection = pCurrentSection;
sect->pScope = sym_GetCurrentSymbolScope();
@@ -798,10 +791,10 @@ void out_PushSection(void)
void out_PopSection(void)
{
if (pSectionStack == NULL)
fatalerror("No entries in the section stack");
fatalerror("No entries in the section stack\n");
if (currentLoadSection)
fatalerror("Cannot change the section within a `LOAD` block!");
fatalerror("Cannot change the section within a `LOAD` block!\n");
struct SectionStackEntry *sect;

View File

@@ -114,8 +114,7 @@ static void updateSymbolFilename(struct Symbol *sym)
{
if (snprintf(sym->fileName, _MAX_PATH + 1, "%s",
tzCurrentFileName) > _MAX_PATH)
fatalerror("%s: File name is too long: '%s'", __func__,
tzCurrentFileName);
fatalerror("%s: File name is too long: '%s'\n", __func__, tzCurrentFileName);
sym->fileLine = fstk_GetLine();
}
@@ -127,10 +126,10 @@ static struct Symbol *createsymbol(char const *s)
struct Symbol *symbol = malloc(sizeof(*symbol));
if (!symbol)
fatalerror("Failed to create symbol: %s", strerror(errno));
fatalerror("Failed to create symbol '%s': %s\n", s, strerror(errno));
if (snprintf(symbol->name, MAXSYMLEN + 1, "%s", s) > MAXSYMLEN)
warning(WARNING_LONG_STR, "Symbol name is too long: '%s'", s);
warning(WARNING_LONG_STR, "Symbol name is too long: '%s'\n", s);
symbol->isExported = false;
symbol->isBuiltin = false;
@@ -155,8 +154,7 @@ static void fullSymbolName(char *output, size_t outputSize,
int n = snprintf(output, outputSize, "%s%s", parent->name, localName);
if (n >= (int)outputSize)
fatalerror("Symbol name is too long: '%s%s'", parent->name,
localName);
fatalerror("Symbol name is too long: '%s%s'\n", parent->name, localName);
}
/*
@@ -174,8 +172,7 @@ static struct Symbol *findsymbol(char const *s, struct Symbol const *scope)
char const *separator = strchr(s, '.');
if (separator && strchr(separator + 1, '.'))
fatalerror("'%s' is a nonsensical reference to a nested local symbol",
s);
fatalerror("'%s' is a nonsensical reference to a nested local symbol\n", s);
return hash_GetElement(symbols, s);
}
@@ -202,12 +199,11 @@ void sym_Purge(char const *symName)
struct Symbol *symbol = findsymbol(symName, scope);
if (!symbol) {
yyerror("'%s' not defined", symName);
error("'%s' not defined\n", symName);
} else if (symbol->isBuiltin) {
yyerror("Built-in symbol '%s' cannot be purged", symName);
error("Built-in symbol '%s' cannot be purged\n", symName);
} else if (isReferenced(symbol)) {
yyerror("Symbol \"%s\" is referenced and thus cannot be purged",
symName);
error("Symbol \"%s\" is referenced and thus cannot be purged\n", symName);
} else {
hash_RemoveElement(symbols, symbol->name);
if (symbol->type == SYM_MACRO)
@@ -221,9 +217,9 @@ uint32_t sym_GetPCValue(void)
struct Section const *sect = sect_GetSymbolSection();
if (!sect)
yyerror("PC has no value outside a section");
error("PC has no value outside a section\n");
else if (sect->org == -1)
yyerror("Expected constant PC but section is not fixed");
error("Expected constant PC but section is not fixed\n");
else
return CallbackPC();
return 0;
@@ -237,11 +233,11 @@ uint32_t sym_GetConstantValue(char const *s)
struct Symbol const *sym = sym_FindSymbol(s);
if (sym == NULL)
yyerror("'%s' not defined", s);
error("'%s' not defined\n", s);
else if (sym == PCSymbol)
return sym_GetPCValue();
else if (!sym_IsConstant(sym))
yyerror("\"%s\" does not have a constant value", s);
error("\"%s\" does not have a constant value\n", s);
else
return sym_GetValue(sym);
@@ -256,9 +252,9 @@ uint32_t sym_GetDefinedValue(char const *s)
struct Symbol const *sym = sym_FindSymbol(s);
if (sym == NULL || !sym_IsDefined(sym))
yyerror("'%s' not defined", s);
error("'%s' not defined\n", s);
else if (!sym_IsNumeric(sym))
yyerror("'%s' is a macro or string symbol", s);
error("'%s' is a macro or string symbol\n", s);
else
return sym_GetValue(sym);
@@ -287,7 +283,7 @@ static struct Symbol *createNonrelocSymbol(char const *symbolName)
if (!symbol)
symbol = createsymbol(symbolName);
else if (sym_IsDefined(symbol))
yyerror("'%s' already defined at %s(%" PRIu32 ")", symbolName,
error("'%s' already defined at %s(%" PRIu32 ")\n", symbolName,
symbol->fileName, symbol->fileLine);
return symbol;
@@ -326,7 +322,7 @@ struct Symbol *sym_AddString(char const *symName, char const *value)
char *string = malloc(len + 1);
if (string == NULL)
fatalerror("No memory for string equate");
fatalerror("No memory for string equate: %s\n", strerror(errno));
strcpy(string, value);
sym->type = SYM_EQUS;
@@ -347,7 +343,7 @@ struct Symbol *sym_AddSet(char const *symName, int32_t value)
if (sym == NULL)
sym = createsymbol(symName);
else if (sym_IsDefined(sym) && sym->type != SYM_SET)
yyerror("'%s' already defined as %s at %s(%" PRIu32 ")",
error("'%s' already defined as %s at %s(%" PRIu32 ")\n",
symName, sym->type == SYM_LABEL ? "label" : "constant",
sym->fileName, sym->fileLine);
else
@@ -367,7 +363,7 @@ struct Symbol *sym_AddSet(char const *symName, int32_t value)
struct Symbol *sym_AddLocalReloc(char const *symName)
{
if (!symbolScope) {
yyerror("Local label '%s' in main scope", symName);
error("Local label '%s' in main scope\n", symName);
return NULL;
}
@@ -387,7 +383,7 @@ struct Symbol *sym_AddReloc(char const *symName)
if (localPtr != NULL) {
if (!symbolScope) {
yyerror("Local label in main scope");
error("Local label in main scope\n");
return NULL;
}
@@ -395,12 +391,11 @@ struct Symbol *sym_AddReloc(char const *symName)
uint32_t parentLen = localPtr - symName;
if (strchr(localPtr + 1, '.') != NULL)
fatalerror("'%s' is a nonsensical reference to a nested local symbol",
fatalerror("'%s' is a nonsensical reference to a nested local symbol\n",
symName);
else if (strlen(scope->name) != parentLen
|| strncmp(symName, scope->name, parentLen) != 0)
yyerror("Not currently in the scope of '%.*s'",
parentLen, symName);
error("Not currently in the scope of '%.*s'\n", parentLen, symName);
}
struct Symbol *sym = findsymbol(symName, scope);
@@ -408,8 +403,8 @@ struct Symbol *sym_AddReloc(char const *symName)
if (!sym)
sym = createsymbol(symName);
else if (sym_IsDefined(sym))
yyerror("'%s' already defined in %s(%" PRIu32 ")", symName,
sym->fileName, sym->fileLine);
error("'%s' already defined in %s(%" PRIu32 ")\n",
symName, sym->fileName, sym->fileLine);
/* If the symbol already exists as a ref, just "take over" it */
sym->type = SYM_LABEL;
@@ -423,8 +418,7 @@ struct Symbol *sym_AddReloc(char const *symName)
sym->section = sect_GetSymbolSection();
/* Labels need to be assigned a section, except PC */
if (!sym->section && strcmp(symName, "@"))
yyerror("Label \"%s\" created outside of a SECTION",
symName);
error("Label \"%s\" created outside of a SECTION\n", symName);
updateSymbolFilename(sym);
@@ -481,12 +475,9 @@ struct Symbol *sym_Ref(char const *symName)
if (symName[0] == '.') {
if (!symbolScope)
fatalerror("Local label reference '%s' in main scope",
symName);
scope = symbolScope->scope ? symbolScope->scope
: symbolScope;
fullSymbolName(fullname, sizeof(fullname), symName,
symbolScope);
fatalerror("Local label reference '%s' in main scope\n", symName);
scope = symbolScope->scope ? symbolScope->scope : symbolScope;
fullSymbolName(fullname, sizeof(fullname), symName, symbolScope);
symName = fullname;
}

View File

@@ -35,7 +35,7 @@ int32_t readUTF8Char(char *dest, char *src)
for (i = 0, state = 0;; i++) {
if (decode(&state, &codep, (uint8_t)src[i]) == 1)
fatalerror("invalid UTF-8 character");
fatalerror("invalid UTF-8 character\n");
dest[i] = src[i];

View File

@@ -201,12 +201,11 @@ void verror(const char *fmt, va_list args, char const *flag)
fstk_Dump();
fprintf(stderr, flag ? ": [-Werror=%s]\n " : ":\n ", flag);
vfprintf(stderr, fmt, args);
fputc('\n', stderr);
fstk_DumpStringExpansions();
nbErrors++;
}
void yyerror(const char *fmt, ...)
void error(const char *fmt, ...)
{
va_list args;
@@ -254,7 +253,6 @@ void warning(enum WarningID id, char const *fmt, ...)
fstk_Dump();
fprintf(stderr, ": [-W%s]\n ", flag);
vfprintf(stderr, fmt, args);
fputc('\n', stderr);
fstk_DumpStringExpansions();
va_end(args);

View File

@@ -1,7 +1,7 @@
warning: overflow.asm(24): [-Wdiv]
Division of min value by -1
Division of -2147483648 by -1 yields -2147483648
warning: overflow.asm(25): [-Wdiv]
Division of min value by -1
Division of -2147483648 by -1 yields -2147483648
warning: overflow.asm(39): [-Wlarge-constant]
Integer constant '4294967296' is too large
warning: overflow.asm(42): [-Wlarge-constant]