1# strstr.m4 serial 16 2dnl Copyright (C) 2008-2014 Free Software Foundation, Inc. 3dnl This file is free software; the Free Software Foundation 4dnl gives unlimited permission to copy and/or distribute it, 5dnl with or without modifications, as long as this notice is preserved. 6 7dnl Check that strstr works. 8AC_DEFUN([gl_FUNC_STRSTR_SIMPLE], 9[ 10 AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) 11 AC_REQUIRE([gl_FUNC_MEMCHR]) 12 if test "$gl_cv_func_memchr_works" != yes; then 13 REPLACE_STRSTR=1 14 else 15 dnl Detect http://sourceware.org/bugzilla/show_bug.cgi?id=12092. 16 AC_CACHE_CHECK([whether strstr works], 17 [gl_cv_func_strstr_works_always], 18 [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ 19#include <string.h> /* for strstr */ 20#define P "_EF_BF_BD" 21#define HAYSTACK "F_BD_CE_BD" P P P P "_C3_88_20" P P P "_C3_A7_20" P 22#define NEEDLE P P P P P 23]], [[return !!strstr (HAYSTACK, NEEDLE); 24 ]])], 25 [gl_cv_func_strstr_works_always=yes], 26 [gl_cv_func_strstr_works_always=no], 27 [dnl glibc 2.12 and cygwin 1.7.7 have a known bug. uClibc is not 28 dnl affected, since it uses different source code for strstr than 29 dnl glibc. 30 dnl Assume that it works on all other platforms, even if it is not 31 dnl linear. 32 AC_EGREP_CPP([Lucky user], 33 [ 34#ifdef __GNU_LIBRARY__ 35 #include <features.h> 36 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \ 37 || defined __UCLIBC__ 38 Lucky user 39 #endif 40#elif defined __CYGWIN__ 41 #include <cygwin/version.h> 42 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) 43 Lucky user 44 #endif 45#else 46 Lucky user 47#endif 48 ], 49 [gl_cv_func_strstr_works_always="guessing yes"], 50 [gl_cv_func_strstr_works_always="guessing no"]) 51 ]) 52 ]) 53 case "$gl_cv_func_strstr_works_always" in 54 *yes) ;; 55 *) 56 REPLACE_STRSTR=1 57 ;; 58 esac 59 fi 60]) # gl_FUNC_STRSTR_SIMPLE 61 62dnl Additionally, check that strstr is efficient. 63AC_DEFUN([gl_FUNC_STRSTR], 64[ 65 AC_REQUIRE([gl_FUNC_STRSTR_SIMPLE]) 66 if test $REPLACE_STRSTR = 0; then 67 AC_CACHE_CHECK([whether strstr works in linear time], 68 [gl_cv_func_strstr_linear], 69 [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ 70#include <signal.h> /* for signal */ 71#include <string.h> /* for strstr */ 72#include <stdlib.h> /* for malloc */ 73#include <unistd.h> /* for alarm */ 74static void quit (int sig) { exit (sig + 128); } 75]], [[ 76 int result = 0; 77 size_t m = 1000000; 78 char *haystack = (char *) malloc (2 * m + 2); 79 char *needle = (char *) malloc (m + 2); 80 /* Failure to compile this test due to missing alarm is okay, 81 since all such platforms (mingw) also have quadratic strstr. */ 82 signal (SIGALRM, quit); 83 alarm (5); 84 /* Check for quadratic performance. */ 85 if (haystack && needle) 86 { 87 memset (haystack, 'A', 2 * m); 88 haystack[2 * m] = 'B'; 89 haystack[2 * m + 1] = 0; 90 memset (needle, 'A', m); 91 needle[m] = 'B'; 92 needle[m + 1] = 0; 93 if (!strstr (haystack, needle)) 94 result |= 1; 95 } 96 return result; 97 ]])], 98 [gl_cv_func_strstr_linear=yes], [gl_cv_func_strstr_linear=no], 99 [dnl Only glibc > 2.12 on processors without SSE 4.2 instructions and 100 dnl cygwin > 1.7.7 are known to have a bug-free strstr that works in 101 dnl linear time. 102 AC_EGREP_CPP([Lucky user], 103 [ 104#include <features.h> 105#ifdef __GNU_LIBRARY__ 106 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ > 12) || (__GLIBC__ > 2)) \ 107 && !(defined __i386__ || defined __x86_64__) \ 108 && !defined __UCLIBC__ 109 Lucky user 110 #endif 111#endif 112#ifdef __CYGWIN__ 113 #include <cygwin/version.h> 114 #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 7) 115 Lucky user 116 #endif 117#endif 118 ], 119 [gl_cv_func_strstr_linear="guessing yes"], 120 [gl_cv_func_strstr_linear="guessing no"]) 121 ]) 122 ]) 123 case "$gl_cv_func_strstr_linear" in 124 *yes) ;; 125 *) 126 REPLACE_STRSTR=1 127 ;; 128 esac 129 fi 130]) # gl_FUNC_STRSTR 131