Blame gnulib/lib/xmalloc.c

Packit Service 51e54d
/* xmalloc.c -- malloc with out of memory checking
Packit Service 51e54d
Packit Service 51e54d
   Copyright (C) 1990-2000, 2002-2006, 2008-2014 Free Software Foundation, Inc.
Packit Service 51e54d
Packit Service 51e54d
   This program is free software: you can redistribute it and/or modify
Packit Service 51e54d
   it under the terms of the GNU General Public License as published by
Packit Service 51e54d
   the Free Software Foundation; either version 3 of the License, or
Packit Service 51e54d
   (at your option) any later version.
Packit Service 51e54d
Packit Service 51e54d
   This program is distributed in the hope that it will be useful,
Packit Service 51e54d
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 51e54d
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 51e54d
   GNU General Public License for more details.
Packit Service 51e54d
Packit Service 51e54d
   You should have received a copy of the GNU General Public License
Packit Service 51e54d
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 51e54d
Packit Service 51e54d
#include <config.h>
Packit Service 51e54d
Packit Service 51e54d
#define XALLOC_INLINE _GL_EXTERN_INLINE
Packit Service 51e54d
Packit Service 51e54d
#include "xalloc.h"
Packit Service 51e54d
Packit Service 51e54d
#include <stdlib.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
Packit Service 51e54d
/* 1 if calloc is known to be compatible with GNU calloc.  This
Packit Service 51e54d
   matters if we are not also using the calloc module, which defines
Packit Service 51e54d
   HAVE_CALLOC_GNU and supports the GNU API even on non-GNU platforms.  */
Packit Service 51e54d
#if defined HAVE_CALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__)
Packit Service 51e54d
enum { HAVE_GNU_CALLOC = 1 };
Packit Service 51e54d
#else
Packit Service 51e54d
enum { HAVE_GNU_CALLOC = 0 };
Packit Service 51e54d
#endif
Packit Service 51e54d
Packit Service 51e54d
/* Allocate N bytes of memory dynamically, with error checking.  */
Packit Service 51e54d
Packit Service 51e54d
void *
Packit Service 51e54d
xmalloc (size_t n)
Packit Service 51e54d
{
Packit Service 51e54d
  void *p = malloc (n);
Packit Service 51e54d
  if (!p && n != 0)
Packit Service 51e54d
    xalloc_die ();
Packit Service 51e54d
  return p;
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
/* Change the size of an allocated block of memory P to N bytes,
Packit Service 51e54d
   with error checking.  */
Packit Service 51e54d
Packit Service 51e54d
void *
Packit Service 51e54d
xrealloc (void *p, size_t n)
Packit Service 51e54d
{
Packit Service 51e54d
  if (!n && p)
Packit Service 51e54d
    {
Packit Service 51e54d
      /* The GNU and C99 realloc behaviors disagree here.  Act like
Packit Service 51e54d
         GNU, even if the underlying realloc is C99.  */
Packit Service 51e54d
      free (p);
Packit Service 51e54d
      return NULL;
Packit Service 51e54d
    }
Packit Service 51e54d
Packit Service 51e54d
  p = realloc (p, n);
Packit Service 51e54d
  if (!p && n)
Packit Service 51e54d
    xalloc_die ();
Packit Service 51e54d
  return p;
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
/* If P is null, allocate a block of at least *PN bytes; otherwise,
Packit Service 51e54d
   reallocate P so that it contains more than *PN bytes.  *PN must be
Packit Service 51e54d
   nonzero unless P is null.  Set *PN to the new block's size, and
Packit Service 51e54d
   return the pointer to the new block.  *PN is never set to zero, and
Packit Service 51e54d
   the returned pointer is never null.  */
Packit Service 51e54d
Packit Service 51e54d
void *
Packit Service 51e54d
x2realloc (void *p, size_t *pn)
Packit Service 51e54d
{
Packit Service 51e54d
  return x2nrealloc (p, pn, 1);
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
/* Allocate S bytes of zeroed memory dynamically, with error checking.
Packit Service 51e54d
   There's no need for xnzalloc (N, S), since it would be equivalent
Packit Service 51e54d
   to xcalloc (N, S).  */
Packit Service 51e54d
Packit Service 51e54d
void *
Packit Service 51e54d
xzalloc (size_t s)
Packit Service 51e54d
{
Packit Service 51e54d
  return memset (xmalloc (s), 0, s);
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
/* Allocate zeroed memory for N elements of S bytes, with error
Packit Service 51e54d
   checking.  S must be nonzero.  */
Packit Service 51e54d
Packit Service 51e54d
void *
Packit Service 51e54d
xcalloc (size_t n, size_t s)
Packit Service 51e54d
{
Packit Service 51e54d
  void *p;
Packit Service 51e54d
  /* Test for overflow, since some calloc implementations don't have
Packit Service 51e54d
     proper overflow checks.  But omit overflow and size-zero tests if
Packit Service 51e54d
     HAVE_GNU_CALLOC, since GNU calloc catches overflow and never
Packit Service 51e54d
     returns NULL if successful.  */
Packit Service 51e54d
  if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s))
Packit Service 51e54d
      || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0)))
Packit Service 51e54d
    xalloc_die ();
Packit Service 51e54d
  return p;
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
/* Clone an object P of size S, with error checking.  There's no need
Packit Service 51e54d
   for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any
Packit Service 51e54d
   need for an arithmetic overflow check.  */
Packit Service 51e54d
Packit Service 51e54d
void *
Packit Service 51e54d
xmemdup (void const *p, size_t s)
Packit Service 51e54d
{
Packit Service 51e54d
  return memcpy (xmalloc (s), p, s);
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
/* Clone STRING.  */
Packit Service 51e54d
Packit Service 51e54d
char *
Packit Service 51e54d
xstrdup (char const *string)
Packit Service 51e54d
{
Packit Service 51e54d
  return xmemdup (string, strlen (string) + 1);
Packit Service 51e54d
}