]> git.ipfire.org Git - thirdparty/bash.git/blame - xmalloc.c
Imported from ../bash-2.05a.tar.gz.
[thirdparty/bash.git] / xmalloc.c
CommitLineData
ccc6cda3
JA
1/* xmalloc.c -- safe versions of malloc and realloc */
2
3/* Copyright (C) 1991 Free Software Foundation, Inc.
4
5 This file is part of GNU Readline, a library for reading lines
6 of text with interactive input and history editing.
7
8 Readline is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
bb70624e 10 Free Software Foundation; either version 2, or (at your option) any
ccc6cda3
JA
11 later version.
12
13 Readline is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Readline; see the file COPYING. If not, write to the Free
bb70624e 20 Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
ccc6cda3
JA
21
22#if defined (HAVE_CONFIG_H)
23#include <config.h>
24#endif
25
d166f048 26#include "bashtypes.h"
ccc6cda3
JA
27#include <stdio.h>
28
29#if defined (HAVE_UNISTD_H)
30# include <unistd.h>
31#endif
32
33#if defined (HAVE_STDLIB_H)
34# include <stdlib.h>
35#else
36# include "ansi_stdlib.h"
37#endif /* HAVE_STDLIB_H */
38
39#include "error.h"
40
41#if !defined (PTR_T)
42# if defined (__STDC__)
43# define PTR_T void *
44# else
45# define PTR_T char *
46# endif /* !__STDC__ */
47#endif /* !PTR_T */
48
f73dda09 49#if defined (HAVE_SBRK) && !HAVE_DECL_SBRK
ccc6cda3
JA
50extern char *sbrk();
51#endif
52
53static PTR_T lbreak;
54static int brkfound;
55static size_t allocated;
56
57/* **************************************************************** */
58/* */
59/* Memory Allocation and Deallocation. */
60/* */
61/* **************************************************************** */
62
b72432fd
JA
63#if defined (HAVE_SBRK)
64static size_t
65findbrk ()
66{
67 if (brkfound == 0)
68 {
69 lbreak = (PTR_T)sbrk (0);
70 brkfound++;
71 }
72 return (char *)sbrk (0) - (char *)lbreak;
73}
74#endif
75
ccc6cda3
JA
76/* Return a pointer to free()able block of memory large enough
77 to hold BYTES number of bytes. If the memory cannot be allocated,
78 print an error message and abort. */
f73dda09 79PTR_T
ccc6cda3
JA
80xmalloc (bytes)
81 size_t bytes;
82{
f73dda09 83 PTR_T temp;
ccc6cda3 84
f73dda09 85 temp = malloc (bytes);
ccc6cda3
JA
86
87 if (temp == 0)
88 {
b72432fd
JA
89#if defined (HAVE_SBRK)
90 allocated = findbrk ();
ccc6cda3 91 fatal_error ("xmalloc: cannot allocate %lu bytes (%lu bytes allocated)", (unsigned long)bytes, (unsigned long)allocated);
b72432fd
JA
92#else
93 fatal_error ("xmalloc: cannot allocate %lu bytes", (unsigned long)bytes);
94#endif /* !HAVE_SBRK */
ccc6cda3
JA
95 }
96
97 return (temp);
98}
99
f73dda09 100PTR_T
ccc6cda3
JA
101xrealloc (pointer, bytes)
102 PTR_T pointer;
103 size_t bytes;
104{
f73dda09 105 PTR_T temp;
ccc6cda3 106
f73dda09 107 temp = pointer ? realloc (pointer, bytes) : malloc (bytes);
ccc6cda3
JA
108
109 if (temp == 0)
110 {
b72432fd
JA
111#if defined (HAVE_SBRK)
112 allocated = findbrk ();
ccc6cda3 113 fatal_error ("xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)", (unsigned long)bytes, (unsigned long)allocated);
b72432fd
JA
114#else
115 fatal_error ("xmalloc: cannot allocate %lu bytes", (unsigned long)bytes);
116#endif /* !HAVE_SBRK */
ccc6cda3
JA
117 }
118
119 return (temp);
120}
121
122/* Use this as the function to call when adding unwind protects so we
123 don't need to know what free() returns. */
124void
125xfree (string)
bb70624e 126 PTR_T string;
ccc6cda3
JA
127{
128 if (string)
129 free (string);
130}
f73dda09
JA
131
132#ifdef USING_BASH_MALLOC
133#include <malloc/shmalloc.h>
134
135PTR_T
136sh_xmalloc (bytes, file, line)
137 size_t bytes;
138 char *file;
139 int line;
140{
141 PTR_T temp;
142
143 temp = sh_malloc (bytes, file, line);
144
145 if (temp == 0)
146 {
147#if defined (HAVE_SBRK)
148 allocated = findbrk ();
149 fatal_error ("xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)", file, line, (unsigned long)bytes, (unsigned long)allocated);
150#else
151 fatal_error ("xmalloc: %s:%d: cannot allocate %lu bytes", file, line, (unsigned long)bytes);
152#endif /* !HAVE_SBRK */
153 }
154
155 return (temp);
156}
157
158PTR_T
159sh_xrealloc (pointer, bytes, file, line)
160 PTR_T pointer;
161 size_t bytes;
162 char *file;
163 int line;
164{
165 PTR_T temp;
166
167 temp = pointer ? sh_realloc (pointer, bytes, file, line) : sh_malloc (bytes, file, line);
168
169 if (temp == 0)
170 {
171#if defined (HAVE_SBRK)
172 allocated = findbrk ();
173 fatal_error ("xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)", file, line, (unsigned long)bytes, (unsigned long)allocated);
174#else
175 fatal_error ("xrealloc: %s:%d: cannot allocate %lu bytes", file, line, (unsigned long)bytes);
176#endif /* !HAVE_SBRK */
177 }
178
179 return (temp);
180}
181
182void
183sh_xfree (string, file, line)
184 PTR_T string;
185 char *file;
186 int line;
187{
188 if (string)
189 sh_free (string, file, line);
190}
191#endif