diff options
Diffstat (limited to 'gl/m4/regex.m4')
-rw-r--r-- | gl/m4/regex.m4 | 157 |
1 files changed, 100 insertions, 57 deletions
diff --git a/gl/m4/regex.m4 b/gl/m4/regex.m4 index 95784e4b..0945c11a 100644 --- a/gl/m4/regex.m4 +++ b/gl/m4/regex.m4 | |||
@@ -1,7 +1,6 @@ | |||
1 | # serial 56 | 1 | # serial 64 |
2 | 2 | ||
3 | # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, | 3 | # Copyright (C) 1996-2001, 2003-2013 Free Software Foundation, Inc. |
4 | # 2007, 2008, 2009, 2010 Free Software Foundation, Inc. | ||
5 | # | 4 | # |
6 | # This file is free software; the Free Software Foundation | 5 | # This file is free software; the Free Software Foundation |
7 | # gives unlimited permission to copy and/or distribute it, | 6 | # gives unlimited permission to copy and/or distribute it, |
@@ -14,8 +13,6 @@ AC_PREREQ([2.50]) | |||
14 | 13 | ||
15 | AC_DEFUN([gl_REGEX], | 14 | AC_DEFUN([gl_REGEX], |
16 | [ | 15 | [ |
17 | AC_CHECK_HEADERS_ONCE([locale.h]) | ||
18 | |||
19 | AC_ARG_WITH([included-regex], | 16 | AC_ARG_WITH([included-regex], |
20 | [AS_HELP_STRING([--without-included-regex], | 17 | [AS_HELP_STRING([--without-included-regex], |
21 | [don't compile regex; this is the default on systems | 18 | [don't compile regex; this is the default on systems |
@@ -30,31 +27,41 @@ AC_DEFUN([gl_REGEX], | |||
30 | # following run test, then default to *not* using the included regex.c. | 27 | # following run test, then default to *not* using the included regex.c. |
31 | # If cross compiling, assume the test would fail and use the included | 28 | # If cross compiling, assume the test would fail and use the included |
32 | # regex.c. | 29 | # regex.c. |
30 | AC_CHECK_DECLS_ONCE([alarm]) | ||
33 | AC_CACHE_CHECK([for working re_compile_pattern], | 31 | AC_CACHE_CHECK([for working re_compile_pattern], |
34 | [gl_cv_func_re_compile_pattern_working], | 32 | [gl_cv_func_re_compile_pattern_working], |
35 | [AC_RUN_IFELSE( | 33 | [AC_RUN_IFELSE( |
36 | [AC_LANG_PROGRAM( | 34 | [AC_LANG_PROGRAM( |
37 | [AC_INCLUDES_DEFAULT[ | 35 | [[#include <regex.h> |
38 | #if HAVE_LOCALE_H | 36 | |
39 | #include <locale.h> | 37 | #include <locale.h> |
40 | #endif | 38 | #include <limits.h> |
41 | #include <limits.h> | 39 | #include <string.h> |
42 | #include <regex.h> | 40 | #if HAVE_DECL_ALARM |
43 | ]], | 41 | # include <unistd.h> |
44 | [[static struct re_pattern_buffer regex; | 42 | # include <signal.h> |
43 | #endif | ||
44 | ]], | ||
45 | [[int result = 0; | ||
46 | static struct re_pattern_buffer regex; | ||
45 | unsigned char folded_chars[UCHAR_MAX + 1]; | 47 | unsigned char folded_chars[UCHAR_MAX + 1]; |
46 | int i; | 48 | int i; |
47 | const char *s; | 49 | const char *s; |
48 | struct re_registers regs; | 50 | struct re_registers regs; |
49 | 51 | ||
50 | #if HAVE_LOCALE_H | 52 | #if HAVE_DECL_ALARM |
51 | /* http://sourceware.org/ml/libc-hacker/2006-09/msg00008.html | 53 | /* Some builds of glibc go into an infinite loop on this test. */ |
52 | This test needs valgrind to catch the bug on Debian | 54 | signal (SIGALRM, SIG_DFL); |
53 | GNU/Linux 3.1 x86, but it might catch the bug better | 55 | alarm (2); |
54 | on other platforms and it shouldn't hurt to try the | 56 | #endif |
55 | test here. */ | 57 | if (setlocale (LC_ALL, "en_US.UTF-8")) |
56 | if (setlocale (LC_ALL, "en_US.UTF-8")) | 58 | { |
57 | { | 59 | { |
60 | /* http://sourceware.org/ml/libc-hacker/2006-09/msg00008.html | ||
61 | This test needs valgrind to catch the bug on Debian | ||
62 | GNU/Linux 3.1 x86, but it might catch the bug better | ||
63 | on other platforms and it shouldn't hurt to try the | ||
64 | test here. */ | ||
58 | static char const pat[] = "insert into"; | 65 | static char const pat[] = "insert into"; |
59 | static char const data[] = | 66 | static char const data[] = |
60 | "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; | 67 | "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; |
@@ -63,26 +70,57 @@ AC_DEFUN([gl_REGEX], | |||
63 | memset (®ex, 0, sizeof regex); | 70 | memset (®ex, 0, sizeof regex); |
64 | s = re_compile_pattern (pat, sizeof pat - 1, ®ex); | 71 | s = re_compile_pattern (pat, sizeof pat - 1, ®ex); |
65 | if (s) | 72 | if (s) |
66 | return 1; | 73 | result |= 1; |
67 | if (re_search (®ex, data, sizeof data - 1, | 74 | else if (re_search (®ex, data, sizeof data - 1, |
68 | 0, sizeof data - 1, ®s) | 75 | 0, sizeof data - 1, ®s) |
69 | != -1) | 76 | != -1) |
70 | return 1; | 77 | result |= 1; |
71 | if (! setlocale (LC_ALL, "C")) | ||
72 | return 1; | ||
73 | } | 78 | } |
74 | #endif | 79 | |
80 | { | ||
81 | /* This test is from glibc bug 15078. | ||
82 | The test case is from Andreas Schwab in | ||
83 | <http://www.sourceware.org/ml/libc-alpha/2013-01/msg00967.html>. | ||
84 | */ | ||
85 | static char const pat[] = "[^x]x"; | ||
86 | static char const data[] = | ||
87 | /* <U1000><U103B><U103D><U1014><U103A><U102F><U1015><U103A> */ | ||
88 | "\xe1\x80\x80" | ||
89 | "\xe1\x80\xbb" | ||
90 | "\xe1\x80\xbd" | ||
91 | "\xe1\x80\x94" | ||
92 | "\xe1\x80\xba" | ||
93 | "\xe1\x80\xaf" | ||
94 | "\xe1\x80\x95" | ||
95 | "\xe1\x80\xba" | ||
96 | "x"; | ||
97 | re_set_syntax (0); | ||
98 | memset (®ex, 0, sizeof regex); | ||
99 | s = re_compile_pattern (pat, sizeof pat - 1, ®ex); | ||
100 | if (s) | ||
101 | result |= 1; | ||
102 | else | ||
103 | { | ||
104 | i = re_search (®ex, data, sizeof data - 1, | ||
105 | 0, sizeof data - 1, 0); | ||
106 | if (i != 0 && i != 21) | ||
107 | result |= 1; | ||
108 | } | ||
109 | } | ||
110 | |||
111 | if (! setlocale (LC_ALL, "C")) | ||
112 | return 1; | ||
113 | } | ||
75 | 114 | ||
76 | /* This test is from glibc bug 3957, reported by Andrew Mackey. */ | 115 | /* This test is from glibc bug 3957, reported by Andrew Mackey. */ |
77 | re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE); | 116 | re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE); |
78 | memset (®ex, 0, sizeof regex); | 117 | memset (®ex, 0, sizeof regex); |
79 | s = re_compile_pattern ("a[^x]b", 6, ®ex); | 118 | s = re_compile_pattern ("a[^x]b", 6, ®ex); |
80 | if (s) | 119 | if (s) |
81 | return 1; | 120 | result |= 2; |
82 | |||
83 | /* This should fail, but succeeds for glibc-2.5. */ | 121 | /* This should fail, but succeeds for glibc-2.5. */ |
84 | if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -1) | 122 | else if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -1) |
85 | return 1; | 123 | result |= 2; |
86 | 124 | ||
87 | /* This regular expression is from Spencer ere test number 75 | 125 | /* This regular expression is from Spencer ere test number 75 |
88 | in grep-2.3. */ | 126 | in grep-2.3. */ |
@@ -94,7 +132,7 @@ AC_DEFUN([gl_REGEX], | |||
94 | s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, ®ex); | 132 | s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, ®ex); |
95 | /* This should fail with _Invalid character class name_ error. */ | 133 | /* This should fail with _Invalid character class name_ error. */ |
96 | if (!s) | 134 | if (!s) |
97 | return 1; | 135 | result |= 4; |
98 | 136 | ||
99 | /* Ensure that [b-a] is diagnosed as invalid, when | 137 | /* Ensure that [b-a] is diagnosed as invalid, when |
100 | using RE_NO_EMPTY_RANGES. */ | 138 | using RE_NO_EMPTY_RANGES. */ |
@@ -102,34 +140,31 @@ AC_DEFUN([gl_REGEX], | |||
102 | memset (®ex, 0, sizeof regex); | 140 | memset (®ex, 0, sizeof regex); |
103 | s = re_compile_pattern ("a[b-a]", 6, ®ex); | 141 | s = re_compile_pattern ("a[b-a]", 6, ®ex); |
104 | if (s == 0) | 142 | if (s == 0) |
105 | return 1; | 143 | result |= 8; |
106 | 144 | ||
107 | /* This should succeed, but does not for glibc-2.1.3. */ | 145 | /* This should succeed, but does not for glibc-2.1.3. */ |
108 | memset (®ex, 0, sizeof regex); | 146 | memset (®ex, 0, sizeof regex); |
109 | s = re_compile_pattern ("{1", 2, ®ex); | 147 | s = re_compile_pattern ("{1", 2, ®ex); |
110 | |||
111 | if (s) | 148 | if (s) |
112 | return 1; | 149 | result |= 8; |
113 | 150 | ||
114 | /* The following example is derived from a problem report | 151 | /* The following example is derived from a problem report |
115 | against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */ | 152 | against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */ |
116 | memset (®ex, 0, sizeof regex); | 153 | memset (®ex, 0, sizeof regex); |
117 | s = re_compile_pattern ("[an\371]*n", 7, ®ex); | 154 | s = re_compile_pattern ("[an\371]*n", 7, ®ex); |
118 | if (s) | 155 | if (s) |
119 | return 1; | 156 | result |= 8; |
120 | |||
121 | /* This should match, but does not for glibc-2.2.1. */ | 157 | /* This should match, but does not for glibc-2.2.1. */ |
122 | if (re_match (®ex, "an", 2, 0, ®s) != 2) | 158 | else if (re_match (®ex, "an", 2, 0, ®s) != 2) |
123 | return 1; | 159 | result |= 8; |
124 | 160 | ||
125 | memset (®ex, 0, sizeof regex); | 161 | memset (®ex, 0, sizeof regex); |
126 | s = re_compile_pattern ("x", 1, ®ex); | 162 | s = re_compile_pattern ("x", 1, ®ex); |
127 | if (s) | 163 | if (s) |
128 | return 1; | 164 | result |= 8; |
129 | |||
130 | /* glibc-2.2.93 does not work with a negative RANGE argument. */ | 165 | /* glibc-2.2.93 does not work with a negative RANGE argument. */ |
131 | if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 1) | 166 | else if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 1) |
132 | return 1; | 167 | result |= 8; |
133 | 168 | ||
134 | /* The version of regex.c in older versions of gnulib | 169 | /* The version of regex.c in older versions of gnulib |
135 | ignored RE_ICASE. Detect that problem too. */ | 170 | ignored RE_ICASE. Detect that problem too. */ |
@@ -137,10 +172,9 @@ AC_DEFUN([gl_REGEX], | |||
137 | memset (®ex, 0, sizeof regex); | 172 | memset (®ex, 0, sizeof regex); |
138 | s = re_compile_pattern ("x", 1, ®ex); | 173 | s = re_compile_pattern ("x", 1, ®ex); |
139 | if (s) | 174 | if (s) |
140 | return 1; | 175 | result |= 16; |
141 | 176 | else if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) | |
142 | if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) | 177 | result |= 16; |
143 | return 1; | ||
144 | 178 | ||
145 | /* Catch a bug reported by Vin Shelton in | 179 | /* Catch a bug reported by Vin Shelton in |
146 | http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html | 180 | http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html |
@@ -151,21 +185,27 @@ AC_DEFUN([gl_REGEX], | |||
151 | memset (®ex, 0, sizeof regex); | 185 | memset (®ex, 0, sizeof regex); |
152 | s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, ®ex); | 186 | s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, ®ex); |
153 | if (s) | 187 | if (s) |
154 | return 1; | 188 | result |= 32; |
155 | 189 | ||
156 | /* REG_STARTEND was added to glibc on 2004-01-15. | 190 | /* REG_STARTEND was added to glibc on 2004-01-15. |
157 | Reject older versions. */ | 191 | Reject older versions. */ |
158 | if (! REG_STARTEND) | 192 | if (! REG_STARTEND) |
159 | return 1; | 193 | result |= 64; |
160 | 194 | ||
161 | /* Reject hosts whose regoff_t values are too narrow. | 195 | #if 0 |
162 | These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t | 196 | /* It would be nice to reject hosts whose regoff_t values are too |
163 | and 32-bit int. */ | 197 | narrow (including glibc on hosts with 64-bit ptrdiff_t and |
198 | 32-bit int), but we should wait until glibc implements this | ||
199 | feature. Otherwise, support for equivalence classes and | ||
200 | multibyte collation symbols would always be broken except | ||
201 | when compiling --without-included-regex. */ | ||
164 | if (sizeof (regoff_t) < sizeof (ptrdiff_t) | 202 | if (sizeof (regoff_t) < sizeof (ptrdiff_t) |
165 | || sizeof (regoff_t) < sizeof (ssize_t)) | 203 | || sizeof (regoff_t) < sizeof (ssize_t)) |
166 | return 1; | 204 | result |= 64; |
205 | #endif | ||
167 | 206 | ||
168 | return 0;]])], | 207 | return result; |
208 | ]])], | ||
169 | [gl_cv_func_re_compile_pattern_working=yes], | 209 | [gl_cv_func_re_compile_pattern_working=yes], |
170 | [gl_cv_func_re_compile_pattern_working=no], | 210 | [gl_cv_func_re_compile_pattern_working=no], |
171 | dnl When crosscompiling, assume it is not working. | 211 | dnl When crosscompiling, assume it is not working. |
@@ -180,6 +220,9 @@ AC_DEFUN([gl_REGEX], | |||
180 | esac | 220 | esac |
181 | 221 | ||
182 | if test $ac_use_included_regex = yes; then | 222 | if test $ac_use_included_regex = yes; then |
223 | AC_DEFINE([_REGEX_INCLUDE_LIMITS_H], [1], | ||
224 | [Define if you want <regex.h> to include <limits.h>, so that it | ||
225 | consistently overrides <limits.h>'s RE_DUP_MAX.]) | ||
183 | AC_DEFINE([_REGEX_LARGE_OFFSETS], [1], | 226 | AC_DEFINE([_REGEX_LARGE_OFFSETS], [1], |
184 | [Define if you want regoff_t to be at least as wide POSIX requires.]) | 227 | [Define if you want regoff_t to be at least as wide POSIX requires.]) |
185 | AC_DEFINE([re_syntax_options], [rpl_re_syntax_options], | 228 | AC_DEFINE([re_syntax_options], [rpl_re_syntax_options], |
@@ -212,8 +255,6 @@ AC_DEFUN([gl_REGEX], | |||
212 | [Define to rpl_regerror if the replacement should be used.]) | 255 | [Define to rpl_regerror if the replacement should be used.]) |
213 | AC_DEFINE([regfree], [rpl_regfree], | 256 | AC_DEFINE([regfree], [rpl_regfree], |
214 | [Define to rpl_regfree if the replacement should be used.]) | 257 | [Define to rpl_regfree if the replacement should be used.]) |
215 | AC_LIBOBJ([regex]) | ||
216 | gl_PREREQ_REGEX | ||
217 | fi | 258 | fi |
218 | ]) | 259 | ]) |
219 | 260 | ||
@@ -224,7 +265,9 @@ AC_DEFUN([gl_PREREQ_REGEX], | |||
224 | AC_REQUIRE([AC_C_INLINE]) | 265 | AC_REQUIRE([AC_C_INLINE]) |
225 | AC_REQUIRE([AC_C_RESTRICT]) | 266 | AC_REQUIRE([AC_C_RESTRICT]) |
226 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) | 267 | AC_REQUIRE([AC_TYPE_MBSTATE_T]) |
268 | AC_REQUIRE([gl_EEMALLOC]) | ||
269 | AC_REQUIRE([gl_GLIBC21]) | ||
227 | AC_CHECK_HEADERS([libintl.h]) | 270 | AC_CHECK_HEADERS([libintl.h]) |
228 | AC_CHECK_FUNCS_ONCE([isblank iswctype wcscoll]) | 271 | AC_CHECK_FUNCS_ONCE([isblank iswctype wcscoll]) |
229 | AC_CHECK_DECLS([isblank], [], [], [#include <ctype.h>]) | 272 | AC_CHECK_DECLS([isblank], [], [], [[#include <ctype.h>]]) |
230 | ]) | 273 | ]) |