diff options
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; |