# HG changeset patch # User Bruno Haible # Date 1170289792 0 # Node ID aa8abb5db935e177fcc76cf9057a73faab48ee71 # Parent cae55a1e8678c5ca023cc8f55156cfb317d65b8c Enforce the use of gnulib modules for unportable functions. diff --git a/ChangeLog b/ChangeLog --- 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 --- a/lib/string_.h +++ b/lib/string_.h @@ -26,34 +26,54 @@ #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 @@ 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 @@ 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 @@ 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 --- a/modules/memmem +++ b/modules/memmem @@ -10,6 +10,7 @@ configure.ac: gl_FUNC_MEMMEM +gl_STRING_MODULE_INDICATOR([memmem]) Makefile.am: diff --git a/modules/mempcpy b/modules/mempcpy --- a/modules/mempcpy +++ b/modules/mempcpy @@ -10,6 +10,7 @@ configure.ac: gl_FUNC_MEMPCPY +gl_STRING_MODULE_INDICATOR([mempcpy]) Makefile.am: diff --git a/modules/memrchr b/modules/memrchr --- a/modules/memrchr +++ b/modules/memrchr @@ -10,6 +10,7 @@ configure.ac: gl_FUNC_MEMRCHR +gl_STRING_MODULE_INDICATOR([memrchr]) Makefile.am: diff --git a/modules/stpcpy b/modules/stpcpy --- a/modules/stpcpy +++ b/modules/stpcpy @@ -10,6 +10,7 @@ configure.ac: gl_FUNC_STPCPY +gl_STRING_MODULE_INDICATOR([stpcpy]) Makefile.am: diff --git a/modules/stpncpy b/modules/stpncpy --- a/modules/stpncpy +++ b/modules/stpncpy @@ -10,6 +10,7 @@ configure.ac: gl_FUNC_STPNCPY +gl_STRING_MODULE_INDICATOR([stpncpy]) Makefile.am: diff --git a/modules/strcase b/modules/strcase --- a/modules/strcase +++ b/modules/strcase @@ -13,6 +13,7 @@ configure.ac: gl_STRCASE +gl_STRING_MODULE_INDICATOR([strcase]) Makefile.am: diff --git a/modules/strcasestr b/modules/strcasestr --- a/modules/strcasestr +++ b/modules/strcasestr @@ -12,6 +12,7 @@ configure.ac: gl_FUNC_STRCASESTR +gl_STRING_MODULE_INDICATOR([strcasestr]) Makefile.am: diff --git a/modules/strchrnul b/modules/strchrnul --- a/modules/strchrnul +++ b/modules/strchrnul @@ -10,6 +10,7 @@ configure.ac: gl_FUNC_STRCHRNUL +gl_STRING_MODULE_INDICATOR([strchrnul]) Makefile.am: diff --git a/modules/strdup b/modules/strdup --- a/modules/strdup +++ b/modules/strdup @@ -10,6 +10,7 @@ configure.ac: gl_FUNC_STRDUP +gl_STRING_MODULE_INDICATOR([strdup]) Makefile.am: diff --git a/modules/string b/modules/string --- a/modules/string +++ b/modules/string @@ -21,6 +21,22 @@ 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 --- a/modules/strndup +++ b/modules/strndup @@ -11,6 +11,7 @@ configure.ac: gl_FUNC_STRNDUP +gl_STRING_MODULE_INDICATOR([strndup]) Makefile.am: diff --git a/modules/strnlen b/modules/strnlen --- a/modules/strnlen +++ b/modules/strnlen @@ -11,6 +11,7 @@ configure.ac: gl_FUNC_STRNLEN +gl_STRING_MODULE_INDICATOR([strnlen]) Makefile.am: diff --git a/modules/strpbrk b/modules/strpbrk --- a/modules/strpbrk +++ b/modules/strpbrk @@ -10,6 +10,7 @@ configure.ac: gl_FUNC_STRPBRK +gl_STRING_MODULE_INDICATOR([strpbrk]) Makefile.am: diff --git a/modules/strsep b/modules/strsep --- a/modules/strsep +++ b/modules/strsep @@ -11,6 +11,7 @@ configure.ac: gl_FUNC_STRSEP +gl_STRING_MODULE_INDICATOR([strsep]) Makefile.am: diff --git a/modules/strstr b/modules/strstr --- a/modules/strstr +++ b/modules/strstr @@ -12,6 +12,7 @@ configure.ac: gl_FUNC_STRSTR +gl_STRING_MODULE_INDICATOR([strstr]) Makefile.am: diff --git a/modules/strtok_r b/modules/strtok_r --- a/modules/strtok_r +++ b/modules/strtok_r @@ -10,6 +10,7 @@ configure.ac: gl_FUNC_STRTOK_R +gl_STRING_MODULE_INDICATOR([strtok_r]) Makefile.am: