Split xmemdup0 into its own module.
authorEric Blake <ebb9@byu.net>
Wed, 14 May 2008 03:28:43 +0000 (21:28 -0600)
committerEric Blake <ebb9@byu.net>
Wed, 14 May 2008 03:28:43 +0000 (21:28 -0600)
* 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 <ebb9@byu.net>
ChangeLog
MODULES.html.sh
lib/xalloc.h
lib/xmalloc.c
lib/xmemdup0.c [new file with mode: 0644]
lib/xmemdup0.h [new file with mode: 0644]
modules/xmemdup0 [new file with mode: 0644]

index 147ea61..70035ae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,14 @@
 2008-05-13  Eric Blake  <ebb9@byu.net>
+
+       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  <ebb9@byu.net>
             Bruno Haible  <bruno@clisp.org>
 
        Reduce number of forks required during autoconf.
index f07d11c..f390271 100755 (executable)
@@ -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 <stdlib.h>"
index 314ed6d..40dcf4b 100644 (file)
@@ -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 <typename T> inline T *
-xmemdup0 (T const *p, size_t s)
-{
-  return (T *) xmemdup0 ((void const *) p, s);
-}
-
 # endif
 
 
index b1f6993..89ecf17 100644 (file)
@@ -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 (file)
index 0000000..0c20111
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "xmemdup0.h"
+#include "xalloc.h"
+
+#include <string.h>
+
+/* 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 (file)
index 0000000..ca19542
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.  */
+
+#ifndef XMEMDUP_H_
+# define XMEMDUP_H_
+
+# include <stddef.h>
+
+
+# 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 (file)
index 0000000..d7ea438
--- /dev/null
@@ -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