diff options
Diffstat (limited to 'string/bits')
-rw-r--r-- | string/bits/string2.h | 57 |
1 files changed, 44 insertions, 13 deletions
diff --git a/string/bits/string2.h b/string/bits/string2.h index 4b8f161aa1..a84cede465 100644 --- a/string/bits/string2.h +++ b/string/bits/string2.h @@ -710,8 +710,8 @@ strnlen (__const char *__string, size_t __maxlen) ? (((__const unsigned char *) (sep))[0] != '\0' \ && ((__const unsigned char *) (sep))[1] == '\0' \ ? __strtok_r_1c (s, ((__const char *) (sep))[0], nextp) \ - : strtok_r (s, sep, nextp)) \ - : strtok_r (s, sep, nextp))) + : __strtok_r (s, sep, nextp)) \ + : __strtok_r (s, sep, nextp))) __STRING_INLINE char *__strtok_r_1c (char *__s, char __sep, char **__nextp); __STRING_INLINE char * @@ -740,7 +740,7 @@ __strtok_r_1c (char *__s, char __sep, char **__nextp) return __result; } # if defined __USE_POSIX || defined __USE_MISC -# define strtok_r(s, sep, nextp) __strtok_r (s, sep, nextp) +# define strtok_r(s, sep, nextp) __strtok_r ((s), (sep), (nextp)) # endif #endif @@ -845,7 +845,7 @@ __strsep_g (char **__s, __const char *__reject) return __retval; } # ifdef __USE_BSD -# define strsep(s, reject) __strsep (s, reject) +# define strsep(s, reject) __strsep ((s), (reject)) # endif #endif @@ -857,15 +857,15 @@ __strsep_g (char **__s, __const char *__reject) # include <stdlib.h> # define __strdup(s) \ - (__extension__ (__builtin_constant_p (s) && __string2_1bptr_p (s) - ? (((__const unsigned char *) (s))[0] == '\0' - ? return (char *) calloc (1, 1); - : ({ size_t len = strlen (s) + 1; - char *retval = (char *) malloc (len); - if (retval != NULL) - retval = (char *) memcpy (retval, s, len); - retval; })) - : strdup (s))) + (__extension__ (__builtin_constant_p (s) && __string2_1bptr_p (s) \ + ? (((__const unsigned char *) (s))[0] == '\0' \ + ? (char *) calloc (1, 1) \ + : ({ size_t __len = strlen (s) + 1; \ + char *__retval = (char *) malloc (__len); \ + if (__retval != NULL) \ + __retval = (char *) memcpy (__retval, s, __len); \ + __retval; })) \ + : __strdup (s))) # if defined __USE_SVID || defined __USE_BSD || defined __USE_XOPEN_EXTENDED # define strdup(s) __strdup (s) @@ -873,6 +873,37 @@ __strsep_g (char **__s, __const char *__reject) #endif +#if !defined _HAVE_STRING_ARCH_strndup && !defined __STRICT_ANSI__ + +/* We need the memory allocation functions. Including this header is + not allowed. */ +# include <stdlib.h> + +# define __strndup(s, n) \ + (__extension__ (__builtin_constant_p (s) && __string2_1bptr_p (s) \ + ? (((__const unsigned char *) (s))[0] == '\0' \ + ? (char *) calloc (1, 1) \ + : ({ size_t __len = strlen (s) + 1; \ + size_t __n = (n); \ + char *__retval; \ + if (__n < __len) \ + __len = __n; \ + __retval = (char *) malloc (__len); \ + if (__retval != NULL) \ + { \ + __retval[__len - 1] = '\0'; \ + __retval = (char *) memcpy (__retval, s, \ + __len - 1); \ + } \ + __retval; })) \ + : __strndup ((s), (n)))) + +# ifdef __GNU_SOURCE +# define strndup(s, n) __strndup ((s), (n)) +# endif +#endif + + #undef __STRING_INLINE #endif /* No string inlines. */ |