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:18 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2010-12-16 16:22:18 -0500
commit0a0eec670dcfc6a7fe9f5717e85b6f651a6754b8 (patch)
treea1c836ffc0caa5e27ebae7c5ef345ab3eeeb1742 /src/port/getopt_long.c
parent2dffe1f8bb92abd90ee346ca474512191f520888 (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 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;