source: svn/trunk/newcon3bcm2_21bu/toolchain/lib/gcc/mips-linux-uclibc/3.4.2/include/obstack.h

Last change on this file was 2, checked in by phkim, 11 years ago

1.phkim

  1. revision copy newcon3sk r27
  • Property svn:executable set to *
File size: 22.9 KB
Line 
1/*  DO NOT EDIT THIS FILE.
2
3    It has been auto-edited by fixincludes from:
4
5        "/opt/toolchains/uclibc-crosstools_linux-2.6.12.0_gcc-3.4.2_uclibc-0.9.28-20060113/mips-linux-uclibc/sys-include/obstack.h"
6
7    This had to be done to correct non-standard usages in the
8    original, manufacturer supplied header file.  */
9
10/* obstack.h - object stack macros
11   Copyright (C) 1988,89,90,91,92,93,94,96,97,98,99 Free Software Foundation, Inc.
12   This file is part of the GNU C Library.  Its master source is NOT part of
13   the C library, however.  The master source lives in /gd/gnu/lib.
14
15   The GNU C Library is free software; you can redistribute it and/or
16   modify it under the terms of the GNU Lesser General Public
17   License as published by the Free Software Foundation; either
18   version 2.1 of the License, or (at your option) any later version.
19
20   The GNU C Library is distributed in the hope that it will be useful,
21   but WITHOUT ANY WARRANTY; without even the implied warranty of
22   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23   Lesser General Public License for more details.
24
25   You should have received a copy of the GNU Lesser General Public
26   License along with the GNU C Library; if not, write to the Free
27   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28   02111-1307 USA.  */
29
30/* Summary:
31
32All the apparent functions defined here are macros. The idea
33is that you would use these pre-tested macros to solve a
34very specific set of problems, and they would run fast.
35Caution: no side-effects in arguments please!! They may be
36evaluated MANY times!!
37
38These macros operate a stack of objects.  Each object starts life
39small, and may grow to maturity.  (Consider building a word syllable
40by syllable.)  An object can move while it is growing.  Once it has
41been "finished" it never changes address again.  So the "top of the
42stack" is typically an immature growing object, while the rest of the
43stack is of mature, fixed size and fixed address objects.
44
45These routines grab large chunks of memory, using a function you
46supply, called `obstack_chunk_alloc'.  On occasion, they free chunks,
47by calling `obstack_chunk_free'.  You must define them and declare
48them before using any obstack macros.
49
50Each independent stack is represented by a `struct obstack'.
51Each of the obstack macros expects a pointer to such a structure
52as the first argument.
53
54One motivation for this package is the problem of growing char strings
55in symbol tables.  Unless you are "fascist pig with a read-only mind"
56--Gosper's immortal quote from HAKMEM item 154, out of context--you
57would not like to put any arbitrary upper limit on the length of your
58symbols.
59
60In practice this often means you will build many short symbols and a
61few long symbols.  At the time you are reading a symbol you don't know
62how long it is.  One traditional method is to read a symbol into a
63buffer, realloc()ating the buffer every time you try to read a symbol
64that is longer than the buffer.  This is beaut, but you still will
65want to copy the symbol from the buffer to a more permanent
66symbol-table entry say about half the time.
67
68With obstacks, you can work differently.  Use one obstack for all symbol
69names.  As you read a symbol, grow the name in the obstack gradually.
70When the name is complete, finalize it.  Then, if the symbol exists already,
71free the newly read name.
72
73The way we do this is to take a large chunk, allocating memory from
74low addresses.  When you want to build a symbol in the chunk you just
75add chars above the current "high water mark" in the chunk.  When you
76have finished adding chars, because you got to the end of the symbol,
77you know how long the chars are, and you can create a new object.
78Mostly the chars will not burst over the highest address of the chunk,
79because you would typically expect a chunk to be (say) 100 times as
80long as an average object.
81
82In case that isn't clear, when we have enough chars to make up
83the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
84so we just point to it where it lies.  No moving of chars is
85needed and this is the second win: potentially long strings need
86never be explicitly shuffled. Once an object is formed, it does not
87change its address during its lifetime.
88
89When the chars burst over a chunk boundary, we allocate a larger
90chunk, and then copy the partly formed object from the end of the old
91chunk to the beginning of the new larger chunk.  We then carry on
92accreting characters to the end of the object as we normally would.
93
94A special macro is provided to add a single char at a time to a
95growing object.  This allows the use of register variables, which
96break the ordinary 'growth' macro.
97
98Summary:
99        We allocate large chunks.
100        We carve out one object at a time from the current chunk.
101        Once carved, an object never moves.
102        We are free to append data of any size to the currently
103          growing object.
104        Exactly one object is growing in an obstack at any one time.
105        You can run one obstack per control block.
106        You may have as many control blocks as you dare.
107        Because of the way we do it, you can `unwind' an obstack
108          back to a previous state. (You may remove objects much
109          as you would with a stack.)
110*/
111
112
113/* Don't do the contents of this file more than once.  */
114
115#ifndef _OBSTACK_H
116#define _OBSTACK_H 1
117
118#ifdef __cplusplus
119extern "C" {
120#endif
121
122/* We use subtraction of (char *) 0 instead of casting to int
123   because on word-addressable machines a simple cast to int
124   may ignore the byte-within-word field of the pointer.  */
125
126#ifndef __PTR_TO_INT
127# define __PTR_TO_INT(P) ((P) - (char *) 0)
128#endif
129
130#ifndef __INT_TO_PTR
131# define __INT_TO_PTR(P) ((P) + (char *) 0)
132#endif
133
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.  */
139
140#ifdef __PTRDIFF_TYPE__
141# define PTR_INT_TYPE __PTRDIFF_TYPE__
142#else
143# ifdef HAVE_STDDEF_H
144#  include <stddef.h>
145#  define PTR_INT_TYPE ptrdiff_t
146# else
147#  define PTR_INT_TYPE long
148# endif
149#endif
150
151#if defined _LIBC || defined HAVE_STRING_H
152# include <string.h>
153# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
154#else
155# ifdef memcpy
156#  define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
157# else
158#  define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
159# endif
160#endif
161
162struct _obstack_chunk           /* Lives at front of each chunk. */
163{
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 */
167};
168
169struct obstack          /* control current object in current chunk */
170{
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 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 */
185#else
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 */
189#endif
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
197                                   compatibility.  */
198};
199
200/* Declare the external functions we use; they are in obstack.c.  */
201
202#if defined __STDC__ && __STDC__
203extern void _obstack_newchunk (struct obstack *, int);
204extern void _obstack_free (struct obstack *, void *);
205extern int _obstack_begin (struct obstack *, int, int,
206                            void *(*) (long), void (*) (void *));
207extern int _obstack_begin_1 (struct obstack *, int, int,
208                             void *(*) (void *, long),
209                             void (*) (void *, void *), void *);
210extern int _obstack_memory_used (struct obstack *);
211#else
212extern void _obstack_newchunk ();
213extern void _obstack_free ();
214extern int _obstack_begin ();
215extern int _obstack_begin_1 ();
216extern int _obstack_memory_used ();
217#endif
218
219#if defined __STDC__ && __STDC__
220
221/* Do the function-declarations after the structs
222   but before defining the macros.  */
223
224void obstack_init (struct obstack *obstack);
225
226void * obstack_alloc (struct obstack *obstack, int size);
227
228void * obstack_copy (struct obstack *obstack, const void *address, int size);
229void * obstack_copy0 (struct obstack *obstack, const void *address, int size);
230
231void obstack_free (struct obstack *obstack, void *block);
232
233void obstack_blank (struct obstack *obstack, int size);
234
235void obstack_grow (struct obstack *obstack, const void *data, int size);
236void obstack_grow0 (struct obstack *obstack, const void *data, int size);
237
238void obstack_1grow (struct obstack *obstack, int data_char);
239void obstack_ptr_grow (struct obstack *obstack, const void *data);
240void obstack_int_grow (struct obstack *obstack, int data);
241
242void * obstack_finish (struct obstack *obstack);
243
244int obstack_object_size (struct obstack *obstack);
245
246int obstack_room (struct obstack *obstack);
247void obstack_make_room (struct obstack *obstack, int size);
248void obstack_1grow_fast (struct obstack *obstack, int data_char);
249void obstack_ptr_grow_fast (struct obstack *obstack, const void *data);
250void obstack_int_grow_fast (struct obstack *obstack, int data);
251void obstack_blank_fast (struct obstack *obstack, int size);
252
253void * obstack_base (struct obstack *obstack);
254void * obstack_next_free (struct obstack *obstack);
255int obstack_alignment_mask (struct obstack *obstack);
256int obstack_chunk_size (struct obstack *obstack);
257int obstack_memory_used (struct obstack *obstack);
258
259#endif /* __STDC__ */
260
261/* Non-ANSI C cannot really support alternative functions for these macros,
262   so we do not declare them.  */
263
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 defined __STDC__ && __STDC__
269extern void (*obstack_alloc_failed_handler) (void);
270#else
271extern void (*obstack_alloc_failed_handler) ();
272#endif
273
274/* Exit value used when `print_and_abort' is used.  */
275extern int obstack_exit_failure;
276
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.  */
280
281#define obstack_base(h) ((h)->object_base)
282
283/* Size for allocating ordinary chunks.  */
284
285#define obstack_chunk_size(h) ((h)->chunk_size)
286
287/* Pointer to next byte not yet allocated in current chunk.  */
288
289#define obstack_next_free(h)    ((h)->next_free)
290
291/* Mask specifying low bits that should be clear in address of an object.  */
292
293#define obstack_alignment_mask(h) ((h)->alignment_mask)
294
295/* To prevent prototype warnings provide complete argument list in
296   standard C version.  */
297#if defined __STDC__ && __STDC__
298
299# define obstack_init(h)                                        \
300  _obstack_begin ((h), 0, 0,                                    \
301                  (void *(*) (long)) obstack_chunk_alloc,       \
302                  (void (*) (void *)) obstack_chunk_free)
303
304# define obstack_begin(h, size)                                 \
305  _obstack_begin ((h), (size), 0,                               \
306                  (void *(*) (long)) obstack_chunk_alloc,       \
307                  (void (*) (void *)) obstack_chunk_free)
308
309# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
310  _obstack_begin ((h), (size), (alignment),                                \
311                  (void *(*) (long)) (chunkfun),                           \
312                  (void (*) (void *)) (freefun))
313
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))
318
319# define obstack_chunkfun(h, newchunkfun) \
320  ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
321
322# define obstack_freefun(h, newfreefun) \
323  ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
324
325#else
326
327# define obstack_init(h)                                                \
328  _obstack_begin ((h), 0, 0,                                            \
329                  (void *(*) ()) obstack_chunk_alloc,                   \
330                  (void (*) ()) obstack_chunk_free)
331
332# define obstack_begin(h, size)                                         \
333  _obstack_begin ((h), (size), 0,                                       \
334                  (void *(*) ()) obstack_chunk_alloc,                   \
335                  (void (*) ()) obstack_chunk_free)
336
337# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
338  _obstack_begin ((h), (size), (alignment),                                \
339                  (void *(*) ()) (chunkfun),                               \
340                  (void (*) ()) (freefun))
341
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))
346
347# define obstack_chunkfun(h, newchunkfun) \
348  ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))
349
350# define obstack_freefun(h, newfreefun) \
351  ((h) -> freefun = (void (*)()) (newfreefun))
352
353#endif
354
355#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
356
357#define obstack_blank_fast(h,n) ((h)->next_free += (n))
358
359#define obstack_memory_used(h) _obstack_memory_used (h)
360
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
364   __GNUC_MINOR__.  */
365# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
366#  define __extension__
367# endif
368
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.  */
373
374# define obstack_object_size(OBSTACK)                                   \
375  __extension__                                                         \
376  ({ struct obstack *__o = (OBSTACK);                                   \
377     (unsigned) (__o->next_free - __o->object_base); })
378
379# define obstack_room(OBSTACK)                                          \
380  __extension__                                                         \
381  ({ struct obstack *__o = (OBSTACK);                                   \
382     (unsigned) (__o->chunk_limit - __o->next_free); })
383
384# define obstack_make_room(OBSTACK,length)                              \
385__extension__                                                           \
386({ struct obstack *__o = (OBSTACK);                                     \
387   int __len = (length);                                                \
388   if (__o->chunk_limit - __o->next_free < __len)                       \
389     _obstack_newchunk (__o, __len);                                    \
390   (void) 0; })
391
392# define obstack_empty_p(OBSTACK)                                       \
393  __extension__                                                         \
394  ({ struct obstack *__o = (OBSTACK);                                   \
395     (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); })
396
397# define obstack_grow(OBSTACK,where,length)                             \
398__extension__                                                           \
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;                                             \
405   (void) 0; })
406
407# define obstack_grow0(OBSTACK,where,length)                            \
408__extension__                                                           \
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;                                             \
416   (void) 0; })
417
418# define obstack_1grow(OBSTACK,datum)                                   \
419__extension__                                                           \
420({ struct obstack *__o = (OBSTACK);                                     \
421   if (__o->next_free + 1 > __o->chunk_limit)                           \
422     _obstack_newchunk (__o, 1);                                        \
423   *(__o->next_free)++ = (datum);                                       \
424   (void) 0; })
425
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.  */
429
430# define obstack_ptr_grow(OBSTACK,datum)                                \
431__extension__                                                           \
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)), (__o->next_free += sizeof (void *)));                               \
436   (void) 0; })
437
438# define obstack_int_grow(OBSTACK,datum)                                \
439__extension__                                                           \
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)), (__o->next_free += sizeof (int )));                           \
444   (void) 0; })
445
446# define obstack_ptr_grow_fast(h,aptr)                                  \
447  (((*((void **) (h)->next_free) = (aptr)), ( (h)->next_free += sizeof (void *))))
448
449# define obstack_int_grow_fast(h,aint)                                  \
450  (((*((int *) (h)->next_free) = (aint)), ( (h)->next_free += sizeof (int ))))
451
452# define obstack_blank(OBSTACK,length)                                  \
453__extension__                                                           \
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;                                             \
459   (void) 0; })
460
461# define obstack_alloc(OBSTACK,length)                                  \
462__extension__                                                           \
463({ struct obstack *__h = (OBSTACK);                                     \
464   obstack_blank (__h, (length));                                       \
465   obstack_finish (__h); })
466
467# define obstack_copy(OBSTACK,where,length)                             \
468__extension__                                                           \
469({ struct obstack *__h = (OBSTACK);                                     \
470   obstack_grow (__h, (where), (length));                               \
471   obstack_finish (__h); })
472
473# define obstack_copy0(OBSTACK,where,length)                            \
474__extension__                                                           \
475({ struct obstack *__h = (OBSTACK);                                     \
476   obstack_grow0 (__h, (where), (length));                              \
477   obstack_finish (__h); })
478
479/* The local variable is named __o1 to avoid a name conflict
480   when obstack_blank is called.  */
481# define obstack_finish(OBSTACK)                                        \
482__extension__                                                           \
483({ struct obstack *__o1 = (OBSTACK);                                    \
484   void *value;                                                         \
485   value = (void *) __o1->object_base;                                  \
486   if (__o1->next_free == value)                                        \
487     __o1->maybe_empty_object = 1;                                      \
488   __o1->next_free                                                      \
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;                                 \
495   value; })
496
497# define obstack_free(OBSTACK, OBJ)                                     \
498__extension__                                                           \
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); })
504
505#else /* not __GNUC__ or not __STDC__ */
506
507# define obstack_object_size(h) \
508 (unsigned) ((h)->next_free - (h)->object_base)
509
510# define obstack_room(h)                \
511 (unsigned) ((h)->chunk_limit - (h)->next_free)
512
513# define obstack_empty_p(h) \
514 ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0)
515
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.  */
521
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))
526
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)
533
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)
541
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)))
546
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)))
551
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)))
556
557# define obstack_ptr_grow_fast(h,aptr)                                  \
558  (((*((const char **) (h)->next_free) = (aptr)), ( (h)->next_free += sizeof (const char *))))
559
560# define obstack_int_grow_fast(h,aint)                                  \
561  (((*((int *) (h)->next_free) = (aint)), ( (h)->next_free += sizeof (int ))))
562
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))
568
569# define obstack_alloc(h,length)                                        \
570 (obstack_blank ((h), (length)), obstack_finish ((h)))
571
572# define obstack_copy(h,where,length)                                   \
573 (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
574
575# define obstack_copy0(h,where,length)                                  \
576 (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
577
578# define obstack_finish(h)                                              \
579( ((h)->next_free == (h)->object_base                                   \
580   ? (((h)->maybe_empty_object = 1), 0)                                 \
581   : 0),                                                                \
582  (h)->temp = __PTR_TO_INT ((h)->object_base),                          \
583  (h)->next_free                                                        \
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))
591
592# if 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)))
599# else
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)))
606# endif
607
608#endif /* not __GNUC__ or not __STDC__ */
609
610#ifdef __cplusplus
611}       /* C++ */
612#endif
613
614#endif /* obstack.h */
Note: See TracBrowser for help on using the repository browser.