/[anubis]/anubis/src/obstack.h
ViewVC logotype

Diff of /anubis/src/obstack.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by gray, Tue Feb 11 16:50:07 2003 UTC revision 1.2 by polak, Fri Jun 6 09:14:22 2003 UTC
# Line 1  Line 1 
1  /* obstack.h - object stack macros  /* obstack.h - object stack macros
2     Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96 Free Software Foundation, Inc.     Copyright (C) 1988,89,90,91,92,93,94,96,97,98,99,2003 Free Software Foundation, Inc.
3    
4  This program is free software; you can redistribute it and/or modify it     This file is part of the GNU C Library.  Its master source is NOT part of
5  under the terms of the GNU Library General Public License as published by the     the C library, however.  The master source lives in /gd/gnu/lib.
6  Free Software Foundation; either version 2, or (at your option) any  
7  later version.     NOTE: The canonical source of this file is maintained with the GNU C Library.
8       Bugs can be reported to bug-glibc@gnu.org.
9  This program is distributed in the hope that it will be useful,  
10  but WITHOUT ANY WARRANTY; without even the implied warranty of     This program is free software; you can redistribute it and/or modify it
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     under the terms of the GNU General Public License as published by the
12  GNU Library General Public License for more details.     Free Software Foundation; either version 2, or (at your option) any
13       later version.
14  You should have received a copy of the GNU Library General Public License  
15  along with this program; if not, write to the Free Software     This program is distributed in the hope that it will be useful,
16  Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */     but WITHOUT ANY WARRANTY; without even the implied warranty of
17       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18       Library General Public License for more details.
19    
20       You should have received a copy of the GNU Library General Public
21       License along with this program; if not, write to the Free Software
22       Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
23       USA.  */
24    
25  /* Summary:  /* Summary:
26    
# Line 100  Summary: Line 107  Summary:
107    
108  /* Don't do the contents of this file more than once.  */  /* Don't do the contents of this file more than once.  */
109    
110  #ifndef __OBSTACK_H__  #ifndef _OBSTACK_H
111  #define __OBSTACK_H__  #define _OBSTACK_H 1
112    
113    #ifdef __cplusplus
114    extern "C" {
115    #endif
116    
117  /* We use subtraction of (char *)0 instead of casting to int  /* We use subtraction of (char *) 0 instead of casting to int
118     because on word-addressable machines a simple cast to int     because on word-addressable machines a simple cast to int
119     may ignore the byte-within-word field of the pointer.  */     may ignore the byte-within-word field of the pointer.  */
120    
121  #ifndef __PTR_TO_INT  #ifndef __PTR_TO_INT
122  #define __PTR_TO_INT(P) ((P) - (char *)0)  # define __PTR_TO_INT(P) ((P) - (char *) 0)
123  #endif  #endif
124    
125  #ifndef __INT_TO_PTR  #ifndef __INT_TO_PTR
126  #define __INT_TO_PTR(P) ((P) + (char *)0)  #if defined __STDC__ && __STDC__
127  #endif  # define __INT_TO_PTR(P) ((void *) ((P) + (char *) 0))
128    #else
129  /* We need the type of the resulting object.  In ANSI C it is ptrdiff_t  # define __INT_TO_PTR(P) ((P) + (char *) 0)
    but in traditional C it is usually long.  If we are in ANSI C and  
    don't already have ptrdiff_t get it.  */  
   
 #if defined (__STDC__) && ! defined (offsetof)  
 #if defined (__GNUC__) && defined (IN_GCC)  
 /* On Next machine, the system's stddef.h screws up if included  
    after we have defined just ptrdiff_t, so include all of stddef.h.  
    Otherwise, define just ptrdiff_t, which is all we need.  */  
 #ifndef __NeXT__  
 #define __need_ptrdiff_t  
130  #endif  #endif
131  #endif  #endif
132    
133  #include <stddef.h>  /* We need the type of the resulting object.  If __PTRDIFF_TYPE__ is
134       defined, as with GNU C, use that; that way we don't pollute the
135       namespace with <stddef.h>'s symbols.  Otherwise, if <stddef.h> is
136       available, include it and use ptrdiff_t.  In traditional C, long is
137       the best that we can do.  */
138    
139    #ifdef __PTRDIFF_TYPE__
140    # define PTR_INT_TYPE __PTRDIFF_TYPE__
141    #else
142    # ifdef HAVE_STDDEF_H
143    #  include <stddef.h>
144    #  define PTR_INT_TYPE ptrdiff_t
145    # else
146    #  define PTR_INT_TYPE long
147    # endif
148  #endif  #endif
149    
150  #ifdef __STDC__  #if defined _LIBC || defined HAVE_STRING_H
151  #define PTR_INT_TYPE ptrdiff_t  # include <string.h>
152    # define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
153  #else  #else
154  #define PTR_INT_TYPE long  # ifdef memcpy
155    #  define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
156    # else
157    #  define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
158    # endif
159  #endif  #endif
160    
161  struct _obstack_chunk           /* Lives at front of each chunk. */  struct _obstack_chunk           /* Lives at front of each chunk. */
# Line 148  struct _obstack_chunk          /* Lives at front Line 168  struct _obstack_chunk          /* Lives at front
168  struct obstack          /* control current object in current chunk */  struct obstack          /* control current object in current chunk */
169  {  {
170    long  chunk_size;             /* preferred size to allocate chunks in */    long  chunk_size;             /* preferred size to allocate chunks in */
171    struct _obstack_chunk* chunk; /* address of current struct obstack_chunk */    struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
172    char  *object_base;           /* address of object we are building */    char  *object_base;           /* address of object we are building */
173    char  *next_free;             /* where to add next char to current object */    char  *next_free;             /* where to add next char to current object */
174    char  *chunk_limit;           /* address of char after current chunk */    char  *chunk_limit;           /* address of char after current chunk */
175    PTR_INT_TYPE temp;            /* Temporary for some macros.  */    PTR_INT_TYPE temp;            /* Temporary for some macros.  */
176    int   alignment_mask;         /* Mask of alignment for each object. */    int   alignment_mask;         /* Mask of alignment for each object. */
177    #if defined __STDC__ && __STDC__
178      /* These prototypes vary based on `use_extra_arg', and we use
179         casts to the prototypeless function type in all assignments,
180         but having prototypes here quiets -Wstrict-prototypes.  */
181      struct _obstack_chunk *(*chunkfun) (void *, long);
182      void (*freefun) (void *, struct _obstack_chunk *);
183      void *extra_arg;              /* first arg for chunk alloc/dealloc funcs */
184    #else
185    struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk.  */    struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk.  */
186    void (*freefun) ();           /* User's function to free a chunk.  */    void (*freefun) ();           /* User's function to free a chunk.  */
187    char *extra_arg;              /* first arg for chunk alloc/dealloc funcs */    char *extra_arg;              /* first arg for chunk alloc/dealloc funcs */
188    #endif
189    unsigned use_extra_arg:1;     /* chunk alloc/dealloc funcs take extra arg */    unsigned use_extra_arg:1;     /* chunk alloc/dealloc funcs take extra arg */
190    unsigned maybe_empty_object:1;/* There is a possibility that the current    unsigned maybe_empty_object:1;/* There is a possibility that the current
191                                     chunk contains a zero-length object.  This                                     chunk contains a zero-length object.  This
192                                     prevents freeing the chunk if we allocate                                     prevents freeing the chunk if we allocate
193                                     a bigger chunk to replace it. */                                     a bigger chunk to replace it. */
194    unsigned alloc_failed:1;      /* chunk alloc func returned 0 */    unsigned alloc_failed:1;      /* No longer used, as we now call the failed
195                                       handler on error, but retained for binary
196                                       compatibility.  */
197  };  };
198    
199  /* Declare the external functions we use; they are in obstack.c.  */  /* Declare the external functions we use; they are in obstack.c.  */
200    
201  #ifdef __STDC__  #if defined __STDC__ && __STDC__
202  extern void _obstack_newchunk (struct obstack *, int);  extern void _obstack_newchunk (struct obstack *, int);
203  extern void _obstack_free (struct obstack *, void *);  extern void _obstack_free (struct obstack *, void *);
204  extern int _obstack_begin (struct obstack *, int, int,  extern int _obstack_begin (struct obstack *, int, int,
205                              void *(*) (), void (*) ());                              void *(*) (long), void (*) (void *));
206  extern int _obstack_begin_1 (struct obstack *, int, int,  extern int _obstack_begin_1 (struct obstack *, int, int,
207                                void *(*) (), void (*) (), void *);                               void *(*) (void *, long),
208                                 void (*) (void *, void *), void *);
209  extern int _obstack_memory_used (struct obstack *);  extern int _obstack_memory_used (struct obstack *);
210  #else  #else
211  extern void _obstack_newchunk ();  extern void _obstack_newchunk ();
# Line 183  extern int _obstack_begin_1 (); Line 215  extern int _obstack_begin_1 ();
215  extern int _obstack_memory_used ();  extern int _obstack_memory_used ();
216  #endif  #endif
217    
218  #ifdef __STDC__  #if defined __STDC__ && __STDC__
219    
220  /* Do the function-declarations after the structs  /* Do the function-declarations after the structs
221     but before defining the macros.  */     but before defining the macros.  */
# Line 192  void obstack_init (struct obstack *obsta Line 224  void obstack_init (struct obstack *obsta
224    
225  void * obstack_alloc (struct obstack *obstack, int size);  void * obstack_alloc (struct obstack *obstack, int size);
226    
227  void * obstack_copy (struct obstack *obstack, void *address, int size);  void * obstack_copy (struct obstack *obstack, const void *address, int size);
228  void * obstack_copy0 (struct obstack *obstack, void *address, int size);  void * obstack_copy0 (struct obstack *obstack, const void *address, int size);
229    
230  void obstack_free (struct obstack *obstack, void *block);  void obstack_free (struct obstack *obstack, void *block);
231    
232  void obstack_blank (struct obstack *obstack, int size);  void obstack_blank (struct obstack *obstack, int size);
233    
234  void obstack_grow (struct obstack *obstack, void *data, int size);  void obstack_grow (struct obstack *obstack, const void *data, int size);
235  void obstack_grow0 (struct obstack *obstack, void *data, int size);  void obstack_grow0 (struct obstack *obstack, const void *data, int size);
236    
237  void obstack_1grow (struct obstack *obstack, int data_char);  void obstack_1grow (struct obstack *obstack, int data_char);
238  void obstack_ptr_grow (struct obstack *obstack, void *data);  void obstack_ptr_grow (struct obstack *obstack, const void *data);
239  void obstack_int_grow (struct obstack *obstack, int data);  void obstack_int_grow (struct obstack *obstack, int data);
240    
241  void * obstack_finish (struct obstack *obstack);  void * obstack_finish (struct obstack *obstack);
# Line 211  void * obstack_finish (struct obstack *o Line 243  void * obstack_finish (struct obstack *o
243  int obstack_object_size (struct obstack *obstack);  int obstack_object_size (struct obstack *obstack);
244    
245  int obstack_room (struct obstack *obstack);  int obstack_room (struct obstack *obstack);
246    void obstack_make_room (struct obstack *obstack, int size);
247  void obstack_1grow_fast (struct obstack *obstack, int data_char);  void obstack_1grow_fast (struct obstack *obstack, int data_char);
248  void obstack_ptr_grow_fast (struct obstack *obstack, void *data);  void obstack_ptr_grow_fast (struct obstack *obstack, const void *data);
249  void obstack_int_grow_fast (struct obstack *obstack, int data);  void obstack_int_grow_fast (struct obstack *obstack, int data);
250  void obstack_blank_fast (struct obstack *obstack, int size);  void obstack_blank_fast (struct obstack *obstack, int size);
251    
# Line 226  int obstack_memory_used (struct obstack Line 259  int obstack_memory_used (struct obstack
259    
260  /* Non-ANSI C cannot really support alternative functions for these macros,  /* Non-ANSI C cannot really support alternative functions for these macros,
261     so we do not declare them.  */     so we do not declare them.  */
262    
263    /* Error handler called when `obstack_chunk_alloc' failed to allocate
264       more memory.  This can be set to a user defined function which
265       should either abort gracefully or use longjump - but shouldn't
266       return.  The default action is to print a message and abort.  */
267    #if defined __STDC__ && __STDC__
268    extern void (*obstack_alloc_failed_handler) (void);
269    #else
270    extern void (*obstack_alloc_failed_handler) ();
271    #endif
272    
273    /* Exit value used when `print_and_abort' is used.  */
274    extern int obstack_exit_failure;
275    
276  /* Pointer to beginning of object being allocated or to be allocated next.  /* Pointer to beginning of object being allocated or to be allocated next.
277     Note that this might not be the final address of the object     Note that this might not be the final address of the object
278     because a new chunk might be needed to hold the final size.  */     because a new chunk might be needed to hold the final size.  */
279    
280  #define obstack_base(h) ((h)->alloc_failed ? 0 : (h)->object_base)  #define obstack_base(h) ((h)->object_base)
281    
282  /* Size for allocating ordinary chunks.  */  /* Size for allocating ordinary chunks.  */
283    
# Line 239  int obstack_memory_used (struct obstack Line 285  int obstack_memory_used (struct obstack
285    
286  /* Pointer to next byte not yet allocated in current chunk.  */  /* Pointer to next byte not yet allocated in current chunk.  */
287    
288  #define obstack_next_free(h)    ((h)->alloc_failed ? 0 : (h)->next_free)  #define obstack_next_free(h)    ((h)->next_free)
289    
290  /* Mask specifying low bits that should be clear in address of an object.  */  /* Mask specifying low bits that should be clear in address of an object.  */
291    
292  #define obstack_alignment_mask(h) ((h)->alignment_mask)  #define obstack_alignment_mask(h) ((h)->alignment_mask)
293    
294  #define obstack_init(h) \  /* To prevent prototype warnings provide complete argument list in
295    _obstack_begin ((h), 0, 0, \     standard C version.  */
296                    (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free)  #if defined __STDC__ && __STDC__
297    
298  #define obstack_begin(h, size) \  # define obstack_init(h)                                        \
299    _obstack_begin ((h), (size), 0, \    _obstack_begin ((h), 0, 0,                                    \
300                    (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free)                    (void *(*) (long)) obstack_chunk_alloc,       \
301                      (void (*) (void *)) obstack_chunk_free)
302  #define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \  
303    _obstack_begin ((h), (size), (alignment), \  # define obstack_begin(h, size)                                 \
304                      (void *(*) ()) (chunkfun), (void (*) ()) (freefun))    _obstack_begin ((h), (size), 0,                               \
305                      (void *(*) (long)) obstack_chunk_alloc,       \
306  #define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \                    (void (*) (void *)) obstack_chunk_free)
307    _obstack_begin_1 ((h), (size), (alignment), \  
308                      (void *(*) ()) (chunkfun), (void (*) ()) (freefun), (arg))  # define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
309      _obstack_begin ((h), (size), (alignment),                                \
310                      (void *(*) (long)) (chunkfun),                           \
311                      (void (*) (void *)) (freefun))
312    
313    # define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
314      _obstack_begin_1 ((h), (size), (alignment),                           \
315                        (void *(*) (void *, long)) (chunkfun),              \
316                        (void (*) (void *, void *)) (freefun), (arg))
317    
318    # define obstack_chunkfun(h, newchunkfun) \
319      ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
320    
321  #define obstack_chunkfun(h, newchunkfun) \  # define obstack_freefun(h, newfreefun) \
322      ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
323    
324    #else
325    
326    # define obstack_init(h)                                                \
327      _obstack_begin ((h), 0, 0,                                            \
328                      (void *(*) ()) obstack_chunk_alloc,                   \
329                      (void (*) ()) obstack_chunk_free)
330    
331    # define obstack_begin(h, size)                                         \
332      _obstack_begin ((h), (size), 0,                                       \
333                      (void *(*) ()) obstack_chunk_alloc,                   \
334                      (void (*) ()) obstack_chunk_free)
335    
336    # define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
337      _obstack_begin ((h), (size), (alignment),                                \
338                      (void *(*) ()) (chunkfun),                               \
339                      (void (*) ()) (freefun))
340    
341    # define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
342      _obstack_begin_1 ((h), (size), (alignment),                           \
343                        (void *(*) ()) (chunkfun),                          \
344                        (void (*) ()) (freefun), (arg))
345    
346    # define obstack_chunkfun(h, newchunkfun) \
347    ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))    ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))
348    
349  #define obstack_freefun(h, newfreefun) \  # define obstack_freefun(h, newfreefun) \
350    ((h) -> freefun = (void (*)()) (newfreefun))    ((h) -> freefun = (void (*)()) (newfreefun))
351    
352    #endif
353    
354  #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)  #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
355    
356  #define obstack_blank_fast(h,n) ((h)->next_free += (n))  #define obstack_blank_fast(h,n) ((h)->next_free += (n))
357    
358  #define obstack_memory_used(h) _obstack_memory_used (h)  #define obstack_memory_used(h) _obstack_memory_used (h)
359    
360  #if defined (__GNUC__) && defined (__STDC__)  #if defined __GNUC__ && defined __STDC__ && __STDC__
361  #if __GNUC__ < 2  /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
362  #define __extension__     does not implement __extension__.  But that compiler doesn't define
363  #endif     __GNUC_MINOR__.  */
364    # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
365    #  define __extension__
366    # endif
367    
368  /* For GNU C, if not -traditional,  /* For GNU C, if not -traditional,
369     we can define these macros to compute all args only once     we can define these macros to compute all args only once
370     without using a global variable.     without using a global variable.
371     Also, we can avoid using the `temp' slot, to make faster code.  */     Also, we can avoid using the `temp' slot, to make faster code.  */
372    
373  #define obstack_object_size(OBSTACK)                                    \  # define obstack_object_size(OBSTACK)                                   \
374    __extension__                                                         \    __extension__                                                         \
375    ({ struct obstack *__o = (OBSTACK);                                   \    ({ struct obstack const *__o = (OBSTACK);                             \
      __o->alloc_failed ? 0 :                                            \  
376       (unsigned) (__o->next_free - __o->object_base); })       (unsigned) (__o->next_free - __o->object_base); })
377    
378  #define obstack_room(OBSTACK)                                           \  # define obstack_room(OBSTACK)                                          \
379    __extension__                                                         \    __extension__                                                         \
380    ({ struct obstack *__o = (OBSTACK);                                   \    ({ struct obstack const *__o = (OBSTACK);                             \
381       (unsigned) (__o->chunk_limit - __o->next_free); })       (unsigned) (__o->chunk_limit - __o->next_free); })
382    
383  #define obstack_grow(OBSTACK,where,length)                              \  # define obstack_make_room(OBSTACK,length)                              \
384    __extension__                                                           \
385    ({ struct obstack *__o = (OBSTACK);                                     \
386       int __len = (length);                                                \
387       if (__o->chunk_limit - __o->next_free < __len)                       \
388         _obstack_newchunk (__o, __len);                                    \
389       (void) 0; })
390    
391    # define obstack_empty_p(OBSTACK)                                       \
392      __extension__                                                         \
393      ({ struct obstack const *__o = (OBSTACK);                             \
394         (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); })
395    
396    # define obstack_grow(OBSTACK,where,length)                             \
397  __extension__                                                           \  __extension__                                                           \
398  ({ struct obstack *__o = (OBSTACK);                                     \  ({ struct obstack *__o = (OBSTACK);                                     \
399     int __len = (length);                                                \     int __len = (length);                                                \
400     if (__o->next_free + __len > __o->chunk_limit)                       \     if (__o->next_free + __len > __o->chunk_limit)                       \
401       _obstack_newchunk (__o, __len);                                    \       _obstack_newchunk (__o, __len);                                    \
402     if (!__o->alloc_failed)                                              \     _obstack_memcpy (__o->next_free, (where), __len);                    \
403       {                                                                  \     __o->next_free += __len;                                             \
         bcopy (where, __o->next_free, __len);                           \  
         __o->next_free += __len;                                        \  
      }                                                                  \  
404     (void) 0; })     (void) 0; })
405    
406  #define obstack_grow0(OBSTACK,where,length)                             \  # define obstack_grow0(OBSTACK,where,length)                            \
407  __extension__                                                           \  __extension__                                                           \
408  ({ struct obstack *__o = (OBSTACK);                                     \  ({ struct obstack *__o = (OBSTACK);                                     \
409     int __len = (length);                                                \     int __len = (length);                                                \
410     if (__o->next_free + __len + 1 > __o->chunk_limit)                   \     if (__o->next_free + __len + 1 > __o->chunk_limit)                   \
411       _obstack_newchunk (__o, __len + 1);                                \       _obstack_newchunk (__o, __len + 1);                                \
412     if (!__o->alloc_failed)                                              \     _obstack_memcpy (__o->next_free, (where), __len);                    \
413       {                                                                  \     __o->next_free += __len;                                             \
414         bcopy (where, __o->next_free, __len);                            \     *(__o->next_free)++ = 0;                                             \
        __o->next_free += __len;                                         \  
        *(__o->next_free)++ = 0;                                         \  
      }                                                                  \  
415     (void) 0; })     (void) 0; })
416    
417  #define obstack_1grow(OBSTACK,datum)                                    \  # define obstack_1grow(OBSTACK,datum)                                   \
418  __extension__                                                           \  __extension__                                                           \
419  ({ struct obstack *__o = (OBSTACK);                                     \  ({ struct obstack *__o = (OBSTACK);                                     \
420     if (__o->next_free + 1 > __o->chunk_limit)                           \     if (__o->next_free + 1 > __o->chunk_limit)                           \
421       _obstack_newchunk (__o, 1);                                        \       _obstack_newchunk (__o, 1);                                        \
422     if (!__o->alloc_failed)                                              \     *(__o->next_free)++ = (datum);                                       \
      *(__o->next_free)++ = (datum);                                     \  
423     (void) 0; })     (void) 0; })
424    
425  /* These assume that the obstack alignment is good enough for pointers or ints,  /* These assume that the obstack alignment is good enough for pointers
426     and that the data added so far to the current object     or ints, and that the data added so far to the current object
427     shares that much alignment.  */     shares that much alignment.  */
428      
429  #define obstack_ptr_grow(OBSTACK,datum)                                 \  # define obstack_ptr_grow(OBSTACK,datum)                                \
430  __extension__                                                           \  __extension__                                                           \
431  ({ struct obstack *__o = (OBSTACK);                                     \  ({ struct obstack *__o = (OBSTACK);                                     \
432     if (__o->next_free + sizeof (void *) > __o->chunk_limit)             \     if (__o->next_free + sizeof (void *) > __o->chunk_limit)             \
433       _obstack_newchunk (__o, sizeof (void *));                          \       _obstack_newchunk (__o, sizeof (void *));                          \
434     if (!__o->alloc_failed)                                              \     *((void **)__o->next_free)++ = (datum);                              \
      *((void **)__o->next_free)++ = ((void *)datum);                    \  
435     (void) 0; })     (void) 0; })
436    
437  #define obstack_int_grow(OBSTACK,datum)                                 \  # define obstack_int_grow(OBSTACK,datum)                                \
438  __extension__                                                           \  __extension__                                                           \
439  ({ struct obstack *__o = (OBSTACK);                                     \  ({ struct obstack *__o = (OBSTACK);                                     \
440     if (__o->next_free + sizeof (int) > __o->chunk_limit)                \     if (__o->next_free + sizeof (int) > __o->chunk_limit)                \
441       _obstack_newchunk (__o, sizeof (int));                             \       _obstack_newchunk (__o, sizeof (int));                             \
442     if (!__o->alloc_failed)                                              \     *((int *)__o->next_free)++ = (datum);                                \
      *((int *)__o->next_free)++ = ((int)datum);                         \  
443     (void) 0; })     (void) 0; })
444    
445  #define obstack_ptr_grow_fast(h,aptr) (*((void **)(h)->next_free)++ = (void *)aptr)  # define obstack_ptr_grow_fast(h,aptr)                                  \
446  #define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint)    (*((void **) (h)->next_free)++ = (aptr))
447    
448    # define obstack_int_grow_fast(h,aint)                                  \
449      (*((int *) (h)->next_free)++ = (aint))
450    
451  #define obstack_blank(OBSTACK,length)                                   \  # define obstack_blank(OBSTACK,length)                                  \
452  __extension__                                                           \  __extension__                                                           \
453  ({ struct obstack *__o = (OBSTACK);                                     \  ({ struct obstack *__o = (OBSTACK);                                     \
454     int __len = (length);                                                \     int __len = (length);                                                \
455     if (__o->chunk_limit - __o->next_free < __len)                       \     if (__o->chunk_limit - __o->next_free < __len)                       \
456       _obstack_newchunk (__o, __len);                                    \       _obstack_newchunk (__o, __len);                                    \
457     if (!__o->alloc_failed)                                              \     __o->next_free += __len;                                             \
      __o->next_free += __len;                                           \  
458     (void) 0; })     (void) 0; })
459    
460  #define obstack_alloc(OBSTACK,length)                                   \  # define obstack_alloc(OBSTACK,length)                                  \
461  __extension__                                                           \  __extension__                                                           \
462  ({ struct obstack *__h = (OBSTACK);                                     \  ({ struct obstack *__h = (OBSTACK);                                     \
463     obstack_blank (__h, (length));                                       \     obstack_blank (__h, (length));                                       \
464     obstack_finish (__h); })     obstack_finish (__h); })
465    
466  #define obstack_copy(OBSTACK,where,length)                              \  # define obstack_copy(OBSTACK,where,length)                             \
467  __extension__                                                           \  __extension__                                                           \
468  ({ struct obstack *__h = (OBSTACK);                                     \  ({ struct obstack *__h = (OBSTACK);                                     \
469     obstack_grow (__h, (where), (length));                               \     obstack_grow (__h, (where), (length));                               \
470     obstack_finish (__h); })     obstack_finish (__h); })
471    
472  #define obstack_copy0(OBSTACK,where,length)                             \  # define obstack_copy0(OBSTACK,where,length)                            \
473  __extension__                                                           \  __extension__                                                           \
474  ({ struct obstack *__h = (OBSTACK);                                     \  ({ struct obstack *__h = (OBSTACK);                                     \
475     obstack_grow0 (__h, (where), (length));                              \     obstack_grow0 (__h, (where), (length));                              \
# Line 385  __extension__                                                          \ Line 477  __extension__                                                          \
477    
478  /* The local variable is named __o1 to avoid a name conflict  /* The local variable is named __o1 to avoid a name conflict
479     when obstack_blank is called.  */     when obstack_blank is called.  */
480  #define obstack_finish(OBSTACK)                                         \  # define obstack_finish(OBSTACK)                                        \
481  __extension__                                                           \  __extension__                                                           \
482  ({ struct obstack *__o1 = (OBSTACK);                                    \  ({ struct obstack *__o1 = (OBSTACK);                                    \
483     void *value;                                                         \     void *value;                                                         \
484     if (__o1->alloc_failed)                                              \     value = (void *) __o1->object_base;                                  \
485       value = 0;                                                         \     if (__o1->next_free == value)                                        \
486     else                                                                 \       __o1->maybe_empty_object = 1;                                      \
487       {                                                                  \     __o1->next_free                                                      \
488         value = (void *) __o1->object_base;                              \       = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
489         if (__o1->next_free == value)                                    \                       & ~ (__o1->alignment_mask));                       \
490           __o1->maybe_empty_object = 1;                                  \     if (__o1->next_free - (char *)__o1->chunk                            \
491         __o1->next_free                                                  \         > __o1->chunk_limit - (char *)__o1->chunk)                       \
492           = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\       __o1->next_free = __o1->chunk_limit;                               \
493                           & ~ (__o1->alignment_mask));                   \     __o1->object_base = __o1->next_free;                                 \
        if (__o1->next_free - (char *)__o1->chunk                        \  
            > __o1->chunk_limit - (char *)__o1->chunk)                   \  
          __o1->next_free = __o1->chunk_limit;                           \  
        __o1->object_base = __o1->next_free;                             \  
       }                                                                 \  
494     value; })     value; })
495    
496  #define obstack_free(OBSTACK, OBJ)                                      \  # define obstack_free(OBSTACK, OBJ)                                     \
497  __extension__                                                           \  __extension__                                                           \
498  ({ struct obstack *__o = (OBSTACK);                                     \  ({ struct obstack *__o = (OBSTACK);                                     \
499     void *__obj = (OBJ);                                                 \     void *__obj = (OBJ);                                                 \
500     if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \     if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \
501       __o->next_free = __o->object_base = __obj;                         \       __o->next_free = __o->object_base = (char *)__obj;                 \
502     else (obstack_free) (__o, __obj); })     else (obstack_free) (__o, __obj); })
503    
504  #else /* not __GNUC__ or not __STDC__ */  #else /* not __GNUC__ or not __STDC__ */
505    
506  #define obstack_object_size(h) \  # define obstack_object_size(h) \
507   (unsigned) ((h)->alloc_failed ? 0 : (h)->next_free - (h)->object_base)   (unsigned) ((h)->next_free - (h)->object_base)
508    
509  #define obstack_room(h)         \  # define obstack_room(h)                \
510   (unsigned) ((h)->chunk_limit - (h)->next_free)   (unsigned) ((h)->chunk_limit - (h)->next_free)
511    
512    # define obstack_empty_p(h) \
513     ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0)
514    
515  /* Note that the call to _obstack_newchunk is enclosed in (..., 0)  /* Note that the call to _obstack_newchunk is enclosed in (..., 0)
516     so that we can avoid having void expressions     so that we can avoid having void expressions
517     in the arms of the conditional expression.     in the arms of the conditional expression.
518     Casting the third operand to void was tried before,     Casting the third operand to void was tried before,
519     but some compilers won't accept it.  */     but some compilers won't accept it.  */
520    
521  #define obstack_grow(h,where,length)                                    \  # define obstack_make_room(h,length)                                    \
522    ( (h)->temp = (length),                                                 \
523      (((h)->next_free + (h)->temp > (h)->chunk_limit)                      \
524       ? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
525    
526    # define obstack_grow(h,where,length)                                   \
527  ( (h)->temp = (length),                                                 \  ( (h)->temp = (length),                                                 \
528    (((h)->next_free + (h)->temp > (h)->chunk_limit)                      \    (((h)->next_free + (h)->temp > (h)->chunk_limit)                      \
529     ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),                      \     ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),                      \
530    ((h)->alloc_failed ? 0 :                                              \    _obstack_memcpy ((h)->next_free, (where), (h)->temp),                 \
531    (bcopy (where, (h)->next_free, (h)->temp),                            \    (h)->next_free += (h)->temp)
   (h)->next_free += (h)->temp)))  
532    
533  #define obstack_grow0(h,where,length)                                   \  # define obstack_grow0(h,where,length)                                  \
534  ( (h)->temp = (length),                                                 \  ( (h)->temp = (length),                                                 \
535    (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit)                  \    (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit)                  \
536     ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0),                  \     ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0),                  \
537    ((h)->alloc_failed ? 0 :                                              \    _obstack_memcpy ((h)->next_free, (where), (h)->temp),                 \
   (bcopy (where, (h)->next_free, (h)->temp),                            \  
538    (h)->next_free += (h)->temp,                                          \    (h)->next_free += (h)->temp,                                          \
539    *((h)->next_free)++ = 0)))    *((h)->next_free)++ = 0)
540    
541  #define obstack_1grow(h,datum)                                          \  # define obstack_1grow(h,datum)                                         \
542  ( (((h)->next_free + 1 > (h)->chunk_limit)                              \  ( (((h)->next_free + 1 > (h)->chunk_limit)                              \
543     ? (_obstack_newchunk ((h), 1), 0) : 0),                              \     ? (_obstack_newchunk ((h), 1), 0) : 0),                              \
544   ((h)->alloc_failed ? 0 :                                               \    (*((h)->next_free)++ = (datum)))
   (*((h)->next_free)++ = (datum))))  
545    
546  #define obstack_ptr_grow(h,datum)                                       \  # define obstack_ptr_grow(h,datum)                                      \
547  ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)                \  ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)                \
548     ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),                \     ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),                \
549    ((h)->alloc_failed ? 0 :                                              \    (*((const char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = (datum)))
   (*((char **)(((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *)datum))))  
550    
551  #define obstack_int_grow(h,datum)                                       \  # define obstack_int_grow(h,datum)                                      \
552  ( (((h)->next_free + sizeof (int) > (h)->chunk_limit)                   \  ( (((h)->next_free + sizeof (int) > (h)->chunk_limit)                   \
553     ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),                   \     ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),                   \
554    ((h)->alloc_failed ? 0 :                                              \    (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = (datum)))
   (*((int *)(((h)->next_free+=sizeof(int))-sizeof(int))) = ((int)datum))))  
555    
556  #define obstack_ptr_grow_fast(h,aptr) (*((char **)(h)->next_free)++ = (char *)aptr)  # define obstack_ptr_grow_fast(h,aptr)                                  \
557  #define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint)    (*((const char **) (h)->next_free)++ = (aptr))
558    
559  #define obstack_blank(h,length)                                         \  # define obstack_int_grow_fast(h,aint)                                  \
560      (*((int *) (h)->next_free)++ = (aint))
561    
562    # define obstack_blank(h,length)                                        \
563  ( (h)->temp = (length),                                                 \  ( (h)->temp = (length),                                                 \
564    (((h)->chunk_limit - (h)->next_free < (h)->temp)                      \    (((h)->chunk_limit - (h)->next_free < (h)->temp)                      \
565     ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),                      \     ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),                      \
566    ((h)->alloc_failed ? 0 :                                              \    ((h)->next_free += (h)->temp))
   ((h)->next_free += (h)->temp)))  
567    
568  #define obstack_alloc(h,length)                                         \  # define obstack_alloc(h,length)                                        \
569   (obstack_blank ((h), (length)), obstack_finish ((h)))   (obstack_blank ((h), (length)), obstack_finish ((h)))
570    
571  #define obstack_copy(h,where,length)                                    \  # define obstack_copy(h,where,length)                                   \
572   (obstack_grow ((h), (where), (length)), obstack_finish ((h)))   (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
573    
574  #define obstack_copy0(h,where,length)                                   \  # define obstack_copy0(h,where,length)                                  \
575   (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))   (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
576    
577  #define obstack_finish(h)                                               \  # define obstack_finish(h)                                              \
578  ( (h)->alloc_failed ? 0 :                                               \  ( ((h)->next_free == (h)->object_base                                   \
   (((h)->next_free == (h)->object_base                                  \  
579     ? (((h)->maybe_empty_object = 1), 0)                                 \     ? (((h)->maybe_empty_object = 1), 0)                                 \
580     : 0),                                                                \     : 0),                                                                \
581    (h)->temp = __PTR_TO_INT ((h)->object_base),                          \    (h)->temp = __PTR_TO_INT ((h)->object_base),                          \
582    (h)->next_free                                                        \    (h)->next_free                                                        \
583      = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \      = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \
584                      & ~ ((h)->alignment_mask)),                         \                      & ~ ((h)->alignment_mask)),                         \
585    (((h)->next_free - (char *)(h)->chunk                                 \    (((h)->next_free - (char *) (h)->chunk                                \
586      > (h)->chunk_limit - (char *)(h)->chunk)                            \      > (h)->chunk_limit - (char *) (h)->chunk)                           \
587     ? ((h)->next_free = (h)->chunk_limit) : 0),                          \     ? ((h)->next_free = (h)->chunk_limit) : 0),                          \
588    (h)->object_base = (h)->next_free,                                    \    (h)->object_base = (h)->next_free,                                    \
589    __INT_TO_PTR ((h)->temp)))    __INT_TO_PTR ((h)->temp))
590    
591  #ifdef __STDC__  # if defined __STDC__ && __STDC__
592  #define obstack_free(h,obj)                                             \  #  define obstack_free(h,obj)                                           \
593  ( (h)->temp = (char *)(obj) - (char *) (h)->chunk,                      \  ( (h)->temp = (char *) (obj) - (char *) (h)->chunk,                     \
594    (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\    (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
595     ? (int) ((h)->next_free = (h)->object_base                           \     ? (int) ((h)->next_free = (h)->object_base                           \
596              = (h)->temp + (char *) (h)->chunk)                          \              = (h)->temp + (char *) (h)->chunk)                          \
597     : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))     : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))
598  #else  # else
599  #define obstack_free(h,obj)                                             \  #  define obstack_free(h,obj)                                           \
600  ( (h)->temp = (char *)(obj) - (char *) (h)->chunk,                      \  ( (h)->temp = (char *) (obj) - (char *) (h)->chunk,                     \
601    (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\    (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
602     ? (int) ((h)->next_free = (h)->object_base                           \     ? (int) ((h)->next_free = (h)->object_base                           \
603              = (h)->temp + (char *) (h)->chunk)                          \              = (h)->temp + (char *) (h)->chunk)                          \
604     : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0)))     : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0)))
605  #endif  # endif
606    
607  #endif /* not __GNUC__ or not __STDC__ */  #endif /* not __GNUC__ or not __STDC__ */
608    
609  #endif /* not __OBSTACK_H__ */  #ifdef __cplusplus
610    }       /* C++ */
611    #endif
612    
613    #endif /* obstack.h */

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26