| [1814] | 1 | /* xmalloc.c -- malloc with out of memory checking | 
|---|
 | 2 |    Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 99 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ | 
|---|
 | 17 |  | 
|---|
 | 18 | #if HAVE_CONFIG_H | 
|---|
 | 19 | # include <config.h> | 
|---|
 | 20 | #endif | 
|---|
 | 21 |  | 
|---|
 | 22 | #if __STDC__ | 
|---|
 | 23 | # define VOID void | 
|---|
 | 24 | #else | 
|---|
 | 25 | # define VOID char | 
|---|
 | 26 | #endif | 
|---|
 | 27 |  | 
|---|
 | 28 | #include <sys/types.h> | 
|---|
 | 29 |  | 
|---|
 | 30 | #if STDC_HEADERS | 
|---|
 | 31 | # include <stdlib.h> | 
|---|
 | 32 | #else | 
|---|
 | 33 | VOID *calloc (); | 
|---|
 | 34 | VOID *malloc (); | 
|---|
 | 35 | VOID *realloc (); | 
|---|
 | 36 | void free (); | 
|---|
 | 37 | #endif | 
|---|
 | 38 |  | 
|---|
 | 39 | #if ENABLE_NLS | 
|---|
 | 40 | # include <libintl.h> | 
|---|
 | 41 | # define _(Text) gettext (Text) | 
|---|
 | 42 | #else | 
|---|
 | 43 | # define textdomain(Domain) | 
|---|
 | 44 | # define _(Text) Text | 
|---|
 | 45 | #endif | 
|---|
 | 46 |  | 
|---|
 | 47 | #include "error.h" | 
|---|
 | 48 |  | 
|---|
 | 49 | #ifndef EXIT_FAILURE | 
|---|
 | 50 | # define EXIT_FAILURE 1 | 
|---|
 | 51 | #endif | 
|---|
 | 52 |  | 
|---|
 | 53 | /* Prototypes for functions defined here.  */ | 
|---|
 | 54 | #if defined (__STDC__) && __STDC__ | 
|---|
 | 55 | static VOID *fixup_null_alloc (size_t n); | 
|---|
 | 56 | VOID *xmalloc (size_t n); | 
|---|
 | 57 | VOID *xcalloc (size_t n, size_t s); | 
|---|
 | 58 | VOID *xrealloc (VOID *p, size_t n); | 
|---|
 | 59 | char *xstrdup (char *p); | 
|---|
 | 60 | #endif | 
|---|
 | 61 |  | 
|---|
 | 62 |  | 
|---|
 | 63 | /* Exit value when the requested amount of memory is not available. | 
|---|
 | 64 |    The caller may set it to some other value.  */ | 
|---|
 | 65 | int xmalloc_exit_failure = EXIT_FAILURE; | 
|---|
 | 66 |  | 
|---|
 | 67 | #if __STDC__ && (HAVE_VPRINTF || HAVE_DOPRNT) | 
|---|
 | 68 | void error (int, int, const char *, ...); | 
|---|
 | 69 | #else | 
|---|
 | 70 | void error (); | 
|---|
 | 71 | #endif | 
|---|
 | 72 |  | 
|---|
 | 73 | static VOID * | 
|---|
 | 74 | fixup_null_alloc (n) | 
|---|
 | 75 |      size_t n; | 
|---|
 | 76 | { | 
|---|
 | 77 |   VOID *p; | 
|---|
 | 78 |  | 
|---|
 | 79 |   p = 0; | 
|---|
 | 80 |   if (n == 0) | 
|---|
 | 81 |     p = malloc ((size_t) 1); | 
|---|
 | 82 |   if (p == 0) | 
|---|
 | 83 |     error (xmalloc_exit_failure, 0, _("Memory exhausted")); | 
|---|
 | 84 |   return p; | 
|---|
 | 85 | } | 
|---|
 | 86 |  | 
|---|
 | 87 | /* Allocate N bytes of memory dynamically, with error checking.  */ | 
|---|
 | 88 |  | 
|---|
 | 89 | VOID * | 
|---|
 | 90 | xmalloc (n) | 
|---|
 | 91 |      size_t n; | 
|---|
 | 92 | { | 
|---|
 | 93 |   VOID *p; | 
|---|
 | 94 |  | 
|---|
 | 95 |   p = malloc (n); | 
|---|
 | 96 |   if (p == 0) | 
|---|
 | 97 |     p = fixup_null_alloc (n); | 
|---|
 | 98 |   return p; | 
|---|
 | 99 | } | 
|---|
 | 100 |  | 
|---|
 | 101 | /* Allocate memory for N elements of S bytes, with error checking.  */ | 
|---|
 | 102 |  | 
|---|
 | 103 | VOID * | 
|---|
 | 104 | xcalloc (n, s) | 
|---|
 | 105 |      size_t n, s; | 
|---|
 | 106 | { | 
|---|
 | 107 |   VOID *p; | 
|---|
 | 108 |  | 
|---|
 | 109 |   p = calloc (n, s); | 
|---|
 | 110 |   if (p == 0) | 
|---|
 | 111 |     p = fixup_null_alloc (n); | 
|---|
 | 112 |   return p; | 
|---|
 | 113 | } | 
|---|
 | 114 |  | 
|---|
 | 115 | /* Change the size of an allocated block of memory P to N bytes, | 
|---|
 | 116 |    with error checking. | 
|---|
 | 117 |    If P is NULL, run xmalloc.  */ | 
|---|
 | 118 |  | 
|---|
 | 119 | VOID * | 
|---|
 | 120 | xrealloc (p, n) | 
|---|
 | 121 |      VOID *p; | 
|---|
 | 122 |      size_t n; | 
|---|
 | 123 | { | 
|---|
 | 124 |   if (p == 0) | 
|---|
 | 125 |     return xmalloc (n); | 
|---|
 | 126 |   p = realloc (p, n); | 
|---|
 | 127 |   if (p == 0) | 
|---|
 | 128 |     p = fixup_null_alloc (n); | 
|---|
 | 129 |   return p; | 
|---|
 | 130 | } | 
|---|
 | 131 |  | 
|---|
 | 132 | /* Make a copy of a string in a newly allocated block of memory. */ | 
|---|
 | 133 |  | 
|---|
 | 134 | char * | 
|---|
 | 135 | xstrdup (str) | 
|---|
 | 136 |      char *str; | 
|---|
 | 137 | { | 
|---|
 | 138 |   VOID *p; | 
|---|
 | 139 |  | 
|---|
 | 140 |   p = xmalloc (strlen (str) + 1); | 
|---|
 | 141 |   strcpy (p, str); | 
|---|
 | 142 |   return p; | 
|---|
 | 143 | } | 
|---|