]> git.sur5r.net Git - cc65/blob - src/cc65/error.c
0821189e1f8256b7c8e0957710920ad508d2808b
[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     "Symbol `%s' defined more than once",
111     "String literal expected",
112     "`while' expected",
113     "Function must return a value",
114     "Function cannot return a value",
115     "Unexpected `continue'",
116     "Undefined symbol: `%s'",
117     "Undefined label: `%s'",
118     "Include nesting too deep",
119     "Too many local variables",
120     "Too many initializers",
121     "Cannot initialize incomplete type",
122     "Cannot subscript",
123     "Operation not allowed on these types",
124     "Struct expected",
125     "Struct/union has no field named `%s'",
126     "Struct pointer expected",
127     "lvalue expected",
128     "Expression expected",
129     "Preprocessor expression expected",
130     "Illegal type",
131     "Illegal function call",
132     "Illegal indirection",
133     "Illegal address",
134     "Illegal macro call",
135     "Illegal hex digit",
136     "Illegal character constant",
137     "Illegal modifier",
138     "Illegal type qualifier",
139     "Illegal storage class",
140     "Illegal segment name: `%s'",
141     "Division by zero",
142     "Modulo operation with zero",
143     "Range error",
144     "Symbol is already different kind",
145     "Too many lexical levels",
146     "Parameter name omitted",
147     "Old style function decl used as prototype",
148     "Declaration for parameter `%s' but no such parameter",
149     "Cannot take address of a register variable",
150     "Illegal size of data type",
151     "__fastcall__ is not allowed for C functions",
152     "Variable has unknown size",
153     "Unknown identifier: `%s'",
154     "Duplicate qualifier: `%s'",
155     "Assignment to const",
156 };
157
158
159
160 static char* FatMsg [FAT_COUNT-1] = {
161     "Too many errors",
162     "Cannot open output file: %s",
163     "Cannot write to output file (disk full?)",
164     "Cannot open input file: %s",
165     "Out of memory",
166     "Stack overflow",
167     "Stack empty",
168     "Out of string space",
169     "Too many case labels",
170 };
171
172
173
174 /* Count of errors/warnings */
175 unsigned ErrorCount     = 0;
176 unsigned WarningCount   = 0;
177
178
179
180 /*****************************************************************************/
181 /*                                   Code                                    */
182 /*****************************************************************************/
183
184
185
186 void Warning (unsigned WarnNum, ...)
187 /* Print warning message. */
188 {
189     va_list ap;
190
191     if (!NoWarn) {
192         fprintf (stderr, "%s(%u): Warning #%u: ",
193                  GetCurrentFile(), curpos, WarnNum);
194
195         va_start (ap, WarnNum);
196         vfprintf (stderr, WarnMsg [WarnNum-1], ap);
197         va_end (ap);
198         fprintf (stderr, "\n");
199
200         if (Verbose) {
201             fprintf (stderr, "Line: %s\n", line);
202         }
203     }
204     ++ WarningCount;
205 }
206
207
208
209 void PPWarning (unsigned WarnNum, ...)
210 /* Print warning message. For use within the preprocessor. */
211 {
212     va_list ap;
213
214     if (!NoWarn) {
215         fprintf (stderr, "%s(%u): Warning #%u: ",
216                  GetCurrentFile(), GetCurrentLine(), WarnNum);
217
218         va_start (ap, WarnNum);
219         vfprintf (stderr, WarnMsg [WarnNum-1], ap);
220         va_end (ap);
221         fprintf (stderr, "\n");
222     }
223     ++WarningCount;
224 }
225
226
227
228 void Error (unsigned ErrNum, ...)
229 /* Print an error message */
230 {
231     va_list ap;
232
233     fprintf (stderr, "%s(%u): Error #%u: ",
234              GetCurrentFile(), curpos, ErrNum);
235
236     va_start (ap, ErrNum);
237     vfprintf (stderr, ErrMsg [ErrNum-1], ap);
238     va_end (ap);
239     fprintf (stderr, "\n");
240
241     if (Verbose) {
242         fprintf (stderr, "Line: %s\n", line);
243     }
244     ++ErrorCount;
245     if (ErrorCount > 10) {
246         Fatal (FAT_TOO_MANY_ERRORS);
247     }
248 }
249
250
251
252 void PPError (unsigned ErrNum, ...)
253 /* Print an error message. For use within the preprocessor.  */
254 {
255     va_list ap;
256
257     fprintf (stderr, "%s(%u): Error #%u: ",
258              GetCurrentFile(), GetCurrentLine(), ErrNum);
259
260     va_start (ap, ErrNum);
261     vfprintf (stderr, ErrMsg [ErrNum-1], ap);
262     va_end (ap);
263     fprintf (stderr, "\n");
264
265     ++ErrorCount;
266     if (ErrorCount > 10) {
267         Fatal (FAT_TOO_MANY_ERRORS);
268     }
269 }
270
271
272
273 void Fatal (unsigned FatNum, ...)
274 /* Print a message about a fatal error and die */
275 {
276     va_list ap;
277
278     fprintf (stderr, "%s(%u): Fatal #%u: ",
279              GetCurrentFile(), curpos, FatNum);
280
281     va_start (ap, FatNum);
282     vfprintf (stderr, FatMsg [FatNum-1], ap);
283     va_end (ap);
284     fprintf (stderr, "\n");
285
286     if (Verbose) {
287         fprintf (stderr, "Line: %s\n", line);
288     }
289     exit (EXIT_FAILURE);
290 }
291
292
293
294 void Internal (char* Format, ...)
295 /* Print a message about an internal compiler error and die. */
296 {
297     va_list ap;
298
299     fprintf (stderr, "%s(%u): Internal compiler error:\n",
300              GetCurrentFile(), curpos);
301
302     va_start (ap, Format);
303     vfprintf (stderr, Format, ap);
304     va_end (ap);
305     fprintf (stderr, "\nLine: %s\n", line);
306
307     /* Use abort to create a core dump */
308     abort ();
309 }
310
311
312
313 void ErrorReport (void)
314 /* Report errors (called at end of compile) */
315 {
316     if (ErrorCount == 0 && Verbose) {
317         printf ("No errors.\n");
318     }
319 }
320
321
322
323