1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 #ifndef _OBSTACK_H
104 #define _OBSTACK_H 1
105
106 #ifndef _OBSTACK_INTERFACE_VERSION
107 # define _OBSTACK_INTERFACE_VERSION 2
108 #endif
109
110 #include <stddef.h>
111 #include <string.h>
112
113 #if __STDC_VERSION__ < 199901L || defined __HP_cc
114 # define __FLEXIBLE_ARRAY_MEMBER 1
115 #else
116 # define __FLEXIBLE_ARRAY_MEMBER
117 #endif
118
119 #if _OBSTACK_INTERFACE_VERSION == 1
120
121
122 # define _OBSTACK_SIZE_T unsigned int
123 # define _CHUNK_SIZE_T unsigned long
124 # define _OBSTACK_CAST(type, expr) ((type) (expr))
125 #else
126
127 # define _OBSTACK_SIZE_T size_t
128 # define _CHUNK_SIZE_T size_t
129 # define _OBSTACK_CAST(type, expr) (expr)
130 #endif
131
132
133
134
135
136 #define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A)))
137
138
139
140
141
142
143
144
145 #define __PTR_ALIGN(B, P, A) \
146 __BPTR_ALIGN (sizeof (ptrdiff_t) < sizeof (void *) ? (B) : (char *) 0, \
147 P, A)
148
149 #ifndef __attribute_pure__
150 # define __attribute_pure__ _GL_ATTRIBUTE_PURE
151 #endif
152
153
154 #ifndef __attribute_noreturn__
155 # if 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ || 0x5110 <= __SUNPRO_C
156 # define __attribute_noreturn__ __attribute__ ((__noreturn__))
157 # else
158 # define __attribute_noreturn__
159 # endif
160 #endif
161
162 #ifdef __cplusplus
163 extern "C" {
164 #endif
165
166 struct _obstack_chunk
167 {
168 char *limit;
169 struct _obstack_chunk *prev;
170 char contents[__FLEXIBLE_ARRAY_MEMBER];
171 };
172
173 struct obstack
174 {
175 _CHUNK_SIZE_T chunk_size;
176 struct _obstack_chunk *chunk;
177 char *object_base;
178 char *next_free;
179 char *chunk_limit;
180 union
181 {
182 _OBSTACK_SIZE_T i;
183 void *p;
184 } temp;
185 _OBSTACK_SIZE_T alignment_mask;
186
187
188 union
189 {
190 void *(*plain) (size_t);
191 void *(*extra) (void *, size_t);
192 } chunkfun;
193 union
194 {
195 void (*plain) (void *);
196 void (*extra) (void *, void *);
197 } freefun;
198
199 void *extra_arg;
200 unsigned use_extra_arg : 1;
201 unsigned maybe_empty_object : 1;
202
203
204
205 unsigned alloc_failed : 1;
206
207
208 };
209
210
211
212 extern void _obstack_newchunk (struct obstack *, _OBSTACK_SIZE_T);
213 extern void _obstack_free (struct obstack *, void *);
214 extern int _obstack_begin (struct obstack *,
215 _OBSTACK_SIZE_T, _OBSTACK_SIZE_T,
216 void *(*) (size_t), void (*) (void *));
217 extern int _obstack_begin_1 (struct obstack *,
218 _OBSTACK_SIZE_T, _OBSTACK_SIZE_T,
219 void *(*) (void *, size_t),
220 void (*) (void *, void *), void *);
221 extern _OBSTACK_SIZE_T _obstack_memory_used (struct obstack *)
222 __attribute_pure__;
223
224
225
226
227
228
229 extern __attribute_noreturn__ void (*obstack_alloc_failed_handler) (void);
230
231
232 extern int obstack_exit_failure;
233
234
235
236
237
238 #define obstack_base(h) ((void *) (h)->object_base)
239
240
241
242 #define obstack_chunk_size(h) ((h)->chunk_size)
243
244
245
246 #define obstack_next_free(h) ((void *) (h)->next_free)
247
248
249
250 #define obstack_alignment_mask(h) ((h)->alignment_mask)
251
252
253 #define obstack_init(h) \
254 _obstack_begin ((h), 0, 0, \
255 _OBSTACK_CAST (void *(*) (size_t), obstack_chunk_alloc), \
256 _OBSTACK_CAST (void (*) (void *), obstack_chunk_free))
257
258 #define obstack_begin(h, size) \
259 _obstack_begin ((h), (size), 0, \
260 _OBSTACK_CAST (void *(*) (size_t), obstack_chunk_alloc), \
261 _OBSTACK_CAST (void (*) (void *), obstack_chunk_free))
262
263 #define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
264 _obstack_begin ((h), (size), (alignment), \
265 _OBSTACK_CAST (void *(*) (size_t), chunkfun), \
266 _OBSTACK_CAST (void (*) (void *), freefun))
267
268 #define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
269 _obstack_begin_1 ((h), (size), (alignment), \
270 _OBSTACK_CAST (void *(*) (void *, size_t), chunkfun), \
271 _OBSTACK_CAST (void (*) (void *, void *), freefun), arg)
272
273 #define obstack_chunkfun(h, newchunkfun) \
274 ((void) ((h)->chunkfun.extra = (void *(*) (void *, size_t)) (newchunkfun)))
275
276 #define obstack_freefun(h, newfreefun) \
277 ((void) ((h)->freefun.extra = (void *(*) (void *, void *)) (newfreefun)))
278
279 #define obstack_1grow_fast(h, achar) ((void) (*((h)->next_free)++ = (achar)))
280
281 #define obstack_blank_fast(h, n) ((void) ((h)->next_free += (n)))
282
283 #define obstack_memory_used(h) _obstack_memory_used (h)
284
285 #if defined __GNUC__ || defined __clang__
286 # if !(defined __GNUC_MINOR__ && __GNUC__ * 1000 + __GNUC_MINOR__ >= 2008 \
287 || defined __clang__)
288 # define __extension__
289 # endif
290
291
292
293
294
295
296 # define obstack_object_size(OBSTACK) \
297 __extension__ \
298 ({ struct obstack const *__o = (OBSTACK); \
299 (_OBSTACK_SIZE_T) (__o->next_free - __o->object_base); })
300
301
302
303 # define obstack_room(OBSTACK) \
304 __extension__ \
305 ({ struct obstack const *__o1 = (OBSTACK); \
306 (_OBSTACK_SIZE_T) (__o1->chunk_limit - __o1->next_free); })
307
308 # define obstack_make_room(OBSTACK, length) \
309 __extension__ \
310 ({ struct obstack *__o = (OBSTACK); \
311 _OBSTACK_SIZE_T __len = (length); \
312 if (obstack_room (__o) < __len) \
313 _obstack_newchunk (__o, __len); \
314 (void) 0; })
315
316 # define obstack_empty_p(OBSTACK) \
317 __extension__ \
318 ({ struct obstack const *__o = (OBSTACK); \
319 (__o->chunk->prev == 0 \
320 && __o->next_free == __PTR_ALIGN ((char *) __o->chunk, \
321 __o->chunk->contents, \
322 __o->alignment_mask)); })
323
324 # define obstack_grow(OBSTACK, where, length) \
325 __extension__ \
326 ({ struct obstack *__o = (OBSTACK); \
327 _OBSTACK_SIZE_T __len = (length); \
328 if (obstack_room (__o) < __len) \
329 _obstack_newchunk (__o, __len); \
330 memcpy (__o->next_free, where, __len); \
331 __o->next_free += __len; \
332 (void) 0; })
333
334 # define obstack_grow0(OBSTACK, where, length) \
335 __extension__ \
336 ({ struct obstack *__o = (OBSTACK); \
337 _OBSTACK_SIZE_T __len = (length); \
338 if (obstack_room (__o) < __len + 1) \
339 _obstack_newchunk (__o, __len + 1); \
340 memcpy (__o->next_free, where, __len); \
341 __o->next_free += __len; \
342 *(__o->next_free)++ = 0; \
343 (void) 0; })
344
345 # define obstack_1grow(OBSTACK, datum) \
346 __extension__ \
347 ({ struct obstack *__o = (OBSTACK); \
348 if (obstack_room (__o) < 1) \
349 _obstack_newchunk (__o, 1); \
350 obstack_1grow_fast (__o, datum); })
351
352
353
354
355
356 # define obstack_ptr_grow(OBSTACK, datum) \
357 __extension__ \
358 ({ struct obstack *__o = (OBSTACK); \
359 if (obstack_room (__o) < sizeof (void *)) \
360 _obstack_newchunk (__o, sizeof (void *)); \
361 obstack_ptr_grow_fast (__o, datum); })
362
363 # define obstack_int_grow(OBSTACK, datum) \
364 __extension__ \
365 ({ struct obstack *__o = (OBSTACK); \
366 if (obstack_room (__o) < sizeof (int)) \
367 _obstack_newchunk (__o, sizeof (int)); \
368 obstack_int_grow_fast (__o, datum); })
369
370 # define obstack_ptr_grow_fast(OBSTACK, aptr) \
371 __extension__ \
372 ({ struct obstack *__o1 = (OBSTACK); \
373 void *__p1 = __o1->next_free; \
374 *(const void **) __p1 = (aptr); \
375 __o1->next_free += sizeof (const void *); \
376 (void) 0; })
377
378 # define obstack_int_grow_fast(OBSTACK, aint) \
379 __extension__ \
380 ({ struct obstack *__o1 = (OBSTACK); \
381 void *__p1 = __o1->next_free; \
382 *(int *) __p1 = (aint); \
383 __o1->next_free += sizeof (int); \
384 (void) 0; })
385
386 # define obstack_blank(OBSTACK, length) \
387 __extension__ \
388 ({ struct obstack *__o = (OBSTACK); \
389 _OBSTACK_SIZE_T __len = (length); \
390 if (obstack_room (__o) < __len) \
391 _obstack_newchunk (__o, __len); \
392 obstack_blank_fast (__o, __len); })
393
394 # define obstack_alloc(OBSTACK, length) \
395 __extension__ \
396 ({ struct obstack *__h = (OBSTACK); \
397 obstack_blank (__h, (length)); \
398 obstack_finish (__h); })
399
400 # define obstack_copy(OBSTACK, where, length) \
401 __extension__ \
402 ({ struct obstack *__h = (OBSTACK); \
403 obstack_grow (__h, (where), (length)); \
404 obstack_finish (__h); })
405
406 # define obstack_copy0(OBSTACK, where, length) \
407 __extension__ \
408 ({ struct obstack *__h = (OBSTACK); \
409 obstack_grow0 (__h, (where), (length)); \
410 obstack_finish (__h); })
411
412
413
414 # define obstack_finish(OBSTACK) \
415 __extension__ \
416 ({ struct obstack *__o1 = (OBSTACK); \
417 void *__value = (void *) __o1->object_base; \
418 if (__o1->next_free == __value) \
419 __o1->maybe_empty_object = 1; \
420 __o1->next_free \
421 = __PTR_ALIGN (__o1->object_base, __o1->next_free, \
422 __o1->alignment_mask); \
423 if ((size_t) (__o1->next_free - (char *) __o1->chunk) \
424 > (size_t) (__o1->chunk_limit - (char *) __o1->chunk)) \
425 __o1->next_free = __o1->chunk_limit; \
426 __o1->object_base = __o1->next_free; \
427 __value; })
428
429 # define obstack_free(OBSTACK, OBJ) \
430 __extension__ \
431 ({ struct obstack *__o = (OBSTACK); \
432 void *__obj = (void *) (OBJ); \
433 if (__obj > (void *) __o->chunk && __obj < (void *) __o->chunk_limit) \
434 __o->next_free = __o->object_base = (char *) __obj; \
435 else \
436 _obstack_free (__o, __obj); })
437
438 #else
439
440 # define obstack_object_size(h) \
441 ((_OBSTACK_SIZE_T) ((h)->next_free - (h)->object_base))
442
443 # define obstack_room(h) \
444 ((_OBSTACK_SIZE_T) ((h)->chunk_limit - (h)->next_free))
445
446 # define obstack_empty_p(h) \
447 ((h)->chunk->prev == 0 \
448 && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk, \
449 (h)->chunk->contents, \
450 (h)->alignment_mask))
451
452
453
454
455
456
457
458 # define obstack_make_room(h, length) \
459 ((h)->temp.i = (length), \
460 ((obstack_room (h) < (h)->temp.i) \
461 ? (_obstack_newchunk (h, (h)->temp.i), 0) : 0), \
462 (void) 0)
463
464 # define obstack_grow(h, where, length) \
465 ((h)->temp.i = (length), \
466 ((obstack_room (h) < (h)->temp.i) \
467 ? (_obstack_newchunk ((h), (h)->temp.i), 0) : 0), \
468 memcpy ((h)->next_free, where, (h)->temp.i), \
469 (h)->next_free += (h)->temp.i, \
470 (void) 0)
471
472 # define obstack_grow0(h, where, length) \
473 ((h)->temp.i = (length), \
474 ((obstack_room (h) < (h)->temp.i + 1) \
475 ? (_obstack_newchunk ((h), (h)->temp.i + 1), 0) : 0), \
476 memcpy ((h)->next_free, where, (h)->temp.i), \
477 (h)->next_free += (h)->temp.i, \
478 *((h)->next_free)++ = 0, \
479 (void) 0)
480
481 # define obstack_1grow(h, datum) \
482 (((obstack_room (h) < 1) \
483 ? (_obstack_newchunk ((h), 1), 0) : 0), \
484 obstack_1grow_fast (h, datum))
485
486 # define obstack_ptr_grow(h, datum) \
487 (((obstack_room (h) < sizeof (char *)) \
488 ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \
489 obstack_ptr_grow_fast (h, datum))
490
491 # define obstack_int_grow(h, datum) \
492 (((obstack_room (h) < sizeof (int)) \
493 ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
494 obstack_int_grow_fast (h, datum))
495
496 # define obstack_ptr_grow_fast(h, aptr) \
497 (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr), \
498 (void) 0)
499
500 # define obstack_int_grow_fast(h, aint) \
501 (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint), \
502 (void) 0)
503
504 # define obstack_blank(h, length) \
505 ((h)->temp.i = (length), \
506 ((obstack_room (h) < (h)->temp.i) \
507 ? (_obstack_newchunk ((h), (h)->temp.i), 0) : 0), \
508 obstack_blank_fast (h, (h)->temp.i))
509
510 # define obstack_alloc(h, length) \
511 (obstack_blank ((h), (length)), obstack_finish ((h)))
512
513 # define obstack_copy(h, where, length) \
514 (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
515
516 # define obstack_copy0(h, where, length) \
517 (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
518
519 # define obstack_finish(h) \
520 (((h)->next_free == (h)->object_base \
521 ? (((h)->maybe_empty_object = 1), 0) \
522 : 0), \
523 (h)->temp.p = (h)->object_base, \
524 (h)->next_free \
525 = __PTR_ALIGN ((h)->object_base, (h)->next_free, \
526 (h)->alignment_mask), \
527 (((size_t) ((h)->next_free - (char *) (h)->chunk) \
528 > (size_t) ((h)->chunk_limit - (char *) (h)->chunk)) \
529 ? ((h)->next_free = (h)->chunk_limit) : 0), \
530 (h)->object_base = (h)->next_free, \
531 (h)->temp.p)
532
533 # define obstack_free(h, obj) \
534 ((h)->temp.p = (void *) (obj), \
535 (((h)->temp.p > (void *) (h)->chunk \
536 && (h)->temp.p < (void *) (h)->chunk_limit) \
537 ? (void) ((h)->next_free = (h)->object_base = (char *) (h)->temp.p) \
538 : _obstack_free ((h), (h)->temp.p)))
539
540 #endif
541
542 #ifdef __cplusplus
543 }
544 #endif
545
546 #endif