Blame m4/regex.m4

Packit 33f14e
# serial 66
Packit 33f14e
Packit 33f14e
# Copyright (C) 1996-2001, 2003-2017 Free Software Foundation, Inc.
Packit 33f14e
#
Packit 33f14e
# This file is free software; the Free Software Foundation
Packit 33f14e
# gives unlimited permission to copy and/or distribute it,
Packit 33f14e
# with or without modifications, as long as this notice is preserved.
Packit 33f14e
Packit 33f14e
dnl Initially derived from code in GNU grep.
Packit 33f14e
dnl Mostly written by Jim Meyering.
Packit 33f14e
Packit 33f14e
AC_PREREQ([2.50])
Packit 33f14e
Packit 33f14e
AC_DEFUN([gl_REGEX],
Packit 33f14e
[
Packit 33f14e
  AC_ARG_WITH([included-regex],
Packit 33f14e
    [AS_HELP_STRING([--without-included-regex],
Packit 33f14e
                    [don't compile regex; this is the default on systems
Packit 33f14e
                     with recent-enough versions of the GNU C Library
Packit 33f14e
                     (use with caution on other systems).])])
Packit 33f14e
Packit 33f14e
  case $with_included_regex in #(
Packit 33f14e
  yes|no) ac_use_included_regex=$with_included_regex
Packit 33f14e
        ;;
Packit 33f14e
  '')
Packit 33f14e
    # If the system regex support is good enough that it passes the
Packit 33f14e
    # following run test, then default to *not* using the included regex.c.
Packit 33f14e
    # If cross compiling, assume the test would fail and use the included
Packit 33f14e
    # regex.c.
Packit 33f14e
    AC_CHECK_DECLS_ONCE([alarm])
Packit 33f14e
    AC_CHECK_HEADERS_ONCE([malloc.h])
Packit 33f14e
    AC_CACHE_CHECK([for working re_compile_pattern],
Packit 33f14e
                   [gl_cv_func_re_compile_pattern_working],
Packit 33f14e
      [AC_RUN_IFELSE(
Packit 33f14e
        [AC_LANG_PROGRAM(
Packit 33f14e
          [[#include <regex.h>
Packit 33f14e
Packit 33f14e
            #include <locale.h>
Packit 33f14e
            #include <limits.h>
Packit 33f14e
            #include <string.h>
Packit 33f14e
Packit 33f14e
            #if defined M_CHECK_ACTION || HAVE_DECL_ALARM
Packit 33f14e
            # include <signal.h>
Packit 33f14e
            # include <unistd.h>
Packit 33f14e
            #endif
Packit 33f14e
Packit 33f14e
            #if HAVE_MALLOC_H
Packit 33f14e
            # include <malloc.h>
Packit 33f14e
            #endif
Packit 33f14e
Packit 33f14e
            #ifdef M_CHECK_ACTION
Packit 33f14e
            /* Exit with distinguishable exit code.  */
Packit 33f14e
            static void sigabrt_no_core (int sig) { raise (SIGTERM); }
Packit 33f14e
            #endif
Packit 33f14e
          ]],
Packit 33f14e
          [[int result = 0;
Packit 33f14e
            static struct re_pattern_buffer regex;
Packit 33f14e
            unsigned char folded_chars[UCHAR_MAX + 1];
Packit 33f14e
            int i;
Packit 33f14e
            const char *s;
Packit 33f14e
            struct re_registers regs;
Packit 33f14e
Packit 33f14e
            /* Some builds of glibc go into an infinite loop on this
Packit 33f14e
               test.  Use alarm to force death, and mallopt to avoid
Packit 33f14e
               malloc recursion in diagnosing the corrupted heap. */
Packit 33f14e
#if HAVE_DECL_ALARM
Packit 33f14e
            signal (SIGALRM, SIG_DFL);
Packit 33f14e
            alarm (2);
Packit 33f14e
#endif
Packit 33f14e
#ifdef M_CHECK_ACTION
Packit 33f14e
            signal (SIGABRT, sigabrt_no_core);
Packit 33f14e
            mallopt (M_CHECK_ACTION, 2);
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
            if (setlocale (LC_ALL, "en_US.UTF-8"))
Packit 33f14e
              {
Packit 33f14e
                {
Packit 33f14e
                  /* http://sourceware.org/ml/libc-hacker/2006-09/msg00008.html
Packit 33f14e
                     This test needs valgrind to catch the bug on Debian
Packit 33f14e
                     GNU/Linux 3.1 x86, but it might catch the bug better
Packit 33f14e
                     on other platforms and it shouldn't hurt to try the
Packit 33f14e
                     test here.  */
Packit 33f14e
                  static char const pat[] = "insert into";
Packit 33f14e
                  static char const data[] =
Packit 33f14e
                    "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK";
Packit 33f14e
                  re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE
Packit 33f14e
                                 | RE_ICASE);
Packit 33f14e
                  memset (&regex, 0, sizeof regex);
Packit 33f14e
                  s = re_compile_pattern (pat, sizeof pat - 1, &regex);
Packit 33f14e
                  if (s)
Packit 33f14e
                    result |= 1;
Packit 33f14e
                  else if (re_search (&regex, data, sizeof data - 1,
Packit 33f14e
                                      0, sizeof data - 1, &regs)
Packit 33f14e
                           != -1)
Packit 33f14e
                    result |= 1;
Packit 33f14e
                  regfree (&regex);
Packit 33f14e
                }
Packit 33f14e
Packit 33f14e
                {
Packit 33f14e
                  /* This test is from glibc bug 15078.
Packit 33f14e
                     The test case is from Andreas Schwab in
Packit 33f14e
                     <http://www.sourceware.org/ml/libc-alpha/2013-01/msg00967.html>.
Packit 33f14e
                     */
Packit 33f14e
                  static char const pat[] = "[^x]x";
Packit 33f14e
                  static char const data[] =
Packit 33f14e
                    /* <U1000><U103B><U103D><U1014><U103A><U102F><U1015><U103A> */
Packit 33f14e
                    "\xe1\x80\x80"
Packit 33f14e
                    "\xe1\x80\xbb"
Packit 33f14e
                    "\xe1\x80\xbd"
Packit 33f14e
                    "\xe1\x80\x94"
Packit 33f14e
                    "\xe1\x80\xba"
Packit 33f14e
                    "\xe1\x80\xaf"
Packit 33f14e
                    "\xe1\x80\x95"
Packit 33f14e
                    "\xe1\x80\xba"
Packit 33f14e
                    "x";
Packit 33f14e
                  re_set_syntax (0);
Packit 33f14e
                  memset (&regex, 0, sizeof regex);
Packit 33f14e
                  s = re_compile_pattern (pat, sizeof pat - 1, &regex);
Packit 33f14e
                  if (s)
Packit 33f14e
                    result |= 1;
Packit 33f14e
                  else
Packit 33f14e
                    {
Packit 33f14e
                      i = re_search (&regex, data, sizeof data - 1,
Packit 33f14e
                                     0, sizeof data - 1, 0);
Packit 33f14e
                      if (i != 0 && i != 21)
Packit 33f14e
                        result |= 1;
Packit 33f14e
                    }
Packit 33f14e
                  regfree (&regex);
Packit 33f14e
                }
Packit 33f14e
Packit 33f14e
                if (! setlocale (LC_ALL, "C"))
Packit 33f14e
                  return 1;
Packit 33f14e
              }
Packit 33f14e
Packit 33f14e
            /* This test is from glibc bug 3957, reported by Andrew Mackey.  */
Packit 33f14e
            re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE);
Packit 33f14e
            memset (&regex, 0, sizeof regex);
Packit 33f14e
            s = re_compile_pattern ("a[^x]b", 6, &regex);
Packit 33f14e
            if (s)
Packit 33f14e
              result |= 2;
Packit 33f14e
            /* This should fail, but succeeds for glibc-2.5.  */
Packit 33f14e
            else if (re_search (&regex, "a\nb", 3, 0, 3, &regs) != -1)
Packit 33f14e
              result |= 2;
Packit 33f14e
Packit 33f14e
            /* This regular expression is from Spencer ere test number 75
Packit 33f14e
               in grep-2.3.  */
Packit 33f14e
            re_set_syntax (RE_SYNTAX_POSIX_EGREP);
Packit 33f14e
            memset (&regex, 0, sizeof regex);
Packit 33f14e
            for (i = 0; i <= UCHAR_MAX; i++)
Packit 33f14e
              folded_chars[i] = i;
Packit 33f14e
            regex.translate = folded_chars;
Packit 33f14e
            s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, &regex);
Packit 33f14e
            /* This should fail with _Invalid character class name_ error.  */
Packit 33f14e
            if (!s)
Packit 33f14e
              result |= 4;
Packit 33f14e
Packit 33f14e
            /* Ensure that [b-a] is diagnosed as invalid, when
Packit 33f14e
               using RE_NO_EMPTY_RANGES. */
Packit 33f14e
            re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_NO_EMPTY_RANGES);
Packit 33f14e
            memset (&regex, 0, sizeof regex);
Packit 33f14e
            s = re_compile_pattern ("a[b-a]", 6, &regex);
Packit 33f14e
            if (s == 0)
Packit 33f14e
              result |= 8;
Packit 33f14e
Packit 33f14e
            /* This should succeed, but does not for glibc-2.1.3.  */
Packit 33f14e
            memset (&regex, 0, sizeof regex);
Packit 33f14e
            s = re_compile_pattern ("{1", 2, &regex);
Packit 33f14e
            if (s)
Packit 33f14e
              result |= 8;
Packit 33f14e
Packit 33f14e
            /* The following example is derived from a problem report
Packit 33f14e
               against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>.  */
Packit 33f14e
            memset (&regex, 0, sizeof regex);
Packit 33f14e
            s = re_compile_pattern ("[an\371]*n", 7, &regex);
Packit 33f14e
            if (s)
Packit 33f14e
              result |= 8;
Packit 33f14e
            /* This should match, but does not for glibc-2.2.1.  */
Packit 33f14e
            else if (re_match (&regex, "an", 2, 0, &regs) != 2)
Packit 33f14e
              result |= 8;
Packit 33f14e
Packit 33f14e
            memset (&regex, 0, sizeof regex);
Packit 33f14e
            s = re_compile_pattern ("x", 1, &regex);
Packit 33f14e
            if (s)
Packit 33f14e
              result |= 8;
Packit 33f14e
            /* glibc-2.2.93 does not work with a negative RANGE argument.  */
Packit 33f14e
            else if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1)
Packit 33f14e
              result |= 8;
Packit 33f14e
Packit 33f14e
            /* The version of regex.c in older versions of gnulib
Packit 33f14e
               ignored RE_ICASE.  Detect that problem too.  */
Packit 33f14e
            re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE);
Packit 33f14e
            memset (&regex, 0, sizeof regex);
Packit 33f14e
            s = re_compile_pattern ("x", 1, &regex);
Packit 33f14e
            if (s)
Packit 33f14e
              result |= 16;
Packit 33f14e
            else if (re_search (&regex, "WXY", 3, 0, 3, &regs) < 0)
Packit 33f14e
              result |= 16;
Packit 33f14e
Packit 33f14e
            /* Catch a bug reported by Vin Shelton in
Packit 33f14e
               http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html
Packit 33f14e
               */
Packit 33f14e
            re_set_syntax (RE_SYNTAX_POSIX_BASIC
Packit 33f14e
                           & ~RE_CONTEXT_INVALID_DUP
Packit 33f14e
                           & ~RE_NO_EMPTY_RANGES);
Packit 33f14e
            memset (&regex, 0, sizeof regex);
Packit 33f14e
            s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, &regex);
Packit 33f14e
            if (s)
Packit 33f14e
              result |= 32;
Packit 33f14e
Packit 33f14e
            /* REG_STARTEND was added to glibc on 2004-01-15.
Packit 33f14e
               Reject older versions.  */
Packit 33f14e
            if (! REG_STARTEND)
Packit 33f14e
              result |= 64;
Packit 33f14e
Packit 33f14e
#if 0
Packit 33f14e
            /* It would be nice to reject hosts whose regoff_t values are too
Packit 33f14e
               narrow (including glibc on hosts with 64-bit ptrdiff_t and
Packit 33f14e
               32-bit int), but we should wait until glibc implements this
Packit 33f14e
               feature.  Otherwise, support for equivalence classes and
Packit 33f14e
               multibyte collation symbols would always be broken except
Packit 33f14e
               when compiling --without-included-regex.   */
Packit 33f14e
            if (sizeof (regoff_t) < sizeof (ptrdiff_t)
Packit 33f14e
                || sizeof (regoff_t) < sizeof (ssize_t))
Packit 33f14e
              result |= 64;
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
            return result;
Packit 33f14e
          ]])],
Packit 33f14e
       [gl_cv_func_re_compile_pattern_working=yes],
Packit 33f14e
       [gl_cv_func_re_compile_pattern_working=no],
Packit 33f14e
       dnl When crosscompiling, assume it is not working.
Packit 33f14e
       [gl_cv_func_re_compile_pattern_working=no])])
Packit 33f14e
    case $gl_cv_func_re_compile_pattern_working in #(
Packit 33f14e
    yes) ac_use_included_regex=no;; #(
Packit 33f14e
    no) ac_use_included_regex=yes;;
Packit 33f14e
    esac
Packit 33f14e
    ;;
Packit 33f14e
  *) AC_MSG_ERROR([Invalid value for --with-included-regex: $with_included_regex])
Packit 33f14e
    ;;
Packit 33f14e
  esac
Packit 33f14e
Packit 33f14e
  if test $ac_use_included_regex = yes; then
Packit 33f14e
    AC_DEFINE([_REGEX_INCLUDE_LIMITS_H], [1],
Packit 33f14e
      [Define if you want <regex.h> to include <limits.h>, so that it
Packit 33f14e
       consistently overrides <limits.h>'s RE_DUP_MAX.])
Packit 33f14e
    AC_DEFINE([_REGEX_LARGE_OFFSETS], [1],
Packit 33f14e
      [Define if you want regoff_t to be at least as wide POSIX requires.])
Packit 33f14e
    AC_DEFINE([re_syntax_options], [rpl_re_syntax_options],
Packit 33f14e
      [Define to rpl_re_syntax_options if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_set_syntax], [rpl_re_set_syntax],
Packit 33f14e
      [Define to rpl_re_set_syntax if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_compile_pattern], [rpl_re_compile_pattern],
Packit 33f14e
      [Define to rpl_re_compile_pattern if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_compile_fastmap], [rpl_re_compile_fastmap],
Packit 33f14e
      [Define to rpl_re_compile_fastmap if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_search], [rpl_re_search],
Packit 33f14e
      [Define to rpl_re_search if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_search_2], [rpl_re_search_2],
Packit 33f14e
      [Define to rpl_re_search_2 if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_match], [rpl_re_match],
Packit 33f14e
      [Define to rpl_re_match if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_match_2], [rpl_re_match_2],
Packit 33f14e
      [Define to rpl_re_match_2 if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_set_registers], [rpl_re_set_registers],
Packit 33f14e
      [Define to rpl_re_set_registers if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_comp], [rpl_re_comp],
Packit 33f14e
      [Define to rpl_re_comp if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([re_exec], [rpl_re_exec],
Packit 33f14e
      [Define to rpl_re_exec if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([regcomp], [rpl_regcomp],
Packit 33f14e
      [Define to rpl_regcomp if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([regexec], [rpl_regexec],
Packit 33f14e
      [Define to rpl_regexec if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([regerror], [rpl_regerror],
Packit 33f14e
      [Define to rpl_regerror if the replacement should be used.])
Packit 33f14e
    AC_DEFINE([regfree], [rpl_regfree],
Packit 33f14e
      [Define to rpl_regfree if the replacement should be used.])
Packit 33f14e
  fi
Packit 33f14e
])
Packit 33f14e
Packit 33f14e
# Prerequisites of lib/regex.c and lib/regex_internal.c.
Packit 33f14e
AC_DEFUN([gl_PREREQ_REGEX],
Packit 33f14e
[
Packit 33f14e
  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
Packit 33f14e
  AC_REQUIRE([AC_C_INLINE])
Packit 33f14e
  AC_REQUIRE([AC_C_RESTRICT])
Packit 33f14e
  AC_REQUIRE([AC_TYPE_MBSTATE_T])
Packit 33f14e
  AC_REQUIRE([gl_EEMALLOC])
Packit 33f14e
  AC_REQUIRE([gl_GLIBC21])
Packit 33f14e
  AC_CHECK_HEADERS([libintl.h])
Packit 33f14e
  AC_CHECK_FUNCS_ONCE([isblank iswctype])
Packit 33f14e
  AC_CHECK_DECLS([isblank], [], [], [[#include <ctype.h>]])
Packit 33f14e
])