From 12bc1c9e47a5c043e1d2bba599846732b93d062c Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 14 Feb 2013 14:35:24 +0100 Subject: [PATCH] style: move argument handling of -W into the diagnostics module This allows to reduce the number of public interfaces. * src/getargs.c (--yacc): Use warning_argmatch instead of tweaking directly warnings_flag (which will be private). (warning_argmatch, warnings_argmatch): Move to... * src/complain.h, src/complain.c: here. * src/getargs.h, src/getargs.c (warnings_args, warnings_types): Move to... * src/complain.c: here, now private. * src/complain.h (severity, warnings_flag): Move to... * src/complain.c: here, now private. --- src/complain.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++- src/complain.h | 52 ++++++++++++-------- src/getargs.c | 119 +--------------------------------------------- src/getargs.h | 7 --- 4 files changed, 159 insertions(+), 145 deletions(-) diff --git a/src/complain.c b/src/complain.c index 2bc276e9..1162da29 100644 --- a/src/complain.c +++ b/src/complain.c @@ -22,6 +22,7 @@ #include #include "system.h" +#include #include #include @@ -33,10 +34,133 @@ err_status complaint_status = status_none; bool warnings_are_errors = false; -severity warnings_flag[warnings_size]; + +/** Diagnostics severity. */ +typedef enum + { + severity_disabled = 0, + severity_unset = 1, + severity_warning = 2, + severity_error = 3, + severity_fatal = 4 + } severity; + + +/** For each warning type, its severity. */ +static severity warnings_flag[warnings_size]; static unsigned *indent_ptr = 0; +/*------------------------. +| --warnings's handling. | +`------------------------*/ + +static const char * const warnings_args[] = +{ + "none", + "midrule-values", + "yacc", + "conflicts-sr", + "conflicts-rr", + "deprecated", + "precedence", + "other", + "all", + "error", + 0 +}; + +static const int warnings_types[] = +{ + Wnone, + Wmidrule_values, + Wyacc, + Wconflicts_sr, + Wconflicts_rr, + Wdeprecated, + Wprecedence, + Wother, + Wall, + Werror +}; + +ARGMATCH_VERIFY (warnings_args, warnings_types); + +void +warning_argmatch (char const *arg, size_t no, size_t err) +{ + int value = XARGMATCH ("--warning", arg + no + err, + warnings_args, warnings_types); + + /* -Wnone == -Wno-all, and -Wno-none == -Wall. */ + if (!value) + { + value = Wall; + no = !no; + } + + if (no) + { + size_t b; + for (b = 0; b < warnings_size; ++b) + if (value & 1 << b) + { + if (err) + { + /* -Wno-error=foo: if foo enabled as an error, + make it a warning. */ + if (warnings_flag[b] == severity_error) + warnings_flag[b] = severity_warning; + } + else + /* -Wno-foo. */ + warnings_flag[b] = severity_disabled; + } + } + else + { + size_t b; + for (b = 0; b < warnings_size; ++b) + if (value & 1 << b) + /* -Wfoo and -Werror=foo. */ + warnings_flag[b] = err ? severity_error : severity_warning; + } +} + +/** Decode a comma-separated list of arguments from -W. + * + * \param args comma separated list of effective subarguments to decode. + * If 0, then activate all the flags. + */ + +void +warnings_argmatch (char *args) +{ + if (args) + for (args = strtok (args, ","); args; args = strtok (NULL, ",")) + if (STREQ (args, "error")) + warnings_are_errors = true; + else if (STREQ (args, "no-error")) + { + warnings_are_errors = false; + warning_argmatch ("no-error=all", 3, 6); + } + else + { + size_t no = STRPREFIX_LIT ("no-", args) ? 3 : 0; + size_t err = STRPREFIX_LIT ("error=", args + no) ? 6 : 0; + + warning_argmatch (args, no, err); + } + else + warning_argmatch ("all", 0, 0); +} + + +/*-----------. +| complain. | +`-----------*/ + void complain_init (void) { diff --git a/src/complain.h b/src/complain.h index c7f93e1e..10ea19bf 100644 --- a/src/complain.h +++ b/src/complain.h @@ -42,6 +42,39 @@ typedef enum warnings_size /**< The number of warnings. Must be last. */ } warning_bit; +/** Whether -Werror was set. */ +extern bool warnings_are_errors; + +/** Decode a single argument from -W. + * + * \param arg the subarguments to decode. + * If null, then activate all the flags. + * \param no length of the potential "no-" prefix. + * Can be 0 or 3. If 3, negate the action of the subargument. + * \param err length of a potential "error=". + * Can be 0 or 6. If 6, treat the subargument as a CATEGORY. + * + * If VALUE != 0 then KEY sets flags and no-KEY clears them. + * If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all + * flags from \c all. Thus no-none = all and no-all = none. + */ +void warning_argmatch (char const *arg, size_t no, size_t err); + +/** Decode a comma-separated list of arguments from -W. + * + * \param args comma separated list of effective subarguments to decode. + * If 0, then activate all the flags. + */ +void warnings_argmatch (char *args); + + +/*-----------. +| complain. | +`-----------*/ + +/** Initialize this module. */ +void complain_init (void); + typedef enum { /**< Issue no warnings. */ @@ -67,25 +100,6 @@ typedef enum } warnings; -/** For each warning type, its severity. */ -typedef enum - { - severity_disabled = 0, - severity_unset = 1, - severity_warning = 2, - severity_error = 3, - severity_fatal = 4 - } severity; - -/** Whether -Werror was set. */ -extern bool warnings_are_errors; - -/** For each warning type, its severity. */ -extern severity warnings_flag[]; - -/** Initialize this module. */ -void complain_init (void); - /** Make a complaint, with maybe a location. */ void complain (location const *loc, warnings flags, char const *message, ...) __attribute__ ((__format__ (__printf__, 3, 4))); diff --git a/src/getargs.c b/src/getargs.c index 844036ee..fd96fe17 100644 --- a/src/getargs.c +++ b/src/getargs.c @@ -223,123 +223,6 @@ static const int trace_types[] = ARGMATCH_VERIFY (trace_args, trace_types); -/*------------------------. -| --warnings's handling. | -`------------------------*/ - -/** Decode a single argument from -W. - * - * \param arg the subarguments to decode. - * If null, then activate all the flags. - * \param no length of the potential "no-" prefix. - * Can be 0 or 3. If 3, negate the action of the subargument. - * \param err length of a potential "error=". - * Can be 0 or 6. If 6, treat the subargument as a CATEGORY. - * - * If VALUE != 0 then KEY sets flags and no-KEY clears them. - * If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all - * flags from \c all. Thus no-none = all and no-all = none. - */ -static void -warning_argmatch (char const *arg, size_t no, size_t err) -{ - int value = XARGMATCH ("--warning", arg + no + err, - warnings_args, warnings_types); - - /* -Wnone == -Wno-all, and -Wno-none == -Wall. */ - if (!value) - { - value = Wall; - no = !no; - } - - if (no) - { - size_t b; - for (b = 0; b < warnings_size; ++b) - if (value & 1 << b) - { - if (err) - { - /* -Wno-error=foo: if foo enabled as an error, - make it a warning. */ - if (warnings_flag[b] == severity_error) - warnings_flag[b] = severity_warning; - } - else - /* -Wno-foo. */ - warnings_flag[b] = severity_disabled; - } - } - else - { - size_t b; - for (b = 0; b < warnings_size; ++b) - if (value & 1 << b) - /* -Wfoo and -Werror=foo. */ - warnings_flag[b] = err ? severity_error : severity_warning; - } -} - -/** Decode a comma-separated list of arguments from -W. - * - * \param args comma separated list of effective subarguments to decode. - * If 0, then activate all the flags. - */ -static void -warnings_argmatch (char *args) -{ - if (args) - for (args = strtok (args, ","); args; args = strtok (NULL, ",")) - if (STREQ (args, "error")) - warnings_are_errors = true; - else if (STREQ (args, "no-error")) - { - warnings_are_errors = false; - warning_argmatch ("no-error=all", 3, 6); - } - else - { - size_t no = STRPREFIX_LIT ("no-", args) ? 3 : 0; - size_t err = STRPREFIX_LIT ("error=", args + no) ? 6 : 0; - - warning_argmatch (args, no, err); - } - else - warning_argmatch ("all", 0, 0); -} - -const char * const warnings_args[] = -{ - "none", - "midrule-values", - "yacc", - "conflicts-sr", - "conflicts-rr", - "deprecated", - "precedence", - "other", - "all", - "error", - 0 -}; - -const int warnings_types[] = -{ - Wnone, - Wmidrule_values, - Wyacc, - Wconflicts_sr, - Wconflicts_rr, - Wdeprecated, - Wprecedence, - Wother, - Wall, - Werror -}; - -ARGMATCH_VERIFY (warnings_args, warnings_types); - /*-----------------------. | --feature's handling. | `-----------------------*/ @@ -804,7 +687,7 @@ getargs (int argc, char *argv[]) break; case 'y': - warnings_flag[warning_yacc] = severity_error; + warning_argmatch ("error=yacc", 0, 6); yacc_flag = true; break; diff --git a/src/getargs.h b/src/getargs.h index 2fba265a..5d4dfb0d 100644 --- a/src/getargs.h +++ b/src/getargs.h @@ -121,13 +121,6 @@ enum feature /** What additional features to use. */ extern int feature_flag; -/*------------. -| --warning. | -`------------*/ -/* Null-terminated list. */ -extern const char * const warnings_args[]; -extern const int warnings_types[]; - /** Process the command line arguments. * -- 2.45.2