Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5191 | serge | 1 | /* memory allocation routines with error checking. |
2 | Copyright 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. |
||
3 | |||
4 | This file is part of the libiberty library. |
||
5 | Libiberty is free software; you can redistribute it and/or |
||
6 | modify it under the terms of the GNU Library General Public |
||
7 | License as published by the Free Software Foundation; either |
||
8 | version 2 of the License, or (at your option) any later version. |
||
9 | |||
10 | Libiberty is distributed in the hope that it will be useful, |
||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||
13 | Library General Public License for more details. |
||
14 | |||
15 | You should have received a copy of the GNU Library General Public |
||
16 | License along with libiberty; see the file COPYING.LIB. If |
||
17 | not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
||
18 | Boston, MA 02110-1301, USA. */ |
||
19 | |||
20 | /* |
||
21 | |||
22 | @deftypefn Replacement void* xmalloc (size_t) |
||
23 | |||
24 | Allocate memory without fail. If @code{malloc} fails, this will print |
||
25 | a message to @code{stderr} (using the name set by |
||
26 | @code{xmalloc_set_program_name}, |
||
27 | if any) and then call @code{xexit}. Note that it is therefore safe for |
||
28 | a program to contain @code{#define malloc xmalloc} in its source. |
||
29 | |||
30 | @end deftypefn |
||
31 | |||
32 | @deftypefn Replacement void* xrealloc (void *@var{ptr}, size_t @var{size}) |
||
33 | Reallocate memory without fail. This routine functions like @code{realloc}, |
||
34 | but will behave the same as @code{xmalloc} if memory cannot be found. |
||
35 | |||
36 | @end deftypefn |
||
37 | |||
38 | @deftypefn Replacement void* xcalloc (size_t @var{nelem}, size_t @var{elsize}) |
||
39 | |||
40 | Allocate memory without fail, and set it to zero. This routine functions |
||
41 | like @code{calloc}, but will behave the same as @code{xmalloc} if memory |
||
42 | cannot be found. |
||
43 | |||
44 | @end deftypefn |
||
45 | |||
46 | @deftypefn Replacement void xmalloc_set_program_name (const char *@var{name}) |
||
47 | |||
48 | You can use this to set the name of the program used by |
||
49 | @code{xmalloc_failed} when printing a failure message. |
||
50 | |||
51 | @end deftypefn |
||
52 | |||
53 | @deftypefn Replacement void xmalloc_failed (size_t) |
||
54 | |||
55 | This function is not meant to be called by client code, and is listed |
||
56 | here for completeness only. If any of the allocation routines fail, this |
||
57 | function will be called to print an error message and terminate execution. |
||
58 | |||
59 | @end deftypefn |
||
60 | |||
61 | */ |
||
62 | |||
63 | #ifdef HAVE_CONFIG_H |
||
64 | #include "config.h" |
||
65 | #endif |
||
66 | #include "ansidecl.h" |
||
67 | #include "libiberty.h" |
||
68 | |||
69 | #include |
||
70 | |||
71 | #include |
||
72 | |||
73 | #if VMS |
||
74 | #include |
||
75 | #include |
||
76 | #else |
||
77 | /* For systems with larger pointers than ints, these must be declared. */ |
||
78 | # if HAVE_STDLIB_H && HAVE_UNISTD_H && HAVE_DECL_MALLOC \ |
||
79 | && HAVE_DECL_REALLOC && HAVE_DECL_CALLOC && HAVE_DECL_SBRK |
||
80 | # include |
||
81 | # include |
||
82 | # else |
||
83 | # ifdef __cplusplus |
||
84 | extern "C" { |
||
85 | # endif /* __cplusplus */ |
||
86 | void *malloc (size_t); |
||
87 | void *realloc (void *, size_t); |
||
88 | void *calloc (size_t, size_t); |
||
89 | void *sbrk (ptrdiff_t); |
||
90 | # ifdef __cplusplus |
||
91 | } |
||
92 | # endif /* __cplusplus */ |
||
93 | # endif /* HAVE_STDLIB_H ... */ |
||
94 | #endif /* VMS */ |
||
95 | |||
96 | /* The program name if set. */ |
||
97 | static const char *name = ""; |
||
98 | |||
99 | #ifdef HAVE_SBRK |
||
100 | /* The initial sbrk, set when the program name is set. Not used for win32 |
||
101 | ports other than cygwin32. */ |
||
102 | static char *first_break = NULL; |
||
103 | #endif /* HAVE_SBRK */ |
||
104 | |||
105 | void |
||
106 | xmalloc_set_program_name (const char *s) |
||
107 | { |
||
108 | name = s; |
||
109 | #ifdef HAVE_SBRK |
||
110 | /* Win32 ports other than cygwin32 don't have brk() */ |
||
111 | if (first_break == NULL) |
||
112 | first_break = (char *) sbrk (0); |
||
113 | #endif /* HAVE_SBRK */ |
||
114 | } |
||
115 | |||
116 | void |
||
117 | xmalloc_failed (size_t size) |
||
118 | { |
||
119 | #ifdef HAVE_SBRK |
||
120 | extern char **environ; |
||
121 | size_t allocated; |
||
122 | |||
123 | if (first_break != NULL) |
||
124 | allocated = (char *) sbrk (0) - first_break; |
||
125 | else |
||
126 | allocated = (char *) sbrk (0) - (char *) &environ; |
||
127 | fprintf (stderr, |
||
128 | "\n%s%sout of memory allocating %lu bytes after a total of %lu bytes\n", |
||
129 | name, *name ? ": " : "", |
||
130 | (unsigned long) size, (unsigned long) allocated); |
||
131 | #else /* HAVE_SBRK */ |
||
132 | fprintf (stderr, |
||
133 | "\n%s%sout of memory allocating %lu bytes\n", |
||
134 | name, *name ? ": " : "", |
||
135 | (unsigned long) size); |
||
136 | #endif /* HAVE_SBRK */ |
||
137 | xexit (1); |
||
138 | } |
||
139 | |||
140 | PTR |
||
141 | xmalloc (size_t size) |
||
142 | { |
||
143 | PTR newmem; |
||
144 | |||
145 | if (size == 0) |
||
146 | size = 1; |
||
147 | newmem = malloc (size); |
||
148 | if (!newmem) |
||
149 | xmalloc_failed (size); |
||
150 | |||
151 | return (newmem); |
||
152 | } |
||
153 | |||
154 | PTR |
||
155 | xcalloc (size_t nelem, size_t elsize) |
||
156 | { |
||
157 | PTR newmem; |
||
158 | |||
159 | if (nelem == 0 || elsize == 0) |
||
160 | nelem = elsize = 1; |
||
161 | |||
162 | newmem = calloc (nelem, elsize); |
||
163 | if (!newmem) |
||
164 | xmalloc_failed (nelem * elsize); |
||
165 | |||
166 | return (newmem); |
||
167 | } |
||
168 | |||
169 | PTR |
||
170 | xrealloc (PTR oldmem, size_t size) |
||
171 | { |
||
172 | PTR newmem; |
||
173 | |||
174 | if (size == 0) |
||
175 | size = 1; |
||
176 | if (!oldmem) |
||
177 | newmem = malloc (size); |
||
178 | else |
||
179 | newmem = realloc (oldmem, size); |
||
180 | if (!newmem) |
||
181 | xmalloc_failed (size); |
||
182 | |||
183 | return (newmem); |
||
184 | } |