source: trunk/third/gettext/lib/obstack.h @ 16931

Revision 16931, 22.2 KB checked in by ghudson, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r16930, which included commits to RCS files with non-trunk default branches.
Line 
1/* obstack.h - object stack macros
2   Copyright (C) 1988-1999, 2000 Free Software Foundation, Inc.
3
4
5   NOTE: The canonical source of this file is maintained with the GNU C Library.
6   Bugs can be reported to bug-glibc@gnu.org.
7
8   This program 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   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program; if not, write to the Free Software
20   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
21   USA.  */
22
23/* Summary:
24
25All the apparent functions defined here are macros. The idea
26is that you would use these pre-tested macros to solve a
27very specific set of problems, and they would run fast.
28Caution: no side-effects in arguments please!! They may be
29evaluated MANY times!!
30
31These macros operate a stack of objects.  Each object starts life
32small, and may grow to maturity.  (Consider building a word syllable
33by syllable.)  An object can move while it is growing.  Once it has
34been "finished" it never changes address again.  So the "top of the
35stack" is typically an immature growing object, while the rest of the
36stack is of mature, fixed size and fixed address objects.
37
38These routines grab large chunks of memory, using a function you
39supply, called `obstack_chunk_alloc'.  On occasion, they free chunks,
40by calling `obstack_chunk_free'.  You must define them and declare
41them before using any obstack macros.
42
43Each independent stack is represented by a `struct obstack'.
44Each of the obstack macros expects a pointer to such a structure
45as the first argument.
46
47One motivation for this package is the problem of growing char strings
48in symbol tables.  Unless you are "fascist pig with a read-only mind"
49--Gosper's immortal quote from HAKMEM item 154, out of context--you
50would not like to put any arbitrary upper limit on the length of your
51symbols.
52
53In practice this often means you will build many short symbols and a
54few long symbols.  At the time you are reading a symbol you don't know
55how long it is.  One traditional method is to read a symbol into a
56buffer, realloc()ating the buffer every time you try to read a symbol
57that is longer than the buffer.  This is beaut, but you still will
58want to copy the symbol from the buffer to a more permanent
59symbol-table entry say about half the time.
60
61With obstacks, you can work differently.  Use one obstack for all symbol
62names.  As you read a symbol, grow the name in the obstack gradually.
63When the name is complete, finalize it.  Then, if the symbol exists already,
64free the newly read name.
65
66The way we do this is to take a large chunk, allocating memory from
67low addresses.  When you want to build a symbol in the chunk you just
68add chars above the current "high water mark" in the chunk.  When you
69have finished adding chars, because you got to the end of the symbol,
70you know how long the chars are, and you can create a new object.
71Mostly the chars will not burst over the highest address of the chunk,
72because you would typically expect a chunk to be (say) 100 times as
73long as an average object.
74
75In case that isn't clear, when we have enough chars to make up
76the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
77so we just point to it where it lies.  No moving of chars is
78needed and this is the second win: potentially long strings need
79never be explicitly shuffled. Once an object is formed, it does not
80change its address during its lifetime.
81
82When the chars burst over a chunk boundary, we allocate a larger
83chunk, and then copy the partly formed object from the end of the old
84chunk to the beginning of the new larger chunk.  We then carry on
85accreting characters to the end of the object as we normally would.
86
87A special macro is provided to add a single char at a time to a
88growing object.  This allows the use of register variables, which
89break the ordinary 'growth' macro.
90
91Summary:
92        We allocate large chunks.
93        We carve out one object at a time from the current chunk.
94        Once carved, an object never moves.
95        We are free to append data of any size to the currently
96          growing object.
97        Exactly one object is growing in an obstack at any one time.
98        You can run one obstack per control block.
99        You may have as many control blocks as you dare.
100        Because of the way we do it, you can `unwind' an obstack
101          back to a previous state. (You may remove objects much
102          as you would with a stack.)
103*/
104
105
106/* Don't do the contents of this file more than once.  */
107
108#ifndef _OBSTACK_H
109#define _OBSTACK_H 1
110
111#ifdef __cplusplus
112extern "C" {
113#endif
114
115/* We use subtraction of (char *) 0 instead of casting to int
116   because on word-addressable machines a simple cast to int
117   may ignore the byte-within-word field of the pointer.  */
118
119#ifndef __PTR_TO_INT
120# define __PTR_TO_INT(P) ((P) - (char *) 0)
121#endif
122
123#ifndef __INT_TO_PTR
124# define __INT_TO_PTR(P) ((P) + (char *) 0)
125#endif
126
127/* We need the type of the resulting object.  If __PTRDIFF_TYPE__ is
128   defined, as with GNU C, use that; that way we don't pollute the
129   namespace with <stddef.h>'s symbols.  Otherwise, if <stddef.h> is
130   available, include it and use ptrdiff_t.  In traditional C, long is
131   the best that we can do.  */
132
133#ifdef __PTRDIFF_TYPE__
134# define PTR_INT_TYPE __PTRDIFF_TYPE__
135#else
136# ifdef HAVE_STDDEF_H
137#  include <stddef.h>
138#  define PTR_INT_TYPE ptrdiff_t
139# else
140#  define PTR_INT_TYPE long
141# endif
142#endif
143
144#if defined _LIBC || defined HAVE_STRING_H
145# include <string.h>
146# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
147#else
148# ifdef memcpy
149#  define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
150# else
151#  define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
152# endif
153#endif
154
155struct _obstack_chunk           /* Lives at front of each chunk. */
156{
157  char  *limit;                 /* 1 past end of this chunk */
158  struct _obstack_chunk *prev;  /* address of prior chunk or NULL */
159  char  contents[4];            /* objects begin here */
160};
161
162struct obstack          /* control current object in current chunk */
163{
164  long  chunk_size;             /* preferred size to allocate chunks in */
165  struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
166  char  *object_base;           /* address of object we are building */
167  char  *next_free;             /* where to add next char to current object */
168  char  *chunk_limit;           /* address of char after current chunk */
169  PTR_INT_TYPE temp;            /* Temporary for some macros.  */
170  int   alignment_mask;         /* Mask of alignment for each object. */
171#if defined __STDC__ && __STDC__
172  /* These prototypes vary based on `use_extra_arg', and we use
173     casts to the prototypeless function type in all assignments,
174     but having prototypes here quiets -Wstrict-prototypes.  */
175  struct _obstack_chunk *(*chunkfun) (void *, long);
176  void (*freefun) (void *, struct _obstack_chunk *);
177  void *extra_arg;              /* first arg for chunk alloc/dealloc funcs */
178#else
179  struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk.  */
180  void (*freefun) ();           /* User's function to free a chunk.  */
181  char *extra_arg;              /* first arg for chunk alloc/dealloc funcs */
182#endif
183  unsigned use_extra_arg:1;     /* chunk alloc/dealloc funcs take extra arg */
184  unsigned maybe_empty_object:1;/* There is a possibility that the current
185                                   chunk contains a zero-length object.  This
186                                   prevents freeing the chunk if we allocate
187                                   a bigger chunk to replace it. */
188  unsigned alloc_failed:1;      /* No longer used, as we now call the failed
189                                   handler on error, but retained for binary
190                                   compatibility.  */
191};
192
193/* Declare the external functions we use; they are in obstack.c.  */
194
195#if defined __STDC__ && __STDC__
196extern void _obstack_newchunk (struct obstack *, int);
197extern void _obstack_free (struct obstack *, void *);
198extern int _obstack_begin (struct obstack *, int, int,
199                            void *(*) (long), void (*) (void *));
200extern int _obstack_begin_1 (struct obstack *, int, int,
201                             void *(*) (void *, long),
202                             void (*) (void *, void *), void *);
203extern int _obstack_memory_used (struct obstack *);
204#else
205extern void _obstack_newchunk ();
206extern void _obstack_free ();
207extern int _obstack_begin ();
208extern int _obstack_begin_1 ();
209extern int _obstack_memory_used ();
210#endif
211
212#if defined __STDC__ && __STDC__
213
214/* Do the function-declarations after the structs
215   but before defining the macros.  */
216
217void obstack_init (struct obstack *obstack);
218
219void * obstack_alloc (struct obstack *obstack, int size);
220
221void * obstack_copy (struct obstack *obstack, const void *address, int size);
222void * obstack_copy0 (struct obstack *obstack, const void *address, int size);
223
224void obstack_free (struct obstack *obstack, void *block);
225
226void obstack_blank (struct obstack *obstack, int size);
227
228void obstack_grow (struct obstack *obstack, const void *data, int size);
229void obstack_grow0 (struct obstack *obstack, const void *data, int size);
230
231void obstack_1grow (struct obstack *obstack, int data_char);
232void obstack_ptr_grow (struct obstack *obstack, const void *data);
233void obstack_int_grow (struct obstack *obstack, int data);
234
235void * obstack_finish (struct obstack *obstack);
236
237int obstack_object_size (struct obstack *obstack);
238
239int obstack_room (struct obstack *obstack);
240void obstack_make_room (struct obstack *obstack, int size);
241void obstack_1grow_fast (struct obstack *obstack, int data_char);
242void obstack_ptr_grow_fast (struct obstack *obstack, const void *data);
243void obstack_int_grow_fast (struct obstack *obstack, int data);
244void obstack_blank_fast (struct obstack *obstack, int size);
245
246void * obstack_base (struct obstack *obstack);
247void * obstack_next_free (struct obstack *obstack);
248int obstack_alignment_mask (struct obstack *obstack);
249int obstack_chunk_size (struct obstack *obstack);
250int obstack_memory_used (struct obstack *obstack);
251
252#endif /* __STDC__ */
253
254/* Non-ANSI C cannot really support alternative functions for these macros,
255   so we do not declare them.  */
256
257/* Error handler called when `obstack_chunk_alloc' failed to allocate
258   more memory.  This can be set to a user defined function which
259   should either abort gracefully or use longjump - but shouldn't
260   return.  The 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, (const 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, (const 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)++ = ((const 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 = (char *)__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.