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