xref: /netbsd-src/external/gpl3/gcc/dist/libiberty/xmemdup.c (revision b17d1066a7e7247cfc01a45f6ada19302e1cc150)
1*b17d1066Smrg /* xmemdup.c -- Duplicate a memory buffer, using xmalloc.
24fee23f9Smrg    This trivial function is in the public domain.
34fee23f9Smrg    Jeff Garzik, September 1999.  */
44fee23f9Smrg 
54fee23f9Smrg /*
64fee23f9Smrg 
748fb7bfaSmrg @deftypefn Replacement void* xmemdup (void *@var{input}, @
848fb7bfaSmrg   size_t @var{copy_size}, size_t @var{alloc_size})
94fee23f9Smrg 
104fee23f9Smrg Duplicates a region of memory without fail.  First, @var{alloc_size} bytes
114fee23f9Smrg are allocated, then @var{copy_size} bytes from @var{input} are copied into
124fee23f9Smrg it, and the new memory is returned.  If fewer bytes are copied than were
134fee23f9Smrg allocated, the remaining memory is zeroed.
144fee23f9Smrg 
154fee23f9Smrg @end deftypefn
164fee23f9Smrg 
174fee23f9Smrg */
184fee23f9Smrg 
194fee23f9Smrg #ifdef HAVE_CONFIG_H
204fee23f9Smrg #include "config.h"
214fee23f9Smrg #endif
224fee23f9Smrg #include "ansidecl.h"
234fee23f9Smrg #include "libiberty.h"
244fee23f9Smrg 
254fee23f9Smrg #include <sys/types.h> /* For size_t. */
264fee23f9Smrg #ifdef HAVE_STRING_H
274fee23f9Smrg #include <string.h>
284fee23f9Smrg #else
294fee23f9Smrg # ifdef HAVE_STRINGS_H
304fee23f9Smrg #  include <strings.h>
314fee23f9Smrg # endif
324fee23f9Smrg #endif
334fee23f9Smrg 
344fee23f9Smrg PTR
xmemdup(const PTR input,size_t copy_size,size_t alloc_size)354fee23f9Smrg xmemdup (const PTR input, size_t copy_size, size_t alloc_size)
364fee23f9Smrg {
37*b17d1066Smrg   PTR output = xmalloc (alloc_size);
38*b17d1066Smrg   if (alloc_size > copy_size)
39*b17d1066Smrg     memset ((char *) output + copy_size, 0, alloc_size - copy_size);
404fee23f9Smrg   return (PTR) memcpy (output, input, copy_size);
414fee23f9Smrg }
42