1 /* obstack.h - object stack macros 
   3    Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 
   4    1998, 1999, 2002 Free Software Foundation, Inc. 
   6    This file is part of the GNU C Library.  Its master source is NOT part of 
   7    the C library, however.  The master source lives in /gd/gnu/lib. 
   9    NOTE: The canonical source of this file is maintained with the GNU C Library. 
  10    Bugs can be reported to bug-glibc@gnu.org. 
  12    This program is free software; you can redistribute it and/or modify 
  13    it under the terms of the GNU General Public License as published by 
  14    the Free Software Foundation; either version 2, or (at your option) 
  17    This program is distributed in the hope that it will be useful, 
  18    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  20    GNU General Public License for more details. 
  22    You should have received a copy of the GNU General Public License 
  23    along with this program; if not, write to the Free Software Foundation, 
  24    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ 
  28 All the apparent functions defined here are macros. The idea 
  29 is that you would use these pre-tested macros to solve a 
  30 very specific set of problems, and they would run fast. 
  31 Caution: no side-effects in arguments please!! They may be 
  32 evaluated MANY times!! 
  34 These macros operate a stack of objects.  Each object starts life 
  35 small, and may grow to maturity.  (Consider building a word syllable 
  36 by syllable.)  An object can move while it is growing.  Once it has 
  37 been "finished" it never changes address again.  So the "top of the 
  38 stack" is typically an immature growing object, while the rest of the 
  39 stack is of mature, fixed size and fixed address objects. 
  41 These routines grab large chunks of memory, using a function you 
  42 supply, called `obstack_chunk_alloc'.  On occasion, they free chunks, 
  43 by calling `obstack_chunk_free'.  You must define them and declare 
  44 them before using any obstack macros. 
  46 Each independent stack is represented by a `struct obstack'. 
  47 Each of the obstack macros expects a pointer to such a structure 
  48 as the first argument. 
  50 One motivation for this package is the problem of growing char strings 
  51 in symbol tables.  Unless you are "fascist pig with a read-only mind" 
  52 --Gosper's immortal quote from HAKMEM item 154, out of context--you 
  53 would not like to put any arbitrary upper limit on the length of your 
  56 In practice this often means you will build many short symbols and a 
  57 few long symbols.  At the time you are reading a symbol you don't know 
  58 how long it is.  One traditional method is to read a symbol into a 
  59 buffer, realloc()ating the buffer every time you try to read a symbol 
  60 that is longer than the buffer.  This is beaut, but you still will 
  61 want to copy the symbol from the buffer to a more permanent 
  62 symbol-table entry say about half the time. 
  64 With obstacks, you can work differently.  Use one obstack for all symbol 
  65 names.  As you read a symbol, grow the name in the obstack gradually. 
  66 When the name is complete, finalize it.  Then, if the symbol exists already, 
  67 free the newly read name. 
  69 The way we do this is to take a large chunk, allocating memory from 
  70 low addresses.  When you want to build a symbol in the chunk you just 
  71 add chars above the current "high water mark" in the chunk.  When you 
  72 have finished adding chars, because you got to the end of the symbol, 
  73 you know how long the chars are, and you can create a new object. 
  74 Mostly the chars will not burst over the highest address of the chunk, 
  75 because you would typically expect a chunk to be (say) 100 times as 
  76 long as an average object. 
  78 In case that isn't clear, when we have enough chars to make up 
  79 the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) 
  80 so we just point to it where it lies.  No moving of chars is 
  81 needed and this is the second win: potentially long strings need 
  82 never be explicitly shuffled. Once an object is formed, it does not 
  83 change its address during its lifetime. 
  85 When the chars burst over a chunk boundary, we allocate a larger 
  86 chunk, and then copy the partly formed object from the end of the old 
  87 chunk to the beginning of the new larger chunk.  We then carry on 
  88 accreting characters to the end of the object as we normally would. 
  90 A special macro is provided to add a single char at a time to a 
  91 growing object.  This allows the use of register variables, which 
  92 break the ordinary 'growth' macro. 
  95         We allocate large chunks. 
  96         We carve out one object at a time from the current chunk. 
  97         Once carved, an object never moves. 
  98         We are free to append data of any size to the currently 
 100         Exactly one object is growing in an obstack at any one time. 
 101         You can run one obstack per control block. 
 102         You may have as many control blocks as you dare. 
 103         Because of the way we do it, you can `unwind' an obstack 
 104           back to a previous state. (You may remove objects much 
 105           as you would with a stack.) 
 109 /* Don't do the contents of this file more than once.  */ 
 118 /* We use subtraction of (char *) 0 instead of casting to int 
 119    because on word-addressable machines a simple cast to int 
 120    may ignore the byte-within-word field of the pointer.  */ 
 123 # define __PTR_TO_INT(P) ((P) - (char *) 0) 
 128 #  define __INT_TO_PTR(P) ((void *) ((P) + (char *) 0)) 
 130 #  define __INT_TO_PTR(P) ((P) + (char *) 0) 
 134 /* We need the type of the resulting object.  If __PTRDIFF_TYPE__ is 
 135    defined, as with GNU C, use that; that way we don't pollute the 
 136    namespace with <stddef.h>'s symbols.  Otherwise, if <stddef.h> is 
 137    available, include it and use ptrdiff_t.  In traditional C, long is 
 138    the best that we can do.  */ 
 140 #ifdef __PTRDIFF_TYPE__ 
 141 # define PTR_INT_TYPE __PTRDIFF_TYPE__ 
 143 # ifdef HAVE_STDDEF_H 
 145 #  define PTR_INT_TYPE ptrdiff_t 
 147 #  define PTR_INT_TYPE long 
 151 #if defined _LIBC || defined HAVE_STRING_H 
 153 # define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N)) 
 156 #  define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N)) 
 158 #  define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N)) 
 162 struct _obstack_chunk           
/* Lives at front of each chunk. */ 
 164   char  *limit
;                 /* 1 past end of this chunk */ 
 165   struct _obstack_chunk 
*prev
;  /* address of prior chunk or NULL */ 
 166   char  contents
[4];            /* objects begin here */ 
 169 struct obstack          
/* control current object in current chunk */ 
 171   long  chunk_size
;             /* preferred size to allocate chunks in */ 
 172   struct _obstack_chunk 
*chunk
; /* address of current struct obstack_chunk */ 
 173   char  *object_base
;           /* address of object we are building */ 
 174   char  *next_free
;             /* where to add next char to current object */ 
 175   char  *chunk_limit
;           /* address of char after current chunk */ 
 176   PTR_INT_TYPE temp
;            /* Temporary for some macros.  */ 
 177   int   alignment_mask
;         /* Mask of alignment for each object. */ 
 178 #if PROTOTYPES || (defined __STDC__ && __STDC__) 
 179   /* These prototypes vary based on `use_extra_arg', and we use 
 180      casts to the prototypeless function type in all assignments, 
 181      but having prototypes here quiets -Wstrict-prototypes.  */ 
 182   struct _obstack_chunk 
*(*chunkfun
) (void *, long); 
 183   void (*freefun
) (void *, struct _obstack_chunk 
*); 
 184   void *extra_arg
;              /* first arg for chunk alloc/dealloc funcs */ 
 186   struct _obstack_chunk 
*(*chunkfun
) (); /* User's fcn to allocate a chunk.  */ 
 187   void (*freefun
) ();           /* User's function to free a chunk.  */ 
 188   char *extra_arg
;              /* first arg for chunk alloc/dealloc funcs */ 
 190   unsigned use_extra_arg
:1;     /* chunk alloc/dealloc funcs take extra arg */ 
 191   unsigned maybe_empty_object
:1;/* There is a possibility that the current 
 192                                    chunk contains a zero-length object.  This 
 193                                    prevents freeing the chunk if we allocate 
 194                                    a bigger chunk to replace it. */ 
 195   unsigned alloc_failed
:1;      /* No longer used, as we now call the failed 
 196                                    handler on error, but retained for binary 
 200 /* Declare the external functions we use; they are in obstack.c.  */ 
 202 #if PROTOTYPES || (defined __STDC__ && __STDC__) 
 203 extern void _obstack_newchunk (struct obstack 
*, int); 
 204 extern void _obstack_free (struct obstack 
*, void *); 
 205 extern int _obstack_begin (struct obstack 
*, int, int, 
 206                             void *(*) (long), void (*) (void *)); 
 207 extern int _obstack_begin_1 (struct obstack 
*, int, int, 
 208                              void *(*) (void *, long), 
 209                              void (*) (void *, void *), void *); 
 210 extern int _obstack_memory_used (struct obstack 
*); 
 212 extern void _obstack_newchunk (); 
 213 extern void _obstack_free (); 
 214 extern int _obstack_begin (); 
 215 extern int _obstack_begin_1 (); 
 216 extern int _obstack_memory_used (); 
 219 #if PROTOTYPES || (defined __STDC__ && __STDC__) 
 221 /* Do the function-declarations after the structs 
 222    but before defining the macros.  */ 
 224 void obstack_init (struct obstack 
*obstack
); 
 226 void * obstack_alloc (struct obstack 
*obstack
, int size
); 
 228 void * obstack_copy (struct obstack 
*obstack
, const void *address
, int size
); 
 229 void * obstack_copy0 (struct obstack 
*obstack
, const void *address
, int size
); 
 231 void obstack_free (struct obstack 
*obstack
, void *block
); 
 233 void obstack_blank (struct obstack 
*obstack
, int size
); 
 235 void obstack_grow (struct obstack 
*obstack
, const void *data
, int size
); 
 236 void obstack_grow0 (struct obstack 
*obstack
, const void *data
, int size
); 
 238 void obstack_1grow (struct obstack 
*obstack
, int data_char
); 
 239 void obstack_ptr_grow (struct obstack 
*obstack
, const void *data
); 
 240 void obstack_int_grow (struct obstack 
*obstack
, int data
); 
 242 void * obstack_finish (struct obstack 
*obstack
); 
 244 int obstack_object_size (struct obstack 
*obstack
); 
 246 int obstack_room (struct obstack 
*obstack
); 
 247 void obstack_make_room (struct obstack 
*obstack
, int size
); 
 248 void obstack_1grow_fast (struct obstack 
*obstack
, int data_char
); 
 249 void obstack_ptr_grow_fast (struct obstack 
*obstack
, const void *data
); 
 250 void obstack_int_grow_fast (struct obstack 
*obstack
, int data
); 
 251 void obstack_blank_fast (struct obstack 
*obstack
, int size
); 
 253 void * obstack_base (struct obstack 
*obstack
); 
 254 void * obstack_next_free (struct obstack 
*obstack
); 
 255 int obstack_alignment_mask (struct obstack 
*obstack
); 
 256 int obstack_chunk_size (struct obstack 
*obstack
); 
 257 int obstack_memory_used (struct obstack 
*obstack
); 
 259 #endif /* PROTOTYPES || (defined __STDC__ && __STDC__) */ 
 261 /* Non-ANSI C cannot really support alternative functions for these macros, 
 262    so we do not declare them.  */ 
 264 /* Error handler called when `obstack_chunk_alloc' failed to allocate 
 265    more memory.  This can be set to a user defined function which 
 266    should either abort gracefully or use longjump - but shouldn't 
 267    return.  The default action is to print a message and abort.  */ 
 268 #if PROTOTYPES || (defined __STDC__ && __STDC__) 
 269 extern void (*obstack_alloc_failed_handler
) (void); 
 271 extern void (*obstack_alloc_failed_handler
) (); 
 274 /* Exit value used when `print_and_abort' is used.  */ 
 275 extern int obstack_exit_failure
; 
 277 /* Pointer to beginning of object being allocated or to be allocated next. 
 278    Note that this might not be the final address of the object 
 279    because a new chunk might be needed to hold the final size.  */ 
 281 #define obstack_base(h) ((h)->object_base) 
 283 /* Size for allocating ordinary chunks.  */ 
 285 #define obstack_chunk_size(h) ((h)->chunk_size) 
 287 /* Pointer to next byte not yet allocated in current chunk.  */ 
 289 #define obstack_next_free(h)    ((h)->next_free) 
 291 /* Mask specifying low bits that should be clear in address of an object.  */ 
 293 #define obstack_alignment_mask(h) ((h)->alignment_mask) 
 295 /* To prevent prototype warnings provide complete argument list in 
 296    standard C version.  */ 
 297 #if PROTOYPES || (defined __STDC__ && __STDC__) 
 299 # define obstack_init(h)                                        \ 
 300   _obstack_begin ((h), 0, 0,                                    \ 
 301                   (void *(*) (long)) obstack_chunk_alloc,       \ 
 302                   (void (*) (void *)) obstack_chunk_free) 
 304 # define obstack_begin(h, size)                                 \ 
 305   _obstack_begin ((h), (size), 0,                               \ 
 306                   (void *(*) (long)) obstack_chunk_alloc,       \ 
 307                   (void (*) (void *)) obstack_chunk_free) 
 309 # define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ 
 310   _obstack_begin ((h), (size), (alignment),                                \ 
 311                   (void *(*) (long)) (chunkfun),                           \ 
 312                   (void (*) (void *)) (freefun)) 
 314 # define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ 
 315   _obstack_begin_1 ((h), (size), (alignment),                           \ 
 316                     (void *(*) (void *, long)) (chunkfun),              \ 
 317                     (void (*) (void *, void *)) (freefun), (arg)) 
 319 # define obstack_chunkfun(h, newchunkfun) \ 
 320   ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun)) 
 322 # define obstack_freefun(h, newfreefun) \ 
 323   ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun)) 
 327 # define obstack_init(h)                                                \ 
 328   _obstack_begin ((h), 0, 0,                                            \ 
 329                   (void *(*) ()) obstack_chunk_alloc,                   \ 
 330                   (void (*) ()) obstack_chunk_free) 
 332 # define obstack_begin(h, size)                                         \ 
 333   _obstack_begin ((h), (size), 0,                                       \ 
 334                   (void *(*) ()) obstack_chunk_alloc,                   \ 
 335                   (void (*) ()) obstack_chunk_free) 
 337 # define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ 
 338   _obstack_begin ((h), (size), (alignment),                                \ 
 339                   (void *(*) ()) (chunkfun),                               \ 
 340                   (void (*) ()) (freefun)) 
 342 # define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ 
 343   _obstack_begin_1 ((h), (size), (alignment),                           \ 
 344                     (void *(*) ()) (chunkfun),                          \ 
 345                     (void (*) ()) (freefun), (arg)) 
 347 # define obstack_chunkfun(h, newchunkfun) \ 
 348   ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun)) 
 350 # define obstack_freefun(h, newfreefun) \ 
 351   ((h) -> freefun = (void (*)()) (newfreefun)) 
 355 #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar) 
 357 #define obstack_blank_fast(h,n) ((h)->next_free += (n)) 
 359 #define obstack_memory_used(h) _obstack_memory_used (h) 
 361 #if defined __GNUC__ && defined __STDC__ && __STDC__ 
 362 /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and 
 363    does not implement __extension__.  But that compiler doesn't define 
 365 # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) 
 366 #  define __extension__ 
 369 /* For GNU C, if not -traditional, 
 370    we can define these macros to compute all args only once 
 371    without using a global variable. 
 372    Also, we can avoid using the `temp' slot, to make faster code.  */ 
 374 # define obstack_object_size(OBSTACK)                                   \ 
 376   ({ struct obstack *__o = (OBSTACK);                                   \ 
 377      (unsigned) (__o->next_free - __o->object_base); }) 
 379 # define obstack_room(OBSTACK)                                          \ 
 381   ({ struct obstack *__o = (OBSTACK);                                   \ 
 382      (unsigned) (__o->chunk_limit - __o->next_free); }) 
 384 # define obstack_make_room(OBSTACK,length)                              \ 
 386 ({ struct obstack *__o = (OBSTACK);                                     \ 
 387    int __len = (length);                                                \ 
 388    if (__o->chunk_limit - __o->next_free < __len)                       \ 
 389      _obstack_newchunk (__o, __len);                                    \ 
 392 # define obstack_empty_p(OBSTACK)                                       \ 
 394   ({ struct obstack *__o = (OBSTACK);                                   \ 
 395      (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); }) 
 397 # define obstack_grow(OBSTACK,where,length)                             \ 
 399 ({ struct obstack *__o = (OBSTACK);                                     \ 
 400    int __len = (length);                                                \ 
 401    if (__o->next_free + __len > __o->chunk_limit)                       \ 
 402      _obstack_newchunk (__o, __len);                                    \ 
 403    _obstack_memcpy (__o->next_free, (where), __len);                    \ 
 404    __o->next_free += __len;                                             \ 
 407 # define obstack_grow0(OBSTACK,where,length)                            \ 
 409 ({ struct obstack *__o = (OBSTACK);                                     \ 
 410    int __len = (length);                                                \ 
 411    if (__o->next_free + __len + 1 > __o->chunk_limit)                   \ 
 412      _obstack_newchunk (__o, __len + 1);                                \ 
 413    _obstack_memcpy (__o->next_free, (where), __len);                    \ 
 414    __o->next_free += __len;                                             \ 
 415    *(__o->next_free)++ = 0;                                             \ 
 418 # define obstack_1grow(OBSTACK,datum)                                   \ 
 420 ({ struct obstack *__o = (OBSTACK);                                     \ 
 421    if (__o->next_free + 1 > __o->chunk_limit)                           \ 
 422      _obstack_newchunk (__o, 1);                                        \ 
 423    *(__o->next_free)++ = (datum);                                       \ 
 426 /* These assume that the obstack alignment is good enough for pointers 
 427    or ints, and that the data added so far to the current object 
 428    shares that much alignment.  */ 
 430 # define obstack_ptr_grow(OBSTACK,datum)                                \ 
 432 ({ struct obstack *__o = (OBSTACK);                                     \ 
 433    if (__o->next_free + sizeof (void *) > __o->chunk_limit)             \ 
 434      _obstack_newchunk (__o, sizeof (void *));                          \ 
 435    *((void **)__o->next_free)++ = (datum);                              \ 
 438 # define obstack_int_grow(OBSTACK,datum)                                \ 
 440 ({ struct obstack *__o = (OBSTACK);                                     \ 
 441    if (__o->next_free + sizeof (int) > __o->chunk_limit)                \ 
 442      _obstack_newchunk (__o, sizeof (int));                             \ 
 443    *((int *)__o->next_free)++ = (datum);                                \ 
 446 # define obstack_ptr_grow_fast(h,aptr)                                  \ 
 447   (*((void **) (h)->next_free)++ = (aptr)) 
 449 # define obstack_int_grow_fast(h,aint)                                  \ 
 450   (*((int *) (h)->next_free)++ = (aint)) 
 452 # define obstack_blank(OBSTACK,length)                                  \ 
 454 ({ struct obstack *__o = (OBSTACK);                                     \ 
 455    int __len = (length);                                                \ 
 456    if (__o->chunk_limit - __o->next_free < __len)                       \ 
 457      _obstack_newchunk (__o, __len);                                    \ 
 458    __o->next_free += __len;                                             \ 
 461 # define obstack_alloc(OBSTACK,length)                                  \ 
 463 ({ struct obstack *__h = (OBSTACK);                                     \ 
 464    obstack_blank (__h, (length));                                       \ 
 465    obstack_finish (__h); }) 
 467 # define obstack_copy(OBSTACK,where,length)                             \ 
 469 ({ struct obstack *__h = (OBSTACK);                                     \ 
 470    obstack_grow (__h, (where), (length));                               \ 
 471    obstack_finish (__h); }) 
 473 # define obstack_copy0(OBSTACK,where,length)                            \ 
 475 ({ struct obstack *__h = (OBSTACK);                                     \ 
 476    obstack_grow0 (__h, (where), (length));                              \ 
 477    obstack_finish (__h); }) 
 479 /* The local variable is named __o1 to avoid a name conflict 
 480    when obstack_blank is called.  */ 
 481 # define obstack_finish(OBSTACK)                                        \ 
 483 ({ struct obstack *__o1 = (OBSTACK);                                    \ 
 485    value = (void *) __o1->object_base;                                  \ 
 486    if (__o1->next_free == value)                                        \ 
 487      __o1->maybe_empty_object = 1;                                      \ 
 489      = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ 
 490                      & ~ (__o1->alignment_mask));                       \ 
 491    if (__o1->next_free - (char *)__o1->chunk                            \ 
 492        > __o1->chunk_limit - (char *)__o1->chunk)                       \ 
 493      __o1->next_free = __o1->chunk_limit;                               \ 
 494    __o1->object_base = __o1->next_free;                                 \ 
 497 # define obstack_free(OBSTACK, OBJ)                                     \ 
 499 ({ struct obstack *__o = (OBSTACK);                                     \ 
 500    void *__obj = (OBJ);                                                 \ 
 501    if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \ 
 502      __o->next_free = __o->object_base = (char *)__obj;                 \ 
 503    else (obstack_free) (__o, __obj); }) 
 505 #else /* not __GNUC__ or not __STDC__ */ 
 507 # define obstack_object_size(h) \ 
 508  (unsigned) ((h)->next_free - (h)->object_base) 
 510 # define obstack_room(h)                \ 
 511  (unsigned) ((h)->chunk_limit - (h)->next_free) 
 513 # define obstack_empty_p(h) \ 
 514  ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0) 
 516 /* Note that the call to _obstack_newchunk is enclosed in (..., 0) 
 517    so that we can avoid having void expressions 
 518    in the arms of the conditional expression. 
 519    Casting the third operand to void was tried before, 
 520    but some compilers won't accept it.  */ 
 522 # define obstack_make_room(h,length)                                    \ 
 523 ( (h)->temp = (length),                                                 \ 
 524   (((h)->next_free + (h)->temp > (h)->chunk_limit)                      \ 
 525    ? (_obstack_newchunk ((h), (h)->temp), 0) : 0)) 
 527 # define obstack_grow(h,where,length)                                   \ 
 528 ( (h)->temp = (length),                                                 \ 
 529   (((h)->next_free + (h)->temp > (h)->chunk_limit)                      \ 
 530    ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),                      \ 
 531   _obstack_memcpy ((h)->next_free, (where), (h)->temp),                 \ 
 532   (h)->next_free += (h)->temp) 
 534 # define obstack_grow0(h,where,length)                                  \ 
 535 ( (h)->temp = (length),                                                 \ 
 536   (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit)                  \ 
 537    ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0),                  \ 
 538   _obstack_memcpy ((h)->next_free, (where), (h)->temp),                 \ 
 539   (h)->next_free += (h)->temp,                                          \ 
 540   *((h)->next_free)++ = 0) 
 542 # define obstack_1grow(h,datum)                                         \ 
 543 ( (((h)->next_free + 1 > (h)->chunk_limit)                              \ 
 544    ? (_obstack_newchunk ((h), 1), 0) : 0),                              \ 
 545   (*((h)->next_free)++ = (datum))) 
 547 # define obstack_ptr_grow(h,datum)                                      \ 
 548 ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)                \ 
 549    ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),                \ 
 550   (*((const char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = (datum))) 
 552 # define obstack_int_grow(h,datum)                                      \ 
 553 ( (((h)->next_free + sizeof (int) > (h)->chunk_limit)                   \ 
 554    ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),                   \ 
 555   (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = (datum))) 
 557 # define obstack_ptr_grow_fast(h,aptr)                                  \ 
 558   (*((const char **) (h)->next_free)++ = (aptr)) 
 560 # define obstack_int_grow_fast(h,aint)                                  \ 
 561   (*((int *) (h)->next_free)++ = (aint)) 
 563 # define obstack_blank(h,length)                                        \ 
 564 ( (h)->temp = (length),                                                 \ 
 565   (((h)->chunk_limit - (h)->next_free < (h)->temp)                      \ 
 566    ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),                      \ 
 567   ((h)->next_free += (h)->temp)) 
 569 # define obstack_alloc(h,length)                                        \ 
 570  (obstack_blank ((h), (length)), obstack_finish ((h))) 
 572 # define obstack_copy(h,where,length)                                   \ 
 573  (obstack_grow ((h), (where), (length)), obstack_finish ((h))) 
 575 # define obstack_copy0(h,where,length)                                  \ 
 576  (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) 
 578 # define obstack_finish(h)                                              \ 
 579 ( ((h)->next_free == (h)->object_base                                   \ 
 580    ? (((h)->maybe_empty_object = 1), 0)                                 \ 
 582   (h)->temp = __PTR_TO_INT ((h)->object_base),                          \ 
 584     = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \ 
 585                     & ~ ((h)->alignment_mask)),                         \ 
 586   (((h)->next_free - (char *) (h)->chunk                                \ 
 587     > (h)->chunk_limit - (char *) (h)->chunk)                           \ 
 588    ? ((h)->next_free = (h)->chunk_limit) : 0),                          \ 
 589   (h)->object_base = (h)->next_free,                                    \ 
 590   __INT_TO_PTR ((h)->temp)) 
 592 # if PROTOTYPES || (defined __STDC__ && __STDC__) 
 593 #  define obstack_free(h,obj)                                           \ 
 594 ( (h)->temp = (char *) (obj) - (char *) (h)->chunk,                     \ 
 595   (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ 
 596    ? (int) ((h)->next_free = (h)->object_base                           \ 
 597             = (h)->temp + (char *) (h)->chunk)                          \ 
 598    : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0))) 
 600 #  define obstack_free(h,obj)                                           \ 
 601 ( (h)->temp = (char *) (obj) - (char *) (h)->chunk,                     \ 
 602   (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ 
 603    ? (int) ((h)->next_free = (h)->object_base                           \ 
 604             = (h)->temp + (char *) (h)->chunk)                          \ 
 605    : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0))) 
 608 #endif /* not __GNUC__ or not __STDC__ */ 
 614 #endif /* obstack.h */