6 #include "diagnostic.h"
10 //#define ABORT_ON_ERROR
12 /** Number of occurred diagnostics. */
13 unsigned diagnostic_count = 0;
14 /** Number of occurred errors. */
15 unsigned error_count = 0;
16 /** Number of occurred warnings. */
17 unsigned warning_count = 0;
18 /* true if warnings should be treated as errors */
19 bool warnings_are_errors = false;
22 * Issue a diagnostic message.
24 static void diagnosticvf(const char *const fmt, va_list ap)
26 for (const char* f = fmt; *f != '\0'; ++f) {
30 bool extended = false;
42 const wint_t val = va_arg(ap, wint_t);
48 const unsigned char val = (unsigned char) va_arg(ap, int);
54 const int val = va_arg(ap, int);
55 fprintf(stderr, "%d", val);
60 const char* const str = va_arg(ap, const char*);
66 const symbol_t *const symbol = va_arg(ap, const symbol_t*);
67 fputs(symbol->string, stderr);
72 const expression_t* const expr = va_arg(ap, const expression_t*);
73 print_expression(expr);
78 const unsigned qualifiers = va_arg(ap, unsigned);
79 print_type_qualifiers(qualifiers);
84 const type_t* const type = va_arg(ap, const type_t*);
85 const symbol_t* sym = NULL;
87 sym = va_arg(ap, const symbol_t*);
89 print_type_ext(type, sym, NULL);
94 const token_t* const token = va_arg(ap, const token_t*);
95 print_token(stderr, token);
102 va_list* toks = va_arg(ap, va_list*);
103 const char* const delimiter = va_arg(ap, const char*);
105 const token_type_t tok = va_arg(*toks, token_type_t);
111 fputs(delimiter, stderr);
113 print_token_type(stderr, tok);
116 const token_type_t token = va_arg(ap, token_type_t);
117 print_token_type(stderr, token);
123 panic("unknown format specifier");
131 void diagnosticf(const char *const fmt, ...)
136 diagnosticvf(fmt, ap);
140 void errorf(const source_position_t pos, const char *const fmt, ...)
144 fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr);
146 diagnosticvf(fmt, ap);
150 #ifdef ABORT_ON_ERROR
155 void warningf(const source_position_t pos, const char *const fmt, ...)
159 if (warnings_are_errors) {
160 fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr);
163 fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr);
166 diagnosticvf(fmt, ap);