X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=diagnostic.c;h=abfa8eba5fc68429fae956f67508a4510e254700;hb=d70f5307ecc25394fc2da35bf4167fea5ac4b9ec;hp=fab118ec9e9eb0253e5768eeae3f24a9ed0c1008;hpb=f3fe51846775845f20d8fc1ae5f60f4556599582;p=cparser diff --git a/diagnostic.c b/diagnostic.c index fab118e..abfa8eb 100644 --- a/diagnostic.c +++ b/diagnostic.c @@ -6,9 +6,7 @@ #include "diagnostic.h" #include "token_t.h" #include "type.h" - - -//#define ABORT_ON_ERROR +#include "warning.h" /** Number of occurred diagnostics. */ unsigned diagnostic_count = 0; @@ -16,6 +14,8 @@ unsigned diagnostic_count = 0; unsigned error_count = 0; /** Number of occurred warnings. */ unsigned warning_count = 0; +/** true if warnings should be inhibited */ +bool inhibit_all_warnings = false; /** * Issue a diagnostic message. @@ -136,28 +136,46 @@ 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) { - ++error_count; fprintf(stderr, "%s:%u: error: ", pos.input_name, pos.linenr); + ++error_count; + diagnosticvf(fmt, ap); + fputc('\n', stderr); + + if (warning.fatal_errors) + exit(EXIT_FAILURE); +} + +void errorf(const source_position_t pos, const char *const fmt, ...) +{ va_list ap; va_start(ap, fmt); - diagnosticvf(fmt, ap); + errorvf(pos, fmt, ap); va_end(ap); - fputc('\n', stderr); +} -#ifdef ABORT_ON_ERROR - abort(); -#endif +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, ...) { - ++warning_count; - fprintf(stderr, "%s:%u: warning: ", pos.input_name, pos.linenr); + if (inhibit_all_warnings) + return; + va_list ap; va_start(ap, fmt); - diagnosticvf(fmt, ap); + if (warning.s_are_errors) { + errorvf(pos, fmt, ap); + } else { + warningvf(pos, fmt, ap); + } va_end(ap); - fputc('\n', stderr); }