(_obstack) [!defined _LIBC]: Remove; not used.
[kopensolaris-gnu/glibc.git] / malloc / obstack.c
1 /* obstack.c - subroutines used implicitly by object stack macros
2    Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4    This file is part of the GNU C Library.  Its master source is NOT part of
5    the C library, however.  The master source lives in /gd/gnu/lib.
6
7    The GNU C Library is free software; you can redistribute it and/or
8    modify it under the terms of the GNU Lesser General Public
9    License as published by the Free Software Foundation; either
10    version 2.1 of the License, or (at your option) any later version.
11
12    The GNU C Library 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 GNU
15    Lesser General Public License for more details.
16
17    You should have received a copy of the GNU Lesser General Public
18    License along with the GNU C Library; if not, write to the Free
19    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20    02111-1307 USA.  */
21
22 #ifdef HAVE_CONFIG_H
23 # include <config.h>
24 #endif
25
26 #ifdef _LIBC
27 # include <obstack.h>
28 #else
29 # include "obstack.h"
30 #endif
31
32 /* NOTE BEFORE MODIFYING THIS FILE: This version number must be
33    incremented whenever callers compiled using an old obstack.h can no
34    longer properly call the functions in this obstack.c.  */
35 #define OBSTACK_INTERFACE_VERSION 1
36
37 /* Comment out all this code if we are using the GNU C Library, and are not
38    actually compiling the library itself, and the installed library
39    supports the same library interface we do.  This code is part of the GNU
40    C Library, but also included in many other GNU distributions.  Compiling
41    and linking in this code is a waste when using the GNU C library
42    (especially if it is a shared library).  Rather than having every GNU
43    program understand `configure --with-gnu-libc' and omit the object
44    files, it is simpler to just do this in the source for each such file.  */
45
46 #include <stdio.h>              /* Random thing to get __GNU_LIBRARY__.  */
47 #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
48 # include <gnu-versions.h>
49 # if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
50 #  define ELIDE_CODE
51 # endif
52 #endif
53
54 #if defined _LIBC && defined USE_IN_LIBIO
55 # include <wchar.h>
56 #endif
57
58 #ifndef ELIDE_CODE
59
60
61 /* Determine default alignment.  */
62 struct fooalign {char x; double d;};
63 # define DEFAULT_ALIGNMENT  \
64   ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
65 /* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
66    But in fact it might be less smart and round addresses to as much as
67    DEFAULT_ROUNDING.  So we prepare for it to do that.  */
68 union fooround {long x; double d;};
69 # define DEFAULT_ROUNDING (sizeof (union fooround))
70
71 /* When we copy a long block of data, this is the unit to do it with.
72    On some machines, copying successive ints does not work;
73    in such a case, redefine COPYING_UNIT to `long' (if that works)
74    or `char' as a last resort.  */
75 # ifndef COPYING_UNIT
76 #  define COPYING_UNIT int
77 # endif
78
79
80 /* The functions allocating more room by calling `obstack_chunk_alloc'
81    jump to the handler pointed to by `obstack_alloc_failed_handler'.
82    This can be set to a user defined function which should either
83    abort gracefully or use longjump - but shouldn't return.  This
84    variable by default points to the internal function
85    `print_and_abort'.  */
86 static void print_and_abort (void);
87 void (*obstack_alloc_failed_handler) (void) = print_and_abort;
88
89 /* Exit value used when `print_and_abort' is used.  */
90 # include <stdlib.h>
91 # ifdef _LIBC
92 int obstack_exit_failure = EXIT_FAILURE;
93 # else
94 #  include "exitfail.h"
95 #  define obstack_exit_failure exit_failure
96 # endif
97
98 # ifdef _LIBC
99 /* A looong time ago (before 1994, anyway; we're not sure) this global variable
100    was used by non-GNU-C macros to avoid multiple evaluation.  The GNU C
101    library still exports it because somebody might use it.  */
102 struct obstack *_obstack;
103 # endif
104
105 /* Define a macro that either calls functions with the traditional malloc/free
106    calling interface, or calls functions with the mmalloc/mfree interface
107    (that adds an extra first argument), based on the state of use_extra_arg.
108    For free, do not use ?:, since some compilers, like the MIPS compilers,
109    do not allow (expr) ? void : void.  */
110
111 # define CALL_CHUNKFUN(h, size) \
112   (((h) -> use_extra_arg) \
113    ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
114    : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
115
116 # define CALL_FREEFUN(h, old_chunk) \
117   do { \
118     if ((h) -> use_extra_arg) \
119       (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
120     else \
121       (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
122   } while (0)
123
124 \f
125 /* Initialize an obstack H for use.  Specify chunk size SIZE (0 means default).
126    Objects start on multiples of ALIGNMENT (0 means use default).
127    CHUNKFUN is the function to use to allocate chunks,
128    and FREEFUN the function to free them.
129
130    Return nonzero if successful, calls obstack_alloc_failed_handler if
131    allocation fails.  */
132
133 int
134 _obstack_begin (struct obstack *h,
135                 int size, int alignment,
136                 void *(*chunkfun) (long),
137                 void (*freefun) (void *))
138 {
139   register struct _obstack_chunk *chunk; /* points to new chunk */
140
141   if (alignment == 0)
142     alignment = (int) DEFAULT_ALIGNMENT;
143   if (size == 0)
144     /* Default size is what GNU malloc can fit in a 4096-byte block.  */
145     {
146       /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
147          Use the values for range checking, because if range checking is off,
148          the extra bytes won't be missed terribly, but if range checking is on
149          and we used a larger request, a whole extra 4096 bytes would be
150          allocated.
151
152          These number are irrelevant to the new GNU malloc.  I suspect it is
153          less sensitive to the size of the request.  */
154       int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
155                     + 4 + DEFAULT_ROUNDING - 1)
156                    & ~(DEFAULT_ROUNDING - 1));
157       size = 4096 - extra;
158     }
159
160   h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
161   h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
162   h->chunk_size = size;
163   h->alignment_mask = alignment - 1;
164   h->use_extra_arg = 0;
165
166   chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
167   if (!chunk)
168     (*obstack_alloc_failed_handler) ();
169   h->next_free = h->object_base = chunk->contents;
170   h->chunk_limit = chunk->limit
171     = (char *) chunk + h->chunk_size;
172   chunk->prev = 0;
173   /* The initial chunk now contains no empty object.  */
174   h->maybe_empty_object = 0;
175   h->alloc_failed = 0;
176   return 1;
177 }
178
179 int
180 _obstack_begin_1 (struct obstack *h, int size, int alignment,
181                   void *(*chunkfun) (void *, long),
182                   void (*freefun) (void *, void *),
183                   void *arg)
184 {
185   register struct _obstack_chunk *chunk; /* points to new chunk */
186
187   if (alignment == 0)
188     alignment = (int) DEFAULT_ALIGNMENT;
189   if (size == 0)
190     /* Default size is what GNU malloc can fit in a 4096-byte block.  */
191     {
192       /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
193          Use the values for range checking, because if range checking is off,
194          the extra bytes won't be missed terribly, but if range checking is on
195          and we used a larger request, a whole extra 4096 bytes would be
196          allocated.
197
198          These number are irrelevant to the new GNU malloc.  I suspect it is
199          less sensitive to the size of the request.  */
200       int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
201                     + 4 + DEFAULT_ROUNDING - 1)
202                    & ~(DEFAULT_ROUNDING - 1));
203       size = 4096 - extra;
204     }
205
206   h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
207   h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
208   h->chunk_size = size;
209   h->alignment_mask = alignment - 1;
210   h->extra_arg = arg;
211   h->use_extra_arg = 1;
212
213   chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
214   if (!chunk)
215     (*obstack_alloc_failed_handler) ();
216   h->next_free = h->object_base = chunk->contents;
217   h->chunk_limit = chunk->limit
218     = (char *) chunk + h->chunk_size;
219   chunk->prev = 0;
220   /* The initial chunk now contains no empty object.  */
221   h->maybe_empty_object = 0;
222   h->alloc_failed = 0;
223   return 1;
224 }
225
226 /* Allocate a new current chunk for the obstack *H
227    on the assumption that LENGTH bytes need to be added
228    to the current object, or a new object of length LENGTH allocated.
229    Copies any partial object from the end of the old chunk
230    to the beginning of the new one.  */
231
232 void
233 _obstack_newchunk (struct obstack *h, int length)
234 {
235   register struct _obstack_chunk *old_chunk = h->chunk;
236   register struct _obstack_chunk *new_chunk;
237   register long new_size;
238   register long obj_size = h->next_free - h->object_base;
239   register long i;
240   long already;
241   char *object_base;
242
243   /* Compute size for new chunk.  */
244   new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100;
245   if (new_size < h->chunk_size)
246     new_size = h->chunk_size;
247
248   /* Allocate and initialize the new chunk.  */
249   new_chunk = CALL_CHUNKFUN (h, new_size);
250   if (!new_chunk)
251     (*obstack_alloc_failed_handler) ();
252   h->chunk = new_chunk;
253   new_chunk->prev = old_chunk;
254   new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
255
256   /* Compute an aligned object_base in the new chunk */
257   object_base =
258     __INT_TO_PTR ((__PTR_TO_INT (new_chunk->contents) + h->alignment_mask)
259                   & ~ (h->alignment_mask));
260
261   /* Move the existing object to the new chunk.
262      Word at a time is fast and is safe if the object
263      is sufficiently aligned.  */
264   if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
265     {
266       for (i = obj_size / sizeof (COPYING_UNIT) - 1;
267            i >= 0; i--)
268         ((COPYING_UNIT *)object_base)[i]
269           = ((COPYING_UNIT *)h->object_base)[i];
270       /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT,
271          but that can cross a page boundary on a machine
272          which does not do strict alignment for COPYING_UNITS.  */
273       already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
274     }
275   else
276     already = 0;
277   /* Copy remaining bytes one by one.  */
278   for (i = already; i < obj_size; i++)
279     object_base[i] = h->object_base[i];
280
281   /* If the object just copied was the only data in OLD_CHUNK,
282      free that chunk and remove it from the chain.
283      But not if that chunk might contain an empty object.  */
284   if (h->object_base == old_chunk->contents && ! h->maybe_empty_object)
285     {
286       new_chunk->prev = old_chunk->prev;
287       CALL_FREEFUN (h, old_chunk);
288     }
289
290   h->object_base = object_base;
291   h->next_free = h->object_base + obj_size;
292   /* The new chunk certainly contains no empty object yet.  */
293   h->maybe_empty_object = 0;
294 }
295 # ifdef _LIBC
296 libc_hidden_def (_obstack_newchunk)
297 # endif
298
299 /* Return nonzero if object OBJ has been allocated from obstack H.
300    This is here for debugging.
301    If you use it in a program, you are probably losing.  */
302
303 /* Suppress -Wmissing-prototypes warning.  We don't want to declare this in
304    obstack.h because it is just for debugging.  */
305 int _obstack_allocated_p (struct obstack *h, void *obj);
306
307 int
308 _obstack_allocated_p (struct obstack *h, void *obj)
309 {
310   register struct _obstack_chunk *lp;   /* below addr of any objects in this chunk */
311   register struct _obstack_chunk *plp;  /* point to previous chunk if any */
312
313   lp = (h)->chunk;
314   /* We use >= rather than > since the object cannot be exactly at
315      the beginning of the chunk but might be an empty object exactly
316      at the end of an adjacent chunk.  */
317   while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
318     {
319       plp = lp->prev;
320       lp = plp;
321     }
322   return lp != 0;
323 }
324 \f
325 /* Free objects in obstack H, including OBJ and everything allocate
326    more recently than OBJ.  If OBJ is zero, free everything in H.  */
327
328 # undef obstack_free
329
330 void
331 obstack_free (struct obstack *h, void *obj)
332 {
333   register struct _obstack_chunk *lp;   /* below addr of any objects in this chunk */
334   register struct _obstack_chunk *plp;  /* point to previous chunk if any */
335
336   lp = h->chunk;
337   /* We use >= because there cannot be an object at the beginning of a chunk.
338      But there can be an empty object at that address
339      at the end of another chunk.  */
340   while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
341     {
342       plp = lp->prev;
343       CALL_FREEFUN (h, lp);
344       lp = plp;
345       /* If we switch chunks, we can't tell whether the new current
346          chunk contains an empty object, so assume that it may.  */
347       h->maybe_empty_object = 1;
348     }
349   if (lp)
350     {
351       h->object_base = h->next_free = (char *) (obj);
352       h->chunk_limit = lp->limit;
353       h->chunk = lp;
354     }
355   else if (obj != 0)
356     /* obj is not in any of the chunks! */
357     abort ();
358 }
359
360 # ifdef _LIBC
361 /* Older versions of libc used a function _obstack_free intended to be
362    called by non-GCC compilers.  */
363 strong_alias (obstack_free, _obstack_free)
364 # endif
365 \f
366 int
367 _obstack_memory_used (struct obstack *h)
368 {
369   register struct _obstack_chunk* lp;
370   register int nbytes = 0;
371
372   for (lp = h->chunk; lp != 0; lp = lp->prev)
373     {
374       nbytes += lp->limit - (char *) lp;
375     }
376   return nbytes;
377 }
378 \f
379 /* Define the error handler.  */
380 # ifdef _LIBC
381 #  include <libintl.h>
382 # else
383 #  include "gettext.h"
384 # endif
385 # ifndef _
386 #  define _(msgid) gettext (msgid)
387 # endif
388
389 # ifdef _LIBC
390 #  include <libio/iolibio.h>
391 # endif
392
393 # ifndef __attribute__
394 /* This feature is available in gcc versions 2.5 and later.  */
395 #  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
396 #   define __attribute__(Spec) /* empty */
397 #  endif
398 # endif
399
400 static void
401 __attribute__ ((noreturn))
402 print_and_abort (void)
403 {
404   /* Don't change any of these strings.  Yes, it would be possible to add
405      the newline to the string and use fputs or so.  But this must not
406      happen because the "memory exhausted" message appears in other places
407      like this and the translation should be reused instead of creating
408      a very similar string which requires a separate translation.  */
409 # if defined _LIBC && defined USE_IN_LIBIO
410   if (_IO_fwide (stderr, 0) > 0)
411     __fwprintf (stderr, L"%s\n", _("memory exhausted"));
412   else
413 # endif
414     fprintf (stderr, "%s\n", _("memory exhausted"));
415   exit (obstack_exit_failure);
416 }
417
418 #endif  /* !ELIDE_CODE */