This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[LIBIBERTY]: Add strndup and xstrndup functions


This patch adds the strndup function from glibc and xstrndup to
libiberty.  These may be useful for getting rid of some of the
savestring/save_string functions in the gcc directory.

For testing, I built libiberty on x86_64-unknown-linux-gnu (which has
strndup) and sparc-sun-solaris2.7 (which doesn't have it) to make sure
the configure stuff works correctly and the new functions compile
without warnings.  I also built libiberty.info to ensure
functions.texi was regenerated properly and the inline texinfo was
okay in the C files.

Since these functions are not used (yet) in the gcc directory,
bootstrap and regtest don't add anything. so I didn't wait for that to
complete, but C-only bootstrap underway.

Okay for mainline?

		Thanks,
		--Kaveh


2005-03-24  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

include:
	* libiberty.h (xstrndup): Declare.

libiberty:
	* Makefile.in (CFILES): Add strndup.c and xstrndup.c.
	(REQUIRED_OFILES): Add xstrndup.o.
	(CONFIGURED_OFILES): Add strndup.o.
	Regenerate dependencies.

	* configure.ac (funcs, AC_CHECK_FUNCS): Add strndup.

	* strndup.c, xstrndup.c: New.

	* config.in, configure, functions.texi: Regenerate.

diff -rup orig/egcc-CVS20050323/include/libiberty.h egcc-CVS20050323/include/libiberty.h
--- orig/egcc-CVS20050323/include/libiberty.h	2005-03-22 22:20:12.000000000 -0500
+++ egcc-CVS20050323/include/libiberty.h	2005-03-24 10:22:50.715621168 -0500
@@ -255,6 +255,10 @@ extern PTR xcalloc PARAMS ((size_t, size
 
 extern char *xstrdup PARAMS ((const char *)) ATTRIBUTE_MALLOC;
 
+/* Copy at most N characters from string into a buffer without fail.  */
+
+extern char *xstrndup PARAMS ((const char *, size_t)) ATTRIBUTE_MALLOC;
+
 /* Copy an existing memory buffer to a new memory buffer without fail.  */
 
 extern PTR xmemdup PARAMS ((const PTR, size_t, size_t)) ATTRIBUTE_MALLOC;
diff -rup orig/egcc-CVS20050323/libiberty/Makefile.in egcc-CVS20050323/libiberty/Makefile.in
--- orig/egcc-CVS20050323/libiberty/Makefile.in	2005-03-09 21:05:00.000000000 -0500
+++ egcc-CVS20050323/libiberty/Makefile.in	2005-03-24 11:07:15.465517608 -0500
@@ -150,12 +150,13 @@ CFILES = alloca.c argv.c asprintf.c atex
 	safe-ctype.c setenv.c sigsetmask.c snprintf.c sort.c spaces.c	\
 	 splay-tree.c stpcpy.c stpncpy.c strcasecmp.c strchr.c strdup.c	\
 	 strerror.c strncasecmp.c strncmp.c strrchr.c strsignal.c	\
-	 strstr.c strtod.c strtol.c strtoul.c				\
+	 strstr.c strtod.c strtol.c strtoul.c strndup.c			\
 	ternary.c tmpnam.c						\
 	unlink-if-ordinary.c						\
 	vasprintf.c vfork.c vfprintf.c vprintf.c vsnprintf.c vsprintf.c	\
 	waitpid.c							\
-	xatexit.c xexit.c xmalloc.c xmemdup.c xstrdup.c xstrerror.c
+	xatexit.c xexit.c xmalloc.c xmemdup.c xstrdup.c xstrerror.c	\
+	xstrndup.c
 
 # These are always included in the library.  The first four are listed
 # first and by compile time to optimize parallel builds.
@@ -175,7 +176,7 @@ REQUIRED_OFILES = ./regex.o ./cplus-dem.
 	./ternary.o							\
 	./unlink-if-ordinary.o						\
 	./xatexit.o ./xexit.o ./xmalloc.o ./xmemdup.o ./xstrdup.o	\
-	 ./xstrerror.o
+	./xstrerror.o ./xstrndup.o
 
 # These are all the objects that configure may add to the library via
 # $funcs or EXTRA_OFILES.  This list exists here only for "make
@@ -195,7 +196,7 @@ CONFIGURED_OFILES = ./asprintf.o ./atexi
 	./random.o ./rename.o ./rindex.o				\
 	./setenv.o ./sigsetmask.o ./snprintf.o ./stpcpy.o ./stpncpy.o	\
 	 ./strcasecmp.o ./strchr.o ./strdup.o ./strncasecmp.o		\
-	 ./strncmp.o ./strrchr.o ./strstr.o				\
+	 ./strncmp.o ./strndup.o ./strrchr.o ./strstr.o			\
 	 ./strtod.o ./strtol.o ./strtoul.o				\
 	./tmpnam.o							\
 	./vasprintf.o ./vfork.o ./vfprintf.o ./vprintf.o ./vsnprintf.o	\
@@ -916,6 +917,12 @@ $(CONFIGURED_OFILES): stamp-picdir
 	else true; fi
 	$(COMPILE.c) $(srcdir)/strncmp.c $(OUTPUT_OPTION)
 
+./strndup.o: $(srcdir)/strndup.c $(INCDIR)/ansidecl.h
+	if [ x"$(PICFLAG)" != x ]; then \
+	  $(COMPILE.c) $(PICFLAG) $(srcdir)/strndup.c -o pic/$@; \
+	else true; fi
+	$(COMPILE.c) $(srcdir)/strndup.c $(OUTPUT_OPTION)
+
 ./strrchr.o: $(srcdir)/strrchr.c $(INCDIR)/ansidecl.h
 	if [ x"$(PICFLAG)" != x ]; then \
 	  $(COMPILE.c) $(PICFLAG) $(srcdir)/strrchr.c -o pic/$@; \
@@ -1058,3 +1065,10 @@ $(CONFIGURED_OFILES): stamp-picdir
 	else true; fi
 	$(COMPILE.c) $(srcdir)/xstrerror.c $(OUTPUT_OPTION)
 
+./xstrndup.o: $(srcdir)/xstrndup.c config.h $(INCDIR)/ansidecl.h \
+	$(INCDIR)/libiberty.h
+	if [ x"$(PICFLAG)" != x ]; then \
+	  $(COMPILE.c) $(PICFLAG) $(srcdir)/xstrndup.c -o pic/$@; \
+	else true; fi
+	$(COMPILE.c) $(srcdir)/xstrndup.c $(OUTPUT_OPTION)
+
diff -rup orig/egcc-CVS20050323/libiberty/configure.ac egcc-CVS20050323/libiberty/configure.ac
--- orig/egcc-CVS20050323/libiberty/configure.ac	2005-03-09 21:05:00.000000000 -0500
+++ egcc-CVS20050323/libiberty/configure.ac	2005-03-24 10:22:50.719620560 -0500
@@ -248,6 +248,7 @@ funcs="$funcs strcasecmp"
 funcs="$funcs strchr"
 funcs="$funcs strdup"
 funcs="$funcs strncasecmp"
+funcs="$funcs strndup"
 funcs="$funcs strrchr"
 funcs="$funcs strstr"
 funcs="$funcs strtod"
@@ -275,7 +276,7 @@ if test "x" = "y"; then
   AC_CHECK_FUNCS(asprintf atexit basename bcmp bcopy bsearch bzero calloc clock \
   getcwd getpagesize gettimeofday index insque mkstemps memchr memcmp memcpy \
   memmove mempcpy memset putenv random rename rindex sigsetmask \
-  strcasecmp setenv stpcpy stpncpy strchr strdup strncasecmp strrchr strstr \
+  strcasecmp setenv stpcpy stpncpy strchr strdup strncasecmp strndup strrchr strstr \
   strtod strtol strtoul tmpnam vasprintf vfprintf vprintf \
   vsprintf waitpid getrusage on_exit psignal strerror strsignal \
   sysconf times sbrk gettimeofday ffs snprintf vsnprintf \
diff -rup orig/egcc-CVS20050323/libiberty/strndup.c egcc-CVS20050323/libiberty/strndup.c
--- orig/egcc-CVS20050323/libiberty/strndup.c	2005-03-24 10:50:24.804161488 -0500
+++ egcc-CVS20050323/libiberty/strndup.c	2005-03-24 11:20:37.673563448 -0500
@@ -0,0 +1,61 @@
+/* Implement the strndup function.
+   Copyright (C) 2005 Free Software Foundation, Inc.
+   Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>.
+
+This file is part of the libiberty library.
+Libiberty is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Libiberty is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with libiberty; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/*
+
+@deftypefn Extension char* strndup (const char *@var{s}, size_t @var{n})
+
+Returns a pointer to a copy of @var{s} with at most @var{n} characters
+in memory obtained from @code{malloc}, or @code{NULL} if insufficient
+memory was available.  The result is always @code{NULL} terminated.
+
+@end deftypefn
+
+*/
+
+#include "ansidecl.h"
+#ifdef ANSI_PROTOTYPES
+#include <stddef.h>
+#else
+#define size_t unsigned long
+#endif
+
+extern size_t	strlen PARAMS ((const char*));
+extern PTR	malloc PARAMS ((size_t));
+extern PTR	memcpy PARAMS ((PTR, const PTR, size_t));
+
+char *
+strndup(s, n)
+     const char *s;
+     size_t n;
+{
+  char *result;
+  size_t len = strlen (s);
+
+  if (n < len)
+    len = n;
+
+  result = malloc (len + 1);
+  if (!result)
+    return 0;
+
+  result[len] = '\0';
+  return memcpy (result, s, len);
+}
diff -rup orig/egcc-CVS20050323/libiberty/xstrndup.c egcc-CVS20050323/libiberty/xstrndup.c
--- orig/egcc-CVS20050323/libiberty/xstrndup.c	2005-03-24 10:50:31.462149320 -0500
+++ egcc-CVS20050323/libiberty/xstrndup.c	2005-03-24 11:20:14.068152016 -0500
@@ -0,0 +1,58 @@
+/* Implement the xstrndup function.
+   Copyright (C) 2005 Free Software Foundation, Inc.
+   Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>.
+
+This file is part of the libiberty library.
+Libiberty is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Libiberty is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with libiberty; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/*
+
+@deftypefn Replacement char* xstrndup (const char *@var{s}, size_t @var{n})
+
+Returns a pointer to a copy of @var{s} with at most @var{n} characters
+without fail, using @code{xmalloc} to obtain memory.  The result is
+always @code{NULL} terminated.
+
+@end deftypefn
+
+*/
+
+#include "libiberty.h"
+/* libiberty.h will have gotten size_t on an ANSI_PROTOTYPES platform,
+   otherwise... */
+#ifndef ANSI_PROTOTYPES
+#define size_t unsigned long
+#endif
+
+extern size_t	strlen PARAMS ((const char*));
+extern PTR	memcpy PARAMS ((PTR, const PTR, size_t));
+
+char *
+xstrndup (s, n)
+     const char *s;
+     size_t n;
+{
+  char *result;
+  size_t len = strlen (s);
+
+  if (n < len)
+    len = n;
+
+  result = xmalloc (len + 1);
+
+  result[len] = '\0';
+  return memcpy (result, s, len);
+}
diff -rup orig/egcc-CVS20050323/libiberty/config.in egcc-CVS20050323/libiberty/config.in
--- orig/egcc-CVS20050323/libiberty/config.in	2004-12-10 16:24:59.000000000 -0500
+++ egcc-CVS20050323/libiberty/config.in	2005-03-24 11:42:01.583379488 -0500
@@ -181,6 +181,9 @@
 /* Define to 1 if you have the `strncasecmp' function. */
 #undef HAVE_STRNCASECMP
 
+/* Define to 1 if you have the `strndup' function. */
+#undef HAVE_STRNDUP
+
 /* Define to 1 if you have the `strrchr' function. */
 #undef HAVE_STRRCHR
 
diff -rup orig/egcc-CVS20050323/libiberty/configure egcc-CVS20050323/libiberty/configure
--- orig/egcc-CVS20050323/libiberty/configure	2005-03-09 21:05:00.000000000 -0500
+++ egcc-CVS20050323/libiberty/configure	2005-03-24 11:41:59.278729848 -0500
@@ -4775,6 +4775,7 @@ funcs="$funcs clock"
 funcs="$funcs ffs"
 funcs="$funcs getcwd"
 funcs="$funcs getpagesize"
+funcs="$funcs gettimeofday"
 funcs="$funcs index"
 funcs="$funcs insque"
 funcs="$funcs memchr"
@@ -4797,6 +4798,7 @@ funcs="$funcs strcasecmp"
 funcs="$funcs strchr"
 funcs="$funcs strdup"
 funcs="$funcs strncasecmp"
+funcs="$funcs strndup"
 funcs="$funcs strrchr"
 funcs="$funcs strstr"
 funcs="$funcs strtod"
@@ -4884,10 +4886,12 @@ if test "x" = "y"; then
 
 
 
+
+
 for ac_func in asprintf atexit basename bcmp bcopy bsearch bzero calloc clock \
-  getcwd getpagesize index insque mkstemps memchr memcmp memcpy \
+  getcwd getpagesize gettimeofday index insque mkstemps memchr memcmp memcpy \
   memmove mempcpy memset putenv random rename rindex sigsetmask \
-  strcasecmp setenv stpcpy stpncpy strchr strdup strncasecmp strrchr strstr \
+  strcasecmp setenv stpcpy stpncpy strchr strdup strncasecmp strndup strrchr strstr \
   strtod strtol strtoul tmpnam vasprintf vfprintf vprintf \
   vsprintf waitpid getrusage on_exit psignal strerror strsignal \
   sysconf times sbrk gettimeofday ffs snprintf vsnprintf \
diff -rup orig/egcc-CVS20050323/libiberty/functions.texi egcc-CVS20050323/libiberty/functions.texi
--- orig/egcc-CVS20050323/libiberty/functions.texi	2005-01-11 22:54:31.000000000 -0500
+++ egcc-CVS20050323/libiberty/functions.texi	2005-03-24 11:39:26.700925200 -0500
@@ -339,6 +339,14 @@ between calls to @code{getpwd}.
 
 @end deftypefn
 
+@c gettimeofday.c:12
+@deftypefn int gettimeofday (struct timeval *@var{tp}, void *@var{tz})
+
+Writes the current time to @var{tp}.  This implementation requires
+that @var{tz} be NULL.  Returns 0 on success, -1 on failure.
+
+@end deftypefn
+
 @c hex.c:30
 @deftypefn Extension void hex_init (void)
 
@@ -893,6 +901,15 @@ Compares the first @var{n} bytes of two 
 
 @end deftypefn
 
+@c strndup.c:23
+@deftypefn Extension char* strndup (const char *@var{s}, size_t @var{n})
+
+Returns a pointer to a copy of @var{s} with at most @var{n} characters
+in memory obtained from @code{malloc}, or @code{NULL} if insufficient
+memory was available.  The result is always @code{NULL} terminated.
+
+@end deftypefn
+
 @c strrchr.c:6
 @deftypefn Supplemental char* strrchr (const char *@var{s}, int @var{c})
 
@@ -1008,6 +1025,16 @@ not be used in new projects.  Use @code{
 
 @end deftypefn
 
+@c unlink-if-ordinary.c:27
+@deftypefn Supplemental int unlink_if_ordinary (const char*)
+
+Unlinks the named file, unless it is special (e.g. a device file).
+Returns 0 when the file was unlinked, a negative value (and errno set) when
+there was an error deleting the file, and a positive value if no attempt
+was made to unlink the file because it is special.
+
+@end deftypefn
+
 @c vasprintf.c:51
 @deftypefn Extension int vasprintf (char **@var{resptr}, const char *@var{format}, va_list @var{args})
 
@@ -1153,4 +1180,13 @@ will never return a @code{NULL} pointer.
 
 @end deftypefn
 
+@c xstrndup.c:23
+@deftypefn Replacement char* xstrndup (const char *@var{s}, size_t @var{n})
+
+Returns a pointer to a copy of @var{s} with at most @var{n} characters
+without fail, using @code{xmalloc} to obtain memory.  The result is
+always @code{NULL} terminated.
+
+@end deftypefn
+
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]