mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Make newlines explicit in error messages
In preparation for a change a PR is about to make
This commit is contained in:
@@ -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
|
||||
|
||||
136
src/asm/asmy.y
136
src/asm/asmy.y
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user