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