1/* xmalloc.c -- malloc with out of memory checking
2   Copyright (C) 1990-1996, 2000-2003, 2005-2006 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#include <config.h>
19
20/* Specification.  */
21#include "xalloc.h"
22
23#include <stdlib.h>
24
25#include "error.h"
26#include "exit.h"
27#include "gettext.h"
28
29#define _(str) gettext (str)
30
31
32/* Exit value when the requested amount of memory is not available.
33   The caller may set it to some other value.  */
34int xmalloc_exit_failure = EXIT_FAILURE;
35
36void
37xalloc_die ()
38{
39  error (xmalloc_exit_failure, 0, _("memory exhausted"));
40  /* The `noreturn' cannot be given to error, since it may return if
41     its first argument is 0.  To help compilers understand the
42     xalloc_die does terminate, call exit. */
43  exit (EXIT_FAILURE);
44}
45
46static void *
47fixup_null_alloc (size_t n)
48{
49  void *p;
50
51  p = 0;
52  if (n == 0)
53    p = malloc ((size_t) 1);
54  if (p == NULL)
55    xalloc_die ();
56  return p;
57}
58
59/* Allocate N bytes of memory dynamically, with error checking.  */
60
61void *
62xmalloc (size_t n)
63{
64  void *p;
65
66  p = malloc (n);
67  if (p == NULL)
68    p = fixup_null_alloc (n);
69  return p;
70}
71
72/* Allocate SIZE bytes of memory dynamically, with error checking,
73   and zero it.  */
74
75void *
76xzalloc (size_t size)
77{
78  void *p;
79
80  p = xmalloc (size);
81  memset (p, 0, size);
82  return p;
83}
84
85/* Allocate memory for N elements of S bytes, with error checking,
86   and zero it.  */
87
88void *
89xcalloc (size_t n, size_t s)
90{
91  void *p;
92
93  p = calloc (n, s);
94  if (p == NULL)
95    p = fixup_null_alloc (n);
96  return p;
97}
98
99/* Change the size of an allocated block of memory P to N bytes,
100   with error checking.
101   If P is NULL, run xmalloc.  */
102
103void *
104xrealloc (void *p, size_t n)
105{
106  if (p == NULL)
107    return xmalloc (n);
108  p = realloc (p, n);
109  if (p == NULL)
110    p = fixup_null_alloc (n);
111  return p;
112}
113