Blame gettext-runtime/gnulib-lib/xmalloc.c

Packit 5b56b6
/* xmalloc.c -- malloc with out of memory checking
Packit 5b56b6
   Copyright (C) 1990-1996, 2000-2003, 2005-2007, 2012, 2015 Free
Packit 5b56b6
   Software Foundation, Inc.
Packit 5b56b6
Packit 5b56b6
   This program is free software: you can redistribute it and/or modify
Packit 5b56b6
   it under the terms of the GNU General Public License as published by
Packit 5b56b6
   the Free Software Foundation; either version 3 of the License, or
Packit 5b56b6
   (at your option) any later version.
Packit 5b56b6
Packit 5b56b6
   This program is distributed in the hope that it will be useful,
Packit 5b56b6
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5b56b6
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 5b56b6
   GNU General Public License for more details.
Packit 5b56b6
Packit 5b56b6
   You should have received a copy of the GNU General Public License
Packit 5b56b6
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit 5b56b6
Packit 5b56b6
#include <config.h>
Packit 5b56b6
Packit 5b56b6
/* Specification.  */
Packit 5b56b6
#include "xalloc.h"
Packit 5b56b6
Packit 5b56b6
#include <stdlib.h>
Packit 5b56b6
Packit 5b56b6
#include "error.h"
Packit 5b56b6
#include "gettext.h"
Packit 5b56b6
Packit 5b56b6
#define _(str) gettext (str)
Packit 5b56b6
Packit 5b56b6
Packit 5b56b6
/* Exit value when the requested amount of memory is not available.
Packit 5b56b6
   The caller may set it to some other value.  */
Packit 5b56b6
int xmalloc_exit_failure = EXIT_FAILURE;
Packit 5b56b6
Packit 5b56b6
void
Packit 5b56b6
xalloc_die ()
Packit 5b56b6
{
Packit 5b56b6
  error (xmalloc_exit_failure, 0, _("memory exhausted"));
Packit 5b56b6
  /* _Noreturn cannot be given to error, since it may return if
Packit 5b56b6
     its first argument is 0.  To help compilers understand the
Packit 5b56b6
     xalloc_die does terminate, call exit. */
Packit 5b56b6
  exit (EXIT_FAILURE);
Packit 5b56b6
}
Packit 5b56b6
Packit 5b56b6
static void *
Packit 5b56b6
fixup_null_alloc (size_t n)
Packit 5b56b6
{
Packit 5b56b6
  void *p;
Packit 5b56b6
Packit 5b56b6
  p = NULL;
Packit 5b56b6
  if (n == 0)
Packit 5b56b6
    p = malloc ((size_t) 1);
Packit 5b56b6
  if (p == NULL)
Packit 5b56b6
    xalloc_die ();
Packit 5b56b6
  return p;
Packit 5b56b6
}
Packit 5b56b6
Packit 5b56b6
/* Allocate N bytes of memory dynamically, with error checking.  */
Packit 5b56b6
Packit 5b56b6
void *
Packit 5b56b6
xmalloc (size_t n)
Packit 5b56b6
{
Packit 5b56b6
  void *p;
Packit 5b56b6
Packit 5b56b6
  p = malloc (n);
Packit 5b56b6
  if (p == NULL)
Packit 5b56b6
    p = fixup_null_alloc (n);
Packit 5b56b6
  return p;
Packit 5b56b6
}
Packit 5b56b6
Packit 5b56b6
/* Allocate memory for NMEMB elements of SIZE bytes, with error checking.
Packit 5b56b6
   SIZE must be > 0.  */
Packit 5b56b6
Packit 5b56b6
void *
Packit 5b56b6
xnmalloc (size_t nmemb, size_t size)
Packit 5b56b6
{
Packit 5b56b6
  size_t n;
Packit 5b56b6
  void *p;
Packit 5b56b6
Packit 5b56b6
  if (xalloc_oversized (nmemb, size))
Packit 5b56b6
    xalloc_die ();
Packit 5b56b6
  n = nmemb * size;
Packit 5b56b6
  p = malloc (n);
Packit 5b56b6
  if (p == NULL)
Packit 5b56b6
    p = fixup_null_alloc (n);
Packit 5b56b6
  return p;
Packit 5b56b6
}
Packit 5b56b6
Packit 5b56b6
/* Allocate SIZE bytes of memory dynamically, with error checking,
Packit 5b56b6
   and zero it.  */
Packit 5b56b6
Packit 5b56b6
void *
Packit 5b56b6
xzalloc (size_t size)
Packit 5b56b6
{
Packit 5b56b6
  void *p;
Packit 5b56b6
Packit 5b56b6
  p = xmalloc (size);
Packit 5b56b6
  memset (p, 0, size);
Packit 5b56b6
  return p;
Packit 5b56b6
}
Packit 5b56b6
Packit 5b56b6
/* Allocate memory for N elements of S bytes, with error checking,
Packit 5b56b6
   and zero it.  */
Packit 5b56b6
Packit 5b56b6
void *
Packit 5b56b6
xcalloc (size_t n, size_t s)
Packit 5b56b6
{
Packit 5b56b6
  void *p;
Packit 5b56b6
Packit 5b56b6
  p = calloc (n, s);
Packit 5b56b6
  if (p == NULL)
Packit 5b56b6
    p = fixup_null_alloc (n);
Packit 5b56b6
  return p;
Packit 5b56b6
}
Packit 5b56b6
Packit 5b56b6
/* Change the size of an allocated block of memory P to N bytes,
Packit 5b56b6
   with error checking.
Packit 5b56b6
   If P is NULL, run xmalloc.  */
Packit 5b56b6
Packit 5b56b6
void *
Packit 5b56b6
xrealloc (void *p, size_t n)
Packit 5b56b6
{
Packit 5b56b6
  if (p == NULL)
Packit 5b56b6
    return xmalloc (n);
Packit 5b56b6
  p = realloc (p, n);
Packit 5b56b6
  if (p == NULL)
Packit 5b56b6
    p = fixup_null_alloc (n);
Packit 5b56b6
  return p;
Packit 5b56b6
}