diff options
Diffstat (limited to 'src/port/getopt.c')
-rw-r--r-- | src/port/getopt.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/port/getopt.c b/src/port/getopt.c index ed7f421a47d..b759d53f0a0 100644 --- a/src/port/getopt.c +++ b/src/port/getopt.c @@ -41,7 +41,7 @@ static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; * On some versions of Solaris, opterr and friends are defined in core libc * rather than in a separate getopt module. Define these variables only * if configure found they aren't there by default. (We assume that testing - * opterr is sufficient for all of these except optreset.) + * opterr is sufficient for all of these.) */ #ifndef HAVE_INT_OPTERR @@ -57,12 +57,6 @@ extern int optopt; extern char *optarg; #endif -#ifndef HAVE_INT_OPTRESET -int optreset; /* reset getopt */ -#else -extern int optreset; -#endif - #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" @@ -70,6 +64,12 @@ extern int optreset; /* * getopt * Parse argc/argv argument vector. + * + * 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(nargc, nargv, ostr) @@ -80,9 +80,8 @@ const char *ostr; 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 >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; @@ -102,7 +101,10 @@ const char *ostr; * if the user didn't specify '-' as an option, assume it means -1. */ if (optopt == (int) '-') + { + place = EMSG; return -1; + } if (!*place) ++optind; if (opterr && *ostr != ':') |