1/* xmalloc.c -- malloc with out of memory checking
2   Copyright (C) 1990-1996, 2000-2003, 2005 Free Software Foundation, Inc.
3
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 2, or (at your option)
7   any later version.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13
14   You should have received a copy of the GNU General Public License
15   along with this program; if not, write to the Free Software Foundation,
16   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
17
18#ifdef HAVE_CONFIG_H
19# include <config.h>
20#endif
21
22/* Specification.  */
23#include "xalloc.h"
24
25#include <stdlib.h>
26
27#include "error.h"
28#include "exit.h"
29#include "gettext.h"
30
31#define _(str) gettext (str)
32
33
34/* Exit value when the requested amount of memory is not available.
35   The caller may set it to some other value.  */
36int xmalloc_exit_failure = EXIT_FAILURE;
37
38void
39xalloc_die ()
40{
41  error (xmalloc_exit_failure, 0, _("memory exhausted"));
42  /* The `noreturn' cannot be given to error, since it may return if
43     its first argument is 0.  To help compilers understand the
44     xalloc_die does terminate, call exit. */
45  exit (EXIT_FAILURE);
46}
47
48static void *
49fixup_null_alloc (size_t n)
50{
51  void *p;
52
53  p = 0;
54  if (n == 0)
55    p = malloc ((size_t) 1);
56  if (p == NULL)
57    xalloc_die ();
58  return p;
59}
60
61/* Allocate N bytes of memory dynamically, with error checking.  */
62
63void *
64xmalloc (size_t n)
65{
66  void *p;
67
68  p = malloc (n);
69  if (p == NULL)
70    p = fixup_null_alloc (n);
71  return p;
72}
73
74/* Allocate memory for N elements of S bytes, with error checking.  */
75
76void *
77xcalloc (size_t n, size_t s)
78{
79  void *p;
80
81  p = calloc (n, s);
82  if (p == NULL)
83    p = fixup_null_alloc (n);
84  return p;
85}
86
87/* Change the size of an allocated block of memory P to N bytes,
88   with error checking.
89   If P is NULL, run xmalloc.  */
90
91void *
92xrealloc (void *p, size_t n)
93{
94  if (p == NULL)
95    return xmalloc (n);
96  p = realloc (p, n);
97  if (p == NULL)
98    p = fixup_null_alloc (n);
99  return p;
100}
101