Requre that long options starting with 'o' only accept a double dash prefix.

This commit is contained in:
Nick Clifton 2000-12-28 19:54:33 +00:00
parent 149fe25ee9
commit e4897a3288
4 changed files with 76 additions and 20 deletions

View File

@ -1,3 +1,24 @@
2000-12-28 Nick Clifton <nickc@redhat.com>
* 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 <danny_r_smith_2001@yahoo.co.nz> 2000-12-26 Danny Smith <danny_r_smith_2001@yahoo.co.nz>
* emultempl/pe.em (OPTION_NO_DEFAULT_EXCLUDES): Define. * emultempl/pe.em (OPTION_NO_DEFAULT_EXCLUDES): Define.

View File

@ -219,13 +219,20 @@ whitespace, or be given as separate arguments immediately following the
option that requires them. option that requires them.
For options whose names are multiple letters, either one dash or two can For options whose names are multiple letters, either one dash or two can
precede the option name; for example, @samp{-oformat} and precede the option name; for example, @samp{-trace-symbol} and
@samp{--oformat} are equivalent. Arguments to multiple-letter options @samp{--trace-symbol} are equivalent. Note - there is one exception to
must either be separated from the option name by an equals sign, or be this rule. Multiple letter options that start with a lower case 'o' can
given as separate arguments immediately following the option that only be preceeded by two dashes. This is to reduce confusion with the
requires them. For example, @samp{--oformat srec} and @samp{-o} option. So for example @samp{-omagic} sets the output file
@samp{--oformat=srec} are equivalent. Unique abbreviations of the names name to @samp{magic} whereas @samp{--omagic} sets the NMAGIC flag on the
of multiple-letter options are accepted. 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 Note - if the linker is being invoked indirectly, via a compiler driver
(eg @samp{gcc}) then all the linker command line options should be (eg @samp{gcc}) then all the linker command line options should be

View File

@ -57,6 +57,6 @@ extern void lex_unput PARAMS ((int));
#ifndef yywrap #ifndef yywrap
extern int yywrap PARAMS ((void)); extern int yywrap PARAMS ((void));
#endif #endif
extern void parse_args PARAMS ((int, char **)); extern void parse_args PARAMS ((unsigned, char **));
#endif #endif

View File

@ -148,6 +148,16 @@ struct ld_option
ONE_DASH, ONE_DASH,
/* Use two dashes before long option name. */ /* Use two dashes before long option name. */
TWO_DASHES, 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. */ /* Don't mention this option in --help output. */
NO_HELP NO_HELP
} control; } control;
@ -200,9 +210,9 @@ static const struct ld_option ld_options[] =
'n', NULL, N_("Do not page align data"), TWO_DASHES }, 'n', NULL, N_("Do not page align data"), TWO_DASHES },
{ {"omagic", no_argument, NULL, 'N'}, { {"omagic", no_argument, NULL, 'N'},
'N', NULL, N_("Do not page align data, do not make text readonly"), 'N', NULL, N_("Do not page align data, do not make text readonly"),
TWO_DASHES }, EXACTLY_TWO_DASHES },
{ {"output", required_argument, NULL, 'o'}, { {"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'}, { {NULL, required_argument, NULL, '\0'},
'O', NULL, N_("Optimize output file"), ONE_DASH }, 'O', NULL, N_("Optimize output file"), ONE_DASH },
{ {"Qy", no_argument, NULL, OPTION_IGNORE}, { {"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}, { {"noinhibit_exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
'\0', NULL, NULL, NO_HELP }, '\0', NULL, NULL, NO_HELP },
{ {"oformat", required_argument, NULL, OPTION_OFORMAT}, { {"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}, { {"qmagic", no_argument, NULL, OPTION_IGNORE},
'\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH }, '\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH },
{ {"relax", no_argument, NULL, OPTION_RELAX}, { {"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 } '\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 /* Test STRING for containing a string of digits that form a number
between MIN and MAX. The return value is the number or ERR. */ between MIN and MAX. The return value is the number or ERR. */
@ -413,14 +423,16 @@ is_num (string, min, max, err)
void void
parse_args (argc, argv) parse_args (argc, argv)
int argc; unsigned argc;
char **argv; char **argv;
{ {
int i, is, il; unsigned i;
int is, il, irl;
int ingroup = 0; int ingroup = 0;
char *default_dirlist = NULL; char *default_dirlist = NULL;
char shortopts[OPTION_COUNT * 3 + 2]; char shortopts[OPTION_COUNT * 3 + 2];
struct option longopts[OPTION_COUNT + 1]; struct option longopts[OPTION_COUNT + 1];
struct option really_longopts[OPTION_COUNT + 1];
int last_optind; int last_optind;
/* Starting the short option string with '-' is for programs that /* Starting the short option string with '-' is for programs that
@ -430,6 +442,7 @@ parse_args (argc, argv)
shortopts[0] = '-'; shortopts[0] = '-';
is = 1; is = 1;
il = 0; il = 0;
irl = 0;
for (i = 0; i < OPTION_COUNT; i++) for (i = 0; i < OPTION_COUNT; i++)
{ {
if (ld_options[i].shortopt != '\0') if (ld_options[i].shortopt != '\0')
@ -450,12 +463,21 @@ parse_args (argc, argv)
} }
if (ld_options[i].opt.name != NULL) if (ld_options[i].opt.name != NULL)
{ {
longopts[il] = ld_options[i].opt; if (ld_options[i].control == EXACTLY_TWO_DASHES)
++il; {
really_longopts[irl] = ld_options[i].opt;
++irl;
}
else
{
longopts[il] = ld_options[i].opt;
++il;
}
} }
} }
shortopts[is] = '\0'; shortopts[is] = '\0';
longopts[il].name = NULL; longopts[il].name = NULL;
really_longopts[irl].name = NULL;
/* The -G option is ambiguous on different platforms. Sometimes it /* The -G option is ambiguous on different platforms. Sometimes it
specifies the largest data size to put into the small data 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 '--' /* getopt_long_only is like getopt_long, but '-' as well as '--'
can indicate a long option. */ can indicate a long option. */
optc = getopt_long_only (argc, argv, shortopts, longopts, &longind); optc = getopt_long_only (argc, argv, shortopts, longopts, &longind);
if (optc == -1)
optc = getopt_long (argc, argv, shortopts, really_longopts, &longind);
if (optc == -1) if (optc == -1)
break; break;
@ -1137,7 +1161,7 @@ set_section_start (sect, valstr)
static void static void
help () help ()
{ {
int i; unsigned i;
const char **targets, **pp; const char **targets, **pp;
printf (_("Usage: %s [options] file...\n"), program_name); printf (_("Usage: %s [options] file...\n"), program_name);
@ -1149,7 +1173,7 @@ help ()
{ {
boolean comma; boolean comma;
int len; int len;
int j; unsigned j;
printf (" "); printf (" ");
@ -1186,13 +1210,17 @@ help ()
if (ld_options[j].opt.name != NULL if (ld_options[j].opt.name != NULL
&& ld_options[j].control != NO_HELP) && 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", printf ("%s-%s%s",
comma ? ", " : "", comma ? ", " : "",
ld_options[j].control == TWO_DASHES ? "-" : "", two_dashes ? "-" : "",
ld_options[j].opt.name); ld_options[j].opt.name);
len += ((comma ? 2 : 0) len += ((comma ? 2 : 0)
+ 1 + 1
+ (ld_options[j].control == TWO_DASHES ? 1 : 0) + (two_dashes ? 1 : 0)
+ strlen (ld_options[j].opt.name)); + strlen (ld_options[j].opt.name));
if (ld_options[j].arg != NULL) if (ld_options[j].arg != NULL)
{ {