Added gitignore entries needed to ignore derived objects generated from full build...
[bash.git] / xmalloc.c
blob2344d2d54ec62edfe13b4549aa09d48cc8bfb748
1 /* xmalloc.c -- safe versions of malloc and realloc */
3 /* Copyright (C) 1991-2009 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the GNU Bourne Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
21 #if defined (HAVE_CONFIG_H)
22 #include <config.h>
23 #endif
25 #include "bashtypes.h"
26 #include <stdio.h>
28 #if defined (HAVE_UNISTD_H)
29 # include <unistd.h>
30 #endif
32 #if defined (HAVE_STDLIB_H)
33 # include <stdlib.h>
34 #else
35 # include "ansi_stdlib.h"
36 #endif /* HAVE_STDLIB_H */
38 #include "error.h"
40 #include "bashintl.h"
42 #if !defined (PTR_T)
43 # if defined (__STDC__)
44 # define PTR_T void *
45 # else
46 # define PTR_T char *
47 # endif /* !__STDC__ */
48 #endif /* !PTR_T */
50 #if defined (HAVE_SBRK) && !HAVE_DECL_SBRK
51 extern char *sbrk();
52 #endif
54 static PTR_T lbreak;
55 static int brkfound;
56 static size_t allocated;
58 /* **************************************************************** */
59 /* */
60 /* Memory Allocation and Deallocation. */
61 /* */
62 /* **************************************************************** */
64 #if defined (HAVE_SBRK)
65 #define FINDBRK() \
66 do { \
67 if (brkfound == 0) \
68 { \
69 lbreak = (PTR_T)sbrk (0); \
70 brkfound++; \
71 } \
72 } while (0)
74 static size_t
75 findbrk ()
77 FINDBRK();
78 return (char *)sbrk (0) - (char *)lbreak;
80 #else
81 #define FINDBRK()
82 #endif
84 static void
85 allocerr (func, bytes)
86 const char *func;
87 size_t bytes;
89 #if defined (HAVE_SBRK)
90 allocated = findbrk ();
91 fatal_error (_("%s: cannot allocate %lu bytes (%lu bytes allocated)"), func, (unsigned long)bytes, (unsigned long)allocated);
92 #else
93 fatal_error (_("%s: cannot allocate %lu bytes"), func, (unsigned long)bytes);
94 #endif /* !HAVE_SBRK */
97 /* Return a pointer to free()able block of memory large enough
98 to hold BYTES number of bytes. If the memory cannot be allocated,
99 print an error message and abort. */
100 PTR_T
101 xmalloc (bytes)
102 size_t bytes;
104 PTR_T temp;
106 #if defined (DEBUG)
107 if (bytes == 0)
108 internal_warning("xmalloc: size argument is 0");
109 #endif
111 FINDBRK();
112 temp = malloc (bytes);
114 if (temp == 0)
115 allocerr ("xmalloc", bytes);
117 return (temp);
120 PTR_T
121 xrealloc (pointer, bytes)
122 PTR_T pointer;
123 size_t bytes;
125 PTR_T temp;
127 #if defined (DEBUG)
128 if (bytes == 0)
129 internal_warning("xrealloc: size argument is 0");
130 #endif
132 FINDBRK();
133 temp = pointer ? realloc (pointer, bytes) : malloc (bytes);
135 if (temp == 0)
136 allocerr ("xrealloc", bytes);
138 return (temp);
141 /* Use this as the function to call when adding unwind protects so we
142 don't need to know what free() returns. */
143 void
144 xfree (string)
145 PTR_T string;
147 if (string)
148 free (string);
151 #ifdef USING_BASH_MALLOC
152 #include <malloc/shmalloc.h>
154 static void
155 sh_allocerr (func, bytes, file, line)
156 const char *func;
157 size_t bytes;
158 char *file;
159 int line;
161 #if defined (HAVE_SBRK)
162 allocated = findbrk ();
163 fatal_error (_("%s: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"), func, file, line, (unsigned long)bytes, (unsigned long)allocated);
164 #else
165 fatal_error (_("%s: %s:%d: cannot allocate %lu bytes"), func, file, line, (unsigned long)bytes);
166 #endif /* !HAVE_SBRK */
169 PTR_T
170 sh_xmalloc (bytes, file, line)
171 size_t bytes;
172 char *file;
173 int line;
175 PTR_T temp;
177 #if defined (DEBUG)
178 if (bytes == 0)
179 internal_warning("xmalloc: %s:%d: size argument is 0", file, line);
180 #endif
182 FINDBRK();
183 temp = sh_malloc (bytes, file, line);
185 if (temp == 0)
186 sh_allocerr ("xmalloc", bytes, file, line);
188 return (temp);
191 PTR_T
192 sh_xrealloc (pointer, bytes, file, line)
193 PTR_T pointer;
194 size_t bytes;
195 char *file;
196 int line;
198 PTR_T temp;
200 #if defined (DEBUG)
201 if (bytes == 0)
202 internal_warning("xrealloc: %s:%d: size argument is 0", file, line);
203 #endif
205 FINDBRK();
206 temp = pointer ? sh_realloc (pointer, bytes, file, line) : sh_malloc (bytes, file, line);
208 if (temp == 0)
209 sh_allocerr ("xrealloc", bytes, file, line);
211 return (temp);
214 void
215 sh_xfree (string, file, line)
216 PTR_T string;
217 char *file;
218 int line;
220 if (string)
221 sh_free (string, file, line);
223 #endif