diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2010-12-16 16:22:18 -0500 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2010-12-16 16:22:18 -0500 |
| commit | 0a0eec670dcfc6a7fe9f5717e85b6f651a6754b8 (patch) | |
| tree | a1c836ffc0caa5e27ebae7c5ef345ab3eeeb1742 /src/port/getopt_long.c | |
| parent | 2dffe1f8bb92abd90ee346ca474512191f520888 (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 9433b568272..11278030242 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; |
