obstack.h revision 05436638acc7c010349a69c3395f1a57c642dc62
1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* obstack.h - object stack macros
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1988-1994, 1996-1999, 2003-2006, 2009-2012 Free Software
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Foundation, Inc.
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of the GNU C Library.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Summary:
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAll the apparent functions defined here are macros. The idea
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis that you would use these pre-tested macros to solve a
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvery specific set of problems, and they would run fast.
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCaution: no side-effects in arguments please!! They may be
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectevaluated MANY times!!
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese macros operate a stack of objects.  Each object starts life
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsmall, and may grow to maturity.  (Consider building a word syllable
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby syllable.)  An object can move while it is growing.  Once it has
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeen "finished" it never changes address again.  So the "top of the
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstack" is typically an immature growing object, while the rest of the
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstack is of mature, fixed size and fixed address objects.
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese routines grab large chunks of memory, using a function you
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wangsupply, called 'obstack_chunk_alloc'.  On occasion, they free chunks,
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wangby calling 'obstack_chunk_free'.  You must define them and declare
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthem before using any obstack macros.
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3905436638acc7c010349a69c3395f1a57c642dc62Ying WangEach independent stack is represented by a 'struct obstack'.
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach of the obstack macros expects a pointer to such a structure
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas the first argument.
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOne motivation for this package is the problem of growing char strings
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin symbol tables.  Unless you are "fascist pig with a read-only mind"
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project--Gosper's immortal quote from HAKMEM item 154, out of context--you
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwould not like to put any arbitrary upper limit on the length of your
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbols.
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn practice this often means you will build many short symbols and a
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfew long symbols.  At the time you are reading a symbol you don't know
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthow long it is.  One traditional method is to read a symbol into a
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbuffer, realloc()ating the buffer every time you try to read a symbol
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat is longer than the buffer.  This is beaut, but you still will
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwant to copy the symbol from the buffer to a more permanent
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol-table entry say about half the time.
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWith obstacks, you can work differently.  Use one obstack for all symbol
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnames.  As you read a symbol, grow the name in the obstack gradually.
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen the name is complete, finalize it.  Then, if the symbol exists already,
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfree the newly read name.
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe way we do this is to take a large chunk, allocating memory from
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlow addresses.  When you want to build a symbol in the chunk you just
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadd chars above the current "high water mark" in the chunk.  When you
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthave finished adding chars, because you got to the end of the symbol,
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou know how long the chars are, and you can create a new object.
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMostly the chars will not burst over the highest address of the chunk,
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbecause you would typically expect a chunk to be (say) 100 times as
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlong as an average object.
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn case that isn't clear, when we have enough chars to make up
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectso we just point to it where it lies.  No moving of chars is
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectneeded and this is the second win: potentially long strings need
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnever be explicitly shuffled. Once an object is formed, it does not
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchange its address during its lifetime.
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen the chars burst over a chunk boundary, we allocate a larger
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchunk, and then copy the partly formed object from the end of the old
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchunk to the beginning of the new larger chunk.  We then carry on
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaccreting characters to the end of the object as we normally would.
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA special macro is provided to add a single char at a time to a
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrowing object.  This allows the use of register variables, which
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbreak the ordinary 'growth' macro.
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSummary:
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        We allocate large chunks.
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        We carve out one object at a time from the current chunk.
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        Once carved, an object never moves.
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        We are free to append data of any size to the currently
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          growing object.
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        Exactly one object is growing in an obstack at any one time.
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        You can run one obstack per control block.
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        You may have as many control blocks as you dare.
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        Because of the way we do it, you can "unwind" an obstack
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          back to a previous state. (You may remove objects much
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          as you would with a stack.)
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project*/
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Don't do the contents of this file more than once.  */
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef _OBSTACK_H
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define _OBSTACK_H 1
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* We need the type of a pointer subtraction.  If __PTRDIFF_TYPE__ is
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   defined, as with GNU C, use that; that way we don't pollute the
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   namespace with <stddef.h>'s symbols.  Otherwise, include <stddef.h>
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   and use ptrdiff_t.  */
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef __PTRDIFF_TYPE__
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define PTR_INT_TYPE __PTRDIFF_TYPE__
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <stddef.h>
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define PTR_INT_TYPE ptrdiff_t
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If B is the base of an object addressed by P, return the result of
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   aligning P to the next multiple of A + 1.  B and P must be of type
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   char *.  A + 1 must be a power of 2.  */
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A)))
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Similar to _BPTR_ALIGN (B, P, A), except optimize the common case
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   where pointers can be converted to integers, aligned as integers,
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   and converted back again.  If PTR_INT_TYPE is narrower than a
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   pointer (e.g., the AS/400), play it safe and compute the alignment
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   relative to B.  Otherwise, use the faster strategy of computing the
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   alignment relative to 0.  */
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define __PTR_ALIGN(B, P, A)                                                \
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                P, A)
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <string.h>
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern "C" {
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wangstruct _obstack_chunk           /* Lives at front of each chunk. */
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  char  *limit;                 /* 1 past end of this chunk */
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  struct _obstack_chunk *prev;  /* address of prior chunk or NULL */
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  char  contents[4];            /* objects begin here */
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wangstruct obstack          /* control current object in current chunk */
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  long  chunk_size;             /* preferred size to allocate chunks in */
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  char  *object_base;           /* address of object we are building */
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  char  *next_free;             /* where to add next char to current object */
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  char  *chunk_limit;           /* address of char after current chunk */
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  union
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  {
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    PTR_INT_TYPE tempint;
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    void *tempptr;
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  } temp;                       /* Temporary for some macros.  */
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int   alignment_mask;         /* Mask of alignment for each object. */
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* These prototypes vary based on 'use_extra_arg', and we use
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     casts to the prototypeless function type in all assignments,
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     but having prototypes here quiets -Wstrict-prototypes.  */
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct _obstack_chunk *(*chunkfun) (void *, long);
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void (*freefun) (void *, struct _obstack_chunk *);
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  void *extra_arg;              /* first arg for chunk alloc/dealloc funcs */
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  unsigned use_extra_arg:1;     /* chunk alloc/dealloc funcs take extra arg */
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned maybe_empty_object:1;/* There is a possibility that the current
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   chunk contains a zero-length object.  This
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   prevents freeing the chunk if we allocate
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   a bigger chunk to replace it. */
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  unsigned alloc_failed:1;      /* No longer used, as we now call the failed
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   handler on error, but retained for binary
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   compatibility.  */
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Declare the external functions we use; they are in obstack.c.  */
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern void _obstack_newchunk (struct obstack *, int);
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int _obstack_begin (struct obstack *, int, int,
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            void *(*) (long), void (*) (void *));
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int _obstack_begin_1 (struct obstack *, int, int,
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             void *(*) (void *, long),
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             void (*) (void *, void *), void *);
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int _obstack_memory_used (struct obstack *);
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The default name of the function for freeing a chunk is 'obstack_free',
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but gnulib users can override this by defining '__obstack_free'.  */
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef __obstack_free
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define __obstack_free obstack_free
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern void __obstack_free (struct obstack *obstack, void *block);
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Error handler called when 'obstack_chunk_alloc' failed to allocate
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   more memory.  This can be set to a user defined function which
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   should either abort gracefully or use longjump - but shouldn't
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   return.  The default action is to print a message and abort.  */
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern void (*obstack_alloc_failed_handler) (void);
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Exit value used when 'print_and_abort' is used.  */
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int obstack_exit_failure;
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Pointer to beginning of object being allocated or to be allocated next.
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Note that this might not be the final address of the object
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   because a new chunk might be needed to hold the final size.  */
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_base(h) ((void *) (h)->object_base)
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Size for allocating ordinary chunks.  */
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_chunk_size(h) ((h)->chunk_size)
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Pointer to next byte not yet allocated in current chunk.  */
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define obstack_next_free(h)    ((h)->next_free)
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Mask specifying low bits that should be clear in address of an object.  */
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_alignment_mask(h) ((h)->alignment_mask)
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* To prevent prototype warnings provide complete argument list.  */
22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define obstack_init(h)                                         \
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _obstack_begin ((h), 0, 0,                                    \
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void *(*) (long)) obstack_chunk_alloc,       \
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void (*) (void *)) obstack_chunk_free)
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define obstack_begin(h, size)                                  \
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _obstack_begin ((h), (size), 0,                               \
23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void *(*) (long)) obstack_chunk_alloc,       \
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void (*) (void *)) obstack_chunk_free)
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun)  \
23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _obstack_begin ((h), (size), (alignment),                                \
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void *(*) (long)) (chunkfun),                           \
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void (*) (void *)) (freefun))
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _obstack_begin_1 ((h), (size), (alignment),                           \
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    (void *(*) (void *, long)) (chunkfun),              \
24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    (void (*) (void *, void *)) (freefun), (arg))
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_chunkfun(h, newchunkfun) \
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_freefun(h, newfreefun) \
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar))
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_blank_fast(h,n) ((h)->next_free += (n))
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_memory_used(h) _obstack_memory_used (h)
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __GNUC__
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   does not implement __extension__.  But that compiler doesn't define
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __GNUC_MINOR__.  */
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define __extension__
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* For GNU C, if not -traditional,
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   we can define these macros to compute all args only once
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   without using a global variable.
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Also, we can avoid using the 'temp' slot, to make faster code.  */
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_object_size(OBSTACK)                                   \
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  __extension__                                                         \
27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  ({ struct obstack const *__o = (OBSTACK);                             \
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     (unsigned) (__o->next_free - __o->object_base); })
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_room(OBSTACK)                                          \
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  __extension__                                                         \
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  ({ struct obstack const *__o = (OBSTACK);                             \
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     (unsigned) (__o->chunk_limit - __o->next_free); })
278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_make_room(OBSTACK,length)                              \
28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o = (OBSTACK);                                     \
28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   int __len = (length);                                                \
28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if (__o->chunk_limit - __o->next_free < __len)                       \
28405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _obstack_newchunk (__o, __len);                                    \
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_empty_p(OBSTACK)                                       \
28805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  __extension__                                                         \
28905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  ({ struct obstack const *__o = (OBSTACK);                             \
29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     (__o->chunk->prev == 0                                             \
29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      && __o->next_free == __PTR_ALIGN ((char *) __o->chunk,            \
29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        __o->chunk->contents,           \
29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        __o->alignment_mask)); })
29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_grow(OBSTACK,where,length)                             \
29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o = (OBSTACK);                                     \
29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   int __len = (length);                                                \
29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if (__o->next_free + __len > __o->chunk_limit)                       \
30005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _obstack_newchunk (__o, __len);                                    \
30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   memcpy (__o->next_free, where, __len);                               \
30205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   __o->next_free += __len;                                             \
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
30505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_grow0(OBSTACK,where,length)                            \
30605436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
30705436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o = (OBSTACK);                                     \
30805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   int __len = (length);                                                \
30905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if (__o->next_free + __len + 1 > __o->chunk_limit)                   \
31005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _obstack_newchunk (__o, __len + 1);                                \
31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   memcpy (__o->next_free, where, __len);                               \
31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   __o->next_free += __len;                                             \
31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   *(__o->next_free)++ = 0;                                             \
314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_1grow(OBSTACK,datum)                                   \
31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o = (OBSTACK);                                     \
31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if (__o->next_free + 1 > __o->chunk_limit)                           \
32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _obstack_newchunk (__o, 1);                                        \
32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   obstack_1grow_fast (__o, datum);                                     \
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* These assume that the obstack alignment is good enough for pointers
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or ints, and that the data added so far to the current object
326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   shares that much alignment.  */
327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_ptr_grow(OBSTACK,datum)                                \
32905436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o = (OBSTACK);                                     \
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if (__o->next_free + sizeof (void *) > __o->chunk_limit)             \
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _obstack_newchunk (__o, sizeof (void *));                          \
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   obstack_ptr_grow_fast (__o, datum); })                               \
33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_int_grow(OBSTACK,datum)                                \
33605436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
33705436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o = (OBSTACK);                                     \
33805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if (__o->next_free + sizeof (int) > __o->chunk_limit)                \
33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _obstack_newchunk (__o, sizeof (int));                             \
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_int_grow_fast (__o, datum); })
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
34205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_ptr_grow_fast(OBSTACK,aptr)                            \
34305436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
34405436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o1 = (OBSTACK);                                    \
34505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   *(const void **) __o1->next_free = (aptr);                           \
34605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   __o1->next_free += sizeof (const void *);                            \
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
34905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_int_grow_fast(OBSTACK,aint)                            \
35005436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o1 = (OBSTACK);                                    \
35205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   *(int *) __o1->next_free = (aint);                                   \
35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   __o1->next_free += sizeof (int);                                     \
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
35605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_blank(OBSTACK,length)                                  \
35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o = (OBSTACK);                                     \
35905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   int __len = (length);                                                \
36005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if (__o->chunk_limit - __o->next_free < __len)                       \
36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _obstack_newchunk (__o, __len);                                    \
36205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   obstack_blank_fast (__o, __len);                                     \
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_alloc(OBSTACK,length)                                  \
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__h = (OBSTACK);                                     \
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   obstack_blank (__h, (length));                                       \
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_finish (__h); })
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
37105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_copy(OBSTACK,where,length)                             \
37205436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
37305436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__h = (OBSTACK);                                     \
37405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   obstack_grow (__h, (where), (length));                               \
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_finish (__h); })
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
37705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_copy0(OBSTACK,where,length)                            \
37805436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
37905436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__h = (OBSTACK);                                     \
38005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   obstack_grow0 (__h, (where), (length));                              \
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_finish (__h); })
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The local variable is named __o1 to avoid a name conflict
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   when obstack_blank is called.  */
38505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_finish(OBSTACK)                                        \
38605436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o1 = (OBSTACK);                                    \
38805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   void *__value = (void *) __o1->object_base;                          \
38905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if (__o1->next_free == __value)                                      \
39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     __o1->maybe_empty_object = 1;                                      \
39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   __o1->next_free                                                      \
39205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     = __PTR_ALIGN (__o1->object_base, __o1->next_free,                 \
39305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    __o1->alignment_mask);                              \
39405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if (__o1->next_free - (char *)__o1->chunk                            \
39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       > __o1->chunk_limit - (char *)__o1->chunk)                       \
39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang     __o1->next_free = __o1->chunk_limit;                               \
39705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   __o1->object_base = __o1->next_free;                                 \
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __value; })
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_free(OBSTACK, OBJ)                                     \
40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang__extension__                                                           \
40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang({ struct obstack *__o = (OBSTACK);                                     \
40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   void *__obj = (OBJ);                                                 \
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \
40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     __o->next_free = __o->object_base = (char *)__obj;                 \
40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   else (__obstack_free) (__o, __obj); })
407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else /* not __GNUC__ */
409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_object_size(h) \
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (unsigned) ((h)->next_free - (h)->object_base)
412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_room(h)                \
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (unsigned) ((h)->chunk_limit - (h)->next_free)
415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_empty_p(h) \
41705436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((h)->chunk->prev == 0                                                 \
41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk,                \
41905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                    (h)->chunk->contents,               \
42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                    (h)->alignment_mask))
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   so that we can avoid having void expressions
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   in the arms of the conditional expression.
425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Casting the third operand to void was tried before,
426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but some compilers won't accept it.  */
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
42805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_make_room(h,length)                                    \
42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang( (h)->temp.tempint = (length),                                         \
43005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit)              \
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0))
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_grow(h,where,length)                                   \
43405436638acc7c010349a69c3395f1a57c642dc62Ying Wang( (h)->temp.tempint = (length),                                         \
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit)              \
43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0),              \
43705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  memcpy ((h)->next_free, where, (h)->temp.tempint),                    \
438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (h)->next_free += (h)->temp.tempint)
439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
44005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_grow0(h,where,length)                                  \
44105436638acc7c010349a69c3395f1a57c642dc62Ying Wang( (h)->temp.tempint = (length),                                         \
44205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit)          \
44305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0),          \
44405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  memcpy ((h)->next_free, where, (h)->temp.tempint),                    \
44505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (h)->next_free += (h)->temp.tempint,                                  \
446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  *((h)->next_free)++ = 0)
447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_1grow(h,datum)                                         \
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang( (((h)->next_free + 1 > (h)->chunk_limit)                              \
45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ? (_obstack_newchunk ((h), 1), 0) : 0),                              \
451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_1grow_fast (h, datum))
452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
45305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_ptr_grow(h,datum)                                      \
45405436638acc7c010349a69c3395f1a57c642dc62Ying Wang( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)                \
45505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),                \
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_ptr_grow_fast (h, datum))
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
45805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_int_grow(h,datum)                                      \
45905436638acc7c010349a69c3395f1a57c642dc62Ying Wang( (((h)->next_free + sizeof (int) > (h)->chunk_limit)                   \
46005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),                   \
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_int_grow_fast (h, datum))
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
46305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_ptr_grow_fast(h,aptr)                                  \
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr))
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
46605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_int_grow_fast(h,aint)                                  \
467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint))
468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
46905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_blank(h,length)                                        \
47005436638acc7c010349a69c3395f1a57c642dc62Ying Wang( (h)->temp.tempint = (length),                                         \
47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint)              \
47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0),              \
473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_blank_fast (h, (h)->temp.tempint))
474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_alloc(h,length)                                        \
476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (obstack_blank ((h), (length)), obstack_finish ((h)))
477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_copy(h,where,length)                                   \
479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_copy0(h,where,length)                                  \
482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
48405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_finish(h)                                              \
48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang( ((h)->next_free == (h)->object_base                                   \
48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ? (((h)->maybe_empty_object = 1), 0)                                 \
48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   : 0),                                                                \
48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (h)->temp.tempptr = (h)->object_base,                                 \
48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (h)->next_free                                                        \
49005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    = __PTR_ALIGN ((h)->object_base, (h)->next_free,                    \
49105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   (h)->alignment_mask),                                \
49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (((h)->next_free - (char *) (h)->chunk                                \
49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    > (h)->chunk_limit - (char *) (h)->chunk)                           \
49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ? ((h)->next_free = (h)->chunk_limit) : 0),                          \
49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  (h)->object_base = (h)->next_free,                                    \
496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (h)->temp.tempptr)
497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define obstack_free(h,obj)                                            \
49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk,             \
50005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  ((((h)->temp.tempint > 0                                              \
50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk))     \
50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ? (int) ((h)->next_free = (h)->object_base                           \
50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            = (h)->temp.tempint + (char *) (h)->chunk)                  \
50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   : (((__obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0)))
505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* not __GNUC__ */
507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef __cplusplus
50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang}       /* C++ */
510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* obstack.h */
513