]> git.sur5r.net Git - cc65/blob - src/cc65/error.c
9d0455ae99793fb23346a760885d9105fc5deda7
[cc65] / src / cc65 / error.c
1 /*****************************************************************************/
2 /*                                                                           */
3 /*                                  error.c                                  */
4 /*                                                                           */
5 /*                  Error handling for the cc65 C compiler                   */
6 /*                                                                           */
7 /*                                                                           */
8 /*                                                                           */
9 /* (C) 1998-2000 Ullrich von Bassewitz                                       */
10 /*               Wacholderweg 14                                             */
11 /*               D-70597 Stuttgart                                           */
12 /* EMail:        uz@musoftware.de                                            */
13 /*                                                                           */
14 /*                                                                           */
15 /* This software is provided 'as-is', without any expressed or implied       */
16 /* warranty.  In no event will the authors be held liable for any damages    */
17 /* arising from the use of this software.                                    */
18 /*                                                                           */
19 /* Permission is granted to anyone to use this software for any purpose,     */
20 /* including commercial applications, and to alter it and redistribute it    */
21 /* freely, subject to the following restrictions:                            */
22 /*                                                                           */
23 /* 1. The origin of this software must not be misrepresented; you must not   */
24 /*    claim that you wrote the original software. If you use this software   */
25 /*    in a product, an acknowledgment in the product documentation would be  */
26 /*    appreciated but is not required.                                       */
27 /* 2. Altered source versions must be plainly marked as such, and must not   */
28 /*    be misrepresented as being the original software.                      */
29 /* 3. This notice may not be removed or altered from any source              */
30 /*    distribution.                                                          */
31 /*                                                                           */
32 /*****************************************************************************/
33
34
35
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <stdarg.h>
39
40 #include "global.h"
41 #include "input.h"
42 #include "scanner.h"
43 #include "stmt.h"
44 #include "error.h"
45
46
47
48 /*****************************************************************************/
49 /*                                   Data                                    */
50 /*****************************************************************************/
51
52
53
54 static char* WarnMsg [WARN_COUNT-1] = {
55     "Unreachable code",
56     "Condition is never true",
57     "Condition is always true",
58     "Converting pointer to integer without a cast",
59     "Converting integer to pointer without a cast",
60     "Function call without a prototype",
61     "Unknown #pragma",
62     "No case labels",
63     "Function must be extern",
64     "Parameter `%s' is never used",
65     "`%s' is defined but never used",
66     "Constant is long",
67     "`/*' found inside a comment",
68     "Useless declaration",
69 };
70
71
72
73 /* Error messages sorted by ErrTypes */
74 static char* ErrMsg [ERR_COUNT-1] = {
75     "Invalid character (%u)",
76     "Unexpected newline",
77     "End-of-file reached in comment starting at line %u",
78     "Syntax error",
79     "`\"' expected",
80     "`:' expected",
81     "`;' expected",
82     "`(' expected",
83     "`)' expected",
84     "`[' expected",
85     "`]' expected",
86     "`{' expected",
87     "`}' expected",
88     "Identifier expected",
89     "Type expected",
90     "Incompatible types",
91     "Incompatible pointer types",
92     "Too many arguments in function call",
93     "Too few arguments in function call",
94     "Macro argument count mismatch",
95     "Duplicate macro parameter: %s",
96     "Variable identifier expected",
97     "Integer expression expected",
98     "Constant expression expected",
99     "No active loop",
100     "`\"' or `<' expected",
101     "Missing terminator or name too long",
102     "Include file `%s' not found",
103     "Cannot open include file `%s': %s",
104     "Invalid #error directive",
105     "#error: %s",
106     "Unexpected `#endif'",
107     "Unexpected `#else'",
108     "`#endif' expected",
109     "Compiler directive expected",
110     "Redefinition of `%s'",
111     "Conflicting types for `%s'",
112     "String literal expected",
113     "`while' expected",
114     "Function must return a value",
115     "Function cannot return a value",
116     "Unexpected `continue'",
117     "Undefined symbol: `%s'",
118     "Undefined label: `%s'",
119     "Include nesting too deep",
120     "Too many local variables",
121     "Too many initializers",
122     "Cannot initialize incomplete type",
123     "Cannot subscript",
124     "Operation not allowed with this type of argument",
125     "Struct expected",
126     "Struct/union has no field named `%s'",
127     "Struct pointer expected",
128     "lvalue expected",
129     "Expression expected",
130     "Preprocessor expression expected",
131     "Illegal type",
132     "Illegal function call",
133     "Illegal indirection",
134     "Illegal address",
135     "Illegal macro call",
136     "Illegal hex digit",
137     "Illegal character constant",
138     "Illegal modifier",
139     "Illegal type qualifier",
140     "Illegal storage class",
141     "Illegal segment name: `%s'",
142     "Division by zero",
143     "Modulo operation with zero",
144     "Range error",
145     "Symbol is already different kind",
146     "Too many lexical levels",
147     "Parameter name omitted",
148     "Old style function decl used as prototype",
149     "Declaration for parameter `%s' but no such parameter",
150     "Cannot take address of a register variable",
151     "Illegal size of data type",
152     "__fastcall__ is not allowed for C functions",
153     "Variable has unknown size",
154     "Unknown identifier: `%s'",
155     "Duplicate qualifier: `%s'",
156     "Assignment to const",
157     "Pointer types differ in type qualifiers",
158 };
159
160
161
162 static char* FatMsg [FAT_COUNT-1] = {
163     "Too many errors",
164     "Cannot open output file: %s",
165     "Cannot write to output file (disk full?)",
166     "Cannot open input file: %s",
167     "Out of memory",
168     "Stack overflow",
169     "Stack empty",
170     "Out of string space",
171     "Too many case labels",
172 };
173
174
175
176 /* Count of errors/warnings */
177 unsigned ErrorCount     = 0;
178 unsigned WarningCount   = 0;
179
180
181
182 /*****************************************************************************/
183 /*                                   Code                                    */
184 /*****************************************************************************/
185
186
187
188 void Warning (unsigned WarnNum, ...)
189 /* Print warning message. */
190 {
191     va_list ap;
192
193     if (!NoWarn) {
194         fprintf (stderr, "%s(%u): Warning #%u: ",
195                  GetCurrentFile(), curpos, WarnNum);
196
197         va_start (ap, WarnNum);
198         vfprintf (stderr, WarnMsg [WarnNum-1], ap);
199         va_end (ap);
200         fprintf (stderr, "\n");
201
202         if (Verbose) {
203             fprintf (stderr, "Line: %s\n", line);
204         }
205     }
206     ++ WarningCount;
207 }
208
209
210
211 void PPWarning (unsigned WarnNum, ...)
212 /* Print warning message. For use within the preprocessor. */
213 {
214     va_list ap;
215
216     if (!NoWarn) {
217         fprintf (stderr, "%s(%u): Warning #%u: ",
218                  GetCurrentFile(), GetCurrentLine(), WarnNum);
219
220         va_start (ap, WarnNum);
221         vfprintf (stderr, WarnMsg [WarnNum-1], ap);
222         va_end (ap);
223         fprintf (stderr, "\n");
224     }
225     ++WarningCount;
226 }
227
228
229
230 void Error (unsigned ErrNum, ...)
231 /* Print an error message */
232 {
233     va_list ap;
234
235     fprintf (stderr, "%s(%u): Error #%u: ",
236              GetCurrentFile(), curpos, ErrNum);
237
238     va_start (ap, ErrNum);
239     vfprintf (stderr, ErrMsg [ErrNum-1], ap);
240     va_end (ap);
241     fprintf (stderr, "\n");
242
243     if (Verbose) {
244         fprintf (stderr, "Line: %s\n", line);
245     }
246     ++ErrorCount;
247     if (ErrorCount > 10) {
248         Fatal (FAT_TOO_MANY_ERRORS);
249     }
250 }
251
252
253
254 void PPError (unsigned ErrNum, ...)
255 /* Print an error message. For use within the preprocessor.  */
256 {
257     va_list ap;
258
259     fprintf (stderr, "%s(%u): Error #%u: ",
260              GetCurrentFile(), GetCurrentLine(), ErrNum);
261
262     va_start (ap, ErrNum);
263     vfprintf (stderr, ErrMsg [ErrNum-1], ap);
264     va_end (ap);
265     fprintf (stderr, "\n");
266
267     ++ErrorCount;
268     if (ErrorCount > 10) {
269         Fatal (FAT_TOO_MANY_ERRORS);
270     }
271 }
272
273
274
275 void Fatal (unsigned FatNum, ...)
276 /* Print a message about a fatal error and die */
277 {
278     va_list ap;
279
280     fprintf (stderr, "%s(%u): Fatal #%u: ",
281              GetCurrentFile(), curpos, FatNum);
282
283     va_start (ap, FatNum);
284     vfprintf (stderr, FatMsg [FatNum-1], ap);
285     va_end (ap);
286     fprintf (stderr, "\n");
287
288     if (Verbose) {
289         fprintf (stderr, "Line: %s\n", line);
290     }
291     exit (EXIT_FAILURE);
292 }
293
294
295
296 void Internal (char* Format, ...)
297 /* Print a message about an internal compiler error and die. */
298 {
299     va_list ap;
300
301     fprintf (stderr, "%s(%u): Internal compiler error:\n",
302              GetCurrentFile(), curpos);
303
304     va_start (ap, Format);
305     vfprintf (stderr, Format, ap);
306     va_end (ap);
307     fprintf (stderr, "\nLine: %s\n", line);
308
309     /* Use abort to create a core dump */
310     abort ();
311 }
312
313
314
315 void ErrorReport (void)
316 /* Report errors (called at end of compile) */
317 {
318     if (ErrorCount == 0 && Verbose) {
319         printf ("No errors.\n");
320     }
321 }
322
323
324
325