]> granicus.if.org Git - postgresql/commitdiff
Add support for optional_argument to our own getopt_long() implementation.
authorAndres Freund <andres@anarazel.de>
Wed, 10 Sep 2014 15:21:50 +0000 (17:21 +0200)
committerAndres Freund <andres@anarazel.de>
Wed, 10 Sep 2014 15:21:50 +0000 (17:21 +0200)
07c8651dd91d5a currently causes compilation errors on mscv (and
probably some other) compilers because our getopt_long()
implementation doesn't have support for optional_argument.

Thus implement optional_argument in our fallback implemenation. It's
quite possibly also useful in other cases.

Arguably this needs a configure check for optional_argument, but it
has existed pretty much since getopt_long() was introduced and thus
doesn't seem worth the configure runtime.

Normally I'd would not push a patch this fast, but this allows msvc to
build again and has low risk as only optional_argument behaviour has
changed.

Author: Michael Paquier and Andres Freund

Discussion: CAB7nPqS5VeedSCxrK=QouokbawgGKLpyc1Q++RRFCa_sjcSVrg@mail.gmail.com

src/include/getopt_long.h
src/port/getopt_long.c

index e23c21f333cadda7eb6130d8cff66419d3a3fbbd..71a884c49c2d6a980c755fc7bca58a8f753f7aba 100644 (file)
@@ -23,6 +23,7 @@ struct option
 
 #define no_argument 0
 #define required_argument 1
+#define optional_argument 2
 #endif
 
 #ifndef HAVE_GETOPT_LONG
index b099091a76d01308ab02a08856dbb9d9d2713cbe..aa5b7319fd56acd55720819d35e6a53c8caca0a6 100644 (file)
@@ -100,11 +100,14 @@ getopt_long(int argc, char *const argv[],
                                if (strlen(longopts[i].name) == namelen
                                        && strncmp(place, longopts[i].name, namelen) == 0)
                                {
-                                       if (longopts[i].has_arg)
+                                       int                     has_arg = longopts[i].has_arg;
+
+                                       if (has_arg != no_argument)
                                        {
                                                if (place[namelen] == '=')
                                                        optarg = place + namelen + 1;
-                                               else if (optind < argc - 1)
+                                               else if (optind < argc - 1 &&
+                                                                has_arg == required_argument)
                                                {
                                                        optind++;
                                                        optarg = argv[optind];
@@ -113,13 +116,18 @@ getopt_long(int argc, char *const argv[],
                                                {
                                                        if (optstring[0] == ':')
                                                                return BADARG;
-                                                       if (opterr)
+
+                                                       if (opterr && has_arg == required_argument)
                                                                fprintf(stderr,
                                                                   "%s: option requires an argument -- %s\n",
                                                                                argv[0], place);
+
                                                        place = EMSG;
                                                        optind++;
-                                                       return BADCH;
+
+                                                       if (has_arg == required_argument)
+                                                               return BADCH;
+                                                       optarg = NULL;
                                                }
                                        }
                                        else