X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Ferror.c;h=f73f0a4a0c24dbde36d2b65de714936ed1837d29;hb=112ae0e3db511ddd92e769c11328646ebe2a6240;hp=29b4a3443cfb103cb58adf541b7f5aa6774a631a;hpb=19e1167b825e7796321cb5289b0ea06bf8e46612;p=cc65 diff --git a/src/cc65/error.c b/src/cc65/error.c index 29b4a3443..f73f0a4a0 100644 --- a/src/cc65/error.c +++ b/src/cc65/error.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2004 Ullrich von Bassewitz */ -/* Römerstraße 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 1998-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -60,53 +60,108 @@ unsigned ErrorCount = 0; unsigned WarningCount = 0; +/* Warning and error options */ +IntStack WarnEnable = INTSTACK(1); /* Enable warnings */ +IntStack WarningsAreErrors = INTSTACK(0); /* Treat warnings as errors */ +IntStack WarnStructParam = INTSTACK(1); /* Warn about structs passed by val */ +IntStack WarnUnusedLabel = INTSTACK(1); /* Warn about unused labels */ +IntStack WarnUnusedParam = INTSTACK(1); /* Warn about unused parameters */ +IntStack WarnUnusedVar = INTSTACK(1); /* Warn about unused variables */ +IntStack WarnUnknownPragma = INTSTACK(1); /* Warn about unknown #pragmas */ + +/* Map the name of a warning to the intstack that holds its state */ +typedef struct WarnMapEntry WarnMapEntry; +struct WarnMapEntry { + IntStack* Stack; + const char* Name; +}; +static WarnMapEntry WarnMap[] = { + /* Keep sorted, even if this isn't used for now */ + { &WarningsAreErrors, "error" }, + { &WarnStructParam, "struct-param" }, + { &WarnUnknownPragma, "unknown-pragma" }, + { &WarnUnusedLabel, "unused-label" }, + { &WarnUnusedParam, "unused-param" }, + { &WarnUnusedVar, "unused-var" }, +}; + /*****************************************************************************/ -/* Code */ +/* Handling of fatal errors */ /*****************************************************************************/ -static void IntWarning (const char* Filename, unsigned LineNo, const char* Msg, va_list ap) -/* Print warning message - internal function. */ +void Fatal (const char* Format, ...) +/* Print a message about a fatal error and die */ { - if (!IS_Get (&WarnDisable)) { - fprintf (stderr, "%s(%u): Warning: ", Filename, LineNo); - vfprintf (stderr, Msg, ap); - fprintf (stderr, "\n"); - - if (Line) { - Print (stderr, 1, "Input: %.*s\n", SB_GetLen (Line), SB_GetConstBuf (Line)); - } - ++WarningCount; - } -} + va_list ap; + const char* FileName; + unsigned LineNum; + if (CurTok.LI) { + FileName = GetInputName (CurTok.LI); + LineNum = GetInputLine (CurTok.LI); + } else { + FileName = GetCurrentFile (); + LineNum = GetCurrentLine (); + } + fprintf (stderr, "%s(%u): Fatal: ", FileName, LineNum); -void Warning (const char* Format, ...) -/* Print warning message. */ -{ - va_list ap; va_start (ap, Format); - IntWarning (GetInputName (CurTok.LI), GetInputLine (CurTok.LI), Format, ap); + vfprintf (stderr, Format, ap); va_end (ap); + fprintf (stderr, "\n"); + + if (Line) { + Print (stderr, 1, "Input: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line)); + } + exit (EXIT_FAILURE); } -void PPWarning (const char* Format, ...) -/* Print warning message. For use within the preprocessor. */ +void Internal (const char* Format, ...) +/* Print a message about an internal compiler error and die. */ { va_list ap; + + const char* FileName; + unsigned LineNum; + if (CurTok.LI) { + FileName = GetInputName (CurTok.LI); + LineNum = GetInputLine (CurTok.LI); + } else { + FileName = GetCurrentFile (); + LineNum = GetCurrentLine (); + } + + fprintf (stderr, "%s(%u): Internal compiler error:\n", + FileName, LineNum); + va_start (ap, Format); - IntWarning (GetCurrentFile(), GetCurrentLine(), Format, ap); + vfprintf (stderr, Format, ap); va_end (ap); + fprintf (stderr, "\n"); + + if (Line) { + fprintf (stderr, "\nInput: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line)); + } + + /* Use abort to create a core dump */ + abort (); } +/*****************************************************************************/ +/* Handling of errors */ +/*****************************************************************************/ + + + static void IntError (const char* Filename, unsigned LineNo, const char* Msg, va_list ap) /* Print an error message - internal function*/ { @@ -115,7 +170,7 @@ static void IntError (const char* Filename, unsigned LineNo, const char* Msg, va fprintf (stderr, "\n"); if (Line) { - Print (stderr, 1, "Input: %.*s\n", SB_GetLen (Line), SB_GetConstBuf (Line)); + Print (stderr, 1, "Input: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line)); } ++ErrorCount; if (ErrorCount > 10) { @@ -136,6 +191,17 @@ void Error (const char* Format, ...) +void LIError (const LineInfo* LI, const char* Format, ...) +/* Print an error message with the line info given explicitly */ +{ + va_list ap; + va_start (ap, Format); + IntError (GetInputName (LI), GetInputLine (LI), Format, ap); + va_end (ap); +} + + + void PPError (const char* Format, ...) /* Print an error message. For use within the preprocessor. */ { @@ -147,68 +213,93 @@ void PPError (const char* Format, ...) -void Fatal (const char* Format, ...) -/* Print a message about a fatal error and die */ +/*****************************************************************************/ +/* Handling of warnings */ +/*****************************************************************************/ + + + +static void IntWarning (const char* Filename, unsigned LineNo, const char* Msg, va_list ap) +/* Print warning message - internal function. */ { - va_list ap; + if (IS_Get (&WarningsAreErrors)) { + + /* Treat the warning as an error */ + IntError (Filename, LineNo, Msg, ap); + + } else if (IS_Get (&WarnEnable)) { + + fprintf (stderr, "%s(%u): Warning: ", Filename, LineNo); + vfprintf (stderr, Msg, ap); + fprintf (stderr, "\n"); + + if (Line) { + Print (stderr, 1, "Input: %.*s\n", (int) SB_GetLen (Line), SB_GetConstBuf (Line)); + } + ++WarningCount; - const char* FileName; - unsigned LineNum; - if (CurTok.LI) { - FileName = GetInputName (CurTok.LI); - LineNum = GetInputLine (CurTok.LI); - } else { - FileName = GetCurrentFile (); - LineNum = GetCurrentLine (); } +} - fprintf (stderr, "%s(%u): Fatal: ", FileName, LineNum); + +void Warning (const char* Format, ...) +/* Print warning message. */ +{ + va_list ap; va_start (ap, Format); - vfprintf (stderr, Format, ap); + IntWarning (GetInputName (CurTok.LI), GetInputLine (CurTok.LI), Format, ap); va_end (ap); - fprintf (stderr, "\n"); - - if (Line) { - Print (stderr, 1, "Input: %.*s\n", SB_GetLen (Line), SB_GetConstBuf (Line)); - } - exit (EXIT_FAILURE); } -void Internal (const char* Format, ...) -/* Print a message about an internal compiler error and die. */ +void LIWarning (const LineInfo* LI, const char* Format, ...) +/* Print a warning message with the line info given explicitly */ { va_list ap; + va_start (ap, Format); + IntWarning (GetInputName (LI), GetInputLine (LI), Format, ap); + va_end (ap); +} - const char* FileName; - unsigned LineNum; - if (CurTok.LI) { - FileName = GetInputName (CurTok.LI); - LineNum = GetInputLine (CurTok.LI); - } else { - FileName = GetCurrentFile (); - LineNum = GetCurrentLine (); - } - fprintf (stderr, "%s(%u): Internal compiler error:\n", - FileName, LineNum); +void PPWarning (const char* Format, ...) +/* Print warning message. For use within the preprocessor. */ +{ + va_list ap; va_start (ap, Format); - vfprintf (stderr, Format, ap); + IntWarning (GetCurrentFile(), GetCurrentLine(), Format, ap); va_end (ap); +} - if (Line) { - fprintf (stderr, "\nInput: %.*s\n", SB_GetLen (Line), SB_GetConstBuf (Line)); - } - /* Use abort to create a core dump */ - abort (); + +IntStack* FindWarning (const char* Name) +/* Search for a warning in the WarnMap table and return a pointer to the + * intstack that holds its state. Return NULL if there is no such warning. + */ +{ + unsigned I; + + /* For now, do a linear search */ + for (I = 0; I < sizeof(WarnMap) / sizeof (WarnMap[0]); ++I) { + if (strcmp (WarnMap[I].Name, Name) == 0) { + return WarnMap[I].Stack; + } + } + return 0; } +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + void ErrorReport (void) /* Report errors (called at end of compile) */ {