/*****************************************************************************/
/* */
-/* error.c */
+/* error.c */
/* */
-/* Error handling for the ca65 macroassembler */
+/* Error handling for the ca65 macroassembler */
/* */
/* */
/* */
-/* (C) 1998-2011, Ullrich von Bassewitz */
+/* (C) 1998-2012, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/*****************************************************************************/
-/* Data */
+/* Data */
/*****************************************************************************/
/* Warning level */
-unsigned WarnLevel = 1;
+unsigned WarnLevel = 1;
/* Statistics */
-unsigned ErrorCount = 0;
-unsigned WarningCount = 0;
+unsigned ErrorCount = 0;
+unsigned WarningCount = 0;
+
+/* Maximum number of additional notifications */
+#define MAX_NOTES 8
SB_Terminate (&Msg);
/* Format the message header */
- SB_Printf (&S, "%s(%lu): %s: ",
+ SB_Printf (&S, "%s(%u): %s: ",
SB_GetConstBuf (GetFileName (Pos->Name)),
Pos->Line,
Desc);
/* Output additional notifications for an error or warning */
{
unsigned I;
+ unsigned Output;
unsigned Skipped;
/* The basic line info is always in slot zero. It has been used to
* more information. Check them and print additional notifications if
* they're present, but limit the number to a reasonable value.
*/
- unsigned MaxCount = CollCount (LineInfos);
- if (MaxCount > 6) {
- MaxCount = 6;
- }
- Skipped = CollCount (LineInfos) - MaxCount;
- for (I = 1; I < MaxCount; ++I) {
+ for (I = 1, Output = 0, Skipped = 0; I < CollCount (LineInfos); ++I) {
/* Get next line info */
const LineInfo* LI = CollConstAt (LineInfos, I);
/* Check the type and output an appropriate note */
- unsigned Type = GetLineInfoType (LI);
- if (Type == LI_TYPE_EXT) {
- PrintMsg (GetSourcePos (LI), "Note",
- "Assembler code generated from this line");
- } else if (Type == LI_TYPE_MACRO) {
- PrintMsg (GetSourcePos (LI), "Note",
- "Macro was defined here");
+ const char* Msg;
+ switch (GetLineInfoType (LI)) {
+
+ case LI_TYPE_ASM:
+ Msg = "Expanded from here";
+ break;
+
+ case LI_TYPE_EXT:
+ Msg = "Assembler code generated from this line";
+ break;
+
+ case LI_TYPE_MACRO:
+ Msg = "Macro was defined here";
+ break;
+
+ case LI_TYPE_MACPARAM:
+ Msg = "Macro parameter came from here";
+ break;
+
+ default:
+ /* No output */
+ Msg = 0;
+ break;
+
+ }
+
+ /* Output until an upper limit of messages is reached */
+ if (Msg) {
+ if (Output < MAX_NOTES) {
+ PrintMsg (GetSourcePos (LI), "Note", "%s", Msg);
+ ++Output;
+ } else {
+ ++Skipped;
+ }
}
}
/*****************************************************************************/
-/* Warnings */
+/* Warnings */
/*****************************************************************************/
Collection LineInfos = STATIC_COLLECTION_INITIALIZER;
/* Get line infos for the current position */
- GetFullLineInfo (&LineInfos, 0);
+ GetFullLineInfo (&LineInfos);
/* Output the message */
va_start (ap, Format);
va_end (ap);
/* Free the line info list */
+ ReleaseFullLineInfo (&LineInfos);
DoneCollection (&LineInfos);
}
}
/*****************************************************************************/
-/* Errors */
+/* Errors */
/*****************************************************************************/
Collection LineInfos = STATIC_COLLECTION_INITIALIZER;
/* Get line infos for the current position */
- GetFullLineInfo (&LineInfos, 0);
+ GetFullLineInfo (&LineInfos);
/* Output the message */
va_start (ap, Format);
va_end (ap);
/* Free the line info list */
+ ReleaseFullLineInfo (&LineInfos);
DoneCollection (&LineInfos);
}
+void PError (const FilePos* Pos, const char* Format, ...)
+/* Print an error message giving an explicit file and position. */
+{
+ va_list ap;
+ va_start (ap, Format);
+ VPrintMsg (Pos, "Error", Format, ap);
+ va_end (ap);
+
+ /* Count errors */
+ ++ErrorCount;
+}
+
+
+
void LIError (const Collection* LineInfos, const char* Format, ...)
/* Print an error message using the given line infos. */
{
Collection LineInfos = STATIC_COLLECTION_INITIALIZER;
/* Get line infos for the current position */
- GetFullLineInfo (&LineInfos, 0);
+ GetFullLineInfo (&LineInfos);
/* Output the message */
va_start (ap, Format);
va_end (ap);
/* Free the line info list */
+ ReleaseFullLineInfo (&LineInfos);
DoneCollection (&LineInfos);
/* Skip tokens until we reach the end of the line */
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
exit (EXIT_FAILURE);
}
-
-
-