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