bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 4/5] getopt: merge bug fixes from glibc


From: Eric Blake
Subject: [PATCH 4/5] getopt: merge bug fixes from glibc
Date: Tue, 13 Apr 2010 17:17:19 -0600

* lib/getopt.c (_getopt_internal_r): Use correct message for 'W;'
diagnostics.  Honor '+:' correctly.  Reject ';'.

Signed-off-by: Eric Blake <address@hidden>
---
 ChangeLog    |    4 ++++
 lib/getopt.c |   37 ++++++++++++++++++++++---------------
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c46bf31..19c3ad5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2010-04-13  Eric Blake  <address@hidden>

+       getopt: merge bug fixes from glibc
+       * lib/getopt.c (_getopt_internal_r): Use correct message for 'W;'
+       diagnostics.  Honor '+:' correctly.  Reject ';'.
+
        getopt-posix: detect MacOS bug
        * m4/getopt.m4 (gl_GETOPT_CHECK_HEADERS): Reject MacOS botch of
        optind when missing a required argument.
diff --git a/lib/getopt.c b/lib/getopt.c
index aaabc8d..738d998 100644
--- a/lib/getopt.c
+++ b/lib/getopt.c
@@ -348,8 +348,6 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
                     int long_only, struct _getopt_data *d, int posixly_correct)
 {
   int print_errors = d->opterr;
-  if (optstring[0] == ':')
-    print_errors = 0;

   if (argc < 1)
     return -1;
@@ -364,6 +362,10 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
                                       posixly_correct);
       d->__initialized = 1;
     }
+  else if (optstring[0] == '-' || optstring[0] == '+')
+    optstring++;
+  if (optstring[0] == ':')
+    print_errors = 0;

   /* Test whether ARGV[optind] points to a non-option argument.
      Either it does not have option syntax, or there is an environment flag
@@ -633,8 +635,8 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
                       char *buf;

                       if (__asprintf (&buf, _("\
-%s: option '%s' requires an argument\n"),
-                                      argv[0], argv[d->optind - 1]) >= 0)
+%s: option '--%s' requires an argument\n"),
+                                      argv[0], pfound->name) >= 0)
                         {
                           _IO_flockfile (stderr);

@@ -651,8 +653,8 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
                         }
 #else
                       fprintf (stderr,
-                               _("%s: option '%s' requires an argument\n"),
-                               argv[0], argv[d->optind - 1]);
+                               _("%s: option '--%s' requires an argument\n"),
+                               argv[0], pfound->name);
 #endif
                     }
                   d->__nextchar += strlen (d->__nextchar);
@@ -742,7 +744,7 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
     if (*d->__nextchar == '\0')
       ++d->optind;

-    if (temp == NULL || c == ':')
+    if (temp == NULL || c == ':' || c == ';')
       {
         if (print_errors)
           {
@@ -864,7 +866,10 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
                   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;
             }
@@ -876,7 +881,7 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
                 char *buf;

                 if (__asprintf (&buf, _("%s: option '-W %s' is ambiguous\n"),
-                                argv[0], argv[d->optind]) >= 0)
+                                argv[0], d->optarg) >= 0)
                   {
                     _IO_flockfile (stderr);

@@ -892,7 +897,7 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
                   }
 #else
                 fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"),
-                         argv[0], argv[d->optind]);
+                         argv[0], d->optarg);
 #endif
               }
             d->__nextchar += strlen (d->__nextchar);
@@ -955,8 +960,8 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
                         char *buf;

                         if (__asprintf (&buf, _("\
-%s: option '%s' requires an argument\n"),
-                                        argv[0], argv[d->optind - 1]) >= 0)
+%s: option '-W %s' requires an argument\n"),
+                                        argv[0], pfound->name) >= 0)
                           {
                             _IO_flockfile (stderr);

@@ -972,15 +977,17 @@ _getopt_internal_r (int argc, char **argv, const char 
*optstring,
                             free (buf);
                           }
 #else
-                        fprintf (stderr,
-                                 _("%s: option '%s' requires an argument\n"),
-                                 argv[0], argv[d->optind - 1]);
+                        fprintf (stderr, _("\
+%s: option '-W %s' requires an argument\n"),
+                                 argv[0], pfound->name);
 #endif
                       }
                     d->__nextchar += strlen (d->__nextchar);
                     return optstring[0] == ':' ? ':' : '?';
                   }
               }
+            else
+              d->optarg = NULL;
             d->__nextchar += strlen (d->__nextchar);
             if (longind != NULL)
               *longind = option_index;
-- 
1.6.6.1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]