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 |
|
|
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. */ |
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 (); |
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. */ |
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); |
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 |
|
|
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 |
|
|
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)); \ |
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 */ |