Update from glibc.
[gnulib.git] / lib / getopt.c
index 81cef23..8aa1353 100644 (file)
@@ -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.  */
 \f
 /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
    Ditto for AIX 3.2 and <stdlib.h>.  */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
-#endif
-
-#if !defined __STDC__ || !__STDC__
+#else
+# if !defined __STDC__ || !__STDC__
 /* This is a separate conditional since some stdc systems
    reject `defined (const)'.  */
-# ifndef const
-#  define const
+#  ifndef const
+#   define const
+#  endif
 # endif
 #endif
 
    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 +128,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 +515,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)
@@ -673,7 +678,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
 
       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 +699,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 +725,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 +752,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 +782,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 +816,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 +865,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 +883,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 +898,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 +945,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] == ':')