1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* obstack.h - object stack macros
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Copyright (C) 1988-1994,1996-1999,2003,2004,2005
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	Free Software Foundation, Inc.
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of the GNU C Library.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   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
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation; either version 2, or (at your option)
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   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
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License along
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   with this program; if not, write to the Free Software Foundation,
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Summary:
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectAll the apparent functions defined here are macros. The idea
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectis that you would use these pre-tested macros to solve a
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvery specific set of problems, and they would run fast.
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectCaution: no side-effects in arguments please!! They may be
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectevaluated MANY times!!
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese macros operate a stack of objects.  Each object starts life
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsmall, and may grow to maturity.  (Consider building a word syllable
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby syllable.)  An object can move while it is growing.  Once it has
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbeen "finished" it never changes address again.  So the "top of the
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstack" is typically an immature growing object, while the rest of the
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstack is of mature, fixed size and fixed address objects.
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThese routines grab large chunks of memory, using a function you
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsupply, called `obstack_chunk_alloc'.  On occasion, they free chunks,
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectby calling `obstack_chunk_free'.  You must define them and declare
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthem before using any obstack macros.
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach independent stack is represented by a `struct obstack'.
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEach of the obstack macros expects a pointer to such a structure
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectas the first argument.
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectOne motivation for this package is the problem of growing char strings
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectin symbol tables.  Unless you are "fascist pig with a read-only mind"
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project--Gosper's immortal quote from HAKMEM item 154, out of context--you
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwould not like to put any arbitrary upper limit on the length of your
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbols.
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn practice this often means you will build many short symbols and a
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfew long symbols.  At the time you are reading a symbol you don't know
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthow long it is.  One traditional method is to read a symbol into a
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbuffer, realloc()ating the buffer every time you try to read a symbol
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthat is longer than the buffer.  This is beaut, but you still will
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectwant to copy the symbol from the buffer to a more permanent
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol-table entry say about half the time.
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWith obstacks, you can work differently.  Use one obstack for all symbol
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnames.  As you read a symbol, grow the name in the obstack gradually.
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen the name is complete, finalize it.  Then, if the symbol exists already,
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfree the newly read name.
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectThe way we do this is to take a large chunk, allocating memory from
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlow addresses.  When you want to build a symbol in the chunk you just
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadd chars above the current "high water mark" in the chunk.  When you
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthave finished adding chars, because you got to the end of the symbol,
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectyou know how long the chars are, and you can create a new object.
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectMostly the chars will not burst over the highest address of the chunk,
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbecause you would typically expect a chunk to be (say) 100 times as
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlong as an average object.
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIn case that isn't clear, when we have enough chars to make up
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthe object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectso we just point to it where it lies.  No moving of chars is
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectneeded and this is the second win: potentially long strings need
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnever be explicitly shuffled. Once an object is formed, it does not
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchange its address during its lifetime.
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectWhen the chars burst over a chunk boundary, we allocate a larger
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchunk, and then copy the partly formed object from the end of the old
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchunk to the beginning of the new larger chunk.  We then carry on
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectaccreting characters to the end of the object as we normally would.
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectA special macro is provided to add a single char at a time to a
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgrowing object.  This allows the use of register variables, which
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbreak the ordinary 'growth' macro.
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectSummary:
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	We allocate large chunks.
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	We carve out one object at a time from the current chunk.
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	Once carved, an object never moves.
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	We are free to append data of any size to the currently
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  growing object.
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	Exactly one object is growing in an obstack at any one time.
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	You can run one obstack per control block.
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	You may have as many control blocks as you dare.
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	Because of the way we do it, you can `unwind' an obstack
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  back to a previous state. (You may remove objects much
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  as you would with a stack.)
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project*/
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Don't do the contents of this file more than once.  */
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef _OBSTACK_H
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define _OBSTACK_H 1
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef __cplusplus
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern "C" {
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* We need the type of a pointer subtraction.  If __PTRDIFF_TYPE__ is
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   defined, as with GNU C, use that; that way we don't pollute the
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   namespace with <stddef.h>'s symbols.  Otherwise, include <stddef.h>
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   and use ptrdiff_t.  */
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef __PTRDIFF_TYPE__
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define PTR_INT_TYPE __PTRDIFF_TYPE__
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <stddef.h>
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define PTR_INT_TYPE ptrdiff_t
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If B is the base of an object addressed by P, return the result of
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   aligning P to the next multiple of A + 1.  B and P must be of type
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   char *.  A + 1 must be a power of 2.  */
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A)))
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Similiar to _BPTR_ALIGN (B, P, A), except optimize the common case
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   where pointers can be converted to integers, aligned as integers,
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   and converted back again.  If PTR_INT_TYPE is narrower than a
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   pointer (e.g., the AS/400), play it safe and compute the alignment
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   relative to B.  Otherwise, use the faster strategy of computing the
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   alignment relative to 0.  */
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define __PTR_ALIGN(B, P, A)						    \
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		P, A)
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <string.h>
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct _obstack_chunk		/* Lives at front of each chunk. */
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char  *limit;			/* 1 past end of this chunk */
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct _obstack_chunk *prev;	/* address of prior chunk or NULL */
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char	contents[4];		/* objects begin here */
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct obstack		/* control current object in current chunk */
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  long	chunk_size;		/* preferred size to allocate chunks in */
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct _obstack_chunk *chunk;	/* address of current struct obstack_chunk */
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char	*object_base;		/* address of object we are building */
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char	*next_free;		/* where to add next char to current object */
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char	*chunk_limit;		/* address of char after current chunk */
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  union
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  {
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    PTR_INT_TYPE tempint;
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    void *tempptr;
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  } temp;			/* Temporary for some macros.  */
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int   alignment_mask;		/* Mask of alignment for each object. */
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* These prototypes vary based on `use_extra_arg', and we use
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     casts to the prototypeless function type in all assignments,
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     but having prototypes here quiets -Wstrict-prototypes.  */
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct _obstack_chunk *(*chunkfun) (void *, long);
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void (*freefun) (void *, struct _obstack_chunk *);
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  void *extra_arg;		/* first arg for chunk alloc/dealloc funcs */
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned use_extra_arg:1;	/* chunk alloc/dealloc funcs take extra arg */
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned maybe_empty_object:1;/* There is a possibility that the current
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				   chunk contains a zero-length object.  This
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				   prevents freeing the chunk if we allocate
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				   a bigger chunk to replace it. */
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned alloc_failed:1;	/* No longer used, as we now call the failed
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				   handler on error, but retained for binary
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				   compatibility.  */
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Declare the external functions we use; they are in obstack.c.  */
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern void _obstack_newchunk (struct obstack *, int);
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int _obstack_begin (struct obstack *, int, int,
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			    void *(*) (long), void (*) (void *));
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int _obstack_begin_1 (struct obstack *, int, int,
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			     void *(*) (void *, long),
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			     void (*) (void *, void *), void *);
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int _obstack_memory_used (struct obstack *);
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid obstack_free (struct obstack *obstack, void *block);
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Error handler called when `obstack_chunk_alloc' failed to allocate
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   more memory.  This can be set to a user defined function which
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   should either abort gracefully or use longjump - but shouldn't
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   return.  The default action is to print a message and abort.  */
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern void (*obstack_alloc_failed_handler) (void);
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Exit value used when `print_and_abort' is used.  */
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int obstack_exit_failure;
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Pointer to beginning of object being allocated or to be allocated next.
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Note that this might not be the final address of the object
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   because a new chunk might be needed to hold the final size.  */
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_base(h) ((void *) (h)->object_base)
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Size for allocating ordinary chunks.  */
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_chunk_size(h) ((h)->chunk_size)
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Pointer to next byte not yet allocated in current chunk.  */
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_next_free(h)	((h)->next_free)
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Mask specifying low bits that should be clear in address of an object.  */
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_alignment_mask(h) ((h)->alignment_mask)
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* To prevent prototype warnings provide complete argument list.  */
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_init(h)						\
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  _obstack_begin ((h), 0, 0,					\
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  (void *(*) (long)) obstack_chunk_alloc,	\
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  (void (*) (void *)) obstack_chunk_free)
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_begin(h, size)					\
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  _obstack_begin ((h), (size), 0,				\
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  (void *(*) (long)) obstack_chunk_alloc,	\
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  (void (*) (void *)) obstack_chunk_free)
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun)  \
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  _obstack_begin ((h), (size), (alignment),				   \
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  (void *(*) (long)) (chunkfun),			   \
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		  (void (*) (void *)) (freefun))
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  _obstack_begin_1 ((h), (size), (alignment),				\
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    (void *(*) (void *, long)) (chunkfun),		\
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    (void (*) (void *, void *)) (freefun), (arg))
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_chunkfun(h, newchunkfun) \
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_freefun(h, newfreefun) \
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar))
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_blank_fast(h,n) ((h)->next_free += (n))
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define obstack_memory_used(h) _obstack_memory_used (h)
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined __GNUC__ && defined __STDC__ && __STDC__
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   does not implement __extension__.  But that compiler doesn't define
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __GNUC_MINOR__.  */
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define __extension__
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* For GNU C, if not -traditional,
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   we can define these macros to compute all args only once
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   without using a global variable.
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Also, we can avoid using the `temp' slot, to make faster code.  */
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_object_size(OBSTACK)					\
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  __extension__								\
267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ({ struct obstack const *__o = (OBSTACK);				\
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     (unsigned) (__o->next_free - __o->object_base); })
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_room(OBSTACK)						\
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  __extension__								\
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ({ struct obstack const *__o = (OBSTACK);				\
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     (unsigned) (__o->chunk_limit - __o->next_free); })
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_make_room(OBSTACK,length)				\
276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o = (OBSTACK);					\
278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   int __len = (length);						\
279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__o->chunk_limit - __o->next_free < __len)			\
280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     _obstack_newchunk (__o, __len);					\
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_empty_p(OBSTACK)					\
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  __extension__								\
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ({ struct obstack const *__o = (OBSTACK);				\
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     (__o->chunk->prev == 0						\
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      && __o->next_free == __PTR_ALIGN ((char *) __o->chunk,		\
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project					__o->chunk->contents,		\
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project					__o->alignment_mask)); })
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_grow(OBSTACK,where,length)				\
292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o = (OBSTACK);					\
294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   int __len = (length);						\
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__o->next_free + __len > __o->chunk_limit)			\
296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     _obstack_newchunk (__o, __len);					\
297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   memcpy (__o->next_free, where, __len);				\
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __o->next_free += __len;						\
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_grow0(OBSTACK,where,length)				\
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o = (OBSTACK);					\
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   int __len = (length);						\
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__o->next_free + __len + 1 > __o->chunk_limit)			\
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     _obstack_newchunk (__o, __len + 1);				\
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   memcpy (__o->next_free, where, __len);				\
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __o->next_free += __len;						\
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   *(__o->next_free)++ = 0;						\
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_1grow(OBSTACK,datum)					\
313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o = (OBSTACK);					\
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__o->next_free + 1 > __o->chunk_limit)				\
316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     _obstack_newchunk (__o, 1);					\
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_1grow_fast (__o, datum);					\
318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* These assume that the obstack alignment is good enough for pointers
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   or ints, and that the data added so far to the current object
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   shares that much alignment.  */
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_ptr_grow(OBSTACK,datum)				\
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o = (OBSTACK);					\
327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__o->next_free + sizeof (void *) > __o->chunk_limit)		\
328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     _obstack_newchunk (__o, sizeof (void *));				\
329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_ptr_grow_fast (__o, datum); })				\
330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_int_grow(OBSTACK,datum)				\
332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o = (OBSTACK);					\
334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__o->next_free + sizeof (int) > __o->chunk_limit)		\
335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     _obstack_newchunk (__o, sizeof (int));				\
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_int_grow_fast (__o, datum); })
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_ptr_grow_fast(OBSTACK,aptr)				\
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o1 = (OBSTACK);					\
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   *(const void **) __o1->next_free = (aptr);				\
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __o1->next_free += sizeof (const void *);				\
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_int_grow_fast(OBSTACK,aint)				\
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o1 = (OBSTACK);					\
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   *(int *) __o1->next_free = (aint);					\
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __o1->next_free += sizeof (int);					\
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_blank(OBSTACK,length)					\
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o = (OBSTACK);					\
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   int __len = (length);						\
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__o->chunk_limit - __o->next_free < __len)			\
357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     _obstack_newchunk (__o, __len);					\
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_blank_fast (__o, __len);					\
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (void) 0; })
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_alloc(OBSTACK,length)					\
362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__h = (OBSTACK);					\
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_blank (__h, (length));					\
365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_finish (__h); })
366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_copy(OBSTACK,where,length)				\
368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__h = (OBSTACK);					\
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_grow (__h, (where), (length));				\
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_finish (__h); })
372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_copy0(OBSTACK,where,length)				\
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__h = (OBSTACK);					\
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_grow0 (__h, (where), (length));				\
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   obstack_finish (__h); })
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The local variable is named __o1 to avoid a name conflict
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   when obstack_blank is called.  */
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_finish(OBSTACK)					\
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o1 = (OBSTACK);					\
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   void *__value = (void *) __o1->object_base;				\
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__o1->next_free == __value)					\
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     __o1->maybe_empty_object = 1;					\
387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __o1->next_free							\
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     = __PTR_ALIGN (__o1->object_base, __o1->next_free,			\
389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		    __o1->alignment_mask);				\
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__o1->next_free - (char *)__o1->chunk				\
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project       > __o1->chunk_limit - (char *)__o1->chunk)			\
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     __o1->next_free = __o1->chunk_limit;				\
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __o1->object_base = __o1->next_free;					\
394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   __value; })
395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_free(OBSTACK, OBJ)					\
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__extension__								\
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project({ struct obstack *__o = (OBSTACK);					\
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   void *__obj = (OBJ);							\
400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \
401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     __o->next_free = __o->object_base = (char *)__obj;			\
402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   else (obstack_free) (__o, __obj); })
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else /* not __GNUC__ or not __STDC__ */
405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_object_size(h) \
407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (unsigned) ((h)->next_free - (h)->object_base)
408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_room(h)		\
410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (unsigned) ((h)->chunk_limit - (h)->next_free)
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_empty_p(h) \
413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ((h)->chunk->prev == 0							\
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk,		\
415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				    (h)->chunk->contents,		\
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				    (h)->alignment_mask))
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   so that we can avoid having void expressions
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   in the arms of the conditional expression.
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Casting the third operand to void was tried before,
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but some compilers won't accept it.  */
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_make_room(h,length)					\
425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project( (h)->temp.tempint = (length),						\
426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit)		\
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0))
428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_grow(h,where,length)					\
430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project( (h)->temp.tempint = (length),						\
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit)		\
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0),		\
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  memcpy ((h)->next_free, where, (h)->temp.tempint),			\
434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (h)->next_free += (h)->temp.tempint)
435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_grow0(h,where,length)					\
437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project( (h)->temp.tempint = (length),						\
438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit)		\
439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0),		\
440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  memcpy ((h)->next_free, where, (h)->temp.tempint),			\
441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (h)->next_free += (h)->temp.tempint,					\
442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  *((h)->next_free)++ = 0)
443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_1grow(h,datum)						\
445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project( (((h)->next_free + 1 > (h)->chunk_limit)				\
446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (_obstack_newchunk ((h), 1), 0) : 0),				\
447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_1grow_fast (h, datum))
448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_ptr_grow(h,datum)					\
450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)		\
451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),		\
452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_ptr_grow_fast (h, datum))
453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_int_grow(h,datum)					\
455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project( (((h)->next_free + sizeof (int) > (h)->chunk_limit)			\
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),			\
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_int_grow_fast (h, datum))
458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_ptr_grow_fast(h,aptr)					\
460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr))
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_int_grow_fast(h,aint)					\
463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint))
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_blank(h,length)					\
466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project( (h)->temp.tempint = (length),						\
467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint)		\
468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0),		\
469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_blank_fast (h, (h)->temp.tempint))
470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_alloc(h,length)					\
472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (obstack_blank ((h), (length)), obstack_finish ((h)))
473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_copy(h,where,length)					\
475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_copy0(h,where,length)					\
478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_finish(h)						\
481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project( ((h)->next_free == (h)->object_base					\
482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (((h)->maybe_empty_object = 1), 0)					\
483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   : 0),								\
484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (h)->temp.tempptr = (h)->object_base,					\
485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (h)->next_free							\
486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    = __PTR_ALIGN ((h)->object_base, (h)->next_free,			\
487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project		   (h)->alignment_mask),				\
488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (((h)->next_free - (char *) (h)->chunk				\
489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    > (h)->chunk_limit - (char *) (h)->chunk)				\
490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? ((h)->next_free = (h)->chunk_limit) : 0),				\
491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (h)->object_base = (h)->next_free,					\
492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (h)->temp.tempptr)
493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_free(h,obj)						\
495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk,		\
496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ((((h)->temp.tempint > 0						\
497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk))	\
498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ? (int) ((h)->next_free = (h)->object_base				\
499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	    = (h)->temp.tempint + (char *) (h)->chunk)			\
500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   : (((obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0)))
501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* not __GNUC__ or not __STDC__ */
503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef __cplusplus
505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}	/* C++ */
506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* obstack.h */
509