-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I found a regression in m4 on cygwin 1.7, and traced it to the fact that
getopt.m4 no longer rejects BSD getopt even though it still has bugs
compared to GNU getopt_long.

Cygwin 1.7 is currently using getopt.c with the following header:
/*      $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $    */
/*      $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $      */

This version of getopt.c has support for optind=0 implying a reset.
However, it is buggy, in that POSIXLY_CORRECT is queried exactly once;
whereas in GNU, optind=0 is a sign that POSIXLY_CORRECT must be re-queried
from the environment.  So, in applications (such as test-getopt) that call
getopt_long, then change the environment, then call getopt_long again, the
state of whether POSIX behavior will be used is erroneously locked down to
the prior behavior.

The second is that when POSIXLY_CORRECT is set, but the option string
begins with '-', BSD erroneously stops parsing at the first non-option,
rather than treating all non-options as arguments to option '\1'.  For
comparison, a build of m4 with gnulib getopt does:

$ touch a
$ m4 -d a -d
$ POSIXLY_CORRECT= m4 -d a -d
$

But with BSD getopt:

$ touch a
$ m4 -d a -d
$ POSIXLY_CORRECT= m4 -d a -d
m4: cannot open `-d': No such file or directory
$

In other words, BSD no longer realizes that -d is still an option.

- --
Don't work too hard, make some time for fun as well!

Eric Blake             e...@byu.net
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAksP/T4ACgkQ84KuGfSFAYDaXACeOTWTJv6M/yP639BJw8lZfpov
z4YAoM+u4AxX7NWvMQ5w0DGthZKiXqb8
=gqFA
-----END PGP SIGNATURE-----


Reply via email to