diff --git a/tools/qfcc/include/diagnostic.h b/tools/qfcc/include/diagnostic.h new file mode 100644 index 000000000..ff2753632 --- /dev/null +++ b/tools/qfcc/include/diagnostic.h @@ -0,0 +1,54 @@ +/* + diagnostic.h + + Diagnostic messages. + + Copyright (C) 2011 Bill Currie + + Author: Bill Currie + Date: 2011/01/24 + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA + + $Id$ +*/ + +#ifndef __diagnostic_h +#define __diagnostic_h + +#include "QF/pr_comp.h" + +/** \defgroup qfcc_diagnostic Diagnostic Messages + \ingroup qfcc +*/ +//@{ + +struct expr_s *error (struct expr_s *e, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +void +internal_error (struct expr_s *e, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3), noreturn)); +struct expr_s *warning (struct expr_s *e, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +struct expr_s *notice (struct expr_s *e, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); + +//@} + +#endif//__diagnostic_h diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index 559b4f378..5bcdf596c 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -547,16 +547,6 @@ expr_t *cast_expr (struct type_s *t, expr_t *e); void init_elements (struct def_s *def, expr_t *eles); -expr_t *error (expr_t *e, const char *fmt, ...) - __attribute__ ((format (printf, 2, 3))); -void -internal_error (expr_t *e, const char *fmt, ...) - __attribute__ ((format (printf, 2, 3), noreturn)); -expr_t *warning (expr_t *e, const char *fmt, ...) - __attribute__ ((format (printf, 2, 3))); -expr_t *notice (expr_t *e, const char *fmt, ...) - __attribute__ ((format (printf, 2, 3))); - const char *get_op_string (int op); extern int lineno_base; diff --git a/tools/qfcc/source/Makefile.am b/tools/qfcc/source/Makefile.am index 387ef6a5f..372f498dc 100644 --- a/tools/qfcc/source/Makefile.am +++ b/tools/qfcc/source/Makefile.am @@ -52,8 +52,8 @@ bin_SCRIPTS= $(qfpreqcc) EXTRA_PROGRAMS= qfcc qfpc qfprogs common_src=\ - class.c codespace.c constfold.c cpp.c debug.c def.c defspace.c dot_expr.c \ - dot_flow.c emit.c \ + class.c codespace.c constfold.c cpp.c debug.c def.c defspace.c \ + diagnostic.c dot_expr.c dot_flow.c emit.c \ expr.c function.c grab.c idstuff.c immediate.c linker.c method.c \ obj_stub.c opcodes.c options.c qfcc.c reloc.c statements.c strpool.c \ struct.c switch.c symtab.c type.c diff --git a/tools/qfcc/source/class.c b/tools/qfcc/source/class.c index 5086b742d..d8cfc94ef 100644 --- a/tools/qfcc/source/class.c +++ b/tools/qfcc/source/class.c @@ -53,6 +53,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "class.h" #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "emit.h" #include "expr.h" #include "immediate.h" diff --git a/tools/qfcc/source/constfold.c b/tools/qfcc/source/constfold.c index 2c55b6287..4adfa89c8 100644 --- a/tools/qfcc/source/constfold.c +++ b/tools/qfcc/source/constfold.c @@ -45,6 +45,7 @@ static __attribute__ ((used)) const char rcsid[] = #include #include +#include "diagnostic.h" #include "expr.h" #include "options.h" #include "qc-parse.h" diff --git a/tools/qfcc/source/debug.c b/tools/qfcc/source/debug.c index d8f02d6f3..682744c47 100644 --- a/tools/qfcc/source/debug.c +++ b/tools/qfcc/source/debug.c @@ -46,6 +46,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "QF/pr_comp.h" #include "debug.h" +#include "diagnostic.h" #include "expr.h" #include "immediate.h" #include "qfcc.h" diff --git a/tools/qfcc/source/def.c b/tools/qfcc/source/def.c index 095d1d74b..ab37b8e98 100644 --- a/tools/qfcc/source/def.c +++ b/tools/qfcc/source/def.c @@ -50,6 +50,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "qfcc.h" #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "expr.h" #include "immediate.h" #include "options.h" diff --git a/tools/qfcc/source/defspace.c b/tools/qfcc/source/defspace.c index 75b188999..78dd2c871 100644 --- a/tools/qfcc/source/defspace.c +++ b/tools/qfcc/source/defspace.c @@ -47,6 +47,7 @@ static __attribute__ ((used)) const char rcsid[] = "$Id$"; #include "qfcc.h" #include "defspace.h" +#include "diagnostic.h" #include "expr.h" #include "immediate.h" #include "options.h" diff --git a/tools/qfcc/source/diagnostic.c b/tools/qfcc/source/diagnostic.c new file mode 100644 index 000000000..311da5166 --- /dev/null +++ b/tools/qfcc/source/diagnostic.c @@ -0,0 +1,182 @@ +/* + diagnostic.c + + Diagnostic messages. + + Copyright (C) 2011 Bill Currie + + Author: Bill Currie + Date: 2011/01/24 + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA + +*/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +static __attribute__ ((used)) const char rcsid[] = "$Id$"; + +#include + +#include "qfcc.h" +#include "class.h" +#include "diagnostic.h" +#include "expr.h" +#include "function.h" +#include "options.h" +#include "strpool.h" + +static void +report_function (expr_t *e) +{ + static function_t *last_func = (function_t *)-1L; + static string_t last_file; + string_t file = pr.source_file; + srcline_t *srcline; + + if (e) + file = e->file; + + if (file != last_file) { + for (srcline = pr.srcline_stack; srcline; srcline = srcline->next) + fprintf (stderr, "In file included from %s:%d:\n", + GETSTR (srcline->source_file), srcline->source_line); + } + last_file = file; + if (current_func != last_func) { + if (current_func) { + fprintf (stderr, "%s: In function `%s':\n", GETSTR (file), + current_func->name); + } else if (current_class) { + fprintf (stderr, "%s: In class `%s':\n", GETSTR (file), + get_class_name (current_class, 1)); + } else { + fprintf (stderr, "%s: At top level:\n", GETSTR (file)); + } + } + last_func = current_func; +} + +static void +_warning (expr_t *e, const char *fmt, va_list args) +{ + string_t file = pr.source_file; + int line = pr.source_line; + + report_function (e); + if (options.warnings.promote) { + options.warnings.promote = 0; // want to do this only once + fprintf (stderr, "%s: warnings treated as errors\n", "qfcc"); + pr.error_count++; + } + + if (e) { + file = e->file; + line = e->line; + } + fprintf (stderr, "%s:%d: warning: ", GETSTR (file), line); + vfprintf (stderr, fmt, args); + fputs ("\n", stderr); +} + +expr_t * +notice (expr_t *e, const char *fmt, ...) +{ + va_list args; + + if (options.notices.silent) + return e; + + va_start (args, fmt); + if (options.notices.promote) { + _warning (e, fmt, args); + } else { + string_t file = pr.source_file; + int line = pr.source_line; + + report_function (e); + if (e) { + file = e->file; + line = e->line; + } + fprintf (stderr, "%s:%d: notice: ", GETSTR (file), line); + vfprintf (stderr, fmt, args); + fputs ("\n", stderr); + } + va_end (args); + return e; +} + +expr_t * +warning (expr_t *e, const char *fmt, ...) +{ + va_list args; + + va_start (args, fmt); + _warning (e, fmt, args); + va_end (args); + return e; +} + +static void +_error (expr_t *e, const char *err, const char *fmt, va_list args) +{ + string_t file = pr.source_file; + int line = pr.source_line; + + report_function (e); + + if (e) { + file = e->file; + line = e->line; + } + fprintf (stderr, "%s:%d: %s%s", GETSTR (file), line, err, + fmt ? ": " : ""); + if (fmt) + vfprintf (stderr, fmt, args); + fputs ("\n", stderr); + pr.error_count++; +} + +void +internal_error (expr_t *e, const char *fmt, ...) +{ + va_list args; + + va_start (args, fmt); + _error (e, "internal error", fmt, args); + va_end (args); + abort (); +} + +expr_t * +error (expr_t *e, const char *fmt, ...) +{ + va_list args; + + va_start (args, fmt); + _error (e, "error", fmt, args); + va_end (args); + + if (!e) + e = new_expr (); + e->type = ex_error; + return e; +} diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index d620cc046..b8ef1f4ec 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -51,6 +51,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "class.h" #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "emit.h" #include "expr.h" #include "function.h" @@ -2478,141 +2479,3 @@ sizeof_expr (expr_t *expr, struct type_s *type) expr = new_integer_expr (type_size (type)); return expr; } - -static void -report_function (expr_t *e) -{ - static function_t *last_func = (function_t *)-1L; - static string_t last_file; - string_t file = pr.source_file; - srcline_t *srcline; - - if (e) - file = e->file; - - if (file != last_file) { - for (srcline = pr.srcline_stack; srcline; srcline = srcline->next) - fprintf (stderr, "In file included from %s:%d:\n", - GETSTR (srcline->source_file), srcline->source_line); - } - last_file = file; - if (current_func != last_func) { - if (current_func) { - fprintf (stderr, "%s: In function `%s':\n", GETSTR (file), - current_func->name); - } else if (current_class) { - fprintf (stderr, "%s: In class `%s':\n", GETSTR (file), - get_class_name (current_class, 1)); - } else { - fprintf (stderr, "%s: At top level:\n", GETSTR (file)); - } - } - last_func = current_func; -} - -static void -_warning (expr_t *e, const char *fmt, va_list args) -{ - string_t file = pr.source_file; - int line = pr.source_line; - - report_function (e); - if (options.warnings.promote) { - options.warnings.promote = 0; // want to do this only once - fprintf (stderr, "%s: warnings treated as errors\n", "qfcc"); - pr.error_count++; - } - - if (e) { - file = e->file; - line = e->line; - } - fprintf (stderr, "%s:%d: warning: ", GETSTR (file), line); - vfprintf (stderr, fmt, args); - fputs ("\n", stderr); -} - -expr_t * -notice (expr_t *e, const char *fmt, ...) -{ - va_list args; - - if (options.notices.silent) - return e; - - va_start (args, fmt); - if (options.notices.promote) { - _warning (e, fmt, args); - } else { - string_t file = pr.source_file; - int line = pr.source_line; - - report_function (e); - if (e) { - file = e->file; - line = e->line; - } - fprintf (stderr, "%s:%d: notice: ", GETSTR (file), line); - vfprintf (stderr, fmt, args); - fputs ("\n", stderr); - } - va_end (args); - return e; -} - -expr_t * -warning (expr_t *e, const char *fmt, ...) -{ - va_list args; - - va_start (args, fmt); - _warning (e, fmt, args); - va_end (args); - return e; -} - -static void -_error (expr_t *e, const char *err, const char *fmt, va_list args) -{ - string_t file = pr.source_file; - int line = pr.source_line; - - report_function (e); - - if (e) { - file = e->file; - line = e->line; - } - fprintf (stderr, "%s:%d: %s%s", GETSTR (file), line, err, - fmt ? ": " : ""); - if (fmt) - vfprintf (stderr, fmt, args); - fputs ("\n", stderr); - pr.error_count++; -} - -void -internal_error (expr_t *e, const char *fmt, ...) -{ - va_list args; - - va_start (args, fmt); - _error (e, "internal error", fmt, args); - va_end (args); - abort (); -} - -expr_t * -error (expr_t *e, const char *fmt, ...) -{ - va_list args; - - va_start (args, fmt); - _error (e, "error", fmt, args); - va_end (args); - - if (!e) - e = new_expr (); - e->type = ex_error; - return e; -} diff --git a/tools/qfcc/source/function.c b/tools/qfcc/source/function.c index 1d88ac960..9acb56004 100644 --- a/tools/qfcc/source/function.c +++ b/tools/qfcc/source/function.c @@ -52,6 +52,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "debug.h" #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "emit.h" #include "expr.h" #include "function.h" diff --git a/tools/qfcc/source/grab.c b/tools/qfcc/source/grab.c index 142247cc2..cca15adc7 100644 --- a/tools/qfcc/source/grab.c +++ b/tools/qfcc/source/grab.c @@ -44,6 +44,7 @@ static __attribute__ ((used)) const char rcsid[] = "$Id$"; #include "QF/hash.h" +#include "diagnostic.h" #include "expr.h" #include "grab.h" #include "options.h" diff --git a/tools/qfcc/source/idstuff.c b/tools/qfcc/source/idstuff.c index a4f099f43..f9d12dac8 100644 --- a/tools/qfcc/source/idstuff.c +++ b/tools/qfcc/source/idstuff.c @@ -47,6 +47,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "qfcc.h" #include "expr.h" #include "idstuff.h" diff --git a/tools/qfcc/source/linker.c b/tools/qfcc/source/linker.c index 1e9aec187..42308e533 100644 --- a/tools/qfcc/source/linker.c +++ b/tools/qfcc/source/linker.c @@ -58,6 +58,7 @@ static __attribute__ ((used)) const char rcsid[] = "$Id$"; #include "codespace.h" #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "emit.h" #include "expr.h" #include "immediate.h" diff --git a/tools/qfcc/source/method.c b/tools/qfcc/source/method.c index 7434786a2..ab7c41792 100644 --- a/tools/qfcc/source/method.c +++ b/tools/qfcc/source/method.c @@ -53,6 +53,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "class.h" #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "emit.h" #include "immediate.h" #include "method.h" diff --git a/tools/qfcc/source/qc-lex.l b/tools/qfcc/source/qc-lex.l index ecaf032ce..dde660a29 100644 --- a/tools/qfcc/source/qc-lex.l +++ b/tools/qfcc/source/qc-lex.l @@ -50,6 +50,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "class.h" #include "debug.h" +#include "diagnostic.h" #include "expr.h" #include "grab.h" #include "immediate.h" diff --git a/tools/qfcc/source/qc-parse.y b/tools/qfcc/source/qc-parse.y index 1d27f5f1d..f1bd4d032 100644 --- a/tools/qfcc/source/qc-parse.y +++ b/tools/qfcc/source/qc-parse.y @@ -49,6 +49,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "class.h" #include "debug.h" #include "def.h" +#include "diagnostic.h" #include "emit.h" #include "expr.h" #include "function.h" diff --git a/tools/qfcc/source/qp-lex.l b/tools/qfcc/source/qp-lex.l index ec64f05b0..8d951daa0 100644 --- a/tools/qfcc/source/qp-lex.l +++ b/tools/qfcc/source/qp-lex.l @@ -37,6 +37,7 @@ static __attribute__ ((used)) const char rcsid[] = "$Id$"; #include "QF/hash.h" #include "debug.h" +#include "diagnostic.h" #include "expr.h" #include "grab.h" #include "qfcc.h" diff --git a/tools/qfcc/source/qp-parse.y b/tools/qfcc/source/qp-parse.y index b225f56ba..964db437e 100644 --- a/tools/qfcc/source/qp-parse.y +++ b/tools/qfcc/source/qp-parse.y @@ -44,6 +44,7 @@ static __attribute__ ((used)) const char rcsid[] = "$Id$"; #include "QF/dstring.h" #include "codespace.h" +#include "diagnostic.h" #include "expr.h" #include "function.h" #include "qfcc.h" diff --git a/tools/qfcc/source/reloc.c b/tools/qfcc/source/reloc.c index 488203b10..96dba64ce 100644 --- a/tools/qfcc/source/reloc.c +++ b/tools/qfcc/source/reloc.c @@ -45,6 +45,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "codespace.h" #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "emit.h" #include "expr.h" #include "function.h" diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index fd55322d1..70d2f6ac6 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -41,6 +41,7 @@ #include "QF/va.h" +#include "diagnostic.h" #include "expr.h" #include "options.h" #include "qc-parse.h" diff --git a/tools/qfcc/source/strpool.c b/tools/qfcc/source/strpool.c index 330a3db8c..27a0ef172 100644 --- a/tools/qfcc/source/strpool.c +++ b/tools/qfcc/source/strpool.c @@ -46,7 +46,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "QF/dstring.h" #include "QF/hash.h" -#include "expr.h" +#include "diagnostic.h" #include "options.h" #include "strpool.h" diff --git a/tools/qfcc/source/struct.c b/tools/qfcc/source/struct.c index da2e98a15..a16b2b1fd 100644 --- a/tools/qfcc/source/struct.c +++ b/tools/qfcc/source/struct.c @@ -50,6 +50,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "emit.h" #include "expr.h" #include "immediate.h" diff --git a/tools/qfcc/source/switch.c b/tools/qfcc/source/switch.c index 9d164bfd5..a3846e1d4 100644 --- a/tools/qfcc/source/switch.c +++ b/tools/qfcc/source/switch.c @@ -46,6 +46,7 @@ static __attribute__ ((used)) const char rcsid[] = #include #include "def.h" +#include "diagnostic.h" #include "expr.h" #include "opcodes.h" #include "options.h" diff --git a/tools/qfcc/source/symtab.c b/tools/qfcc/source/symtab.c index 1c9bddb38..51de18ee2 100644 --- a/tools/qfcc/source/symtab.c +++ b/tools/qfcc/source/symtab.c @@ -6,6 +6,7 @@ #include "class.h" #include "def.h" #include "defspace.h" +#include "diagnostic.h" #include "function.h" #include "qfcc.h" #include "strpool.h" diff --git a/tools/qfcc/source/type.c b/tools/qfcc/source/type.c index 3ef684963..158b5e727 100644 --- a/tools/qfcc/source/type.c +++ b/tools/qfcc/source/type.c @@ -50,6 +50,7 @@ static __attribute__ ((used)) const char rcsid[] = #include "class.h" #include "def.h" +#include "diagnostic.h" #include "expr.h" #include "function.h" #include "options.h" @@ -166,8 +167,7 @@ types_same (type_t *a, type_t *b) return 0; return 1; } - error (0, "we be broke"); - abort (); + internal_error (0, "we be broke"); } /*