6 #include "diagnostic.h"
11 /** Number of occurred diagnostics. */
12 unsigned diagnostic_count = 0;
13 /** Number of occurred errors. */
14 unsigned error_count = 0;
15 /** Number of occurred warnings. */
16 unsigned warning_count = 0;
17 /** true if warnings should be inhibited */
18 bool inhibit_all_warnings = false;
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 = (unsigned char) 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 symbol_t *const symbol = va_arg(ap, const symbol_t*);
66 fputs(symbol->string, stderr);
71 const expression_t* const expr = va_arg(ap, const expression_t*);
72 print_expression(expr);
77 const unsigned qualifiers = va_arg(ap, unsigned);
78 print_type_qualifiers(qualifiers);
83 const type_t* const type = va_arg(ap, const type_t*);
84 const symbol_t* sym = NULL;
86 sym = va_arg(ap, const symbol_t*);
88 print_type_ext(type, sym, NULL);
93 const token_t* const token = va_arg(ap, const token_t*);
94 print_token(stderr, token);
101 va_list* toks = va_arg(ap, va_list*);
102 const char* const delimiter = va_arg(ap, const char*);
104 const token_type_t tok = va_arg(*toks, token_type_t);
110 fputs(delimiter, stderr);
112 print_token_type(stderr, tok);
115 const token_type_t token = va_arg(ap, token_type_t);
116 print_token_type(stderr, token);
122 panic("unknown format specifier");
130 void diagnosticf(const char *const fmt, ...)
135 diagnosticvf(fmt, ap);
139 static void errorvf(const source_position_t pos,
140 const char *const fmt, va_list ap)
142 fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr);
144 diagnosticvf(fmt, ap);
147 if (warning.fatal_errors)
151 void errorf(const source_position_t pos, const char *const fmt, ...)
155 errorvf(pos, fmt, ap);
159 static void warningvf(const source_position_t pos,
160 const char *const fmt, va_list ap)
162 fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr);
164 diagnosticvf(fmt, ap);
168 void warningf(const source_position_t pos, const char *const fmt, ...)
170 if (inhibit_all_warnings)
175 if (warning.s_are_errors) {
176 errorvf(pos, fmt, ap);
178 warningvf(pos, fmt, ap);