diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2010-12-16 16:22:05 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2010-12-16 16:23:05 -0500 |
commit | 61b53695fbbedb7fa9d394e71bf2affdc494e6b0 (patch) | |
tree | ca0928724860207b44639a6bfbf0c4feb8a4db84 /src/port/getopt_long.c | |
parent | cd1fefa973968ff4e3760a9593f70fe2da0def48 (diff) |
Remove optreset from src/port/ implementations of getopt and getopt_long.
We don't actually need optreset, because we can easily fix the code to
ensure that it's cleanly restartable after having completed a scan over the
argv array; which is the only case we need to restart in. Getting rid of
it avoids a class of interactions with the system libraries and allows
reversion of my change of yesterday in postmaster.c and postgres.c.
Back-patch to 8.4. Before that the getopt code was a bit different anyway.
Diffstat (limited to 'src/port/getopt_long.c')
-rw-r--r-- | src/port/getopt_long.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/port/getopt_long.c b/src/port/getopt_long.c index 418cce7c8ba..d624216ad03 100644 --- a/src/port/getopt_long.c +++ b/src/port/getopt_long.c @@ -38,17 +38,21 @@ #include "getopt_long.h" -#ifndef HAVE_INT_OPTRESET -int optreset; - -/* else the "extern" was provided by getopt_long.h */ -#endif - #define BADCH '?' #define BADARG ':' #define EMSG "" +/* + * getopt_long + * Parse argc/argv argument vector, with long options. + * + * This implementation does not use optreset. Instead, we guarantee that + * it can be restarted on a new argv array after a previous call returned -1, + * if the caller resets optind to 1 before the first call of the new series. + * (Internally, this means we must be sure to reset "place" to EMSG before + * returning -1.) + */ int getopt_long(int argc, char *const argv[], const char *optstring, @@ -57,10 +61,8 @@ getopt_long(int argc, char *const argv[], static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ - if (optreset || !*place) + if (!*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= argc) { place = EMSG; |