From 929dcebaff7c1ee0501e83ee6e3016aa6d95b4cf Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Tue, 13 May 2008 21:28:43 -0600 Subject: [PATCH] Split xmemdup0 into its own module. * modules/xmemdup0: New file. * lib/xmemdup0.h: Likewise. * lib/xmemdup0.c: Likewise. * MODULES.html.sh (Memory management functions): Add xmemdup0. * lib/xalloc.h (xmemdup0): Remove. * lib/xmalloc.c (xmemdup0): Likewise. Signed-off-by: Eric Blake --- ChangeLog | 10 ++++++++++ MODULES.html.sh | 1 + lib/xalloc.h | 7 ------- lib/xmalloc.c | 18 ------------------ lib/xmemdup0.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ lib/xmemdup0.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ modules/xmemdup0 | 23 +++++++++++++++++++++++ 7 files changed, 129 insertions(+), 25 deletions(-) create mode 100644 lib/xmemdup0.c create mode 100644 lib/xmemdup0.h create mode 100644 modules/xmemdup0 diff --git a/ChangeLog b/ChangeLog index 147ea6140..70035ae5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,14 @@ 2008-05-13 Eric Blake + + Split xmemdup0 into its own module. + * modules/xmemdup0: New file. + * lib/xmemdup0.h: Likewise. + * lib/xmemdup0.c: Likewise. + * MODULES.html.sh (Memory management functions): Add xmemdup0. + * lib/xalloc.h (xmemdup0): Remove. + * lib/xmalloc.c (xmemdup0): Likewise. + +2008-05-13 Eric Blake Bruno Haible Reduce number of forks required during autoconf. diff --git a/MODULES.html.sh b/MODULES.html.sh index f07d11ce6..f39027104 100755 --- a/MODULES.html.sh +++ b/MODULES.html.sh @@ -1609,6 +1609,7 @@ func_all_modules () func_module alloca-opt func_module malloca func_module xmalloca + func_module xmemdup0 func_end_table element="Integer arithmetic functions " diff --git a/lib/xalloc.h b/lib/xalloc.h index 314ed6d19..40dcf4bd5 100644 --- a/lib/xalloc.h +++ b/lib/xalloc.h @@ -50,7 +50,6 @@ void *xcalloc (size_t n, size_t s); void *xrealloc (void *p, size_t s); void *x2realloc (void *p, size_t *pn); void *xmemdup (void const *p, size_t s); -void *xmemdup0 (void const *p, size_t s); char *xstrdup (char const *str); /* Return 1 if an array of N objects, each of size S, cannot exist due @@ -265,12 +264,6 @@ xmemdup (T const *p, size_t s) return (T *) xmemdup ((void const *) p, s); } -template inline T * -xmemdup0 (T const *p, size_t s) -{ - return (T *) xmemdup0 ((void const *) p, s); -} - # endif diff --git a/lib/xmalloc.c b/lib/xmalloc.c index b1f6993e3..89ecf17ad 100644 --- a/lib/xmalloc.c +++ b/lib/xmalloc.c @@ -113,24 +113,6 @@ xmemdup (void const *p, size_t s) return memcpy (xmalloc (s), p, s); } -/* Clone an object P of size S, with error checking, and include a - terminating NUL byte. - - The terminating NUL makes it safe to use strlen or rawmemchr to - check for embedded NUL; it also speeds up algorithms such as escape - sequence processing on arbitrary memory, by making it always safe - to read the byte after the escape character rather than having to - check if each escape character is the last byte in the object. */ - -void * -xmemdup0 (void const *p, size_t s) -{ - char *result = xcharalloc (s + 1); - memcpy (result, p, s); - result[s] = 0; - return result; -} - /* Clone STRING. */ char * diff --git a/lib/xmemdup0.c b/lib/xmemdup0.c new file mode 100644 index 000000000..0c201111c --- /dev/null +++ b/lib/xmemdup0.c @@ -0,0 +1,44 @@ +/* xmemdup0.c -- copy a block of arbitrary bytes, plus a trailing NUL + + Copyright (C) 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "xmemdup0.h" +#include "xalloc.h" + +#include + +/* Clone an arbitrary block of bytes P of size S, with error checking, + and include a terminating NUL byte. P is of type `void const *', + to make it easier to use this with other mem* functions that return + `void *', but since appending a NUL byte only makes sense on bytes, + the return type is `char *'. + + The terminating NUL makes it safe to use strlen or rawmemchr to + check for embedded NUL; it also speeds up algorithms such as escape + sequence processing on arbitrary memory, by making it always safe + to read the byte after the escape character rather than having to + check if each escape character is the last byte in the object. */ + +char * +xmemdup0 (void const *p, size_t s) +{ + char *result = xcharalloc (s + 1); + memcpy (result, p, s); + result[s] = 0; + return result; +} diff --git a/lib/xmemdup0.h b/lib/xmemdup0.h new file mode 100644 index 000000000..ca195420a --- /dev/null +++ b/lib/xmemdup0.h @@ -0,0 +1,51 @@ +/* xmemdup0.h -- copy a block of arbitrary bytes, plus a trailing NUL + + Copyright (C) 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef XMEMDUP_H_ +# define XMEMDUP_H_ + +# include + + +# ifdef __cplusplus +extern "C" { +# endif + +# ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) +# define __attribute__(x) +# endif +# endif + +# ifndef ATTRIBUTE_NORETURN +# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +# endif + +/* This function is always triggered when memory is exhausted. + It must be defined by the application, either explicitly + or by using gnulib's xalloc-die module. This is the + function to call when one wants the program to die because of a + memory allocation failure. */ +extern void xalloc_die (void) ATTRIBUTE_NORETURN; + +char *xmemdup0 (void const *p, size_t s); + +# ifdef __cplusplus +} +# endif + +#endif /* !XMEMDUP0_H_ */ diff --git a/modules/xmemdup0 b/modules/xmemdup0 new file mode 100644 index 000000000..d7ea438d7 --- /dev/null +++ b/modules/xmemdup0 @@ -0,0 +1,23 @@ +Description: +Copy a block of arbitrary bytes, and append a trailing NUL. + +Files: +lib/xmemdup0.h +lib/xmemdup0.c + +Depends-on: +xalloc + +configure.ac: +AC_LIBOBJ([xmemdup0]) + +Makefile.am: + +Include: +"xmemdup0.h" + +License: +GPL + +Maintainer: +Eric Blake -- 2.11.0