|
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 |
}
|