1/*	$NetBSD: xmalloc.c,v 1.2 2016/01/13 03:39:28 christos Exp $	*/
2
3/* xmalloc.c -- malloc with out of memory checking
4   Copyright (C) 1990-1999, 2000, 2002 Free Software Foundation, Inc.
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software Foundation,
18   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20#if HAVE_CONFIG_H
21# include <config.h>
22#endif
23
24#include <sys/types.h>
25
26#if STDC_HEADERS
27# include <stdlib.h>
28#else
29void *calloc ();
30void *malloc ();
31void *realloc ();
32void free ();
33#endif
34
35#if ENABLE_NLS
36# include <libintl.h>
37# define _(Text) gettext (Text)
38#else
39# define textdomain(Domain)
40# define _(Text) Text
41#endif
42#define N_(Text) Text
43
44#include "error.h"
45#include "exitfail.h"
46#include "xalloc.h"
47
48#ifndef EXIT_FAILURE
49# define EXIT_FAILURE 1
50#endif
51
52#ifndef HAVE_DONE_WORKING_MALLOC_CHECK
53"you must run the autoconf test for a properly working malloc -- see malloc.m4"
54#endif
55
56#ifndef HAVE_DONE_WORKING_REALLOC_CHECK
57"you must run the autoconf test for a properly working realloc --see realloc.m4"
58#endif
59
60/* If non NULL, call this function when memory is exhausted. */
61void (*xalloc_fail_func) PARAMS ((void)) = 0;
62
63/* If XALLOC_FAIL_FUNC is NULL, or does return, display this message
64   before exiting when memory is exhausted.  Goes through gettext. */
65char const xalloc_msg_memory_exhausted[] = N_("memory exhausted");
66
67void
68xalloc_die (void)
69{
70  if (xalloc_fail_func)
71    (*xalloc_fail_func) ();
72  error (exit_failure, 0, "%s", _(xalloc_msg_memory_exhausted));
73  /* The `noreturn' cannot be given to error, since it may return if
74     its first argument is 0.  To help compilers understand the
75     xalloc_die does terminate, call exit. */
76  exit (EXIT_FAILURE);
77}
78
79/* Allocate N bytes of memory dynamically, with error checking.  */
80
81void *
82xmalloc (size_t n)
83{
84  void *p;
85
86  p = malloc (n);
87  if (p == 0 && n)
88    xalloc_die ();
89  return p;
90}
91
92/* Change the size of an allocated block of memory P to N bytes,
93   with error checking.  */
94
95void *
96xrealloc (void *p, size_t n)
97{
98  p = realloc (p, n);
99  if (p == 0 && n)
100    xalloc_die ();
101  return p;
102}
103
104/* Allocate memory for N elements of S bytes, with error checking.  */
105
106void *
107xcalloc (size_t n, size_t s)
108{
109  void *p;
110
111  p = calloc (n, s);
112  if (p == 0 && n && s)
113    xalloc_die ();
114  return p;
115}
116