summaryrefslogtreecommitdiffstats
path: root/gl/m4/regex.m4
diff options
context:
space:
mode:
Diffstat (limited to 'gl/m4/regex.m4')
-rw-r--r--gl/m4/regex.m480
1 files changed, 52 insertions, 28 deletions
diff --git a/gl/m4/regex.m4 b/gl/m4/regex.m4
index 25da645..7da6efe 100644
--- a/gl/m4/regex.m4
+++ b/gl/m4/regex.m4
@@ -1,4 +1,4 @@
1#serial 42 1#serial 48
2 2
3# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 3# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
4# 2006, 2007 Free Software Foundation, Inc. 4# 2006, 2007 Free Software Foundation, Inc.
@@ -18,9 +18,12 @@ AC_DEFUN([gl_REGEX],
18 18
19 AC_ARG_WITH([included-regex], 19 AC_ARG_WITH([included-regex],
20 [AC_HELP_STRING([--without-included-regex], 20 [AC_HELP_STRING([--without-included-regex],
21 [don't compile regex; this is the default on 21 [don't compile regex; this is the default on 32-bit
22 systems with recent-enough versions of the GNU C 22 systems with recent-enough versions of the GNU C
23 Library (use with caution on other systems)])]) 23 Library (use with caution on other systems).
24 On systems with 64-bit ptrdiff_t and 32-bit int,
25 --with-included-regex is the default, in case
26 regex functions operate on very long strings (>2GB)])])
24 27
25 case $with_included_regex in #( 28 case $with_included_regex in #(
26 yes|no) ac_use_included_regex=$with_included_regex 29 yes|no) ac_use_included_regex=$with_included_regex
@@ -29,8 +32,7 @@ AC_DEFUN([gl_REGEX],
29 # If the system regex support is good enough that it passes the 32 # If the system regex support is good enough that it passes the
30 # following run test, then default to *not* using the included regex.c. 33 # 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 34 # If cross compiling, assume the test would fail and use the included
32 # regex.c. The first failing regular expression is from `Spencer ere 35 # regex.c.
33 # test #75' in grep-2.3.
34 AC_CACHE_CHECK([for working re_compile_pattern], 36 AC_CACHE_CHECK([for working re_compile_pattern],
35 [gl_cv_func_re_compile_pattern_working], 37 [gl_cv_func_re_compile_pattern_working],
36 [AC_RUN_IFELSE( 38 [AC_RUN_IFELSE(
@@ -74,68 +76,91 @@ AC_DEFUN([gl_REGEX],
74 } 76 }
75 #endif 77 #endif
76 78
79 /* This test is from glibc bug 3957, reported by Andrew Mackey. */
80 re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE);
81 memset (&regex, 0, sizeof regex);
82 s = re_compile_pattern ("a[^x]b", 6, &regex);
83 if (s)
84 return 1;
85
86 /* This should fail, but succeeds for glibc-2.5. */
87 if (re_search (&regex, "a\nb", 3, 0, 3, &regs) != -1)
88 return 1;
89
90 /* This regular expression is from Spencer ere test number 75
91 in grep-2.3. */
77 re_set_syntax (RE_SYNTAX_POSIX_EGREP); 92 re_set_syntax (RE_SYNTAX_POSIX_EGREP);
78 memset (&regex, 0, sizeof (regex)); 93 memset (&regex, 0, sizeof regex);
79 for (i = 0; i <= UCHAR_MAX; i++) 94 for (i = 0; i <= UCHAR_MAX; i++)
80 folded_chars[i] = i; 95 folded_chars[i] = i;
81 regex.translate = folded_chars; 96 regex.translate = folded_chars;
82 s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, &regex); 97 s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, &regex);
83 /* This should fail with _Invalid character class name_ error. */ 98 /* This should fail with _Invalid character class name_ error. */
84 if (!s) 99 if (!s)
85 exit (1); 100 return 1;
86 101
87 /* This should succeed, but does not for e.g. glibc-2.1.3. */ 102 /* This should succeed, but does not for glibc-2.1.3. */
88 memset (&regex, 0, sizeof (regex)); 103 memset (&regex, 0, sizeof regex);
89 s = re_compile_pattern ("{1", 2, &regex); 104 s = re_compile_pattern ("{1", 2, &regex);
90 105
91 if (s) 106 if (s)
92 exit (1); 107 return 1;
93 108
94 /* The following example is derived from a problem report 109 /* The following example is derived from a problem report
95 against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */ 110 against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */
96 memset (&regex, 0, sizeof (regex)); 111 memset (&regex, 0, sizeof regex);
97 s = re_compile_pattern ("[an\371]*n", 7, &regex); 112 s = re_compile_pattern ("[an\371]*n", 7, &regex);
98 if (s) 113 if (s)
99 exit (1); 114 return 1;
100 115
101 /* This should match, but does not for e.g. glibc-2.2.1. */ 116 /* This should match, but does not for glibc-2.2.1. */
102 if (re_match (&regex, "an", 2, 0, &regs) != 2) 117 if (re_match (&regex, "an", 2, 0, &regs) != 2)
103 exit (1); 118 return 1;
104 119
105 memset (&regex, 0, sizeof (regex)); 120 memset (&regex, 0, sizeof regex);
106 s = re_compile_pattern ("x", 1, &regex); 121 s = re_compile_pattern ("x", 1, &regex);
107 if (s) 122 if (s)
108 exit (1); 123 return 1;
109 124
110 /* The version of regex.c in e.g. GNU libc-2.2.93 did not 125 /* glibc-2.2.93 does not work with a negative RANGE argument. */
111 work with a negative RANGE argument. */
112 if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1) 126 if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1)
113 exit (1); 127 return 1;
114 128
115 /* The version of regex.c in older versions of gnulib 129 /* The version of regex.c in older versions of gnulib
116 ignored RE_ICASE. Detect that problem too. */ 130 ignored RE_ICASE. Detect that problem too. */
117 memset (&regex, 0, sizeof (regex));
118 re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE); 131 re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE);
132 memset (&regex, 0, sizeof regex);
119 s = re_compile_pattern ("x", 1, &regex); 133 s = re_compile_pattern ("x", 1, &regex);
120 if (s) 134 if (s)
121 exit (1); 135 return 1;
122 136
123 if (re_search (&regex, "WXY", 3, 0, 3, &regs) < 0) 137 if (re_search (&regex, "WXY", 3, 0, 3, &regs) < 0)
124 exit (1); 138 return 1;
139
140 /* Catch a bug reported by Vin Shelton in
141 http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html
142 */
143 re_set_syntax (RE_SYNTAX_POSIX_BASIC
144 & ~RE_CONTEXT_INVALID_DUP
145 & ~RE_NO_EMPTY_RANGES);
146 memset (&regex, 0, sizeof regex);
147 s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, &regex);
148 if (s)
149 return 1;
125 150
126 /* REG_STARTEND was added to glibc on 2004-01-15. 151 /* REG_STARTEND was added to glibc on 2004-01-15.
127 Reject older versions. */ 152 Reject older versions. */
128 if (! REG_STARTEND) 153 if (! REG_STARTEND)
129 exit (1); 154 return 1;
130 155
131 /* Reject hosts whose regoff_t values are too narrow. 156 /* Reject hosts whose regoff_t values are too narrow.
132 These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t 157 These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t
133 and 32-bit int. */ 158 and 32-bit int. */
134 if (sizeof (regoff_t) < sizeof (ptrdiff_t) 159 if (sizeof (regoff_t) < sizeof (ptrdiff_t)
135 || sizeof (regoff_t) < sizeof (ssize_t)) 160 || sizeof (regoff_t) < sizeof (ssize_t))
136 exit (1); 161 return 1;
137 162
138 exit (0);]])], 163 return 0;]])],
139 [gl_cv_func_re_compile_pattern_working=yes], 164 [gl_cv_func_re_compile_pattern_working=yes],
140 [gl_cv_func_re_compile_pattern_working=no], 165 [gl_cv_func_re_compile_pattern_working=no],
141 dnl When crosscompiling, assume it is not working. 166 dnl When crosscompiling, assume it is not working.
@@ -190,9 +215,8 @@ AC_DEFUN([gl_REGEX],
190# Prerequisites of lib/regex.c and lib/regex_internal.c. 215# Prerequisites of lib/regex.c and lib/regex_internal.c.
191AC_DEFUN([gl_PREREQ_REGEX], 216AC_DEFUN([gl_PREREQ_REGEX],
192[ 217[
193 AC_REQUIRE([AC_GNU_SOURCE]) 218 AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
194 AC_REQUIRE([AC_C_RESTRICT]) 219 AC_REQUIRE([AC_C_RESTRICT])
195 AC_REQUIRE([AM_LANGINFO_CODESET]) 220 AC_CHECK_FUNCS_ONCE([isblank iswctype mbrtowc wcrtomb wcscoll])
196 AC_CHECK_FUNCS_ONCE([iswctype mbrtowc mempcpy wcrtomb wcscoll])
197 AC_CHECK_DECLS([isblank], [], [], [#include <ctype.h>]) 221 AC_CHECK_DECLS([isblank], [], [], [#include <ctype.h>])
198]) 222])