diff --git a/configure.in b/configure.in index a0dd303..4c55e2a 100644 --- a/configure.in +++ b/configure.in @@ -1432,7 +1432,7 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge setuid setgid daemon select_large_fdset setenv unsetenv\ mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\ pread sendfile shutdown sigaltstack dl_iterate_phdr\ - dup3 pipe2 posix_memalign memalign) + dup3 pipe2 posix_memalign memalign memmem) AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value, [AC_TRY_COMPILE([ @@ -2733,6 +2733,40 @@ if test "${universal_binary-no}" = yes ; then ])]) fi +AC_CACHE_CHECK(for broken memmem, rb_cv_broken_memmem, + [AC_TRY_RUN([ +#include + +int +main() +{ + char *str = "hogefugafoobar"; + char *rs = "foo"; + char *empty = ""; + char *p; + + p = memmem(str, strlen(str), rs, strlen(rs)); + if (p == str+8) { + p = memmem(str, strlen(str), empty, strlen(empty)); + if (p == str) + return 0; + else + return 1; + } + else { + return 1; + } +} + ], + rb_cv_broken_memmem=no, + rb_cv_broken_memmem=yes, + rb_cv_broken_memmem=yes) +]) + +if test "$rb_cv_broken_memmem" = yes; then + AC_DEFINE(BROKEN_MEMMEM, 1) +fi + CPPFLAGS="$CPPFLAGS "'$(DEFS)' test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}' if test -n "${cflags+set}"; then diff --git a/re.c b/re.c index 590e9b0..fb3f84d 100644 --- a/re.c +++ b/re.c @@ -228,7 +228,16 @@ rb_memsearch(const void *x0, long m, const void *y0, long n, rb_encoding *enc) return -1; } else if (m <= SIZEOF_VALUE) { +#if defined(HAVE_MEMMEM) && !defined(BROKEN_MEMMEM) + const unsigned char *ys; + + if (ys = memmem(y, n, x, m)) + return ys - y; + else + return -1; +#else return rb_memsearch_ss(x0, m, y0, n); +#endif } else if (enc == rb_utf8_encoding()){ return rb_memsearch_qs_utf8(x0, m, y0, n);