diff options
Diffstat (limited to 'gl/m4/getopt.m4')
-rw-r--r-- | gl/m4/getopt.m4 | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/gl/m4/getopt.m4 b/gl/m4/getopt.m4 index a19805ea..5b211e56 100644 --- a/gl/m4/getopt.m4 +++ b/gl/m4/getopt.m4 | |||
@@ -1,4 +1,4 @@ | |||
1 | # getopt.m4 serial 24 | 1 | # getopt.m4 serial 28 |
2 | dnl Copyright (C) 2002-2006, 2008-2010 Free Software Foundation, Inc. | 2 | dnl Copyright (C) 2002-2006, 2008-2010 Free Software Foundation, Inc. |
3 | dnl This file is free software; the Free Software Foundation | 3 | dnl This file is free software; the Free Software Foundation |
4 | dnl gives unlimited permission to copy and/or distribute it, | 4 | dnl gives unlimited permission to copy and/or distribute it, |
@@ -79,8 +79,13 @@ AC_DEFUN([gl_GETOPT_CHECK_HEADERS], | |||
79 | dnl Existence of the variable, in and of itself, is not a reason to replace | 79 | dnl Existence of the variable, in and of itself, is not a reason to replace |
80 | dnl getopt, but knowledge of the variable is needed to determine how to | 80 | dnl getopt, but knowledge of the variable is needed to determine how to |
81 | dnl reset and whether a reset reparses the environment. | 81 | dnl reset and whether a reset reparses the environment. |
82 | if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then | 82 | dnl Solaris supports neither optreset nor optind=0, but keeps no state that |
83 | AC_CHECK_DECLS([optreset], [], [], | 83 | dnl needs a reset beyond setting optind=1; detect Solaris by getopt_clip. |
84 | if test -z "$gl_replace_getopt"; then | ||
85 | AC_CHECK_DECLS([optreset], [], | ||
86 | [AC_CHECK_DECLS([getopt_clip], [], [], | ||
87 | [[#include <getopt.h>]]) | ||
88 | ], | ||
84 | [[#include <getopt.h>]]) | 89 | [[#include <getopt.h>]]) |
85 | fi | 90 | fi |
86 | 91 | ||
@@ -89,6 +94,10 @@ AC_DEFUN([gl_GETOPT_CHECK_HEADERS], | |||
89 | dnl is left over from earlier calls, and neither setting optind = 0 nor | 94 | dnl is left over from earlier calls, and neither setting optind = 0 nor |
90 | dnl setting optreset = 1 get rid of this internal state. | 95 | dnl setting optreset = 1 get rid of this internal state. |
91 | dnl POSIX is silent on optind vs. optreset, so we allow either behavior. | 96 | dnl POSIX is silent on optind vs. optreset, so we allow either behavior. |
97 | dnl POSIX 2008 does not specify leading '+' behavior, but see | ||
98 | dnl http://austingroupbugs.net/view.php?id=191 for a recommendation on | ||
99 | dnl the next version of POSIX. For now, we only guarantee leading '+' | ||
100 | dnl behavior with getopt-gnu. | ||
92 | if test -z "$gl_replace_getopt"; then | 101 | if test -z "$gl_replace_getopt"; then |
93 | AC_CACHE_CHECK([whether getopt is POSIX compatible], | 102 | AC_CACHE_CHECK([whether getopt is POSIX compatible], |
94 | [gl_cv_func_getopt_posix], | 103 | [gl_cv_func_getopt_posix], |
@@ -99,7 +108,7 @@ AC_DEFUN([gl_GETOPT_CHECK_HEADERS], | |||
99 | #include <stdlib.h> | 108 | #include <stdlib.h> |
100 | #include <string.h> | 109 | #include <string.h> |
101 | 110 | ||
102 | #if !HAVE_DECL_OPTRESET | 111 | #if !HAVE_DECL_OPTRESET && !HAVE_DECL_GETOPT_CLIP |
103 | # define OPTIND_MIN 0 | 112 | # define OPTIND_MIN 0 |
104 | #else | 113 | #else |
105 | # define OPTIND_MIN 1 | 114 | # define OPTIND_MIN 1 |
@@ -167,6 +176,20 @@ main () | |||
167 | if (!(optind == 1)) | 176 | if (!(optind == 1)) |
168 | return 12; | 177 | return 12; |
169 | } | 178 | } |
179 | /* Detect MacOS 10.5 bug. */ | ||
180 | { | ||
181 | char *argv[3] = { "program", "-ab", NULL }; | ||
182 | optind = OPTIND_MIN; | ||
183 | opterr = 0; | ||
184 | if (getopt (2, argv, "ab:") != 'a') | ||
185 | return 13; | ||
186 | if (getopt (2, argv, "ab:") != '?') | ||
187 | return 14; | ||
188 | if (optopt != 'b') | ||
189 | return 15; | ||
190 | if (optind != 2) | ||
191 | return 16; | ||
192 | } | ||
170 | 193 | ||
171 | return 0; | 194 | return 0; |
172 | } | 195 | } |
@@ -174,6 +197,7 @@ main () | |||
174 | [gl_cv_func_getopt_posix=yes], [gl_cv_func_getopt_posix=no], | 197 | [gl_cv_func_getopt_posix=yes], [gl_cv_func_getopt_posix=no], |
175 | [case "$host_os" in | 198 | [case "$host_os" in |
176 | mingw*) gl_cv_func_getopt_posix="guessing no";; | 199 | mingw*) gl_cv_func_getopt_posix="guessing no";; |
200 | darwin*) gl_cv_func_getopt_posix="guessing no";; | ||
177 | *) gl_cv_func_getopt_posix="guessing yes";; | 201 | *) gl_cv_func_getopt_posix="guessing yes";; |
178 | esac | 202 | esac |
179 | ]) | 203 | ]) |
@@ -234,6 +258,15 @@ main () | |||
234 | if (getopt (3, argv, "-p") != 'p') | 258 | if (getopt (3, argv, "-p") != 'p') |
235 | return 7; | 259 | return 7; |
236 | } | 260 | } |
261 | /* This code fails on glibc 2.11. */ | ||
262 | { | ||
263 | char *argv[] = { "program", "-b", "-a", NULL }; | ||
264 | optind = opterr = 0; | ||
265 | if (getopt (3, argv, "+:a:b") != 'b') | ||
266 | return 8; | ||
267 | if (getopt (3, argv, "+:a:b") != ':') | ||
268 | return 9; | ||
269 | } | ||
237 | return 0; | 270 | return 0; |
238 | ]])], | 271 | ]])], |
239 | [gl_cv_func_getopt_gnu=yes], | 272 | [gl_cv_func_getopt_gnu=yes], |