1 # serial 54 2 3 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 4 # 2006, 2007, 2008, 2009 Free Software Foundation, Inc. 5 # 6 # This file is free software; the Free Software Foundation 7 # gives unlimited permission to copy and/or distribute it, 8 # with or without modifications, as long as this notice is preserved. 9 10 dnl Initially derived from code in GNU grep. 11 dnl Mostly written by Jim Meyering. 12 13 AC_PREREQ([2.50]) 14 15 AC_DEFUN([gl_REGEX], 16 [ 17 AC_CHECK_HEADERS_ONCE([locale.h]) 18 19 AC_ARG_WITH([included-regex], 20 [AS_HELP_STRING([--without-included-regex], 21 [don't compile regex; this is the default on systems 22 with recent-enough versions of the GNU C Library 23 (use with caution on other systems).])]) 24 25 case $with_included_regex in #( 26 yes|no) ac_use_included_regex=$with_included_regex 27 ;; 28 '') 29 # 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. 31 # If cross compiling, assume the test would fail and use the included 32 # regex.c. 33 AC_CACHE_CHECK([for working re_compile_pattern], 34 [gl_cv_func_re_compile_pattern_working], 35 [AC_RUN_IFELSE( 36 [AC_LANG_PROGRAM( 37 [AC_INCLUDES_DEFAULT[ 38 #if HAVE_LOCALE_H 39 #include <locale.h> 40 #endif 41 #include <limits.h> 42 #include <regex.h> 43 ]], 44 [[static struct re_pattern_buffer regex; 45 unsigned char folded_chars[UCHAR_MAX + 1]; 46 int i; 47 const char *s; 48 struct re_registers regs; 49 50 #if HAVE_LOCALE_H 51 /* http://sourceware.org/ml/libc-hacker/2006-09/msg00008.html 52 This test needs valgrind to catch the bug on Debian 53 GNU/Linux 3.1 x86, but it might catch the bug better 54 on other platforms and it shouldn't hurt to try the 55 test here. */ 56 if (setlocale (LC_ALL, "en_US.UTF-8")) 57 { 58 static char const pat[] = "insert into"; 59 static char const data[] = 60 "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; 61 re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE 62 | RE_ICASE); 63 memset (®ex, 0, sizeof regex); 64 s = re_compile_pattern (pat, sizeof pat - 1, ®ex); 65 if (s) 66 return 1; 67 if (re_search (®ex, data, sizeof data - 1, 68 0, sizeof data - 1, ®s) 69 != -1) 70 return 1; 71 if (! setlocale (LC_ALL, "C")) 72 return 1; 73 } 74 #endif 75 76 /* This test is from glibc bug 3957, reported by Andrew Mackey. */ 77 re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE); 78 memset (®ex, 0, sizeof regex); 79 s = re_compile_pattern ("a[^x]b", 6, ®ex); 80 if (s) 81 return 1; 82 83 /* This should fail, but succeeds for glibc-2.5. */ 84 if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -1) 85 return 1; 86 87 /* This regular expression is from Spencer ere test number 75 88 in grep-2.3. */ 89 re_set_syntax (RE_SYNTAX_POSIX_EGREP); 90 memset (®ex, 0, sizeof regex); 91 for (i = 0; i <= UCHAR_MAX; i++) 92 folded_chars[i] = i; 93 regex.translate = folded_chars; 94 s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, ®ex); 95 /* This should fail with _Invalid character class name_ error. */ 96 if (!s) 97 return 1; 98 99 /* This should succeed, but does not for glibc-2.1.3. */ 100 memset (®ex, 0, sizeof regex); 101 s = re_compile_pattern ("{1", 2, ®ex); 102 103 if (s) 104 return 1; 105 106 /* The following example is derived from a problem report 107 against gawk from Jorge Stolfi <stolfi (a] ic.unicamp.br>. */ 108 memset (®ex, 0, sizeof regex); 109 s = re_compile_pattern ("[an\371]*n", 7, ®ex); 110 if (s) 111 return 1; 112 113 /* This should match, but does not for glibc-2.2.1. */ 114 if (re_match (®ex, "an", 2, 0, ®s) != 2) 115 return 1; 116 117 memset (®ex, 0, sizeof regex); 118 s = re_compile_pattern ("x", 1, ®ex); 119 if (s) 120 return 1; 121 122 /* glibc-2.2.93 does not work with a negative RANGE argument. */ 123 if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 1) 124 return 1; 125 126 /* The version of regex.c in older versions of gnulib 127 ignored RE_ICASE. Detect that problem too. */ 128 re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE); 129 memset (®ex, 0, sizeof regex); 130 s = re_compile_pattern ("x", 1, ®ex); 131 if (s) 132 return 1; 133 134 if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) 135 return 1; 136 137 /* Catch a bug reported by Vin Shelton in 138 http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html 139 */ 140 re_set_syntax (RE_SYNTAX_POSIX_BASIC 141 & ~RE_CONTEXT_INVALID_DUP 142 & ~RE_NO_EMPTY_RANGES); 143 memset (®ex, 0, sizeof regex); 144 s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, ®ex); 145 if (s) 146 return 1; 147 148 /* REG_STARTEND was added to glibc on 2004-01-15. 149 Reject older versions. */ 150 if (! REG_STARTEND) 151 return 1; 152 153 /* Reject hosts whose regoff_t values are too narrow. 154 These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t 155 and 32-bit int. */ 156 if (sizeof (regoff_t) < sizeof (ptrdiff_t) 157 || sizeof (regoff_t) < sizeof (ssize_t)) 158 return 1; 159 160 return 0;]])], 161 [gl_cv_func_re_compile_pattern_working=yes], 162 [gl_cv_func_re_compile_pattern_working=no], 163 dnl When crosscompiling, assume it is not working. 164 [gl_cv_func_re_compile_pattern_working=no])]) 165 case $gl_cv_func_re_compile_pattern_working in #( 166 yes) ac_use_included_regex=no;; #( 167 no) ac_use_included_regex=yes;; 168 esac 169 ;; 170 *) AC_MSG_ERROR([Invalid value for --with-included-regex: $with_included_regex]) 171 ;; 172 esac 173 174 if test $ac_use_included_regex = yes; then 175 AC_DEFINE([_REGEX_LARGE_OFFSETS], [1], 176 [Define if you want regoff_t to be at least as wide POSIX requires.]) 177 AC_DEFINE([re_syntax_options], [rpl_re_syntax_options], 178 [Define to rpl_re_syntax_options if the replacement should be used.]) 179 AC_DEFINE([re_set_syntax], [rpl_re_set_syntax], 180 [Define to rpl_re_set_syntax if the replacement should be used.]) 181 AC_DEFINE([re_compile_pattern], [rpl_re_compile_pattern], 182 [Define to rpl_re_compile_pattern if the replacement should be used.]) 183 AC_DEFINE([re_compile_fastmap], [rpl_re_compile_fastmap], 184 [Define to rpl_re_compile_fastmap if the replacement should be used.]) 185 AC_DEFINE([re_search], [rpl_re_search], 186 [Define to rpl_re_search if the replacement should be used.]) 187 AC_DEFINE([re_search_2], [rpl_re_search_2], 188 [Define to rpl_re_search_2 if the replacement should be used.]) 189 AC_DEFINE([re_match], [rpl_re_match], 190 [Define to rpl_re_match if the replacement should be used.]) 191 AC_DEFINE([re_match_2], [rpl_re_match_2], 192 [Define to rpl_re_match_2 if the replacement should be used.]) 193 AC_DEFINE([re_set_registers], [rpl_re_set_registers], 194 [Define to rpl_re_set_registers if the replacement should be used.]) 195 AC_DEFINE([re_comp], [rpl_re_comp], 196 [Define to rpl_re_comp if the replacement should be used.]) 197 AC_DEFINE([re_exec], [rpl_re_exec], 198 [Define to rpl_re_exec if the replacement should be used.]) 199 AC_DEFINE([regcomp], [rpl_regcomp], 200 [Define to rpl_regcomp if the replacement should be used.]) 201 AC_DEFINE([regexec], [rpl_regexec], 202 [Define to rpl_regexec if the replacement should be used.]) 203 AC_DEFINE([regerror], [rpl_regerror], 204 [Define to rpl_regerror if the replacement should be used.]) 205 AC_DEFINE([regfree], [rpl_regfree], 206 [Define to rpl_regfree if the replacement should be used.]) 207 AC_LIBOBJ([regex]) 208 gl_PREREQ_REGEX 209 fi 210 ]) 211 212 # Prerequisites of lib/regex.c and lib/regex_internal.c. 213 AC_DEFUN([gl_PREREQ_REGEX], 214 [ 215 AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) 216 AC_REQUIRE([AC_C_RESTRICT]) 217 AC_REQUIRE([AC_TYPE_MBSTATE_T]) 218 AC_CHECK_HEADERS([libintl.h]) 219 AC_CHECK_FUNCS_ONCE([isblank iswctype wcscoll]) 220 AC_CHECK_DECLS([isblank], [], [], [#include <ctype.h>]) 221 ]) 222