diff options
-rw-r--r-- | include/ChangeLog | 4 | ||||
-rw-r--r-- | include/libiberty.h | 4 | ||||
-rw-r--r-- | libiberty/ChangeLog | 13 | ||||
-rw-r--r-- | libiberty/Makefile.in | 22 | ||||
-rw-r--r-- | libiberty/config.in | 3 | ||||
-rwxr-xr-x | libiberty/configure | 8 | ||||
-rw-r--r-- | libiberty/configure.ac | 3 | ||||
-rw-r--r-- | libiberty/functions.texi | 36 | ||||
-rw-r--r-- | libiberty/strndup.c | 61 | ||||
-rw-r--r-- | libiberty/xstrndup.c | 62 |
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); +} |