mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-20 17:53:02 +00:00
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.
This commit is contained in:
126
src/complain.c
126
src/complain.c
@@ -22,6 +22,7 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
|
#include <argmatch.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <progname.h>
|
#include <progname.h>
|
||||||
|
|
||||||
@@ -33,10 +34,133 @@
|
|||||||
err_status complaint_status = status_none;
|
err_status complaint_status = status_none;
|
||||||
|
|
||||||
bool warnings_are_errors = false;
|
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;
|
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
|
void
|
||||||
complain_init (void)
|
complain_init (void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -42,6 +42,39 @@ typedef enum
|
|||||||
warnings_size /**< The number of warnings. Must be last. */
|
warnings_size /**< The number of warnings. Must be last. */
|
||||||
} warning_bit;
|
} 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
|
typedef enum
|
||||||
{
|
{
|
||||||
/**< Issue no warnings. */
|
/**< Issue no warnings. */
|
||||||
@@ -67,25 +100,6 @@ typedef enum
|
|||||||
} warnings;
|
} 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. */
|
/** Make a complaint, with maybe a location. */
|
||||||
void complain (location const *loc, warnings flags, char const *message, ...)
|
void complain (location const *loc, warnings flags, char const *message, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 3, 4)));
|
__attribute__ ((__format__ (__printf__, 3, 4)));
|
||||||
|
|||||||
119
src/getargs.c
119
src/getargs.c
@@ -223,123 +223,6 @@ static const int trace_types[] =
|
|||||||
ARGMATCH_VERIFY (trace_args, 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. |
|
| --feature's handling. |
|
||||||
`-----------------------*/
|
`-----------------------*/
|
||||||
@@ -804,7 +687,7 @@ getargs (int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'y':
|
case 'y':
|
||||||
warnings_flag[warning_yacc] = severity_error;
|
warning_argmatch ("error=yacc", 0, 6);
|
||||||
yacc_flag = true;
|
yacc_flag = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -121,13 +121,6 @@ enum feature
|
|||||||
/** What additional features to use. */
|
/** What additional features to use. */
|
||||||
extern int feature_flag;
|
extern int feature_flag;
|
||||||
|
|
||||||
/*------------.
|
|
||||||
| --warning. |
|
|
||||||
`------------*/
|
|
||||||
/* Null-terminated list. */
|
|
||||||
extern const char * const warnings_args[];
|
|
||||||
extern const int warnings_types[];
|
|
||||||
|
|
||||||
|
|
||||||
/** Process the command line arguments.
|
/** Process the command line arguments.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user