From 7551a1e5100c596793fa182cd26346ff971d3a4f Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 18 Mar 1998 17:57:13 +0000 Subject: Update. 1998-03-18 Andreas Jaeger * manual/memory.texi (Heap Consistency Checking): Document MALLOC_CHECK_. Based on a text by Wolfram Gloger. 1998-03-18 17:11 Zack Weinberg * manual/Makefile: Add missing rules. 1998-03-18 Ulrich Drepper * timezone/Makefile (generated): Define to remove all stamp files. * sysdeps/generic/strsep.c: Also undefine __strsep. * string/strdup.c: Undefine __strdup and strdup first. * string/strndup.c: Likewise. * string/bits/string2.h: Correct strtok_r and strsep. Add strndup optimization. * sysdeps/generic/strsep.c: Little optimization. --- string/bits/string2.h | 57 +++++++++++++++++++++++++++++++++++++++------------ string/strdup.c | 5 ++++- string/strndup.c | 5 ++++- 3 files changed, 52 insertions(+), 15 deletions(-) (limited to 'string') 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 # 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 + +# 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. */ diff --git a/string/strdup.c b/string/strdup.c index be3883f688..2e0852cb9e 100644 --- a/string/strdup.c +++ b/string/strdup.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -28,6 +28,9 @@ char *malloc (); char *memcpy (); #endif +#undef __strdup +#undef strdup + #ifndef weak_alias # define __strdup strdup #endif diff --git a/string/strndup.c b/string/strndup.c index cd971e1c6f..3f534427b4 100644 --- a/string/strndup.c +++ b/string/strndup.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -30,6 +30,9 @@ char *malloc (); #endif +#undef __strndup +#undef strndup + #ifndef weak_alias # define __strndup strndup #endif -- cgit v1.2.3