aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/libc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-12-14 10:47:25 +0000
committerCorinna Vinschen <corinna@vinschen.de>2009-12-14 10:47:25 +0000
commit5d5594597eaccccd24e3ee3d07dfdae01c3f89b3 (patch)
treeed150f43fc2e060b3ced853645e73650efcfac9f /winsup/cygwin/libc
parentcfc4fc9debfdd6823358bc63c550b96f3d48d5b1 (diff)
downloadnewlib-5d5594597eaccccd24e3ee3d07dfdae01c3f89b3.zip
newlib-5d5594597eaccccd24e3ee3d07dfdae01c3f89b3.tar.gz
newlib-5d5594597eaccccd24e3ee3d07dfdae01c3f89b3.tar.bz2
* libc/getopt.c (getopt_internal): Set optreset according to optind
setting earlier. Reevaluate POSIXLY_CORRECT if optreset is set to !0. Handle a leading '-' in options independently of posixly_correct.
Diffstat (limited to 'winsup/cygwin/libc')
-rw-r--r--winsup/cygwin/libc/getopt.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/winsup/cygwin/libc/getopt.c b/winsup/cygwin/libc/getopt.c
index ccec9b5..bc35f96 100644
--- a/winsup/cygwin/libc/getopt.c
+++ b/winsup/cygwin/libc/getopt.c
@@ -304,25 +304,28 @@ getopt_internal(int nargc, char * const *nargv, const char *options,
return (-1);
/*
+ * XXX Some GNU programs (like cvs) set optind to 0 instead of
+ * XXX using optreset. Work around this braindamage.
+ */
+ if (optind == 0)
+ optind = optreset = 1;
+
+ /*
* Disable GNU extensions if POSIXLY_CORRECT is set or options
* string begins with a '+'.
+ *
+ * CV, 2009-12-14: Check POSIXLY_CORRECT anew if optind == 0 or
+ * optreset != 0 for GNU compatibility.
*/
- if (posixly_correct == -1)
+ if (posixly_correct == -1 || optreset != 0)
posixly_correct = (getenv("POSIXLY_CORRECT") != NULL);
- if (posixly_correct || *options == '+')
- flags &= ~FLAG_PERMUTE;
- else if (*options == '-')
+ if (*options == '-')
flags |= FLAG_ALLARGS;
+ else if (posixly_correct || *options == '+')
+ flags &= ~FLAG_PERMUTE;
if (*options == '+' || *options == '-')
options++;
- /*
- * XXX Some GNU programs (like cvs) set optind to 0 instead of
- * XXX using optreset. Work around this braindamage.
- */
- if (optind == 0)
- optind = optreset = 1;
-
optarg = NULL;
if (optreset)
nonopt_start = nonopt_end = -1;