X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=m4%2Fregex.m4;h=69dc326f7499e5465dba8d0f94e3a2dda1a8fb72;hb=4131c37368040602add83fb12dfda11505f884e7;hp=d59df38dd8cfad11df1cac473fc71007e341c7a1;hpb=d41ac94ee9c6646da062a193b37c32a82ba63ac2;p=gnulib.git diff --git a/m4/regex.m4 b/m4/regex.m4 index d59df38dd..69dc326f7 100644 --- a/m4/regex.m4 +++ b/m4/regex.m4 @@ -1,4 +1,4 @@ -#serial 34 +#serial 40 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006 Free Software Foundation, Inc. @@ -14,9 +14,7 @@ AC_PREREQ([2.50]) AC_DEFUN([gl_REGEX], [ - AC_LIBSOURCES( - [regcomp.c, regex.c, regex.h, - regex_internal.c, regex_internal.h, regexec.c]) + AC_CHECK_HEADERS_ONCE([locale.h]) AC_ARG_WITH([included-regex], [AC_HELP_STRING([--without-included-regex], @@ -24,27 +22,64 @@ AC_DEFUN([gl_REGEX], systems with recent-enough versions of the GNU C Library (use with caution on other systems)])]) - case $with_included_regex in + case $with_included_regex in #( yes|no) ac_use_included_regex=$with_included_regex ;; '') - # If the system regex support is good enough that it passes the the + # If the system regex support is good enough that it passes the # following run test, then default to *not* using the included regex.c. # If cross compiling, assume the test would fail and use the included # regex.c. The first failing regular expression is from `Spencer ere # test #75' in grep-2.3. AC_CACHE_CHECK([for working re_compile_pattern], - [gl_cv_func_re_compile_pattern_broken], + [gl_cv_func_re_compile_pattern_working], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [AC_INCLUDES_DEFAULT - #include ], + #if HAVE_LOCALE_H + #include + #endif + #include + #include + ], [[static struct re_pattern_buffer regex; + unsigned char folded_chars[UCHAR_MAX + 1]; + int i; const char *s; struct re_registers regs; + + #if HAVE_LOCALE_H + /* http://sourceware.org/ml/libc-hacker/2006-09/msg00008.html + This test needs valgrind to catch the bug on Debian + GNU/Linux 3.1 x86, but it might catch the bug better + on other platforms and it shouldn't hurt to try the + test here. */ + if (setlocale (LC_ALL, "en_US.UTF-8")) + { + static char const pat[] = "insert into"; + static char const data[] = + "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK"; + re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE + | RE_ICASE); + memset (®ex, 0, sizeof regex); + s = re_compile_pattern (pat, sizeof pat - 1, ®ex); + if (s) + return 1; + if (re_search (®ex, data, sizeof data - 1, + 0, sizeof data - 1, ®s) + != -1) + return 1; + if (! setlocale (LC_ALL, "C")) + return 1; + } + #endif + re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof (regex)); - s = re_compile_pattern ("a[:@:>@:]b\n", 9, ®ex); + for (i = 0; i <= UCHAR_MAX; i++) + folded_chars[i] = i; + regex.translate = folded_chars; + s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, ®ex); /* This should fail with _Invalid character class name_ error. */ if (!s) exit (1); @@ -97,15 +132,18 @@ AC_DEFUN([gl_REGEX], These include glibc 2.3.5 on hosts with 64-bit ptrdiff_t and 32-bit int. */ if (sizeof (regoff_t) < sizeof (ptrdiff_t) - || sizeof (regoff_t) < sizeof (ssize_t)) + || sizeof (regoff_t) < sizeof (ssize_t)) exit (1); exit (0);]])], - [gl_cv_func_re_compile_pattern_broken=no], - [gl_cv_func_re_compile_pattern_broken=yes], - dnl When crosscompiling, assume it is broken. - [gl_cv_func_re_compile_pattern_broken=yes])]) - ac_use_included_regex=$gl_cv_func_re_compile_pattern_broken + [gl_cv_func_re_compile_pattern_working=yes], + [gl_cv_func_re_compile_pattern_working=no], + dnl When crosscompiling, assume it is not working. + [gl_cv_func_re_compile_pattern_working=no])]) + case $gl_cv_func_re_compile_pattern_working in #( + yes) ac_use_included_regex=no;; #( + no) ac_use_included_regex=yes;; + esac ;; *) AC_MSG_ERROR([Invalid value for --with-included-regex: $with_included_regex]) ;; @@ -153,8 +191,9 @@ AC_DEFUN([gl_REGEX], AC_DEFUN([gl_PREREQ_REGEX], [ AC_REQUIRE([AC_GNU_SOURCE]) - AC_REQUIRE([gl_C_RESTRICT]) + AC_REQUIRE([AC_C_RESTRICT]) AC_REQUIRE([AM_LANGINFO_CODESET]) - AC_CHECK_HEADERS_ONCE([locale.h wchar.h wctype.h]) - AC_CHECK_FUNCS_ONCE([isblank mbrtowc mempcpy wcrtomb wcscoll]) + AC_CHECK_HEADERS_ONCE([wchar.h wctype.h]) + AC_CHECK_FUNCS_ONCE([mbrtowc mempcpy wcrtomb wcscoll]) + AC_CHECK_DECLS([isblank], [], [], [#include ]) ])