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