From 01bffc033dfef548b6edc50ae134175cbc5dc652 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 1 Feb 2007 00:29:52 +0000 Subject: [PATCH] Enforce the use of gnulib modules for unportable functions. --- ChangeLog | 27 ++++++++++++- lib/string_.h | 114 +++++++++++++++++++++++++++++++++++++++++------------ modules/memmem | 1 + modules/mempcpy | 1 + modules/memrchr | 1 + modules/stpcpy | 1 + modules/stpncpy | 1 + modules/strcase | 1 + modules/strcasestr | 1 + modules/strchrnul | 1 + modules/strdup | 1 + modules/string | 16 ++++++++ modules/strndup | 1 + modules/strnlen | 1 + modules/strpbrk | 1 + modules/strsep | 1 + modules/strstr | 1 + modules/strtok_r | 1 + 18 files changed, 146 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index a3096ce7f..ab851dcbe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,29 @@ -2007-01-31 Jean-Louis Martineau (tiny change) +2007-01-27 Bruno Haible + + Enforce the use of gnulib modules for unportable functions. + * m4/string_h.m4 (gl_STRING_MODULE_INDICATOR): New macro. + (gl_STRING_MODULE_INDICATOR_DEFAULTS): New macro. + (gl_HEADER_STRING_H_BODY): Require it. + * lib/string_.h: If the gnulib module XYZ is not present, redefine + the symbol XYZ to one that gives a link error. + * modules/string (Makefile.am): Also substitute the GNULIB_* variables. + * modules/memmem (configure.ac): Invoke gl_STRING_MODULE_INDICATOR. + * modules/mempcpy (configure.ac): Likewise. + * modules/memrchr (configure.ac): Likewise. + * modules/stpcpy (configure.ac): Likewise. + * modules/stpncpy (configure.ac): Likewise. + * modules/strcase (configure.ac): Likewise. + * modules/strcasestr (configure.ac): Likewise. + * modules/strchrnul (configure.ac): Likewise. + * modules/strdup (configure.ac): Likewise. + * modules/strndup (configure.ac): Likewise. + * modules/strnlen (configure.ac): Likewise. + * modules/strpbrk (configure.ac): Likewise. + * modules/strsep (configure.ac): Likewise. + * modules/strstr (configure.ac): Likewise. + * modules/strtok_r (configure.ac): Likewise. + +2007-01-31 Jean-Louis Martineau (tiny change) * lib/gai_strerror.c (values): Add EAI_OVERFLOW. diff --git a/lib/string_.h b/lib/string_.h index 94d991cf0..86701d419 100644 --- a/lib/string_.h +++ b/lib/string_.h @@ -26,34 +26,54 @@ extern "C" { #endif /* Return the first occurrence of NEEDLE in HAYSTACK. */ -#if ! @HAVE_DECL_MEMMEM@ +#if @GNULIB_MEMMEM@ +# if ! @HAVE_DECL_MEMMEM@ extern void *memmem (void const *__haystack, size_t __haystack_len, void const *__needle, size_t __needle_len); +# endif +#else +# define memmem memmem_is_unportable__use_gnulib_module_memmem_for_portability #endif /* Copy N bytes of SRC to DEST, return pointer to bytes after the last written byte. */ -#if ! @HAVE_MEMPCPY@ +#if @GNULIB_MEMPCPY@ +# if ! @HAVE_MEMPCPY@ extern void *mempcpy (void *restrict __dest, void const *restrict __src, size_t __n); +# endif +#else +# define mempcpy mempcpy_is_unportable__use_gnulib_module_mempcpy_for_portability #endif /* Search backwards through a block for a byte (specified as an int). */ -#if ! @HAVE_DECL_MEMRCHR@ +#if @GNULIB_MEMRCHR@ +# if ! @HAVE_DECL_MEMRCHR@ extern void *memrchr (void const *, int, size_t); +# endif +#else +# define memrchr memrchr_is_unportable__use_gnulib_module_memrchr_for_portability #endif /* Copy SRC to DST, returning the address of the terminating '\0' in DST. */ -#if ! @HAVE_STPCPY@ +#if @GNULIB_STPCPY@ +# if ! @HAVE_STPCPY@ extern char *stpcpy (char *restrict __dst, char const *restrict __src); +# endif +#else +# define stpcpy stpcpy_is_unportable__use_gnulib_module_stpcpy_for_portability #endif /* Copy no more than N bytes of SRC to DST, returning a pointer past the last non-NUL byte written into DST. */ -#if ! @HAVE_STPNCPY@ -# define stpncpy gnu_stpncpy +#if @GNULIB_STPNCPY@ +# if ! @HAVE_STPNCPY@ +# define stpncpy gnu_stpncpy extern char *stpncpy (char *restrict __dst, char const *restrict __src, size_t __n); +# endif +#else +# define stpncpy stpncpy_is_unportable__use_gnulib_module_stpncpy_for_portability #endif /* Compare strings S1 and S2, ignoring case, returning less than, equal to or @@ -64,48 +84,76 @@ extern char *stpncpy (char *restrict __dst, char const *restrict __src, No known system has a strcasecmp() function that works correctly in multibyte locales. Therefore use our version always, if the strcase module is available. */ -#if @REPLACE_STRCASECMP@ -# define strcasecmp rpl_strcasecmp +#if @GNULIB_STRCASE@ +# if @REPLACE_STRCASECMP@ +# define strcasecmp rpl_strcasecmp extern int strcasecmp (char const *__s1, char const *__s2); +# endif +#else +# define strcasecmp strcasecmp_is_unportable__use_gnulib_module_strcase_for_portability #endif /* Compare no more than N bytes of strings S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexicographically less than, equal to or greater than S2. Note: This function cannot work correctly in multibyte locales. */ -#if ! @HAVE_DECL_STRNCASECMP@ +#if @GNULIB_STRCASE@ +# if ! @HAVE_DECL_STRNCASECMP@ extern int strncasecmp (char const *__s1, char const *__s2, size_t __n); +# endif +#else +# define strncasecmp strncasecmp_is_unportable__use_gnulib_module_strcase_for_portability #endif /* Find the first occurrence of C in S or the final NUL byte. */ -#if ! @HAVE_STRCHRNUL@ +#if @GNULIB_STRCHRNUL@ +# if ! @HAVE_STRCHRNUL@ extern char *strchrnul (char const *__s, int __c_in); +# endif +#else +# define strchrnul strchrnul_is_unportable__use_gnulib_module_strchrnul_for_portability #endif /* Duplicate S, returning an identical malloc'd string. */ -#if ! @HAVE_DECL_STRDUP@ && ! defined strdup +#if @GNULIB_STRDUP@ +# if ! @HAVE_DECL_STRDUP@ && ! defined strdup extern char *strdup (char const *__s); +# endif +#else +# define strdup strdup_is_unportable__use_gnulib_module_strdup_for_portability #endif /* Return a newly allocated copy of at most N bytes of STRING. */ -#if ! @HAVE_STRNDUP@ -# undef strndup -# define strndup rpl_strndup -# if ! @HAVE_DECL_STRNDUP@ +#if @GNULIB_STRNDUP@ +# if ! @HAVE_STRNDUP@ +# undef strndup +# define strndup rpl_strndup +# if ! @HAVE_DECL_STRNDUP@ extern char *strndup (char const *__string, size_t __n); +# endif # endif +#else +# define strndup strndup_is_unportable__use_gnulib_module_strndup_for_portability #endif /* Find the length (number of bytes) of STRING, but scan at most MAXLEN bytes. If no '\0' terminator is found in that many bytes, return MAXLEN. */ -#if ! @HAVE_DECL_STRNLEN@ +#if @GNULIB_STRNLEN@ +# if ! @HAVE_DECL_STRNLEN@ extern size_t strnlen (char const *__string, size_t __maxlen); +# endif +#else +# define strnlen strnlen_is_unportable__use_gnulib_module_strnlen_for_portability #endif /* Find the first occurrence in S of any character in ACCEPT. */ -#if ! @HAVE_STRPBRK@ +#if @GNULIB_STRPBRK@ +# if ! @HAVE_STRPBRK@ extern char *strpbrk (char const *__s, char const *__accept); +# endif +#else +# define strpbrk strpbrk_is_unportable__use_gnulib_module_strpbrk_for_portability #endif /* Search the next delimiter (char listed in DELIM) starting at *STRINGP. @@ -124,28 +172,40 @@ extern char *strpbrk (char const *__s, char const *__accept); characters are ASCII characters < 0x30. See also strtok_r(). */ -#if ! @HAVE_STRSEP@ +#if @GNULIB_STRSEP@ +# if ! @HAVE_STRSEP@ extern char *strsep (char **restrict __stringp, char const *restrict __delim); +# endif +#else +# define strsep strsep_is_unportable__use_gnulib_module_strsep_for_portability #endif /* Find the first occurrence of NEEDLE in HAYSTACK. No known system has a strstr() function that works correctly in multibyte locales. Therefore use our version always, if the strstr module is available. */ -#if @REPLACE_STRSTR@ -# undef strstr -# define strstr rpl_strstr +#if @GNULIB_STRSTR@ +# if @REPLACE_STRSTR@ +# undef strstr +# define strstr rpl_strstr extern char *strstr (char const *__haystack, char const *__needle); +# endif +#else +# define strstr strstr_is_unportable__use_gnulib_module_strstr_for_portability #endif /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive comparison. Note: This function may, in multibyte locales, return success even if strlen (haystack) < strlen (needle) ! */ -#if @REPLACE_STRCASESTR@ -# undef strcasestr -# define strcasestr rpl_strcasestr +#if @GNULIB_STRCASESTR@ +# if @REPLACE_STRCASESTR@ +# undef strcasestr +# define strcasestr rpl_strcasestr extern char *strcasestr (const char *haystack, const char *needle); +# endif +#else +# define strcasestr strcasestr_is_unportable__use_gnulib_module_strcasestr_for_portability #endif /* Parse S into tokens separated by characters in DELIM. @@ -170,9 +230,13 @@ extern char *strcasestr (const char *haystack, const char *needle); characters are ASCII characters < 0x30. See also strsep(). */ -#if ! @HAVE_DECL_STRTOK_R@ +#if @GNULIB_STRTOK_R@ +# if ! @HAVE_DECL_STRTOK_R@ extern char *strtok_r (char *restrict __s, char const *restrict __sep, char **restrict __lasts); +# endif +#else +# define strtok_r strtok_r_is_unportable__use_gnulib_module_strtok_r_for_portability #endif #ifdef __cplusplus diff --git a/modules/memmem b/modules/memmem index 2e8b29838..4586391ea 100644 --- a/modules/memmem +++ b/modules/memmem @@ -10,6 +10,7 @@ string configure.ac: gl_FUNC_MEMMEM +gl_STRING_MODULE_INDICATOR([memmem]) Makefile.am: diff --git a/modules/mempcpy b/modules/mempcpy index fc093deb3..a49c40ad2 100644 --- a/modules/mempcpy +++ b/modules/mempcpy @@ -10,6 +10,7 @@ string configure.ac: gl_FUNC_MEMPCPY +gl_STRING_MODULE_INDICATOR([mempcpy]) Makefile.am: diff --git a/modules/memrchr b/modules/memrchr index 039b1325d..54912ccb0 100644 --- a/modules/memrchr +++ b/modules/memrchr @@ -10,6 +10,7 @@ string configure.ac: gl_FUNC_MEMRCHR +gl_STRING_MODULE_INDICATOR([memrchr]) Makefile.am: diff --git a/modules/stpcpy b/modules/stpcpy index d30c1cf6f..de70b1029 100644 --- a/modules/stpcpy +++ b/modules/stpcpy @@ -10,6 +10,7 @@ string configure.ac: gl_FUNC_STPCPY +gl_STRING_MODULE_INDICATOR([stpcpy]) Makefile.am: diff --git a/modules/stpncpy b/modules/stpncpy index 87847103d..6453c8094 100644 --- a/modules/stpncpy +++ b/modules/stpncpy @@ -10,6 +10,7 @@ string configure.ac: gl_FUNC_STPNCPY +gl_STRING_MODULE_INDICATOR([stpncpy]) Makefile.am: diff --git a/modules/strcase b/modules/strcase index 05c1c921c..77d2f2c74 100644 --- a/modules/strcase +++ b/modules/strcase @@ -13,6 +13,7 @@ string configure.ac: gl_STRCASE +gl_STRING_MODULE_INDICATOR([strcase]) Makefile.am: diff --git a/modules/strcasestr b/modules/strcasestr index ed7dea72d..4a9b922e3 100644 --- a/modules/strcasestr +++ b/modules/strcasestr @@ -12,6 +12,7 @@ string configure.ac: gl_FUNC_STRCASESTR +gl_STRING_MODULE_INDICATOR([strcasestr]) Makefile.am: diff --git a/modules/strchrnul b/modules/strchrnul index ee2307ac3..d79d63eb0 100644 --- a/modules/strchrnul +++ b/modules/strchrnul @@ -10,6 +10,7 @@ string configure.ac: gl_FUNC_STRCHRNUL +gl_STRING_MODULE_INDICATOR([strchrnul]) Makefile.am: diff --git a/modules/strdup b/modules/strdup index e267a68a3..b953f0fa6 100644 --- a/modules/strdup +++ b/modules/strdup @@ -10,6 +10,7 @@ string configure.ac: gl_FUNC_STRDUP +gl_STRING_MODULE_INDICATOR([strdup]) Makefile.am: diff --git a/modules/string b/modules/string index 313613f18..526fdebd7 100644 --- a/modules/string +++ b/modules/string @@ -21,6 +21,22 @@ string.h: string_.h rm -f $@-t $@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's|@''ABSOLUTE_STRING_H''@|$(ABSOLUTE_STRING_H)|g' \ + -e 's|@''GNULIB_MEMMEM''@|$(GNULIB_MEMMEM)|g' \ + -e 's|@''GNULIB_MEMPCPY''@|$(GNULIB_MEMPCPY)|g' \ + -e 's|@''GNULIB_MEMRCHR''@|$(GNULIB_MEMRCHR)|g' \ + -e 's|@''GNULIB_STPCPY''@|$(GNULIB_STPCPY)|g' \ + -e 's|@''GNULIB_STPNCPY''@|$(GNULIB_STPNCPY)|g' \ + -e 's|@''GNULIB_STRCASE''@|$(GNULIB_STRCASE)|g' \ + -e 's|@''GNULIB_STRCASE''@|$(GNULIB_STRCASE)|g' \ + -e 's|@''GNULIB_STRCHRNUL''@|$(GNULIB_STRCHRNUL)|g' \ + -e 's|@''GNULIB_STRDUP''@|$(GNULIB_STRDUP)|g' \ + -e 's|@''GNULIB_STRNDUP''@|$(GNULIB_STRNDUP)|g' \ + -e 's|@''GNULIB_STRNLEN''@|$(GNULIB_STRNLEN)|g' \ + -e 's|@''GNULIB_STRPBRK''@|$(GNULIB_STRPBRK)|g' \ + -e 's|@''GNULIB_STRSEP''@|$(GNULIB_STRSEP)|g' \ + -e 's|@''GNULIB_STRSTR''@|$(GNULIB_STRSTR)|g' \ + -e 's|@''GNULIB_STRCASESTR''@|$(GNULIB_STRCASESTR)|g' \ + -e 's|@''GNULIB_STRTOK_R''@|$(GNULIB_STRTOK_R)|g' \ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \ diff --git a/modules/strndup b/modules/strndup index 7246e0af0..cfe0dd0c6 100644 --- a/modules/strndup +++ b/modules/strndup @@ -11,6 +11,7 @@ strnlen configure.ac: gl_FUNC_STRNDUP +gl_STRING_MODULE_INDICATOR([strndup]) Makefile.am: diff --git a/modules/strnlen b/modules/strnlen index 56f20512b..3cc071126 100644 --- a/modules/strnlen +++ b/modules/strnlen @@ -11,6 +11,7 @@ string configure.ac: gl_FUNC_STRNLEN +gl_STRING_MODULE_INDICATOR([strnlen]) Makefile.am: diff --git a/modules/strpbrk b/modules/strpbrk index 1222c00b9..016a5795a 100644 --- a/modules/strpbrk +++ b/modules/strpbrk @@ -10,6 +10,7 @@ string configure.ac: gl_FUNC_STRPBRK +gl_STRING_MODULE_INDICATOR([strpbrk]) Makefile.am: diff --git a/modules/strsep b/modules/strsep index 3510fbaca..4503a071c 100644 --- a/modules/strsep +++ b/modules/strsep @@ -11,6 +11,7 @@ strpbrk configure.ac: gl_FUNC_STRSEP +gl_STRING_MODULE_INDICATOR([strsep]) Makefile.am: diff --git a/modules/strstr b/modules/strstr index f4868a4f5..5e3f9fd47 100644 --- a/modules/strstr +++ b/modules/strstr @@ -12,6 +12,7 @@ string configure.ac: gl_FUNC_STRSTR +gl_STRING_MODULE_INDICATOR([strstr]) Makefile.am: diff --git a/modules/strtok_r b/modules/strtok_r index e5691d483..cfcd01462 100644 --- a/modules/strtok_r +++ b/modules/strtok_r @@ -10,6 +10,7 @@ string configure.ac: gl_FUNC_STRTOK_R +gl_STRING_MODULE_INDICATOR([strtok_r]) Makefile.am: -- 2.11.0