Blame gl/m4/regex.m4

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