From e4897a3288f37d5f69e8acd256a6e83e607fe8d8 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 28 Dec 2000 19:54:33 +0000 Subject: [PATCH] Requre that long options starting with 'o' only accept a double dash prefix. --- ld/ChangeLog | 21 +++++++++++++++++++++ ld/ld.texinfo | 21 ++++++++++++++------- ld/ldlex.h | 2 +- ld/lexsup.c | 52 +++++++++++++++++++++++++++++++++++++++------------ 4 files changed, 76 insertions(+), 20 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index bf67e173a80..2e1b4169e46 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,24 @@ +2000-12-28 Nick Clifton + + * lexsup.c (struct ld_option): Add new enum value: + EXACTLY_TWO_DASHES. + (ld_options[]): Change -omagic, -output and -oformat options + to be EXACTLY_TWO_DASHES. + (OUTPUT_COUNT): Use ARRAY_SIZE. + (parse_args): Change parameter 'argc' to unsigned. + Place EXACTLY_TWO_DASHES options into new really_longopts + array. + If getopt_long_only fails, try calling getopt_long using the + really_longopts array. + (help): Print a double dash for both EXACTLY_TWO_DASHES and + TWO_DASHES options. + + * ldlex.h: Fix prototype of parse_args. + + * ld.texinfo: Document that long options starting with 'o' + must be preceeded by two dashes. Change example of a single + dashed long option from -oformat to -trace-symbol. + 2000-12-26 Danny Smith * emultempl/pe.em (OPTION_NO_DEFAULT_EXCLUDES): Define. diff --git a/ld/ld.texinfo b/ld/ld.texinfo index 9e227e02c69..c09148f27d4 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -219,13 +219,20 @@ whitespace, or be given as separate arguments immediately following the option that requires them. For options whose names are multiple letters, either one dash or two can -precede the option name; for example, @samp{-oformat} and -@samp{--oformat} are equivalent. Arguments to multiple-letter options -must either be separated from the option name by an equals sign, or be -given as separate arguments immediately following the option that -requires them. For example, @samp{--oformat srec} and -@samp{--oformat=srec} are equivalent. Unique abbreviations of the names -of multiple-letter options are accepted. +precede the option name; for example, @samp{-trace-symbol} and +@samp{--trace-symbol} are equivalent. Note - there is one exception to +this rule. Multiple letter options that start with a lower case 'o' can +only be preceeded by two dashes. This is to reduce confusion with the +@samp{-o} option. So for example @samp{-omagic} sets the output file +name to @samp{magic} whereas @samp{--omagic} sets the NMAGIC flag on the +output. + +Arguments to multiple-letter options must either be separated from the +option name by an equals sign, or be given as separate arguments +immediately following the option that requires them. For example, +@samp{--trace-symbol foo} and @samp{--trace-symbol=foo} are equivalent. +Unique abbreviations of the names of multiple-letter options are +accepted. Note - if the linker is being invoked indirectly, via a compiler driver (eg @samp{gcc}) then all the linker command line options should be diff --git a/ld/ldlex.h b/ld/ldlex.h index 53444cacad7..9990ddd5922 100644 --- a/ld/ldlex.h +++ b/ld/ldlex.h @@ -57,6 +57,6 @@ extern void lex_unput PARAMS ((int)); #ifndef yywrap extern int yywrap PARAMS ((void)); #endif -extern void parse_args PARAMS ((int, char **)); +extern void parse_args PARAMS ((unsigned, char **)); #endif diff --git a/ld/lexsup.c b/ld/lexsup.c index 52a86802b68..eb1fc2d86dd 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -148,6 +148,16 @@ struct ld_option ONE_DASH, /* Use two dashes before long option name. */ TWO_DASHES, + /* Only accept two dashes before the long option name. + This is an overloading of the use of this enum, since originally it + was only intended to tell the --help display function how to display + the long option name. This feature was added in order to resolve + the confusion about the -omagic command line switch. Is it setting + the output file name to "magic" or is it setting the NMAGIC flag on + the output ? It has been decided that it is setting the output file + name, and that if you want to set the NMAGIC flag you should use -N + or --omagic. */ + EXACTLY_TWO_DASHES, /* Don't mention this option in --help output. */ NO_HELP } control; @@ -200,9 +210,9 @@ static const struct ld_option ld_options[] = 'n', NULL, N_("Do not page align data"), TWO_DASHES }, { {"omagic", no_argument, NULL, 'N'}, 'N', NULL, N_("Do not page align data, do not make text readonly"), - TWO_DASHES }, + EXACTLY_TWO_DASHES }, { {"output", required_argument, NULL, 'o'}, - 'o', N_("FILE"), N_("Set output file name"), TWO_DASHES }, + 'o', N_("FILE"), N_("Set output file name"), EXACTLY_TWO_DASHES }, { {NULL, required_argument, NULL, '\0'}, 'O', NULL, N_("Optimize output file"), ONE_DASH }, { {"Qy", no_argument, NULL, OPTION_IGNORE}, @@ -312,7 +322,7 @@ static const struct ld_option ld_options[] = { {"noinhibit_exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC}, '\0', NULL, NULL, NO_HELP }, { {"oformat", required_argument, NULL, OPTION_OFORMAT}, - '\0', N_("TARGET"), N_("Specify target of output file"), TWO_DASHES }, + '\0', N_("TARGET"), N_("Specify target of output file"), EXACTLY_TWO_DASHES }, { {"qmagic", no_argument, NULL, OPTION_IGNORE}, '\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH }, { {"relax", no_argument, NULL, OPTION_RELAX}, @@ -382,7 +392,7 @@ static const struct ld_option ld_options[] = '\0', N_("[=WORDS]"), N_("Modify problematic branches in last WORDS (1-10,\n\t\t\t\tdefault 5) words of a page"), TWO_DASHES } }; -#define OPTION_COUNT ((int) (sizeof ld_options / sizeof ld_options[0])) +#define OPTION_COUNT ARRAY_SIZE (ld_options) /* Test STRING for containing a string of digits that form a number between MIN and MAX. The return value is the number or ERR. */ @@ -413,14 +423,16 @@ is_num (string, min, max, err) void parse_args (argc, argv) - int argc; + unsigned argc; char **argv; { - int i, is, il; + unsigned i; + int is, il, irl; int ingroup = 0; char *default_dirlist = NULL; char shortopts[OPTION_COUNT * 3 + 2]; struct option longopts[OPTION_COUNT + 1]; + struct option really_longopts[OPTION_COUNT + 1]; int last_optind; /* Starting the short option string with '-' is for programs that @@ -430,6 +442,7 @@ parse_args (argc, argv) shortopts[0] = '-'; is = 1; il = 0; + irl = 0; for (i = 0; i < OPTION_COUNT; i++) { if (ld_options[i].shortopt != '\0') @@ -450,12 +463,21 @@ parse_args (argc, argv) } if (ld_options[i].opt.name != NULL) { - longopts[il] = ld_options[i].opt; - ++il; + if (ld_options[i].control == EXACTLY_TWO_DASHES) + { + really_longopts[irl] = ld_options[i].opt; + ++irl; + } + else + { + longopts[il] = ld_options[i].opt; + ++il; + } } } shortopts[is] = '\0'; longopts[il].name = NULL; + really_longopts[irl].name = NULL; /* The -G option is ambiguous on different platforms. Sometimes it specifies the largest data size to put into the small data @@ -522,6 +544,8 @@ parse_args (argc, argv) /* getopt_long_only is like getopt_long, but '-' as well as '--' can indicate a long option. */ optc = getopt_long_only (argc, argv, shortopts, longopts, &longind); + if (optc == -1) + optc = getopt_long (argc, argv, shortopts, really_longopts, &longind); if (optc == -1) break; @@ -1137,7 +1161,7 @@ set_section_start (sect, valstr) static void help () { - int i; + unsigned i; const char **targets, **pp; printf (_("Usage: %s [options] file...\n"), program_name); @@ -1149,7 +1173,7 @@ help () { boolean comma; int len; - int j; + unsigned j; printf (" "); @@ -1186,13 +1210,17 @@ help () if (ld_options[j].opt.name != NULL && ld_options[j].control != NO_HELP) { + int two_dashes = + (ld_options[j].control == TWO_DASHES + || ld_options[j].control == EXACTLY_TWO_DASHES); + printf ("%s-%s%s", comma ? ", " : "", - ld_options[j].control == TWO_DASHES ? "-" : "", + two_dashes ? "-" : "", ld_options[j].opt.name); len += ((comma ? 2 : 0) + 1 - + (ld_options[j].control == TWO_DASHES ? 1 : 0) + + (two_dashes ? 1 : 0) + strlen (ld_options[j].opt.name)); if (ld_options[j].arg != NULL) { -- 2.30.2