Blame m4/strcasestr.m4

Packit Service c30d13
# strcasestr.m4 serial 23
Packit Service c30d13
dnl Copyright (C) 2005, 2007-2018 Free Software Foundation, Inc.
Packit Service c30d13
dnl This file is free software; the Free Software Foundation
Packit Service c30d13
dnl gives unlimited permission to copy and/or distribute it,
Packit Service c30d13
dnl with or without modifications, as long as this notice is preserved.
Packit Service c30d13
Packit Service c30d13
dnl Check that strcasestr is present and works.
Packit Service c30d13
AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE],
Packit Service c30d13
[
Packit Service c30d13
  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
Packit Service c30d13
Packit Service c30d13
  dnl Persuade glibc <string.h> to declare strcasestr().
Packit Service c30d13
  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
Packit Service c30d13
Packit Service c30d13
  AC_REQUIRE([gl_FUNC_MEMCHR])
Packit Service c30d13
  AC_CHECK_FUNCS([strcasestr])
Packit Service c30d13
  if test $ac_cv_func_strcasestr = no; then
Packit Service c30d13
    HAVE_STRCASESTR=0
Packit Service c30d13
  else
Packit Service c30d13
    if test $HAVE_MEMCHR = 0 || test $REPLACE_MEMCHR = 1; then
Packit Service c30d13
      REPLACE_STRCASESTR=1
Packit Service c30d13
    else
Packit Service c30d13
      dnl Detect https://sourceware.org/bugzilla/show_bug.cgi?id=12092.
Packit Service c30d13
      AC_CACHE_CHECK([whether strcasestr works],
Packit Service c30d13
        [gl_cv_func_strcasestr_works_always],
Packit Service c30d13
        [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
Packit Service c30d13
#include <string.h> /* for strcasestr */
Packit Service c30d13
#define P "_EF_BF_BD"
Packit Service c30d13
#define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P
Packit Service c30d13
#define NEEDLE P P P P P
Packit Service c30d13
]], [[return !!strcasestr (HAYSTACK, NEEDLE);
Packit Service c30d13
      ]])],
Packit Service c30d13
          [gl_cv_func_strcasestr_works_always=yes],
Packit Service c30d13
          [gl_cv_func_strcasestr_works_always=no],
Packit Service c30d13
          [dnl glibc 2.12 and cygwin 1.7.7 have a known bug.  uClibc is not
Packit Service c30d13
           dnl affected, since it uses different source code for strcasestr
Packit Service c30d13
           dnl than glibc.
Packit Service c30d13
           dnl Assume that it works on all other platforms, even if it is not
Packit Service c30d13
           dnl linear.
Packit Service c30d13
           AC_EGREP_CPP([Lucky user],
Packit Service c30d13
             [
Packit Service c30d13
#ifdef __GNU_LIBRARY__
Packit Service c30d13
 #include <features.h>
Packit Service c30d13
 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \
Packit Service c30d13
     || defined __UCLIBC__
Packit Service c30d13
  Lucky user
Packit Service c30d13
 #endif
Packit Service c30d13
#elif defined __CYGWIN__
Packit Service c30d13
 #include <cygwin/version.h>
Packit Service c30d13
 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7)
Packit Service c30d13
  Lucky user
Packit Service c30d13
 #endif
Packit Service c30d13
#else
Packit Service c30d13
  Lucky user
Packit Service c30d13
#endif
Packit Service c30d13
             ],
Packit Service c30d13
             [gl_cv_func_strcasestr_works_always="guessing yes"],
Packit Service c30d13
             [gl_cv_func_strcasestr_works_always="guessing no"])
Packit Service c30d13
          ])
Packit Service c30d13
        ])
Packit Service c30d13
      case "$gl_cv_func_strcasestr_works_always" in
Packit Service c30d13
        *yes) ;;
Packit Service c30d13
        *)
Packit Service c30d13
          REPLACE_STRCASESTR=1
Packit Service c30d13
          ;;
Packit Service c30d13
      esac
Packit Service c30d13
    fi
Packit Service c30d13
  fi
Packit Service c30d13
]) # gl_FUNC_STRCASESTR_SIMPLE
Packit Service c30d13
Packit Service c30d13
dnl Additionally, check that strcasestr is efficient.
Packit Service c30d13
AC_DEFUN([gl_FUNC_STRCASESTR],
Packit Service c30d13
[
Packit Service c30d13
  AC_REQUIRE([gl_FUNC_STRCASESTR_SIMPLE])
Packit Service c30d13
  if test $HAVE_STRCASESTR = 1 && test $REPLACE_STRCASESTR = 0; then
Packit Service c30d13
    AC_CACHE_CHECK([whether strcasestr works in linear time],
Packit Service c30d13
      [gl_cv_func_strcasestr_linear],
Packit Service c30d13
      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
Packit Service c30d13
#include <signal.h> /* for signal */
Packit Service c30d13
#include <string.h> /* for strcasestr */
Packit Service c30d13
#include <stdlib.h> /* for malloc */
Packit Service c30d13
#include <unistd.h> /* for alarm */
Packit Service c30d13
static void quit (int sig) { _exit (sig + 128); }
Packit Service c30d13
]], [[
Packit Service c30d13
    int result = 0;
Packit Service c30d13
    size_t m = 1000000;
Packit Service c30d13
    char *haystack = (char *) malloc (2 * m + 2);
Packit Service c30d13
    char *needle = (char *) malloc (m + 2);
Packit Service c30d13
    /* Failure to compile this test due to missing alarm is okay,
Packit Service c30d13
       since all such platforms (mingw) also lack strcasestr.  */
Packit Service c30d13
    signal (SIGALRM, quit);
Packit Service c30d13
    alarm (5);
Packit Service c30d13
    /* Check for quadratic performance.  */
Packit Service c30d13
    if (haystack && needle)
Packit Service c30d13
      {
Packit Service c30d13
        memset (haystack, 'A', 2 * m);
Packit Service c30d13
        haystack[2 * m] = 'B';
Packit Service c30d13
        haystack[2 * m + 1] = 0;
Packit Service c30d13
        memset (needle, 'A', m);
Packit Service c30d13
        needle[m] = 'B';
Packit Service c30d13
        needle[m + 1] = 0;
Packit Service c30d13
        if (!strcasestr (haystack, needle))
Packit Service c30d13
          result |= 1;
Packit Service c30d13
      }
Packit Service c30d13
    /* Free allocated memory, in case some sanitizer is watching.  */
Packit Service c30d13
    free (haystack);
Packit Service c30d13
    free (needle);
Packit Service c30d13
    return result;
Packit Service c30d13
    ]])],
Packit Service c30d13
        [gl_cv_func_strcasestr_linear=yes], [gl_cv_func_strcasestr_linear=no],
Packit Service c30d13
        [dnl Only glibc > 2.12 and cygwin > 1.7.7 are known to have a
Packit Service c30d13
         dnl strcasestr that works in linear time.
Packit Service c30d13
         AC_EGREP_CPP([Lucky user],
Packit Service c30d13
           [
Packit Service c30d13
#include <features.h>
Packit Service c30d13
#ifdef __GNU_LIBRARY__
Packit Service c30d13
 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \
Packit Service c30d13
     && !defined __UCLIBC__
Packit Service c30d13
  Lucky user
Packit Service c30d13
 #endif
Packit Service c30d13
#endif
Packit Service c30d13
#ifdef __CYGWIN__
Packit Service c30d13
 #include <cygwin/version.h>
Packit Service c30d13
 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7)
Packit Service c30d13
  Lucky user
Packit Service c30d13
 #endif
Packit Service c30d13
#endif
Packit Service c30d13
           ],
Packit Service c30d13
           [gl_cv_func_strcasestr_linear="guessing yes"],
Packit Service c30d13
           [gl_cv_func_strcasestr_linear="guessing no"])
Packit Service c30d13
        ])
Packit Service c30d13
      ])
Packit Service c30d13
    case "$gl_cv_func_strcasestr_linear" in
Packit Service c30d13
      *yes) ;;
Packit Service c30d13
      *)
Packit Service c30d13
        REPLACE_STRCASESTR=1
Packit Service c30d13
        ;;
Packit Service c30d13
    esac
Packit Service c30d13
  fi
Packit Service c30d13
]) # gl_FUNC_STRCASESTR
Packit Service c30d13
Packit Service c30d13
# Prerequisites of lib/strcasestr.c.
Packit Service c30d13
AC_DEFUN([gl_PREREQ_STRCASESTR], [
Packit Service c30d13
  :
Packit Service c30d13
])