summaryrefslogtreecommitdiff
path: root/src/port/getopt_long.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2010-12-16 16:22:05 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2010-12-16 16:23:05 -0500
commit61b53695fbbedb7fa9d394e71bf2affdc494e6b0 (patch)
treeca0928724860207b44639a6bfbf0c4feb8a4db84 /src/port/getopt_long.c
parentcd1fefa973968ff4e3760a9593f70fe2da0def48 (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.c20
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;