* modules/glob (Files): Add glob-libc.h.
[gnulib.git] / m4 / regex.m4
index 7908f7e..6addb10 100644 (file)
@@ -1,4 +1,4 @@
-#serial 23
+#serial 29
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 Free
 # Software Foundation, Inc.
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 Free
 # Software Foundation, Inc.
 dnl Initially derived from code in GNU grep.
 dnl Mostly written by Jim Meyering.
 
 dnl Initially derived from code in GNU grep.
 dnl Mostly written by Jim Meyering.
 
+AC_PREREQ([2.50])
+
 AC_DEFUN([gl_REGEX],
 [
 AC_DEFUN([gl_REGEX],
 [
-  gl_INCLUDED_REGEX([lib/regex.c])
-])
-
-dnl Usage: gl_INCLUDED_REGEX([lib/regex.c])
-dnl
-AC_DEFUN([gl_INCLUDED_REGEX],
-  [
-    AC_LIBSOURCES(
-      [regcomp.c, regex.c, regex.h,
-       regex_internal.c, regex_internal.h, regexec.c])
-
-    dnl Even packages that don't use regex.c can use this macro.
-    dnl Of course, for them it doesn't do anything.
-
-    # Assume we'll default to using the included regex.c.
-    ac_use_included_regex=yes
-
-    # However, if the system regex support is good enough that it passes the
-    # the following run test, then default to *not* using the included regex.c.
+  AC_REQUIRE([AC_SYS_LARGEFILE]) dnl for a sufficently-wide off_t
+  AC_DEFINE([_REGEX_LARGE_OFFSETS], 1,
+    [Define if you want regoff_t to be at least as wide POSIX requires.])
+
+  AC_LIBSOURCES(
+    [regcomp.c, regex.c, regex.h,
+     regex_internal.c, regex_internal.h, regexec.c])
+
+  AC_ARG_WITH([included-regex],
+    [AC_HELP_STRING([--without-included-regex],
+                   [don't compile regex; this is the default on
+                    systems with recent-enough versions of the GNU C
+                    Library (use with caution on other systems)])])
+
+  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
+    # 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],
     # 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_working_re_compile_pattern],
-      [AC_TRY_RUN(
-        [[
-#include <stdio.h>
-#include <string.h>
-#include <regex.h>
-         int
-         main ()
-         {
-           static struct re_pattern_buffer regex;
+                  [gl_cv_func_re_compile_pattern_broken],
+      [AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+         [AC_INCLUDES_DEFAULT
+          #include <regex.h>],
+         [[static struct re_pattern_buffer regex;
            const char *s;
            struct re_registers regs;
            const char *s;
            struct re_registers regs;
-           re_set_syntax (RE_SYNTAX_POSIX_EGREP);
+           /* Use the POSIX-compliant spelling with leading REG_,
+              rather than the traditional GNU spelling with leading RE_,
+              so that we reject older libc implementations.  */
+           re_set_syntax (REG_SYNTAX_POSIX_EGREP);
            memset (&regex, 0, sizeof (regex));
            s = re_compile_pattern ("a[:@:>@:]b\n", 9, &regex);
            /* This should fail with _Invalid character class name_ error.  */
            memset (&regex, 0, sizeof (regex));
            s = re_compile_pattern ("a[:@:>@:]b\n", 9, &regex);
            /* This should fail with _Invalid character class name_ error.  */
@@ -62,7 +64,7 @@ AC_DEFUN([gl_INCLUDED_REGEX],
              exit (1);
 
            /* The following example is derived from a problem report
              exit (1);
 
            /* The following example is derived from a problem report
-               against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>.  */
+              against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>.  */
            memset (&regex, 0, sizeof (regex));
            s = re_compile_pattern ("[an\371]*n", 7, &regex);
            if (s)
            memset (&regex, 0, sizeof (regex));
            s = re_compile_pattern ("[an\371]*n", 7, &regex);
            if (s)
@@ -83,9 +85,10 @@ AC_DEFUN([gl_INCLUDED_REGEX],
              exit (1);
 
            /* The version of regex.c in older versions of gnulib
              exit (1);
 
            /* The version of regex.c in older versions of gnulib
-             * ignored RE_ICASE.  Detect that problem too. */
+              ignored REG_IGNORE_CASE (which was then called RE_ICASE).
+              Detect that problem too.  */
            memset (&regex, 0, sizeof (regex));
            memset (&regex, 0, sizeof (regex));
-           re_set_syntax(RE_SYNTAX_EMACS|RE_ICASE);
+           re_set_syntax (REG_SYNTAX_EMACS | REG_IGNORE_CASE);
            s = re_compile_pattern ("x", 1, &regex);
            if (s)
              exit (1);
            s = re_compile_pattern ("x", 1, &regex);
            if (s)
              exit (1);
@@ -98,39 +101,34 @@ AC_DEFUN([gl_INCLUDED_REGEX],
            if (! REG_STARTEND)
              exit (1);
 
            if (! REG_STARTEND)
              exit (1);
 
-           exit (0);
-         }
-        ]],
-        [gl_cv_func_working_re_compile_pattern=yes],
-        [gl_cv_func_working_re_compile_pattern=no],
-        dnl When crosscompiling, assume it is broken.
-        [gl_cv_func_working_re_compile_pattern=no])])
-    if test $gl_cv_func_working_re_compile_pattern = yes; then
-      ac_use_included_regex=no
-    fi
-
-    test -n "$1" || AC_MSG_ERROR([missing argument])
-    m4_syscmd([test -f '$1'])
-    ifelse(m4_sysval, 0,
-      [
-       AC_ARG_WITH([included-regex],
-         [  --without-included-regex don't compile regex; this is the default on
-                          systems with recent-enough versions of the GNU C
-                          Library (use with caution on other systems)],
-         [gl_with_regex=$withval],
-         [gl_with_regex=$ac_use_included_regex])
-       if test "X$gl_with_regex" = Xyes; then
-         AC_LIBOBJ([regex])
-         gl_PREREQ_REGEX
-       fi
-      ],
-    )
-  ]
-)
+           /* Reject hosts whose regoff_t values are too narrow.
+              These include glibc 2.3.5 on hosts with 64-bit off_t
+              and 32-bit int, and Solaris 10 on hosts with 32-bit int
+              and _FILE_OFFSET_BITS=64.  */
+           if (sizeof (regoff_t) < sizeof (off_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
+    ;;
+  *) AC_MSG_ERROR([Invalid value for --with-included-regex: $with_included_regex])
+    ;;
+  esac
+
+  if test $ac_use_included_regex = yes; then
+    AC_LIBOBJ([regex])
+    gl_PREREQ_REGEX
+  fi
+])
 
 # Prerequisites of lib/regex.c and lib/regex_internal.c.
 AC_DEFUN([gl_PREREQ_REGEX],
 [
 
 # Prerequisites of lib/regex.c and lib/regex_internal.c.
 AC_DEFUN([gl_PREREQ_REGEX],
 [
+  AC_REQUIRE([AC_GNU_SOURCE])
   AC_REQUIRE([gl_C_RESTRICT])
   AC_REQUIRE([AM_LANGINFO_CODESET])
   AC_CHECK_HEADERS_ONCE([locale.h wchar.h wctype.h])
   AC_REQUIRE([gl_C_RESTRICT])
   AC_REQUIRE([AM_LANGINFO_CODESET])
   AC_CHECK_HEADERS_ONCE([locale.h wchar.h wctype.h])