X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fgetopt.c;h=e852127f626003de9d997f6c16b6490449334dd3;hb=118c7c3af6b537e01580f3ddd29262cdc7ee17b9;hp=81cef23f9bd5fec08d9a15e2741c059bc0baccc2;hpb=dd82a0dbce944385c0790a127b135de0e4731505;p=gnulib.git diff --git a/lib/getopt.c b/lib/getopt.c index 81cef23f9..e852127f6 100644 --- a/lib/getopt.c +++ b/lib/getopt.c @@ -1,25 +1,23 @@ /* Getopt for GNU. - NOTE: getopt is now part of the C library, so if you don't know what - "Keep this file name-space clean" means, talk to drepper@gnu.org - before changing it! + NOTE: The canonical source of this file is maintained with the GNU + C Library. Bugs can be reported to bug-glibc@gnu.org. - Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98 + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. - The GNU C Library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ @@ -77,11 +75,12 @@ #endif #ifndef _ -/* This is for other GNU distributions with internationalized messages. - When compiling libc, the _ macro is predefined. */ -# ifdef HAVE_LIBINTL_H +/* This is for other GNU distributions with internationalized messages. */ +# if defined HAVE_LIBINTL_H || defined _LIBC # include -# define _(msgid) gettext (msgid) +# ifndef _ +# define _(msgid) gettext (msgid) +# endif # else # define _(msgid) (msgid) # endif @@ -109,7 +108,7 @@ Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ -char *optarg = NULL; +char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller @@ -130,7 +129,7 @@ int optind = 1; causes problems with re-calling getopt as programs generally don't know that. */ -int __getopt_initialized = 0; +int __getopt_initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. @@ -517,6 +516,13 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int *longind; int long_only; { + int print_errors = opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + optarg = NULL; if (optind == 0 || !__getopt_initialized) @@ -666,14 +672,17 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) pfound = p; indfound = option_index; } - else + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { - if (opterr) + if (print_errors) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); @@ -694,7 +703,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) optarg = nameend + 1; else { - if (opterr) + if (print_errors) { if (argv[optind - 1][1] == '-') /* --option */ @@ -720,7 +729,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) optarg = argv[optind++]; else { - if (opterr) + if (print_errors) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); @@ -747,7 +756,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { - if (opterr) + if (print_errors) { if (argv[optind][1] == '-') /* --option */ @@ -777,7 +786,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) if (temp == NULL || c == ':') { - if (opterr) + if (print_errors) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ @@ -811,7 +820,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) } else if (optind == argc) { - if (opterr) + if (print_errors) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), @@ -860,7 +869,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) } if (ambig && !exact) { - if (opterr) + if (print_errors) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); @@ -878,7 +887,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) optarg = nameend + 1; else { - if (opterr) + if (print_errors) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); @@ -893,7 +902,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) optarg = argv[optind++]; else { - if (opterr) + if (print_errors) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); @@ -940,12 +949,12 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) } else if (optind == argc) { - if (opterr) + if (print_errors) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, - _("%s: option requires an argument -- %c\n"), - argv[0], c); + _("%s: option requires an argument -- %c\n"), + argv[0], c); } optopt = c; if (optstring[0] == ':')