X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/e9690142325711b320ef444768fdd40a087d02f7..56f8d560888c22e2788244066478a3e92334f633:/src/getargs.c?ds=sidebyside diff --git a/src/getargs.c b/src/getargs.c index d039383f..5a74f4b8 100644 --- a/src/getargs.c +++ b/src/getargs.c @@ -1,6 +1,6 @@ /* Parse command line arguments for Bison. - Copyright (C) 1984, 1986, 1989, 1992, 2000-2011 Free Software + Copyright (C) 1984, 1986, 1989, 1992, 2000-2012 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -26,25 +26,14 @@ #include #include #include -#include - -/* Hack to get to declare getopt with a prototype. */ -#if lint && ! defined __GNU_LIBRARY__ -# define __GNU_LIBRARY__ -# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1 -#endif - #include - -#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE -# undef __GNU_LIBRARY__ -# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE -#endif +#include #include "complain.h" #include "files.h" #include "getargs.h" #include "muscle-tab.h" +#include "quote.h" #include "uniqstr.h" bool defines_flag; @@ -59,8 +48,6 @@ bool glr_parser = false; int report_flag = report_none; int trace_flag = trace_none; -int warnings_flag = warnings_conflicts_sr | warnings_conflicts_rr - | warnings_other; static struct bison_language const valid_languages[] = { { "c", "c-skel.m4", ".c", ".h", true }, @@ -75,8 +62,6 @@ int language_prio = default_prio; struct bison_language const *language = &valid_languages[0]; const char *include = NULL; -char *program_name; - /** Decode an option's set of keys. * @@ -102,7 +87,7 @@ flags_argmatch (const char *option, args = strtok (args, ","); while (args) { - int no = strncmp (args, "no-", 3) == 0 ? 3 : 0; + int no = STRPREFIX_LIT ("no-", args) ? 3 : 0; int value = XARGMATCH (option, args + no, keys, values); if (value == 0) { @@ -129,15 +114,15 @@ flags_argmatch (const char *option, * * \param FlagName the flag familly to update. * \param Args the effective sub arguments to decode. + * \param All the "all" value. * * \arg FlagName_args the list of keys. * \arg FlagName_types the list of values. - * \arg FlagName_all the all value. * \arg FlagName_flag the flag to update. */ -#define FLAGS_ARGMATCH(FlagName, Args) \ +#define FLAGS_ARGMATCH(FlagName, Args, All) \ flags_argmatch ("--" #FlagName, FlagName ## _args, FlagName ## _types, \ - FlagName ## _all, &FlagName ## _flag, Args) + All, &FlagName ## _flag, Args) /*----------------------. @@ -241,19 +226,18 @@ static const char * const warnings_args[] = static const int warnings_types[] = { - warnings_none, - warnings_midrule_values, - warnings_yacc, - warnings_conflicts_sr, - warnings_conflicts_rr, - warnings_other, - warnings_all, - warnings_error + Wnone, + Wmidrule_values, + Wyacc, + Wconflicts_sr, + Wconflicts_rr, + Wother, + Wall, + Werror }; ARGMATCH_VERIFY (warnings_args, warnings_types); - /*-------------------------------------------. | Display the help message and exit STATUS. | `-------------------------------------------*/ @@ -308,10 +292,11 @@ Parser:\n\ -t, --debug instrument the parser for tracing\n\ same as `-Dparse.trace'\n\ --locations enable location support\n\ - -D, --define=NAME[=VALUE] similar to `%define NAME \"VALUE\"'\n\ - -F, --force-define=NAME[=VALUE] override `%define NAME \"VALUE\"'\n\ + -D, --define=NAME[=VALUE] similar to '%define NAME \"VALUE\"'\n\ + -F, --force-define=NAME[=VALUE] override '%define NAME \"VALUE\"'\n\ -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\ - -l, --no-lines don't generate `#line' directives\n\ + deprecated by '-Dapi.prefix=PREFIX'\n\ + -l, --no-lines don't generate '#line' directives\n\ -k, --token-table include a table of token names\n\ \n\ "), stdout); @@ -403,7 +388,8 @@ skeleton_arg (char const *arg, int prio, location loc) skeleton = arg; } else if (prio == skeleton_prio) - complain_at (loc, _("multiple skeleton declarations are invalid")); + complain_at (loc, complaint, + _("multiple skeleton declarations are invalid")); } void @@ -421,14 +407,14 @@ language_argmatch (char const *arg, int prio, location loc) language = &valid_languages[i]; return; } - msg = _("invalid language `%s'"); + msg = _("%s: invalid language"); } else if (language_prio == prio) msg = _("multiple language declarations are invalid"); else return; - complain_at (loc, msg, arg); + complain_at (loc, complaint, msg, quotearg_colon (arg)); } /*----------------------. @@ -559,7 +545,7 @@ getargs (int argc, char *argv[]) case 'F': /* -FNAME[=VALUE]. */ { char* name = optarg; - char* value = mbschr (optarg, '='); + char* value = strchr (optarg, '='); if (value) *value++ = 0; muscle_percent_define_insert (name, command_line_location (), @@ -584,7 +570,7 @@ getargs (int argc, char *argv[]) break; case 'T': - FLAGS_ARGMATCH (trace, optarg); + FLAGS_ARGMATCH (trace, optarg, trace_all); break; case 'V': @@ -592,7 +578,7 @@ getargs (int argc, char *argv[]) exit (EXIT_SUCCESS); case 'W': - FLAGS_ARGMATCH (warnings, optarg); + FLAGS_ARGMATCH (warnings, optarg, Wall); break; case 'b': @@ -603,13 +589,19 @@ getargs (int argc, char *argv[]) /* Here, the -d and --defines options are differentiated. */ defines_flag = true; if (optarg) - spec_defines_file = xstrdup (AS_FILE_NAME (optarg)); + { + free (spec_defines_file); + spec_defines_file = xstrdup (AS_FILE_NAME (optarg)); + } break; case 'g': graph_flag = true; if (optarg) - spec_graph_file = xstrdup (AS_FILE_NAME (optarg)); + { + free (spec_graph_file); + spec_graph_file = xstrdup (AS_FILE_NAME (optarg)); + } break; case 'h': @@ -632,7 +624,7 @@ getargs (int argc, char *argv[]) break; case 'r': - FLAGS_ARGMATCH (report, optarg); + FLAGS_ARGMATCH (report, optarg, report_all); break; case 't': @@ -648,7 +640,10 @@ getargs (int argc, char *argv[]) case 'x': xml_flag = true; if (optarg) - spec_xml_file = xstrdup (AS_FILE_NAME (optarg)); + { + free (spec_xml_file); + spec_xml_file = xstrdup (AS_FILE_NAME (optarg)); + } break; case 'y': @@ -665,10 +660,11 @@ getargs (int argc, char *argv[]) exit (EXIT_SUCCESS); case PRINT_DATADIR_OPTION: - printf ("%s\n", compute_pkgdatadir ()); + printf ("%s\n", pkgdatadir ()); exit (EXIT_SUCCESS); case REPORT_FILE_OPTION: + free (spec_verbose_file); spec_verbose_file = xstrdup (AS_FILE_NAME (optarg)); break; @@ -679,9 +675,9 @@ getargs (int argc, char *argv[]) if (argc - optind != 1) { if (argc - optind < 1) - error (0, 0, _("missing operand after `%s'"), argv[argc - 1]); + error (0, 0, _("%s: missing operand"), quotearg_colon (argv[argc - 1])); else - error (0, 0, _("extra operand `%s'"), argv[optind + 1]); + error (0, 0, _("extra operand %s"), quote (argv[optind + 1])); usage (EXIT_FAILURE); }