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