(jm_INCLUDED_REGEX): Change "\201" to "\371"; apparently Emacs's
[gnulib.git] / m4 / regex.m4
index b7a0389..93efa3a 100644 (file)
@@ -1,61 +1,90 @@
-#serial 4
+#serial 19
 
 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_DEFUN(jm_WITH_REGEX,
-  [
-    AC_REQUIRE([AM_GLIBC])
+AC_DEFUN([gl_REGEX],
+[
+  jm_INCLUDED_REGEX([lib/regex.c])
+])
 
 
+dnl Usage: jm_INCLUDED_REGEX([lib/regex.c])
+dnl
+AC_DEFUN([jm_INCLUDED_REGEX],
+  [
     dnl Even packages that don't use regex.c can use this macro.
     dnl Of course, for them it doesn't do anything.
 
     dnl Even packages that don't use regex.c can use this macro.
     dnl Of course, for them it doesn't do anything.
 
-    # By default, don't use the included regex.c on systems with a version
-    # of glibc 2 that's new enough to pass the following run test.
-    # If cross compiling, assume the test would fail and use the included
-    # regex.c.  The failing regular expression is from `Spencer ere test
-    # #75' in grep-2.2f.
+    # Assume we'll default to using the included regex.c.
     ac_use_included_regex=yes
 
     ac_use_included_regex=yes
 
-    if test "$ac_cv_glibc" = yes; then
-      # Without this run-test, on older glibc2 systems we'd end up
-      # using the buggy system regex.
-      AC_CACHE_CHECK([for working re_compile_pattern],
-                     jm_cv_func_working_re_compile_pattern,
-       AC_TRY_RUN(
-         changequote(<<, >>)dnl
-         <<
-#include <stdio.h>
+    # 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.
+    # 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],
+                  jm_cv_func_working_re_compile_pattern,
+      AC_TRY_RUN(
+[#include <stdio.h>
+#include <string.h>
 #include <regex.h>
 #include <regex.h>
-           int
-           main ()
-           {
-             static struct re_pattern_buffer regex;
-             const char *s;
-             re_set_syntax (RE_SYNTAX_POSIX_EGREP);
-             /* Add this third left square bracket, [, to balance the
-                three right ones below.  Otherwise autoconf-2.14 chokes.  */
-             s = re_compile_pattern ("a[[:]:]]b\n", 9, &regex);
-             /* This should fail with _Invalid character class name_ error.  */
-             exit (s ? 0 : 1);
-           }
-         >>,
-         changequote([, ])dnl
-
-                jm_cv_func_working_re_compile_pattern=yes,
-                jm_cv_func_working_re_compile_pattern=no,
-                dnl When crosscompiling, assume it's broken.
-                jm_cv_func_working_re_compile_pattern=no))
-      if test $jm_cv_func_working_re_compile_pattern = yes; then
-       ac_use_included_regex=no
-      fi
+         int
+         main ()
+         {
+           static struct re_pattern_buffer regex;
+           const char *s;
+           struct re_registers regs;
+           re_set_syntax (RE_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.  */
+           if (!s)
+             exit (1);
+
+           /* This should succeed, but doesn't for e.g. glibc-2.1.3.  */
+           memset (&regex, 0, sizeof (regex));
+           s = re_compile_pattern ("{1", 2, &regex);
+
+           if (s)
+             exit (1);
+
+           /* The following example is derived from a problem report
+               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)
+             exit (1);
+
+           /* This should match, but doesn't for e.g. glibc-2.2.1.  */
+           if (re_match (&regex, "an", 2, 0, &regs) != 2)
+             exit (1);
+
+           memset (&regex, 0, sizeof (regex));
+           s = re_compile_pattern ("x", 1, &regex);
+           if (s)
+             exit (1);
+
+           /* The version of regex.c in e.g. GNU libc-2.2.93 didn't
+              work with a negative RANGE argument.  */
+           if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1)
+             exit (1);
+
+           exit (0);
+         }
+       ],
+              jm_cv_func_working_re_compile_pattern=yes,
+              jm_cv_func_working_re_compile_pattern=no,
+              dnl When crosscompiling, assume it's broken.
+              jm_cv_func_working_re_compile_pattern=no))
+    if test $jm_cv_func_working_re_compile_pattern = yes; then
+      ac_use_included_regex=no
     fi
 
     test -n "$1" || AC_MSG_ERROR([missing argument])
     fi
 
     test -n "$1" || AC_MSG_ERROR([missing argument])
-    syscmd([test -f $1])
-    ifelse(sysval, 0,
+    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 version 2 of the GNU C library
        AC_ARG_WITH(included-regex,
        [  --without-included-regex don't compile regex; this is the default on
                           systems with version 2 of the GNU C library
@@ -63,9 +92,28 @@ AC_DEFUN(jm_WITH_REGEX,
                    jm_with_regex=$withval,
                    jm_with_regex=$ac_use_included_regex)
        if test "$jm_with_regex" = yes; then
                    jm_with_regex=$withval,
                    jm_with_regex=$ac_use_included_regex)
        if test "$jm_with_regex" = yes; then
-         LIBOBJS="$LIBOBJS regex.o"
+         AC_LIBOBJ(regex)
+         jm_PREREQ_REGEX
        fi
       ],
     )
   ]
 )
        fi
       ],
     )
   ]
 )
+
+# Prerequisites of lib/regex.c.
+AC_DEFUN([jm_PREREQ_REGEX],
+[
+  dnl FIXME: Maybe provide a btowc replacement someday: Solaris 2.5.1 lacks it.
+  dnl FIXME: Check for wctype and iswctype, and and add -lw if necessary
+  dnl to get them.
+
+  dnl Persuade glibc <string.h> to declare mempcpy().
+  AC_REQUIRE([AC_GNU_SOURCE])
+
+  AC_REQUIRE([gl_C_RESTRICT])
+  AC_REQUIRE([AC_FUNC_ALLOCA])
+  AC_REQUIRE([AC_HEADER_STDC])
+  AC_CHECK_HEADERS_ONCE(limits.h string.h wchar.h wctype.h)
+  AC_CHECK_FUNCS_ONCE(isascii mempcpy)
+  AC_CHECK_FUNCS(btowc)
+])