On Mon, Mar 27, 2023 at 8:00 PM Xi Ruoyao via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> memmem is not POSIX so the system may lack it.  Then libiberty will
> provide an implementation, but it's a "supplemental function" and not
> declared in libiberty.h.  We need to declare the prototype to use it
> then.

Was there a reason to use memmem over strstr in the first place?  Otherwise
looks reasonable.

Richard.

> See libiberty doc at
> https://gcc.gnu.org/onlinedocs/libiberty/Supplemental-Functions.html.
>
> Tested by bootstrapping GCC in the following container environments on
> x86_64-linux-gnu:
>
> 1. "Vanilla" system with memmem in Glibc.
> 2. memmem removed from string.h.
> 3. memmem removed from both string.h and libc.so.
>
> For 3, also verified that memmem from libiberty is linked into fixincl
> executable.
>
> Ok for trunk?
>
> fixincludes/ChangeLog:
>
>         PR other/109293
>         * configure.ac (AC_CHECK_DECLS): Add memmem.
>         * configure: Regenerate.
>         * config.h.in: Regenerate.
>         * system.h (memmem): Declare if HAVE_DECL_MEMMEM is zero.
> ---
>  fixincludes/config.h.in  |  4 ++++
>  fixincludes/configure    | 10 ++++++++++
>  fixincludes/configure.ac |  2 +-
>  fixincludes/system.h     |  4 ++++
>  4 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/fixincludes/config.h.in b/fixincludes/config.h.in
> index 69a67f5f116..0fd21b721b9 100644
> --- a/fixincludes/config.h.in
> +++ b/fixincludes/config.h.in
> @@ -78,6 +78,10 @@
>     don't. */
>  #undef HAVE_DECL_GETC_UNLOCKED
>
> +/* Define to 1 if you have the declaration of `memmem', and to 0 if you 
> don't.
> +   */
> +#undef HAVE_DECL_MEMMEM
> +
>  /* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if
>     you don't. */
>  #undef HAVE_DECL_PUTCHAR_UNLOCKED
> diff --git a/fixincludes/configure b/fixincludes/configure
> index b3bca666a4d..bdcc41f6ddc 100755
> --- a/fixincludes/configure
> +++ b/fixincludes/configure
> @@ -5043,6 +5043,16 @@ fi
>  cat >>confdefs.h <<_ACEOF
>  #define HAVE_DECL_VASPRINTF $ac_have_decl
>  _ACEOF
> +ac_fn_c_check_decl "$LINENO" "memmem" "ac_cv_have_decl_memmem" 
> "$ac_includes_default"
> +if test "x$ac_cv_have_decl_memmem" = xyes; then :
> +  ac_have_decl=1
> +else
> +  ac_have_decl=0
> +fi
> +
> +cat >>confdefs.h <<_ACEOF
> +#define HAVE_DECL_MEMMEM $ac_have_decl
> +_ACEOF
>
>  ac_fn_c_check_decl "$LINENO" "clearerr_unlocked" 
> "ac_cv_have_decl_clearerr_unlocked" "$ac_includes_default"
>  if test "x$ac_cv_have_decl_clearerr_unlocked" = xyes; then :
> diff --git a/fixincludes/configure.ac b/fixincludes/configure.ac
> index 14813b910f1..ef2227e3c93 100644
> --- a/fixincludes/configure.ac
> +++ b/fixincludes/configure.ac
> @@ -88,7 +88,7 @@ define(fixincludes_UNLOCKED_FUNCS, clearerr_unlocked 
> feof_unlocked dnl
>    fread_unlocked fwrite_unlocked getchar_unlocked getc_unlocked dnl
>    putchar_unlocked putc_unlocked)
>  AC_CHECK_FUNCS(fixincludes_UNLOCKED_FUNCS)
> -AC_CHECK_DECLS([abort, asprintf, basename(char *), errno, vasprintf])
> +AC_CHECK_DECLS([abort, asprintf, basename(char *), errno, vasprintf, memmem])
>  AC_CHECK_DECLS(m4_split(m4_normalize(fixincludes_UNLOCKED_FUNCS)))
>
>  # Checks for typedefs, structures, and compiler characteristics.
> diff --git a/fixincludes/system.h b/fixincludes/system.h
> index dca5d57b2e3..687fb2e2025 100644
> --- a/fixincludes/system.h
> +++ b/fixincludes/system.h
> @@ -209,6 +209,10 @@ extern int errno;
>  extern void abort (void);
>  #endif
>
> +#if defined (HAVE_DECL_MEMMEM) && !HAVE_DECL_MEMMEM
> +extern void *memmem (const void *, size_t, const void *, size_t);
> +#endif
> +
>  #if HAVE_SYS_STAT_H
>  # include <sys/stat.h>
>  #endif
> --
> 2.40.0
>

Reply via email to