Mercurial > hg > octave-kai > gnulib-hg
annotate lib/obstack.h @ 4667:117a6d2af03b
Remove K&R cruft.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Tue, 09 Sep 2003 23:00:43 +0000 |
parents | 6070487cf52f |
children | d0a345595720 |
rev | line source |
---|---|
334 | 1 /* obstack.h - object stack macros |
4253
bd7590d0c6b6
(__INT_TO_PTR) [__STDC__]: Cast result to
Paul Eggert <eggert@cs.ucla.edu>
parents:
2991
diff
changeset
|
2 Copyright (C) 1988,89,90,91,92,93,94,96,97,98,99,2003 Free Software Foundation, Inc. |
334 | 3 |
2991 | 4 This file is part of the GNU C Library. Its master source is NOT part of |
881 | 5 the C library, however. The master source lives in /gd/gnu/lib. |
334 | 6 |
1112 | 7 NOTE: The canonical source of this file is maintained with the GNU C Library. |
2991 | 8 Bugs can be reported to bug-glibc@gnu.org. |
334 | 9 |
4422 | 10 This program is free software; you can redistribute it and/or modify |
11 it under the terms of the GNU General Public License as published by | |
12 the Free Software Foundation; either version 2, or (at your option) | |
13 any later version. | |
1112 | 14 |
15 This program is distributed in the hope that it will be useful, | |
881 | 16 but WITHOUT ANY WARRANTY; without even the implied warranty of |
4422 | 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
18 GNU General Public License for more details. | |
881 | 19 |
4422 | 20 You should have received a copy of the GNU General Public License along |
21 with this program; if not, write to the Free Software Foundation, | |
22 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
334 | 23 |
24 /* Summary: | |
25 | |
26 All the apparent functions defined here are macros. The idea | |
27 is that you would use these pre-tested macros to solve a | |
28 very specific set of problems, and they would run fast. | |
29 Caution: no side-effects in arguments please!! They may be | |
30 evaluated MANY times!! | |
31 | |
32 These macros operate a stack of objects. Each object starts life | |
33 small, and may grow to maturity. (Consider building a word syllable | |
34 by syllable.) An object can move while it is growing. Once it has | |
35 been "finished" it never changes address again. So the "top of the | |
36 stack" is typically an immature growing object, while the rest of the | |
37 stack is of mature, fixed size and fixed address objects. | |
38 | |
39 These routines grab large chunks of memory, using a function you | |
40 supply, called `obstack_chunk_alloc'. On occasion, they free chunks, | |
41 by calling `obstack_chunk_free'. You must define them and declare | |
42 them before using any obstack macros. | |
43 | |
44 Each independent stack is represented by a `struct obstack'. | |
45 Each of the obstack macros expects a pointer to such a structure | |
46 as the first argument. | |
47 | |
48 One motivation for this package is the problem of growing char strings | |
49 in symbol tables. Unless you are "fascist pig with a read-only mind" | |
50 --Gosper's immortal quote from HAKMEM item 154, out of context--you | |
51 would not like to put any arbitrary upper limit on the length of your | |
52 symbols. | |
53 | |
54 In practice this often means you will build many short symbols and a | |
55 few long symbols. At the time you are reading a symbol you don't know | |
56 how long it is. One traditional method is to read a symbol into a | |
57 buffer, realloc()ating the buffer every time you try to read a symbol | |
58 that is longer than the buffer. This is beaut, but you still will | |
59 want to copy the symbol from the buffer to a more permanent | |
60 symbol-table entry say about half the time. | |
61 | |
62 With obstacks, you can work differently. Use one obstack for all symbol | |
63 names. As you read a symbol, grow the name in the obstack gradually. | |
64 When the name is complete, finalize it. Then, if the symbol exists already, | |
65 free the newly read name. | |
66 | |
67 The way we do this is to take a large chunk, allocating memory from | |
68 low addresses. When you want to build a symbol in the chunk you just | |
69 add chars above the current "high water mark" in the chunk. When you | |
70 have finished adding chars, because you got to the end of the symbol, | |
71 you know how long the chars are, and you can create a new object. | |
72 Mostly the chars will not burst over the highest address of the chunk, | |
73 because you would typically expect a chunk to be (say) 100 times as | |
74 long as an average object. | |
75 | |
76 In case that isn't clear, when we have enough chars to make up | |
77 the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) | |
78 so we just point to it where it lies. No moving of chars is | |
79 needed and this is the second win: potentially long strings need | |
80 never be explicitly shuffled. Once an object is formed, it does not | |
81 change its address during its lifetime. | |
82 | |
83 When the chars burst over a chunk boundary, we allocate a larger | |
84 chunk, and then copy the partly formed object from the end of the old | |
85 chunk to the beginning of the new larger chunk. We then carry on | |
86 accreting characters to the end of the object as we normally would. | |
87 | |
88 A special macro is provided to add a single char at a time to a | |
89 growing object. This allows the use of register variables, which | |
90 break the ordinary 'growth' macro. | |
91 | |
92 Summary: | |
93 We allocate large chunks. | |
94 We carve out one object at a time from the current chunk. | |
95 Once carved, an object never moves. | |
96 We are free to append data of any size to the currently | |
97 growing object. | |
98 Exactly one object is growing in an obstack at any one time. | |
99 You can run one obstack per control block. | |
100 You may have as many control blocks as you dare. | |
101 Because of the way we do it, you can `unwind' an obstack | |
102 back to a previous state. (You may remove objects much | |
103 as you would with a stack.) | |
104 */ | |
105 | |
106 | |
107 /* Don't do the contents of this file more than once. */ | |
108 | |
1112 | 109 #ifndef _OBSTACK_H |
110 #define _OBSTACK_H 1 | |
111 | |
995 | 112 #ifdef __cplusplus |
113 extern "C" { | |
114 #endif | |
115 | |
881 | 116 /* We use subtraction of (char *) 0 instead of casting to int |
334 | 117 because on word-addressable machines a simple cast to int |
118 may ignore the byte-within-word field of the pointer. */ | |
119 | |
120 #ifndef __PTR_TO_INT | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
121 # define __PTR_TO_INT(P) ((P) - (char *) 0) |
334 | 122 #endif |
123 | |
124 #ifndef __INT_TO_PTR | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
125 # define __INT_TO_PTR(P) ((P) + (char *) 0) |
334 | 126 #endif |
127 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
128 /* We need the type of the resulting object. If __PTRDIFF_TYPE__ is |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
129 defined, as with GNU C, use that; that way we don't pollute the |
4667 | 130 namespace with <stddef.h>'s symbols. Otherwise, include <stddef.h> |
131 and use ptrdiff_t. */ | |
334 | 132 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
133 #ifdef __PTRDIFF_TYPE__ |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
134 # define PTR_INT_TYPE __PTRDIFF_TYPE__ |
334 | 135 #else |
4667 | 136 # include <stddef.h> |
137 # define PTR_INT_TYPE ptrdiff_t | |
334 | 138 #endif |
139 | |
4667 | 140 #include <string.h> |
881 | 141 |
334 | 142 struct _obstack_chunk /* Lives at front of each chunk. */ |
143 { | |
144 char *limit; /* 1 past end of this chunk */ | |
145 struct _obstack_chunk *prev; /* address of prior chunk or NULL */ | |
146 char contents[4]; /* objects begin here */ | |
147 }; | |
148 | |
149 struct obstack /* control current object in current chunk */ | |
150 { | |
151 long chunk_size; /* preferred size to allocate chunks in */ | |
881 | 152 struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */ |
334 | 153 char *object_base; /* address of object we are building */ |
154 char *next_free; /* where to add next char to current object */ | |
155 char *chunk_limit; /* address of char after current chunk */ | |
156 PTR_INT_TYPE temp; /* Temporary for some macros. */ | |
157 int alignment_mask; /* Mask of alignment for each object. */ | |
779 | 158 /* These prototypes vary based on `use_extra_arg', and we use |
159 casts to the prototypeless function type in all assignments, | |
160 but having prototypes here quiets -Wstrict-prototypes. */ | |
161 struct _obstack_chunk *(*chunkfun) (void *, long); | |
162 void (*freefun) (void *, struct _obstack_chunk *); | |
881 | 163 void *extra_arg; /* first arg for chunk alloc/dealloc funcs */ |
334 | 164 unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ |
165 unsigned maybe_empty_object:1;/* There is a possibility that the current | |
166 chunk contains a zero-length object. This | |
167 prevents freeing the chunk if we allocate | |
168 a bigger chunk to replace it. */ | |
881 | 169 unsigned alloc_failed:1; /* No longer used, as we now call the failed |
170 handler on error, but retained for binary | |
171 compatibility. */ | |
334 | 172 }; |
173 | |
174 /* Declare the external functions we use; they are in obstack.c. */ | |
175 | |
176 extern void _obstack_newchunk (struct obstack *, int); | |
177 extern void _obstack_free (struct obstack *, void *); | |
178 extern int _obstack_begin (struct obstack *, int, int, | |
779 | 179 void *(*) (long), void (*) (void *)); |
334 | 180 extern int _obstack_begin_1 (struct obstack *, int, int, |
779 | 181 void *(*) (void *, long), |
182 void (*) (void *, void *), void *); | |
881 | 183 extern int _obstack_memory_used (struct obstack *); |
334 | 184 |
185 /* Do the function-declarations after the structs | |
186 but before defining the macros. */ | |
187 | |
188 void obstack_init (struct obstack *obstack); | |
189 | |
190 void * obstack_alloc (struct obstack *obstack, int size); | |
191 | |
2979 | 192 void * obstack_copy (struct obstack *obstack, const void *address, int size); |
193 void * obstack_copy0 (struct obstack *obstack, const void *address, int size); | |
334 | 194 |
195 void obstack_free (struct obstack *obstack, void *block); | |
196 | |
197 void obstack_blank (struct obstack *obstack, int size); | |
198 | |
2979 | 199 void obstack_grow (struct obstack *obstack, const void *data, int size); |
200 void obstack_grow0 (struct obstack *obstack, const void *data, int size); | |
334 | 201 |
202 void obstack_1grow (struct obstack *obstack, int data_char); | |
2979 | 203 void obstack_ptr_grow (struct obstack *obstack, const void *data); |
334 | 204 void obstack_int_grow (struct obstack *obstack, int data); |
205 | |
206 void * obstack_finish (struct obstack *obstack); | |
207 | |
208 int obstack_object_size (struct obstack *obstack); | |
209 | |
210 int obstack_room (struct obstack *obstack); | |
881 | 211 void obstack_make_room (struct obstack *obstack, int size); |
334 | 212 void obstack_1grow_fast (struct obstack *obstack, int data_char); |
2979 | 213 void obstack_ptr_grow_fast (struct obstack *obstack, const void *data); |
334 | 214 void obstack_int_grow_fast (struct obstack *obstack, int data); |
215 void obstack_blank_fast (struct obstack *obstack, int size); | |
216 | |
217 void * obstack_base (struct obstack *obstack); | |
218 void * obstack_next_free (struct obstack *obstack); | |
219 int obstack_alignment_mask (struct obstack *obstack); | |
220 int obstack_chunk_size (struct obstack *obstack); | |
881 | 221 int obstack_memory_used (struct obstack *obstack); |
334 | 222 |
881 | 223 /* Error handler called when `obstack_chunk_alloc' failed to allocate |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
224 more memory. This can be set to a user defined function which |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
225 should either abort gracefully or use longjump - but shouldn't |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
226 return. The default action is to print a message and abort. */ |
881 | 227 extern void (*obstack_alloc_failed_handler) (void); |
228 | |
229 /* Exit value used when `print_and_abort' is used. */ | |
230 extern int obstack_exit_failure; | |
334 | 231 |
232 /* Pointer to beginning of object being allocated or to be allocated next. | |
233 Note that this might not be the final address of the object | |
234 because a new chunk might be needed to hold the final size. */ | |
235 | |
881 | 236 #define obstack_base(h) ((h)->object_base) |
334 | 237 |
238 /* Size for allocating ordinary chunks. */ | |
239 | |
240 #define obstack_chunk_size(h) ((h)->chunk_size) | |
241 | |
242 /* Pointer to next byte not yet allocated in current chunk. */ | |
243 | |
881 | 244 #define obstack_next_free(h) ((h)->next_free) |
334 | 245 |
246 /* Mask specifying low bits that should be clear in address of an object. */ | |
247 | |
248 #define obstack_alignment_mask(h) ((h)->alignment_mask) | |
249 | |
4667 | 250 /* To prevent prototype warnings provide complete argument list. */ |
2990 | 251 # define obstack_init(h) \ |
252 _obstack_begin ((h), 0, 0, \ | |
4550
6070487cf52f
White-space changes only; from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4432
diff
changeset
|
253 (void *(*) (long)) obstack_chunk_alloc, \ |
2990 | 254 (void (*) (void *)) obstack_chunk_free) |
779 | 255 |
2990 | 256 # define obstack_begin(h, size) \ |
257 _obstack_begin ((h), (size), 0, \ | |
4550
6070487cf52f
White-space changes only; from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4432
diff
changeset
|
258 (void *(*) (long)) obstack_chunk_alloc, \ |
2990 | 259 (void (*) (void *)) obstack_chunk_free) |
779 | 260 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
261 # define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ |
2990 | 262 _obstack_begin ((h), (size), (alignment), \ |
4550
6070487cf52f
White-space changes only; from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4432
diff
changeset
|
263 (void *(*) (long)) (chunkfun), \ |
2990 | 264 (void (*) (void *)) (freefun)) |
779 | 265 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
266 # define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ |
2990 | 267 _obstack_begin_1 ((h), (size), (alignment), \ |
268 (void *(*) (void *, long)) (chunkfun), \ | |
995 | 269 (void (*) (void *, void *)) (freefun), (arg)) |
779 | 270 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
271 # define obstack_chunkfun(h, newchunkfun) \ |
995 | 272 ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun)) |
779 | 273 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
274 # define obstack_freefun(h, newfreefun) \ |
995 | 275 ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun)) |
779 | 276 |
334 | 277 #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar) |
278 | |
279 #define obstack_blank_fast(h,n) ((h)->next_free += (n)) | |
881 | 280 |
281 #define obstack_memory_used(h) _obstack_memory_used (h) | |
334 | 282 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
283 #if defined __GNUC__ && defined __STDC__ && __STDC__ |
350 | 284 /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and |
285 does not implement __extension__. But that compiler doesn't define | |
286 __GNUC_MINOR__. */ | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
287 # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
288 # define __extension__ |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
289 # endif |
334 | 290 |
291 /* For GNU C, if not -traditional, | |
292 we can define these macros to compute all args only once | |
293 without using a global variable. | |
294 Also, we can avoid using the `temp' slot, to make faster code. */ | |
295 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
296 # define obstack_object_size(OBSTACK) \ |
334 | 297 __extension__ \ |
4256
8985ae624e3d
Merge changes from Coreutils.
Jim Meyering <jim@meyering.net>
parents:
4253
diff
changeset
|
298 ({ struct obstack const *__o = (OBSTACK); \ |
334 | 299 (unsigned) (__o->next_free - __o->object_base); }) |
300 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
301 # define obstack_room(OBSTACK) \ |
334 | 302 __extension__ \ |
4256
8985ae624e3d
Merge changes from Coreutils.
Jim Meyering <jim@meyering.net>
parents:
4253
diff
changeset
|
303 ({ struct obstack const *__o = (OBSTACK); \ |
334 | 304 (unsigned) (__o->chunk_limit - __o->next_free); }) |
305 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
306 # define obstack_make_room(OBSTACK,length) \ |
881 | 307 __extension__ \ |
308 ({ struct obstack *__o = (OBSTACK); \ | |
309 int __len = (length); \ | |
310 if (__o->chunk_limit - __o->next_free < __len) \ | |
311 _obstack_newchunk (__o, __len); \ | |
312 (void) 0; }) | |
313 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
314 # define obstack_empty_p(OBSTACK) \ |
1112 | 315 __extension__ \ |
4256
8985ae624e3d
Merge changes from Coreutils.
Jim Meyering <jim@meyering.net>
parents:
4253
diff
changeset
|
316 ({ struct obstack const *__o = (OBSTACK); \ |
1112 | 317 (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); }) |
318 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
319 # define obstack_grow(OBSTACK,where,length) \ |
334 | 320 __extension__ \ |
321 ({ struct obstack *__o = (OBSTACK); \ | |
322 int __len = (length); \ | |
323 if (__o->next_free + __len > __o->chunk_limit) \ | |
324 _obstack_newchunk (__o, __len); \ | |
4667 | 325 memcpy (__o->next_free, (where), __len); \ |
881 | 326 __o->next_free += __len; \ |
334 | 327 (void) 0; }) |
328 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
329 # define obstack_grow0(OBSTACK,where,length) \ |
334 | 330 __extension__ \ |
331 ({ struct obstack *__o = (OBSTACK); \ | |
332 int __len = (length); \ | |
333 if (__o->next_free + __len + 1 > __o->chunk_limit) \ | |
334 _obstack_newchunk (__o, __len + 1); \ | |
4667 | 335 memcpy (__o->next_free, (where), __len); \ |
881 | 336 __o->next_free += __len; \ |
337 *(__o->next_free)++ = 0; \ | |
334 | 338 (void) 0; }) |
339 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
340 # define obstack_1grow(OBSTACK,datum) \ |
334 | 341 __extension__ \ |
342 ({ struct obstack *__o = (OBSTACK); \ | |
343 if (__o->next_free + 1 > __o->chunk_limit) \ | |
344 _obstack_newchunk (__o, 1); \ | |
881 | 345 *(__o->next_free)++ = (datum); \ |
334 | 346 (void) 0; }) |
347 | |
2990 | 348 /* These assume that the obstack alignment is good enough for pointers |
349 or ints, and that the data added so far to the current object | |
334 | 350 shares that much alignment. */ |
479 | 351 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
352 # define obstack_ptr_grow(OBSTACK,datum) \ |
334 | 353 __extension__ \ |
354 ({ struct obstack *__o = (OBSTACK); \ | |
355 if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ | |
356 _obstack_newchunk (__o, sizeof (void *)); \ | |
2990 | 357 *((void **)__o->next_free)++ = (datum); \ |
334 | 358 (void) 0; }) |
359 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
360 # define obstack_int_grow(OBSTACK,datum) \ |
334 | 361 __extension__ \ |
362 ({ struct obstack *__o = (OBSTACK); \ | |
363 if (__o->next_free + sizeof (int) > __o->chunk_limit) \ | |
364 _obstack_newchunk (__o, sizeof (int)); \ | |
2990 | 365 *((int *)__o->next_free)++ = (datum); \ |
334 | 366 (void) 0; }) |
367 | |
2990 | 368 # define obstack_ptr_grow_fast(h,aptr) \ |
369 (*((void **) (h)->next_free)++ = (aptr)) | |
370 | |
371 # define obstack_int_grow_fast(h,aint) \ | |
372 (*((int *) (h)->next_free)++ = (aint)) | |
334 | 373 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
374 # define obstack_blank(OBSTACK,length) \ |
334 | 375 __extension__ \ |
376 ({ struct obstack *__o = (OBSTACK); \ | |
377 int __len = (length); \ | |
378 if (__o->chunk_limit - __o->next_free < __len) \ | |
379 _obstack_newchunk (__o, __len); \ | |
881 | 380 __o->next_free += __len; \ |
334 | 381 (void) 0; }) |
382 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
383 # define obstack_alloc(OBSTACK,length) \ |
334 | 384 __extension__ \ |
385 ({ struct obstack *__h = (OBSTACK); \ | |
386 obstack_blank (__h, (length)); \ | |
387 obstack_finish (__h); }) | |
388 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
389 # define obstack_copy(OBSTACK,where,length) \ |
334 | 390 __extension__ \ |
391 ({ struct obstack *__h = (OBSTACK); \ | |
392 obstack_grow (__h, (where), (length)); \ | |
393 obstack_finish (__h); }) | |
394 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
395 # define obstack_copy0(OBSTACK,where,length) \ |
334 | 396 __extension__ \ |
397 ({ struct obstack *__h = (OBSTACK); \ | |
398 obstack_grow0 (__h, (where), (length)); \ | |
399 obstack_finish (__h); }) | |
400 | |
401 /* The local variable is named __o1 to avoid a name conflict | |
402 when obstack_blank is called. */ | |
4550
6070487cf52f
White-space changes only; from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4432
diff
changeset
|
403 # define obstack_finish(OBSTACK) \ |
334 | 404 __extension__ \ |
405 ({ struct obstack *__o1 = (OBSTACK); \ | |
406 void *value; \ | |
881 | 407 value = (void *) __o1->object_base; \ |
408 if (__o1->next_free == value) \ | |
409 __o1->maybe_empty_object = 1; \ | |
410 __o1->next_free \ | |
411 = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ | |
412 & ~ (__o1->alignment_mask)); \ | |
413 if (__o1->next_free - (char *)__o1->chunk \ | |
414 > __o1->chunk_limit - (char *)__o1->chunk) \ | |
415 __o1->next_free = __o1->chunk_limit; \ | |
416 __o1->object_base = __o1->next_free; \ | |
334 | 417 value; }) |
418 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
419 # define obstack_free(OBSTACK, OBJ) \ |
334 | 420 __extension__ \ |
421 ({ struct obstack *__o = (OBSTACK); \ | |
422 void *__obj = (OBJ); \ | |
423 if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \ | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
424 __o->next_free = __o->object_base = (char *)__obj; \ |
334 | 425 else (obstack_free) (__o, __obj); }) |
426 | |
427 #else /* not __GNUC__ or not __STDC__ */ | |
428 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
429 # define obstack_object_size(h) \ |
881 | 430 (unsigned) ((h)->next_free - (h)->object_base) |
334 | 431 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
432 # define obstack_room(h) \ |
334 | 433 (unsigned) ((h)->chunk_limit - (h)->next_free) |
434 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
435 # define obstack_empty_p(h) \ |
1112 | 436 ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0) |
437 | |
334 | 438 /* Note that the call to _obstack_newchunk is enclosed in (..., 0) |
439 so that we can avoid having void expressions | |
440 in the arms of the conditional expression. | |
441 Casting the third operand to void was tried before, | |
442 but some compilers won't accept it. */ | |
443 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
444 # define obstack_make_room(h,length) \ |
881 | 445 ( (h)->temp = (length), \ |
446 (((h)->next_free + (h)->temp > (h)->chunk_limit) \ | |
447 ? (_obstack_newchunk ((h), (h)->temp), 0) : 0)) | |
448 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
449 # define obstack_grow(h,where,length) \ |
334 | 450 ( (h)->temp = (length), \ |
451 (((h)->next_free + (h)->temp > (h)->chunk_limit) \ | |
452 ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ | |
4667 | 453 memcpy ((h)->next_free, (where), (h)->temp), \ |
881 | 454 (h)->next_free += (h)->temp) |
334 | 455 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
456 # define obstack_grow0(h,where,length) \ |
334 | 457 ( (h)->temp = (length), \ |
458 (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \ | |
459 ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \ | |
4667 | 460 memcpy ((h)->next_free, (where), (h)->temp), \ |
334 | 461 (h)->next_free += (h)->temp, \ |
881 | 462 *((h)->next_free)++ = 0) |
334 | 463 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
464 # define obstack_1grow(h,datum) \ |
334 | 465 ( (((h)->next_free + 1 > (h)->chunk_limit) \ |
466 ? (_obstack_newchunk ((h), 1), 0) : 0), \ | |
881 | 467 (*((h)->next_free)++ = (datum))) |
334 | 468 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
469 # define obstack_ptr_grow(h,datum) \ |
334 | 470 ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ |
471 ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ | |
2990 | 472 (*((const char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = (datum))) |
334 | 473 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
474 # define obstack_int_grow(h,datum) \ |
334 | 475 ( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ |
476 ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ | |
2990 | 477 (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = (datum))) |
334 | 478 |
2990 | 479 # define obstack_ptr_grow_fast(h,aptr) \ |
480 (*((const char **) (h)->next_free)++ = (aptr)) | |
481 | |
482 # define obstack_int_grow_fast(h,aint) \ | |
483 (*((int *) (h)->next_free)++ = (aint)) | |
334 | 484 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
485 # define obstack_blank(h,length) \ |
334 | 486 ( (h)->temp = (length), \ |
487 (((h)->chunk_limit - (h)->next_free < (h)->temp) \ | |
488 ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ | |
881 | 489 ((h)->next_free += (h)->temp)) |
334 | 490 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
491 # define obstack_alloc(h,length) \ |
334 | 492 (obstack_blank ((h), (length)), obstack_finish ((h))) |
493 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
494 # define obstack_copy(h,where,length) \ |
334 | 495 (obstack_grow ((h), (where), (length)), obstack_finish ((h))) |
496 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
497 # define obstack_copy0(h,where,length) \ |
334 | 498 (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) |
499 | |
4550
6070487cf52f
White-space changes only; from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4432
diff
changeset
|
500 # define obstack_finish(h) \ |
881 | 501 ( ((h)->next_free == (h)->object_base \ |
334 | 502 ? (((h)->maybe_empty_object = 1), 0) \ |
503 : 0), \ | |
504 (h)->temp = __PTR_TO_INT ((h)->object_base), \ | |
505 (h)->next_free \ | |
506 = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \ | |
507 & ~ ((h)->alignment_mask)), \ | |
881 | 508 (((h)->next_free - (char *) (h)->chunk \ |
509 > (h)->chunk_limit - (char *) (h)->chunk) \ | |
334 | 510 ? ((h)->next_free = (h)->chunk_limit) : 0), \ |
511 (h)->object_base = (h)->next_free, \ | |
4432
2fdacf8fdb47
(__INT_TO_PTR): Revert change of 2003-03-13; it breaks C++ compilation.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4422
diff
changeset
|
512 (void *) __INT_TO_PTR ((h)->temp)) |
334 | 513 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
514 # define obstack_free(h,obj) \ |
881 | 515 ( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \ |
334 | 516 (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ |
517 ? (int) ((h)->next_free = (h)->object_base \ | |
518 = (h)->temp + (char *) (h)->chunk) \ | |
519 : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0))) | |
520 | |
521 #endif /* not __GNUC__ or not __STDC__ */ | |
522 | |
995 | 523 #ifdef __cplusplus |
524 } /* C++ */ | |
525 #endif | |
526 | |
1112 | 527 #endif /* obstack.h */ |