source: trunk/third/gcc/obstack.h @ 11288

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