X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=diagnostic.c;h=c1a4ad8f57cac5631a3451fbef3f83f8424cf210;hb=8c2442b5efb0f534ac76b62f2b0cee24481991f9;hp=9af64913b3edb9c1775e04aee6b0a75dc232d3a7;hpb=e344e920c9e6eac5f91e9e72ef44b2597e0114ab;p=cparser diff --git a/diagnostic.c b/diagnostic.c index 9af6491..c1a4ad8 100644 --- a/diagnostic.c +++ b/diagnostic.c @@ -7,16 +7,18 @@ #include "token_t.h" #include "type.h" -//#define ABORT_ON_ERROR - /** Number of occurred diagnostics. */ unsigned diagnostic_count = 0; /** Number of occurred errors. */ unsigned error_count = 0; /** Number of occurred warnings. */ unsigned warning_count = 0; -/* true if warnings should be treated as errors */ +/** true if warnings should be inhibited */ +bool inhibit_all_warnings = false; +/** true if warnings should be treated as errors */ bool warnings_are_errors = false; +/** true if the first error should stop the compilation */ +bool fatal_errors = false; /** * Issue a diagnostic message. @@ -137,33 +139,48 @@ void diagnosticf(const char *const fmt, ...) va_end(ap); } -void errorf(const source_position_t pos, const char *const fmt, ...) +static void errorvf(const source_position_t pos, + const char *const fmt, va_list ap) { - va_list ap; - va_start(ap, fmt); fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr); ++error_count; diagnosticvf(fmt, ap); - va_end(ap); fputc('\n', stderr); -#ifdef ABORT_ON_ERROR - abort(); -#endif + if (fatal_errors) + abort(); +} +void errorf(const source_position_t pos, const char *const fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + errorvf(pos, fmt, ap); + va_end(ap); + + if (fatal_errors) + exit(1); +} + +static void warningvf(const source_position_t pos, + const char *const fmt, va_list ap) +{ + fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr); + ++warning_count; + diagnosticvf(fmt, ap); + fputc('\n', stderr); } void warningf(const source_position_t pos, const char *const fmt, ...) { + if (inhibit_all_warnings) + return; + va_list ap; va_start(ap, fmt); if (warnings_are_errors) { - fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr); - ++error_count; + errorvf(pos, fmt, ap); } else { - fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr); - ++warning_count; + warningvf(pos, fmt, ap); } - diagnosticvf(fmt, ap); va_end(ap); - fputc('\n', stderr); }