source: trunk/third/bash/xmalloc.c @ 18290

Revision 18290, 4.4 KB checked in by zacheiss, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18289, which included commits to RCS files with non-trunk default branches.
Line 
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
10   Free Software Foundation; either version 2, or (at your option) any
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
20   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
21
22#if defined (HAVE_CONFIG_H)
23#include <config.h>
24#endif
25
26#include "bashtypes.h"
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
49#if defined (HAVE_SBRK) && !HAVE_DECL_SBRK
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
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
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. */
79PTR_T
80xmalloc (bytes)
81     size_t bytes;
82{
83  PTR_T temp;
84
85  temp = malloc (bytes);
86
87  if (temp == 0)
88    {
89#if defined (HAVE_SBRK)
90      allocated = findbrk ();
91      fatal_error ("xmalloc: cannot allocate %lu bytes (%lu bytes allocated)", (unsigned long)bytes, (unsigned long)allocated);
92#else
93      fatal_error ("xmalloc: cannot allocate %lu bytes", (unsigned long)bytes);
94#endif /* !HAVE_SBRK */
95    }
96
97  return (temp);
98}
99
100PTR_T
101xrealloc (pointer, bytes)
102     PTR_T pointer;
103     size_t bytes;
104{
105  PTR_T temp;
106
107  temp = pointer ? realloc (pointer, bytes) : malloc (bytes);
108
109  if (temp == 0)
110    {
111#if defined (HAVE_SBRK)
112      allocated = findbrk ();
113      fatal_error ("xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)", (unsigned long)bytes, (unsigned long)allocated);
114#else
115      fatal_error ("xrealloc: cannot allocate %lu bytes", (unsigned long)bytes);
116#endif /* !HAVE_SBRK */
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)
126     PTR_T string;
127{
128  if (string)
129    free (string);
130}
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
Note: See TracBrowser for help on using the repository browser.