From 7f9f858b98f47c6648ca063c3fdce99c1fc05f57 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Tue, 22 May 2001 20:44:32 +0000 Subject: [PATCH] Split error and warning handlers into notify and output functions. Paired with changes in bison.y.in, this will make sure only one error and/or warning is output for each line. svn path=/trunk/yasm/; revision=35 --- include/errwarn.h | 14 +++++++++---- libyasm/errwarn.c | 50 +++++++++++++++++++++++++++++++++++++---------- libyasm/errwarn.h | 14 +++++++++---- src/errwarn.c | 50 +++++++++++++++++++++++++++++++++++++---------- src/errwarn.h | 14 +++++++++---- 5 files changed, 110 insertions(+), 32 deletions(-) diff --git a/include/errwarn.h b/include/errwarn.h index ffb0ecca..1c5fc8fa 100644 --- a/include/errwarn.h +++ b/include/errwarn.h @@ -1,4 +1,4 @@ -/* $Id: errwarn.h,v 1.2 2001/05/21 20:14:58 peter Exp $ +/* $Id: errwarn.h,v 1.3 2001/05/22 20:44:32 peter Exp $ * Error and warning reporting and related functions header file. * * Copyright (C) 2001 Peter Johnson @@ -32,21 +32,27 @@ typedef enum { void Fatal(fatal_num); typedef enum { - ERR_UNKNOWN = 0, + ERR_NONE = 0, ERR_PARSER, ERR_MISSING, ERR_MISSING_ARG, - ERR_INVALID_ARG + ERR_INVALID_ARG, + ERR_INVALID_EA, + ERR_INVALID_LINE, + ERR_EXP_SYNTAX } err_num; void Error(err_num, char *, ...); typedef enum { - WARN_UNKNOWN = 0, + WARN_NONE = 0, WARN_UNREC_CHAR, WARN_VALUE_EXCEEDS_BOUNDS } warn_num; void Warning(warn_num, char *, ...); +void OutputError(void); +void OutputWarning(void); + #endif diff --git a/libyasm/errwarn.c b/libyasm/errwarn.c index a7ab7052..136d2133 100644 --- a/libyasm/errwarn.c +++ b/libyasm/errwarn.c @@ -1,4 +1,4 @@ -/* $Id: errwarn.c,v 1.3 2001/05/21 20:14:58 peter Exp $ +/* $Id: errwarn.c,v 1.4 2001/05/22 20:44:32 peter Exp $ * Error and warning reporting and related functions. * * Copyright (C) 2001 Peter Johnson @@ -36,19 +36,29 @@ static char *fatal_msgs[] = { }; static char *err_msgs[] = { - "unknown error", + "", "parser error: %s", "missing '%1'", "missing argument to %s", - "invalid argument to %s" + "invalid argument to %s", + "invalid effective address", + "label or instruction expected at start of line", + "expression syntax error" }; static char *warn_msgs[] = { - "unknown", + "", "ignoring unrecognized character '%s'", "%s value exceeds bounds" }; +/* hate to define these as static buffers; better solution would be to use + * vasprintf() to dynamically allocate, but that's not ANSI C */ +static char last_err[1024]; +static char last_warn[1024]; +static err_num last_err_num = ERR_NONE; +static warn_num last_warn_num = WARN_NONE; + /* conv_unprint: convert a possibly unprintable character into a printable * string, using standard cat(1) convention for unprintable characters. */ static char unprint[5]; @@ -129,13 +139,16 @@ void Error(err_num num, char *argtypes, ...) va_list ap; char *printf_str; + if((last_err_num != ERR_NONE) && (last_err_num != ERR_PARSER)) + return; + + last_err_num = num; + printf_str = process_argtypes(err_msgs[num], argtypes); - fprintf(stderr, "filename:%u: ", line_number); va_start(ap, argtypes); - vfprintf(stderr, printf_str, ap); + vsprintf(last_err, printf_str, ap); va_end(ap); - fprintf(stderr, "\n"); free(printf_str); @@ -147,16 +160,33 @@ void Warning(warn_num num, char *argtypes, ...) va_list ap; char *printf_str; + if(last_warn_num != WARN_NONE) + return; + + last_warn_num = num; + printf_str = process_argtypes(warn_msgs[num], argtypes); - fprintf(stderr, "filename:%u: warning: ", line_number); va_start(ap, argtypes); - vfprintf(stderr, printf_str, ap); + vsprintf(last_warn, printf_str, ap); va_end(ap); - fprintf(stderr, "\n"); free(printf_str); warning_count++; } +void OutputError(void) +{ + if(last_err_num != ERR_NONE) + fprintf(stderr, "filename:%u: %s\n", line_number, last_err); + last_err_num = ERR_NONE; +} + +void OutputWarning(void) +{ + if(last_warn_num != WARN_NONE) + fprintf(stderr, "filename:%u: warning: %s\n", line_number, last_warn); + last_warn_num = WARN_NONE; +} + diff --git a/libyasm/errwarn.h b/libyasm/errwarn.h index ffb0ecca..1c5fc8fa 100644 --- a/libyasm/errwarn.h +++ b/libyasm/errwarn.h @@ -1,4 +1,4 @@ -/* $Id: errwarn.h,v 1.2 2001/05/21 20:14:58 peter Exp $ +/* $Id: errwarn.h,v 1.3 2001/05/22 20:44:32 peter Exp $ * Error and warning reporting and related functions header file. * * Copyright (C) 2001 Peter Johnson @@ -32,21 +32,27 @@ typedef enum { void Fatal(fatal_num); typedef enum { - ERR_UNKNOWN = 0, + ERR_NONE = 0, ERR_PARSER, ERR_MISSING, ERR_MISSING_ARG, - ERR_INVALID_ARG + ERR_INVALID_ARG, + ERR_INVALID_EA, + ERR_INVALID_LINE, + ERR_EXP_SYNTAX } err_num; void Error(err_num, char *, ...); typedef enum { - WARN_UNKNOWN = 0, + WARN_NONE = 0, WARN_UNREC_CHAR, WARN_VALUE_EXCEEDS_BOUNDS } warn_num; void Warning(warn_num, char *, ...); +void OutputError(void); +void OutputWarning(void); + #endif diff --git a/src/errwarn.c b/src/errwarn.c index a7ab7052..136d2133 100644 --- a/src/errwarn.c +++ b/src/errwarn.c @@ -1,4 +1,4 @@ -/* $Id: errwarn.c,v 1.3 2001/05/21 20:14:58 peter Exp $ +/* $Id: errwarn.c,v 1.4 2001/05/22 20:44:32 peter Exp $ * Error and warning reporting and related functions. * * Copyright (C) 2001 Peter Johnson @@ -36,19 +36,29 @@ static char *fatal_msgs[] = { }; static char *err_msgs[] = { - "unknown error", + "", "parser error: %s", "missing '%1'", "missing argument to %s", - "invalid argument to %s" + "invalid argument to %s", + "invalid effective address", + "label or instruction expected at start of line", + "expression syntax error" }; static char *warn_msgs[] = { - "unknown", + "", "ignoring unrecognized character '%s'", "%s value exceeds bounds" }; +/* hate to define these as static buffers; better solution would be to use + * vasprintf() to dynamically allocate, but that's not ANSI C */ +static char last_err[1024]; +static char last_warn[1024]; +static err_num last_err_num = ERR_NONE; +static warn_num last_warn_num = WARN_NONE; + /* conv_unprint: convert a possibly unprintable character into a printable * string, using standard cat(1) convention for unprintable characters. */ static char unprint[5]; @@ -129,13 +139,16 @@ void Error(err_num num, char *argtypes, ...) va_list ap; char *printf_str; + if((last_err_num != ERR_NONE) && (last_err_num != ERR_PARSER)) + return; + + last_err_num = num; + printf_str = process_argtypes(err_msgs[num], argtypes); - fprintf(stderr, "filename:%u: ", line_number); va_start(ap, argtypes); - vfprintf(stderr, printf_str, ap); + vsprintf(last_err, printf_str, ap); va_end(ap); - fprintf(stderr, "\n"); free(printf_str); @@ -147,16 +160,33 @@ void Warning(warn_num num, char *argtypes, ...) va_list ap; char *printf_str; + if(last_warn_num != WARN_NONE) + return; + + last_warn_num = num; + printf_str = process_argtypes(warn_msgs[num], argtypes); - fprintf(stderr, "filename:%u: warning: ", line_number); va_start(ap, argtypes); - vfprintf(stderr, printf_str, ap); + vsprintf(last_warn, printf_str, ap); va_end(ap); - fprintf(stderr, "\n"); free(printf_str); warning_count++; } +void OutputError(void) +{ + if(last_err_num != ERR_NONE) + fprintf(stderr, "filename:%u: %s\n", line_number, last_err); + last_err_num = ERR_NONE; +} + +void OutputWarning(void) +{ + if(last_warn_num != WARN_NONE) + fprintf(stderr, "filename:%u: warning: %s\n", line_number, last_warn); + last_warn_num = WARN_NONE; +} + diff --git a/src/errwarn.h b/src/errwarn.h index ffb0ecca..1c5fc8fa 100644 --- a/src/errwarn.h +++ b/src/errwarn.h @@ -1,4 +1,4 @@ -/* $Id: errwarn.h,v 1.2 2001/05/21 20:14:58 peter Exp $ +/* $Id: errwarn.h,v 1.3 2001/05/22 20:44:32 peter Exp $ * Error and warning reporting and related functions header file. * * Copyright (C) 2001 Peter Johnson @@ -32,21 +32,27 @@ typedef enum { void Fatal(fatal_num); typedef enum { - ERR_UNKNOWN = 0, + ERR_NONE = 0, ERR_PARSER, ERR_MISSING, ERR_MISSING_ARG, - ERR_INVALID_ARG + ERR_INVALID_ARG, + ERR_INVALID_EA, + ERR_INVALID_LINE, + ERR_EXP_SYNTAX } err_num; void Error(err_num, char *, ...); typedef enum { - WARN_UNKNOWN = 0, + WARN_NONE = 0, WARN_UNREC_CHAR, WARN_VALUE_EXCEEDS_BOUNDS } warn_num; void Warning(warn_num, char *, ...); +void OutputError(void); +void OutputWarning(void); + #endif -- 2.40.0