strstr, strcasestr: replace on platforms with broken memchr
authorEric Blake <ebb9@byu.net>
Tue, 16 Jun 2009 12:14:05 +0000 (06:14 -0600)
committerEric Blake <ebb9@byu.net>
Wed, 17 Jun 2009 13:24:16 +0000 (07:24 -0600)
* modules/strstr: Split into...
* modules/strstr-simple: ...new module that does not care about
performance, but does care about glibc bug.
* m4/strstr.m4 (gl_FUNC_STRSTR): Split...
(gl_FUNC_STRSTR_SIMPLE): ...into new macro, which replaces strstr
if platform memchr is broken, per Debian bug 521737.
* m4/strcasestr.m4 (gl_FUNC_STRCASESTR_SIMPLE): React to broken
memchr.
* m4/memchr.m4 (gl_FUNC_MEMCHR): Only expand once.
* doc/posix-functions/strstr.texi (strstr): Document the fix.
* doc/glibc-functions/strcasestr.texi (strcasestr): Likewise.
* modules/mountlist (Depends-on): Add strstr-simple.
* modules/gen-uni-tables (Depends-on): Likewise.
* modules/argz (Depends-on): Add strstr.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
doc/glibc-functions/strcasestr.texi
doc/posix-functions/strstr.texi
m4/memchr.m4
m4/strcasestr.m4
m4/strstr.m4
modules/argz
modules/gen-uni-tables
modules/mountlist
modules/strstr
modules/strstr-simple [new file with mode: 0644]

index dc85105..f5c0497 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2009-06-17  Eric Blake  <ebb9@byu.net>
+
+       strstr, strcasestr: replace on platforms with broken memchr
+       * modules/strstr: Split into...
+       * modules/strstr-simple: ...new module that does not care about
+       performance, but does care about glibc bug.
+       * m4/strstr.m4 (gl_FUNC_STRSTR): Split...
+       (gl_FUNC_STRSTR_SIMPLE): ...into new macro, which replaces strstr
+       if platform memchr is broken, per Debian bug 521737.
+       * m4/strcasestr.m4 (gl_FUNC_STRCASESTR_SIMPLE): React to broken
+       memchr.
+       * m4/memchr.m4 (gl_FUNC_MEMCHR): Only expand once.
+       * doc/posix-functions/strstr.texi (strstr): Document the fix.
+       * doc/glibc-functions/strcasestr.texi (strcasestr): Likewise.
+       * modules/mountlist (Depends-on): Add strstr-simple.
+       * modules/gen-uni-tables (Depends-on): Likewise.
+       * modules/argz (Depends-on): Add strstr.
+
 2009-06-17  Bruno Haible  <bruno@clisp.org>
 
        * modules/posix_spawn-internal (Depends-on): Add errno.
 2009-06-17  Bruno Haible  <bruno@clisp.org>
 
        * modules/posix_spawn-internal (Depends-on): Add errno.
index feb5104..7ce39f4 100644 (file)
@@ -9,7 +9,12 @@ or @code{strcasestr}:
 @itemize
 @item
 This function is missing on some platforms:
 @itemize
 @item
 This function is missing on some platforms:
-AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, BeOS.
+AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x,
+mingw, BeOS.
+
+@item
+This function can trigger memchr bugs on some platforms:
+glibc 2.10.
 @end itemize
 
 Portability problems fixed by Gnulib module @code{strcasestr}:
 @end itemize
 
 Portability problems fixed by Gnulib module @code{strcasestr}:
index ffd2ad7..f92ba1b 100644 (file)
@@ -4,14 +4,23 @@
 
 POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strstr.html}
 
 
 POSIX specification: @url{http://www.opengroup.org/onlinepubs/9699919799/functions/strstr.html}
 
-Gnulib module: strstr
+Gnulib module: strstr or strstr-simple
 
 
-Portability problems fixed by Gnulib:
+Portability problems fixed by either Gnulib module @code{strstr-simple}
+or @code{strstr}:
+@itemize
+@item
+This function can trigger memchr bugs on some platforms:
+glibc 2.10.
+@end itemize
+
+Portability problems fixed by Gnulib @code{strstr}:
 @itemize
 @item
 This function has quadratic instead of linear worst-case complexity on some
 platforms:
 @itemize
 @item
 This function has quadratic instead of linear worst-case complexity on some
 platforms:
-glibc 2.8, MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
+glibc 2.8, MacOS X 10.3, FreeBSD 6.2, NetBSD 3.0, OpenBSD 4.0, AIX
+5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw.
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @end itemize
 
 Portability problems not fixed by Gnulib:
index 0f899d2..1194bac 100644 (file)
@@ -1,10 +1,10 @@
-# memchr.m4 serial 6
+# memchr.m4 serial 7
 dnl Copyright (C) 2002, 2003, 2004, 2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Copyright (C) 2002, 2003, 2004, 2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-AC_DEFUN([gl_FUNC_MEMCHR],
+AC_DEFUN_ONCE([gl_FUNC_MEMCHR],
 [
   dnl Check for prerequisites for memory fence checks.
   gl_FUNC_MMAP_ANON
 [
   dnl Check for prerequisites for memory fence checks.
   gl_FUNC_MMAP_ANON
index e1e5390..d641958 100644 (file)
@@ -1,20 +1,25 @@
-# strcasestr.m4 serial 12
-dnl Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc.
+# strcasestr.m4 serial 13
+dnl Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-dnl Check that strcasestr is present.
+dnl Check that strcasestr is present and works.
 AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE],
 [
   dnl Persuade glibc <string.h> to declare strcasestr().
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
 
   AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
 AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE],
 [
   dnl Persuade glibc <string.h> to declare strcasestr().
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
 
   AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_FUNC_MEMCHR])
   AC_REPLACE_FUNCS([strcasestr])
   if test $ac_cv_func_strcasestr = no; then
     HAVE_STRCASESTR=0
     gl_PREREQ_STRCASESTR
   AC_REPLACE_FUNCS([strcasestr])
   if test $ac_cv_func_strcasestr = no; then
     HAVE_STRCASESTR=0
     gl_PREREQ_STRCASESTR
+  elif test "$gl_cv_func_memchr_works" != yes; then
+    REPLACE_STRCASESTR=1
+    AC_LIBOBJ([strcasestr])
+    gl_PREREQ_STRCASESTR
   fi
 ]) # gl_FUNC_STRCASESTR_SIMPLE
 
   fi
 ]) # gl_FUNC_STRCASESTR_SIMPLE
 
index f48bebb..c8beb9c 100644 (file)
@@ -1,13 +1,24 @@
-# strstr.m4 serial 5
-dnl Copyright (C) 2008 Free Software Foundation, Inc.
+# strstr.m4 serial 6
+dnl Copyright (C) 2008, 2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
-dnl Check that strstr is efficient.
-AC_DEFUN([gl_FUNC_STRSTR],
+dnl Check that strstr works.
+AC_DEFUN([gl_FUNC_STRSTR_SIMPLE],
 [
   AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
 [
   AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_FUNC_MEMCHR])
+  if test "$gl_cv_func_memchr_works" != yes; then
+    REPLACE_STRSTR=1
+    AC_LIBOBJ([strstr])
+  fi
+]) # gl_FUNC_STRSTR_SIMPLE
+
+dnl Additionally, check that strstr is efficient.
+AC_DEFUN([gl_FUNC_STRSTR],
+[
+  AC_REQUIRE([gl_FUNC_STRSTR_SIMPLE])
   AC_CACHE_CHECK([whether strstr works in linear time],
     [gl_cv_func_strstr_linear],
     [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
   AC_CACHE_CHECK([whether strstr works in linear time],
     [gl_cv_func_strstr_linear],
     [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
index 8217ff8..7ef73d5 100644 (file)
@@ -12,6 +12,7 @@ mempcpy
 stpcpy
 strndup
 strnlen
 stpcpy
 strndup
 strnlen
+strstr
 
 configure.ac:
 gl_FUNC_ARGZ
 
 configure.ac:
 gl_FUNC_ARGZ
index fd2735a..115853a 100644 (file)
@@ -10,6 +10,7 @@ lib/unictype/3levelbit.h
 Depends-on:
 memcmp
 strdup
 Depends-on:
 memcmp
 strdup
+strstr-simple
 
 configure.ac:
 
 
 configure.ac:
 
index 526022c..65af9c1 100644 (file)
@@ -11,6 +11,7 @@ m4/mountlist.m4
 Depends-on:
 stdbool
 stdint
 Depends-on:
 stdbool
 stdint
+strstr-simple
 xalloc
 
 configure.ac:
 xalloc
 
 configure.ac:
index 251b2d7..dc33bd2 100644 (file)
@@ -2,19 +2,12 @@ Description:
 strstr() function: efficiently locate first substring in a buffer.
 
 Files:
 strstr() function: efficiently locate first substring in a buffer.
 
 Files:
-lib/str-two-way.h
-lib/strstr.c
-m4/strstr.m4
 
 Depends-on:
 
 Depends-on:
-string
-stdbool
-memchr
-memcmp
+strstr-simple
 
 configure.ac:
 gl_FUNC_STRSTR
 
 configure.ac:
 gl_FUNC_STRSTR
-gl_STRING_MODULE_INDICATOR([strstr])
 
 Makefile.am:
 
 
 Makefile.am:
 
diff --git a/modules/strstr-simple b/modules/strstr-simple
new file mode 100644 (file)
index 0000000..9ebf5da
--- /dev/null
@@ -0,0 +1,28 @@
+Description:
+strstr() function: locate first substring in a buffer.
+
+Files:
+lib/str-two-way.h
+lib/strstr.c
+m4/strstr.m4
+
+Depends-on:
+string
+stdbool
+memchr
+memcmp
+
+configure.ac:
+gl_FUNC_STRSTR_SIMPLE
+gl_STRING_MODULE_INDICATOR([strstr])
+
+Makefile.am:
+
+Include:
+<string.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+all, Eric Blake