6 #include "diagnostic.h"
11 //#define ABORT_ON_ERROR
13 /** Number of occurred diagnostics. */
14 unsigned diagnostic_count = 0;
15 /** Number of occurred errors. */
16 unsigned error_count = 0;
17 /** Number of occurred warnings. */
18 unsigned warning_count = 0;
21 * Issue a diagnostic message.
23 static void diagnosticvf(const char *const fmt, va_list ap)
25 for (const char* f = fmt; *f != '\0'; ++f) {
29 bool extended = false;
41 const wint_t val = va_arg(ap, wint_t);
47 const unsigned char val = va_arg(ap, int);
53 const int val = va_arg(ap, int);
54 fprintf(stderr, "%d", val);
59 const char* const str = va_arg(ap, const char*);
65 const expression_t* const expr = va_arg(ap, const expression_t*);
66 print_expression(expr);
71 const unsigned qualifiers = va_arg(ap, unsigned);
72 print_type_qualifiers(qualifiers);
77 const type_t* const type = va_arg(ap, const type_t*);
78 const symbol_t* sym = NULL;
80 sym = va_arg(ap, const symbol_t*);
82 print_type_ext(type, sym, NULL);
87 const token_t* const token = va_arg(ap, const token_t*);
88 print_token(stderr, token);
95 va_list* toks = va_arg(ap, va_list*);
96 const char* const delimiter = va_arg(ap, const char*);
98 const token_type_t tok = va_arg(*toks, token_type_t);
104 fputs(delimiter, stderr);
106 print_token_type(stderr, tok);
109 const token_type_t token = va_arg(ap, token_type_t);
110 print_token_type(stderr, token);
116 panic("unknown format specifier");
124 void diagnosticf(const char *const fmt, ...)
129 diagnosticvf(fmt, ap);
133 void errorf(const source_position_t pos, const char *const fmt, ...)
136 fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr);
139 diagnosticvf(fmt, ap);
143 #ifdef ABORT_ON_ERROR
148 void warningf(const source_position_t pos, const char *const fmt, ...)
151 fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr);
154 diagnosticvf(fmt, ap);