On Wed, Sep 10, 2014 at 10:04 AM, Andres Freund <[email protected]> wrote:
> The best plan after that seems to be to add optional_argument support to
> getopt_long.c - looks easy enough. Do we need a configure test for
> optional_argument? I don't think so, but I could see somebody arguing
> the other way round.
Adding support for optional_argument in src/port would be the best
solution for long-term purposes. So +1 for it or we'll be limited in
the future as well. Here is for example attached a proof-of-concept
patch that it is not that complicated to add support for optional
arguments... Interestingly, the current implementation dates of 2003
in 939a59f and has not been majorly touched since. The patch has been
tested with MSVC.
--
Michael
diff --git a/src/include/getopt_long.h b/src/include/getopt_long.h
index e23c21f..71a884c 100644
--- a/src/include/getopt_long.h
+++ b/src/include/getopt_long.h
@@ -23,6 +23,7 @@ struct option
#define no_argument 0
#define required_argument 1
+#define optional_argument 2
#endif
#ifndef HAVE_GETOPT_LONG
diff --git a/src/port/getopt_long.c b/src/port/getopt_long.c
index b099091..029a359 100644
--- a/src/port/getopt_long.c
+++ b/src/port/getopt_long.c
@@ -100,7 +100,8 @@ 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)
+ if (longopts[i].has_arg == required_argument ||
+ longopts[i].has_arg == optional_argument)
{
if (place[namelen] == '=')
optarg = place + namelen + 1;
@@ -113,13 +114,19 @@ getopt_long(int argc, char *const argv[],
{
if (optstring[0] == ':')
return BADARG;
- if (opterr)
+
+ if (opterr &&
+ longopts[i].has_arg == required_argument)
fprintf(stderr,
"%s: option requires an argument -- %s\n",
argv[0], place);
+
place = EMSG;
optind++;
- return BADCH;
+ if (longopts[i].has_arg == required_argument)
+ return BADCH;
+
+ optarg = NULL;
}
}
else
--
Sent via pgsql-committers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-committers