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