aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ChangeLog4
-rw-r--r--include/libiberty.h4
-rw-r--r--libiberty/ChangeLog13
-rw-r--r--libiberty/Makefile.in22
-rw-r--r--libiberty/config.in3
-rwxr-xr-xlibiberty/configure8
-rw-r--r--libiberty/configure.ac3
-rw-r--r--libiberty/functions.texi36
-rw-r--r--libiberty/strndup.c61
-rw-r--r--libiberty/xstrndup.c62
10 files changed, 209 insertions, 7 deletions
diff --git a/include/ChangeLog b/include/ChangeLog
index 4c8d105..6f64e06 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,7 @@
+2005-03-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * libiberty.h (xstrndup): Declare.
+
2005-03-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* libiberty.h (make_relative_prefix): Add ATTRIBUTE_MALLOC.
diff --git a/include/libiberty.h b/include/libiberty.h
index d2a8a0b..49a2fb6 100644
--- a/include/libiberty.h
+++ b/include/libiberty.h
@@ -255,6 +255,10 @@ extern PTR xcalloc PARAMS ((size_t, size_t)) ATTRIBUTE_MALLOC;
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 --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 231bab3..62e8d1e 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,5 +1,18 @@
2005-03-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+ * 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.
+
+2005-03-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
* xmemdup.c, xstrdup.c: Expose the tail call.
2005-03-09 Mark Mitchell <mark@codesourcery.com>
diff --git a/libiberty/Makefile.in b/libiberty/Makefile.in
index 3cbde17..092d8d5 100644
--- a/libiberty/Makefile.in
+++ b/libiberty/Makefile.in
@@ -150,12 +150,13 @@ CFILES = alloca.c argv.c asprintf.c atexit.c \
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.o ./cp-demangle.o ./md5.o \
./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 ./atexit.o \
./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 --git a/libiberty/config.in b/libiberty/config.in
index 2b57d29..6eb169e 100644
--- a/libiberty/config.in
+++ b/libiberty/config.in
@@ -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 --git a/libiberty/configure b/libiberty/configure
index 9e238de..88da642 100755
--- a/libiberty/configure
+++ b/libiberty/configure
@@ -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 --git a/libiberty/configure.ac b/libiberty/configure.ac
index 4d5361b..9925053 100644
--- a/libiberty/configure.ac
+++ b/libiberty/configure.ac
@@ -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 --git a/libiberty/functions.texi b/libiberty/functions.texi
index b6e8e7a..79c8a35 100644
--- a/libiberty/functions.texi
+++ b/libiberty/functions.texi
@@ -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 strings, returning a value as
@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 NUL 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{mkstemp} instead.
@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 NUL terminated.
+
+@end deftypefn
+
diff --git a/libiberty/strndup.c b/libiberty/strndup.c
new file mode 100644
index 0000000..3d6b93d
--- /dev/null
+++ b/libiberty/strndup.c
@@ -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 NUL 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 --git a/libiberty/xstrndup.c b/libiberty/xstrndup.c
new file mode 100644
index 0000000..b481e4a
--- /dev/null
+++ b/libiberty/xstrndup.c
@@ -0,0 +1,62 @@
+/* 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 NUL terminated.
+
+@end deftypefn
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <sys/types.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+# ifdef HAVE_STRINGS_H
+# include <strings.h>
+# endif
+#endif
+#include "ansidecl.h"
+#include "libiberty.h"
+
+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);
+}