Blame gnulib/lib/xmalloc.c

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