aboutsummaryrefslogtreecommitdiff
path: root/src/port/getopt_long.c
diff options
context:
space:
mode:
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;