Mercurial > hg > octave-kai > gnulib-hg
annotate lib/obstack.h @ 4422:d82316ffe803
Switch from LGPL to GPL.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Wed, 09 Jul 2003 22:48:52 +0000 |
parents | 8985ae624e3d |
children | 2fdacf8fdb47 |
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 | |
4253
bd7590d0c6b6
(__INT_TO_PTR) [__STDC__]: Cast result to
Paul Eggert <eggert@cs.ucla.edu>
parents:
2991
diff
changeset
|
125 #if defined __STDC__ && __STDC__ |
bd7590d0c6b6
(__INT_TO_PTR) [__STDC__]: Cast result to
Paul Eggert <eggert@cs.ucla.edu>
parents:
2991
diff
changeset
|
126 # define __INT_TO_PTR(P) ((void *) ((P) + (char *) 0)) |
bd7590d0c6b6
(__INT_TO_PTR) [__STDC__]: Cast result to
Paul Eggert <eggert@cs.ucla.edu>
parents:
2991
diff
changeset
|
127 #else |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
128 # define __INT_TO_PTR(P) ((P) + (char *) 0) |
334 | 129 #endif |
4253
bd7590d0c6b6
(__INT_TO_PTR) [__STDC__]: Cast result to
Paul Eggert <eggert@cs.ucla.edu>
parents:
2991
diff
changeset
|
130 #endif |
334 | 131 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
132 /* 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
|
133 defined, as with GNU C, use that; that way we don't pollute the |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
134 namespace with <stddef.h>'s symbols. Otherwise, if <stddef.h> is |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
135 available, include it and use ptrdiff_t. In traditional C, long is |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
136 the best that we can do. */ |
334 | 137 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
138 #ifdef __PTRDIFF_TYPE__ |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
139 # define PTR_INT_TYPE __PTRDIFF_TYPE__ |
334 | 140 #else |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
141 # ifdef HAVE_STDDEF_H |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
142 # include <stddef.h> |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
143 # define PTR_INT_TYPE ptrdiff_t |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
144 # else |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
145 # define PTR_INT_TYPE long |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
146 # endif |
334 | 147 #endif |
148 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
149 #if defined _LIBC || defined HAVE_STRING_H |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
150 # include <string.h> |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
151 # define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N)) |
881 | 152 #else |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
153 # ifdef memcpy |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
154 # define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N)) |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
155 # else |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
156 # define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N)) |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
157 # endif |
881 | 158 #endif |
159 | |
334 | 160 struct _obstack_chunk /* Lives at front of each chunk. */ |
161 { | |
162 char *limit; /* 1 past end of this chunk */ | |
163 struct _obstack_chunk *prev; /* address of prior chunk or NULL */ | |
164 char contents[4]; /* objects begin here */ | |
165 }; | |
166 | |
167 struct obstack /* control current object in current chunk */ | |
168 { | |
169 long chunk_size; /* preferred size to allocate chunks in */ | |
881 | 170 struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */ |
334 | 171 char *object_base; /* address of object we are building */ |
172 char *next_free; /* where to add next char to current object */ | |
173 char *chunk_limit; /* address of char after current chunk */ | |
174 PTR_INT_TYPE temp; /* Temporary for some macros. */ | |
175 int alignment_mask; /* Mask of alignment for each object. */ | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
176 #if defined __STDC__ && __STDC__ |
779 | 177 /* These prototypes vary based on `use_extra_arg', and we use |
178 casts to the prototypeless function type in all assignments, | |
179 but having prototypes here quiets -Wstrict-prototypes. */ | |
180 struct _obstack_chunk *(*chunkfun) (void *, long); | |
181 void (*freefun) (void *, struct _obstack_chunk *); | |
881 | 182 void *extra_arg; /* first arg for chunk alloc/dealloc funcs */ |
779 | 183 #else |
334 | 184 struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */ |
185 void (*freefun) (); /* User's function to free a chunk. */ | |
186 char *extra_arg; /* first arg for chunk alloc/dealloc funcs */ | |
779 | 187 #endif |
334 | 188 unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ |
189 unsigned maybe_empty_object:1;/* There is a possibility that the current | |
190 chunk contains a zero-length object. This | |
191 prevents freeing the chunk if we allocate | |
192 a bigger chunk to replace it. */ | |
881 | 193 unsigned alloc_failed:1; /* No longer used, as we now call the failed |
194 handler on error, but retained for binary | |
195 compatibility. */ | |
334 | 196 }; |
197 | |
198 /* Declare the external functions we use; they are in obstack.c. */ | |
199 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
200 #if defined __STDC__ && __STDC__ |
334 | 201 extern void _obstack_newchunk (struct obstack *, int); |
202 extern void _obstack_free (struct obstack *, void *); | |
203 extern int _obstack_begin (struct obstack *, int, int, | |
779 | 204 void *(*) (long), void (*) (void *)); |
334 | 205 extern int _obstack_begin_1 (struct obstack *, int, int, |
779 | 206 void *(*) (void *, long), |
207 void (*) (void *, void *), void *); | |
881 | 208 extern int _obstack_memory_used (struct obstack *); |
334 | 209 #else |
210 extern void _obstack_newchunk (); | |
211 extern void _obstack_free (); | |
212 extern int _obstack_begin (); | |
213 extern int _obstack_begin_1 (); | |
881 | 214 extern int _obstack_memory_used (); |
334 | 215 #endif |
216 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
217 #if defined __STDC__ && __STDC__ |
334 | 218 |
219 /* Do the function-declarations after the structs | |
220 but before defining the macros. */ | |
221 | |
222 void obstack_init (struct obstack *obstack); | |
223 | |
224 void * obstack_alloc (struct obstack *obstack, int size); | |
225 | |
2979 | 226 void * obstack_copy (struct obstack *obstack, const void *address, int size); |
227 void * obstack_copy0 (struct obstack *obstack, const void *address, int size); | |
334 | 228 |
229 void obstack_free (struct obstack *obstack, void *block); | |
230 | |
231 void obstack_blank (struct obstack *obstack, int size); | |
232 | |
2979 | 233 void obstack_grow (struct obstack *obstack, const void *data, int size); |
234 void obstack_grow0 (struct obstack *obstack, const void *data, int size); | |
334 | 235 |
236 void obstack_1grow (struct obstack *obstack, int data_char); | |
2979 | 237 void obstack_ptr_grow (struct obstack *obstack, const void *data); |
334 | 238 void obstack_int_grow (struct obstack *obstack, int data); |
239 | |
240 void * obstack_finish (struct obstack *obstack); | |
241 | |
242 int obstack_object_size (struct obstack *obstack); | |
243 | |
244 int obstack_room (struct obstack *obstack); | |
881 | 245 void obstack_make_room (struct obstack *obstack, int size); |
334 | 246 void obstack_1grow_fast (struct obstack *obstack, int data_char); |
2979 | 247 void obstack_ptr_grow_fast (struct obstack *obstack, const void *data); |
334 | 248 void obstack_int_grow_fast (struct obstack *obstack, int data); |
249 void obstack_blank_fast (struct obstack *obstack, int size); | |
250 | |
251 void * obstack_base (struct obstack *obstack); | |
252 void * obstack_next_free (struct obstack *obstack); | |
253 int obstack_alignment_mask (struct obstack *obstack); | |
254 int obstack_chunk_size (struct obstack *obstack); | |
881 | 255 int obstack_memory_used (struct obstack *obstack); |
334 | 256 |
257 #endif /* __STDC__ */ | |
258 | |
259 /* Non-ANSI C cannot really support alternative functions for these macros, | |
260 so we do not declare them. */ | |
881 | 261 |
262 /* 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
|
263 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
|
264 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
|
265 return. The default action is to print a message and abort. */ |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
266 #if defined __STDC__ && __STDC__ |
881 | 267 extern void (*obstack_alloc_failed_handler) (void); |
268 #else | |
269 extern void (*obstack_alloc_failed_handler) (); | |
270 #endif | |
271 | |
272 /* Exit value used when `print_and_abort' is used. */ | |
273 extern int obstack_exit_failure; | |
334 | 274 |
275 /* Pointer to beginning of object being allocated or to be allocated next. | |
276 Note that this might not be the final address of the object | |
277 because a new chunk might be needed to hold the final size. */ | |
278 | |
881 | 279 #define obstack_base(h) ((h)->object_base) |
334 | 280 |
281 /* Size for allocating ordinary chunks. */ | |
282 | |
283 #define obstack_chunk_size(h) ((h)->chunk_size) | |
284 | |
285 /* Pointer to next byte not yet allocated in current chunk. */ | |
286 | |
881 | 287 #define obstack_next_free(h) ((h)->next_free) |
334 | 288 |
289 /* Mask specifying low bits that should be clear in address of an object. */ | |
290 | |
291 #define obstack_alignment_mask(h) ((h)->alignment_mask) | |
292 | |
779 | 293 /* To prevent prototype warnings provide complete argument list in |
294 standard C version. */ | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
295 #if defined __STDC__ && __STDC__ |
779 | 296 |
2990 | 297 # define obstack_init(h) \ |
298 _obstack_begin ((h), 0, 0, \ | |
299 (void *(*) (long)) obstack_chunk_alloc, \ | |
300 (void (*) (void *)) obstack_chunk_free) | |
779 | 301 |
2990 | 302 # define obstack_begin(h, size) \ |
303 _obstack_begin ((h), (size), 0, \ | |
304 (void *(*) (long)) obstack_chunk_alloc, \ | |
305 (void (*) (void *)) obstack_chunk_free) | |
779 | 306 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
307 # define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ |
2990 | 308 _obstack_begin ((h), (size), (alignment), \ |
309 (void *(*) (long)) (chunkfun), \ | |
310 (void (*) (void *)) (freefun)) | |
779 | 311 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
312 # define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ |
2990 | 313 _obstack_begin_1 ((h), (size), (alignment), \ |
314 (void *(*) (void *, long)) (chunkfun), \ | |
995 | 315 (void (*) (void *, void *)) (freefun), (arg)) |
779 | 316 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
317 # define obstack_chunkfun(h, newchunkfun) \ |
995 | 318 ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun)) |
779 | 319 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
320 # define obstack_freefun(h, newfreefun) \ |
995 | 321 ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun)) |
779 | 322 |
323 #else | |
324 | |
2990 | 325 # define obstack_init(h) \ |
326 _obstack_begin ((h), 0, 0, \ | |
327 (void *(*) ()) obstack_chunk_alloc, \ | |
328 (void (*) ()) obstack_chunk_free) | |
334 | 329 |
2990 | 330 # define obstack_begin(h, size) \ |
331 _obstack_begin ((h), (size), 0, \ | |
332 (void *(*) ()) obstack_chunk_alloc, \ | |
333 (void (*) ()) obstack_chunk_free) | |
334 | 334 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
335 # define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ |
2990 | 336 _obstack_begin ((h), (size), (alignment), \ |
337 (void *(*) ()) (chunkfun), \ | |
338 (void (*) ()) (freefun)) | |
334 | 339 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
340 # define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ |
2990 | 341 _obstack_begin_1 ((h), (size), (alignment), \ |
342 (void *(*) ()) (chunkfun), \ | |
343 (void (*) ()) (freefun), (arg)) | |
334 | 344 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
345 # define obstack_chunkfun(h, newchunkfun) \ |
334 | 346 ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun)) |
347 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
348 # define obstack_freefun(h, newfreefun) \ |
334 | 349 ((h) -> freefun = (void (*)()) (newfreefun)) |
350 | |
779 | 351 #endif |
352 | |
334 | 353 #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar) |
354 | |
355 #define obstack_blank_fast(h,n) ((h)->next_free += (n)) | |
881 | 356 |
357 #define obstack_memory_used(h) _obstack_memory_used (h) | |
334 | 358 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
359 #if defined __GNUC__ && defined __STDC__ && __STDC__ |
350 | 360 /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and |
361 does not implement __extension__. But that compiler doesn't define | |
362 __GNUC_MINOR__. */ | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
363 # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
364 # define __extension__ |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
365 # endif |
334 | 366 |
367 /* For GNU C, if not -traditional, | |
368 we can define these macros to compute all args only once | |
369 without using a global variable. | |
370 Also, we can avoid using the `temp' slot, to make faster code. */ | |
371 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
372 # define obstack_object_size(OBSTACK) \ |
334 | 373 __extension__ \ |
4256
8985ae624e3d
Merge changes from Coreutils.
Jim Meyering <jim@meyering.net>
parents:
4253
diff
changeset
|
374 ({ struct obstack const *__o = (OBSTACK); \ |
334 | 375 (unsigned) (__o->next_free - __o->object_base); }) |
376 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
377 # define obstack_room(OBSTACK) \ |
334 | 378 __extension__ \ |
4256
8985ae624e3d
Merge changes from Coreutils.
Jim Meyering <jim@meyering.net>
parents:
4253
diff
changeset
|
379 ({ struct obstack const *__o = (OBSTACK); \ |
334 | 380 (unsigned) (__o->chunk_limit - __o->next_free); }) |
381 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
382 # define obstack_make_room(OBSTACK,length) \ |
881 | 383 __extension__ \ |
384 ({ struct obstack *__o = (OBSTACK); \ | |
385 int __len = (length); \ | |
386 if (__o->chunk_limit - __o->next_free < __len) \ | |
387 _obstack_newchunk (__o, __len); \ | |
388 (void) 0; }) | |
389 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
390 # define obstack_empty_p(OBSTACK) \ |
1112 | 391 __extension__ \ |
4256
8985ae624e3d
Merge changes from Coreutils.
Jim Meyering <jim@meyering.net>
parents:
4253
diff
changeset
|
392 ({ struct obstack const *__o = (OBSTACK); \ |
1112 | 393 (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); }) |
394 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
395 # define obstack_grow(OBSTACK,where,length) \ |
334 | 396 __extension__ \ |
397 ({ struct obstack *__o = (OBSTACK); \ | |
398 int __len = (length); \ | |
399 if (__o->next_free + __len > __o->chunk_limit) \ | |
400 _obstack_newchunk (__o, __len); \ | |
2990 | 401 _obstack_memcpy (__o->next_free, (where), __len); \ |
881 | 402 __o->next_free += __len; \ |
334 | 403 (void) 0; }) |
404 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
405 # define obstack_grow0(OBSTACK,where,length) \ |
334 | 406 __extension__ \ |
407 ({ struct obstack *__o = (OBSTACK); \ | |
408 int __len = (length); \ | |
409 if (__o->next_free + __len + 1 > __o->chunk_limit) \ | |
410 _obstack_newchunk (__o, __len + 1); \ | |
2990 | 411 _obstack_memcpy (__o->next_free, (where), __len); \ |
881 | 412 __o->next_free += __len; \ |
413 *(__o->next_free)++ = 0; \ | |
334 | 414 (void) 0; }) |
415 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
416 # define obstack_1grow(OBSTACK,datum) \ |
334 | 417 __extension__ \ |
418 ({ struct obstack *__o = (OBSTACK); \ | |
419 if (__o->next_free + 1 > __o->chunk_limit) \ | |
420 _obstack_newchunk (__o, 1); \ | |
881 | 421 *(__o->next_free)++ = (datum); \ |
334 | 422 (void) 0; }) |
423 | |
2990 | 424 /* These assume that the obstack alignment is good enough for pointers |
425 or ints, and that the data added so far to the current object | |
334 | 426 shares that much alignment. */ |
479 | 427 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
428 # define obstack_ptr_grow(OBSTACK,datum) \ |
334 | 429 __extension__ \ |
430 ({ struct obstack *__o = (OBSTACK); \ | |
431 if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ | |
432 _obstack_newchunk (__o, sizeof (void *)); \ | |
2990 | 433 *((void **)__o->next_free)++ = (datum); \ |
334 | 434 (void) 0; }) |
435 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
436 # define obstack_int_grow(OBSTACK,datum) \ |
334 | 437 __extension__ \ |
438 ({ struct obstack *__o = (OBSTACK); \ | |
439 if (__o->next_free + sizeof (int) > __o->chunk_limit) \ | |
440 _obstack_newchunk (__o, sizeof (int)); \ | |
2990 | 441 *((int *)__o->next_free)++ = (datum); \ |
334 | 442 (void) 0; }) |
443 | |
2990 | 444 # define obstack_ptr_grow_fast(h,aptr) \ |
445 (*((void **) (h)->next_free)++ = (aptr)) | |
446 | |
447 # define obstack_int_grow_fast(h,aint) \ | |
448 (*((int *) (h)->next_free)++ = (aint)) | |
334 | 449 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
450 # define obstack_blank(OBSTACK,length) \ |
334 | 451 __extension__ \ |
452 ({ struct obstack *__o = (OBSTACK); \ | |
453 int __len = (length); \ | |
454 if (__o->chunk_limit - __o->next_free < __len) \ | |
455 _obstack_newchunk (__o, __len); \ | |
881 | 456 __o->next_free += __len; \ |
334 | 457 (void) 0; }) |
458 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
459 # define obstack_alloc(OBSTACK,length) \ |
334 | 460 __extension__ \ |
461 ({ struct obstack *__h = (OBSTACK); \ | |
462 obstack_blank (__h, (length)); \ | |
463 obstack_finish (__h); }) | |
464 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
465 # define obstack_copy(OBSTACK,where,length) \ |
334 | 466 __extension__ \ |
467 ({ struct obstack *__h = (OBSTACK); \ | |
468 obstack_grow (__h, (where), (length)); \ | |
469 obstack_finish (__h); }) | |
470 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
471 # define obstack_copy0(OBSTACK,where,length) \ |
334 | 472 __extension__ \ |
473 ({ struct obstack *__h = (OBSTACK); \ | |
474 obstack_grow0 (__h, (where), (length)); \ | |
475 obstack_finish (__h); }) | |
476 | |
477 /* The local variable is named __o1 to avoid a name conflict | |
478 when obstack_blank is called. */ | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
479 # define obstack_finish(OBSTACK) \ |
334 | 480 __extension__ \ |
481 ({ struct obstack *__o1 = (OBSTACK); \ | |
482 void *value; \ | |
881 | 483 value = (void *) __o1->object_base; \ |
484 if (__o1->next_free == value) \ | |
485 __o1->maybe_empty_object = 1; \ | |
486 __o1->next_free \ | |
487 = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ | |
488 & ~ (__o1->alignment_mask)); \ | |
489 if (__o1->next_free - (char *)__o1->chunk \ | |
490 > __o1->chunk_limit - (char *)__o1->chunk) \ | |
491 __o1->next_free = __o1->chunk_limit; \ | |
492 __o1->object_base = __o1->next_free; \ | |
334 | 493 value; }) |
494 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
495 # define obstack_free(OBSTACK, OBJ) \ |
334 | 496 __extension__ \ |
497 ({ struct obstack *__o = (OBSTACK); \ | |
498 void *__obj = (OBJ); \ | |
499 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
|
500 __o->next_free = __o->object_base = (char *)__obj; \ |
334 | 501 else (obstack_free) (__o, __obj); }) |
502 | |
503 #else /* not __GNUC__ or not __STDC__ */ | |
504 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
505 # define obstack_object_size(h) \ |
881 | 506 (unsigned) ((h)->next_free - (h)->object_base) |
334 | 507 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
508 # define obstack_room(h) \ |
334 | 509 (unsigned) ((h)->chunk_limit - (h)->next_free) |
510 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
511 # define obstack_empty_p(h) \ |
1112 | 512 ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0) |
513 | |
334 | 514 /* Note that the call to _obstack_newchunk is enclosed in (..., 0) |
515 so that we can avoid having void expressions | |
516 in the arms of the conditional expression. | |
517 Casting the third operand to void was tried before, | |
518 but some compilers won't accept it. */ | |
519 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
520 # define obstack_make_room(h,length) \ |
881 | 521 ( (h)->temp = (length), \ |
522 (((h)->next_free + (h)->temp > (h)->chunk_limit) \ | |
523 ? (_obstack_newchunk ((h), (h)->temp), 0) : 0)) | |
524 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
525 # define obstack_grow(h,where,length) \ |
334 | 526 ( (h)->temp = (length), \ |
527 (((h)->next_free + (h)->temp > (h)->chunk_limit) \ | |
528 ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ | |
2990 | 529 _obstack_memcpy ((h)->next_free, (where), (h)->temp), \ |
881 | 530 (h)->next_free += (h)->temp) |
334 | 531 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
532 # define obstack_grow0(h,where,length) \ |
334 | 533 ( (h)->temp = (length), \ |
534 (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \ | |
535 ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \ | |
2990 | 536 _obstack_memcpy ((h)->next_free, (where), (h)->temp), \ |
334 | 537 (h)->next_free += (h)->temp, \ |
881 | 538 *((h)->next_free)++ = 0) |
334 | 539 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
540 # define obstack_1grow(h,datum) \ |
334 | 541 ( (((h)->next_free + 1 > (h)->chunk_limit) \ |
542 ? (_obstack_newchunk ((h), 1), 0) : 0), \ | |
881 | 543 (*((h)->next_free)++ = (datum))) |
334 | 544 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
545 # define obstack_ptr_grow(h,datum) \ |
334 | 546 ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ |
547 ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ | |
2990 | 548 (*((const char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = (datum))) |
334 | 549 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
550 # define obstack_int_grow(h,datum) \ |
334 | 551 ( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ |
552 ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ | |
2990 | 553 (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = (datum))) |
334 | 554 |
2990 | 555 # define obstack_ptr_grow_fast(h,aptr) \ |
556 (*((const char **) (h)->next_free)++ = (aptr)) | |
557 | |
558 # define obstack_int_grow_fast(h,aint) \ | |
559 (*((int *) (h)->next_free)++ = (aint)) | |
334 | 560 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
561 # define obstack_blank(h,length) \ |
334 | 562 ( (h)->temp = (length), \ |
563 (((h)->chunk_limit - (h)->next_free < (h)->temp) \ | |
564 ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ | |
881 | 565 ((h)->next_free += (h)->temp)) |
334 | 566 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
567 # define obstack_alloc(h,length) \ |
334 | 568 (obstack_blank ((h), (length)), obstack_finish ((h))) |
569 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
570 # define obstack_copy(h,where,length) \ |
334 | 571 (obstack_grow ((h), (where), (length)), obstack_finish ((h))) |
572 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
573 # define obstack_copy0(h,where,length) \ |
334 | 574 (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) |
575 | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
576 # define obstack_finish(h) \ |
881 | 577 ( ((h)->next_free == (h)->object_base \ |
334 | 578 ? (((h)->maybe_empty_object = 1), 0) \ |
579 : 0), \ | |
580 (h)->temp = __PTR_TO_INT ((h)->object_base), \ | |
581 (h)->next_free \ | |
582 = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \ | |
583 & ~ ((h)->alignment_mask)), \ | |
881 | 584 (((h)->next_free - (char *) (h)->chunk \ |
585 > (h)->chunk_limit - (char *) (h)->chunk) \ | |
334 | 586 ? ((h)->next_free = (h)->chunk_limit) : 0), \ |
587 (h)->object_base = (h)->next_free, \ | |
881 | 588 __INT_TO_PTR ((h)->temp)) |
334 | 589 |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
590 # if defined __STDC__ && __STDC__ |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
591 # define obstack_free(h,obj) \ |
881 | 592 ( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \ |
334 | 593 (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ |
594 ? (int) ((h)->next_free = (h)->object_base \ | |
595 = (h)->temp + (char *) (h)->chunk) \ | |
596 : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0))) | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
597 # else |
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
598 # define obstack_free(h,obj) \ |
881 | 599 ( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \ |
334 | 600 (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ |
601 ? (int) ((h)->next_free = (h)->object_base \ | |
602 = (h)->temp + (char *) (h)->chunk) \ | |
603 : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0))) | |
2477
27aa55bf95b7
update from glibc -- solely white space changes
Jim Meyering <jim@meyering.net>
parents:
1112
diff
changeset
|
604 # endif |
334 | 605 |
606 #endif /* not __GNUC__ or not __STDC__ */ | |
607 | |
995 | 608 #ifdef __cplusplus |
609 } /* C++ */ | |
610 #endif | |
611 | |
1112 | 612 #endif /* obstack.h */ |