1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* obstack.c - subroutines used implicitly by object stack macros 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, 5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Inc. 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This program is free software; you can redistribute it and/or modify 8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project it under the terms of the GNU General Public License as published by 9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the Free Software Foundation; either version 2, or (at your option) 10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project any later version. 11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This program is distributed in the hope that it will be useful, 13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GNU General Public License for more details. 16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project You should have received a copy of the GNU General Public License along 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project with this program; if not, write to the Free Software Foundation, 19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_CONFIG_H 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <config.h> 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef _LIBC 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <obstack.h> 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <shlib-compat.h> 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "obstack.h" 30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* NOTE BEFORE MODIFYING THIS FILE: This version number must be 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project incremented whenever callers compiled using an old obstack.h can no 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project longer properly call the functions in this obstack.c. */ 35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define OBSTACK_INTERFACE_VERSION 1 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Comment out all this code if we are using the GNU C Library, and are not 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project actually compiling the library itself, and the installed library 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project supports the same library interface we do. This code is part of the GNU 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project C Library, but also included in many other GNU distributions. Compiling 41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and linking in this code is a waste when using the GNU C library 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (especially if it is a shared library). Rather than having every GNU 43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project program understand `configure --with-gnu-libc' and omit the object 44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project files, it is simpler to just do this in the source for each such file. */ 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */ 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <gnu-versions.h> 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define ELIDE_CODE 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stddef.h> 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef ELIDE_CODE 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if HAVE_INTTYPES_H 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <inttypes.h> 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if HAVE_STDINT_H || defined _LIBC 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <stdint.h> 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Determine default alignment. */ 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunion fooround 68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project uintmax_t i; 70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project long double d; 71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void *p; 72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}; 73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct fooalign 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char c; 76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project union fooround u; 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}; 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project But in fact it might be less smart and round addresses to as much as 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFAULT_ROUNDING. So we prepare for it to do that. */ 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFAULT_ALIGNMENT = offsetof (struct fooalign, u), 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project DEFAULT_ROUNDING = sizeof (union fooround) 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project }; 86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* When we copy a long block of data, this is the unit to do it with. 88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project On some machines, copying successive ints does not work; 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project in such a case, redefine COPYING_UNIT to `long' (if that works) 90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project or `char' as a last resort. */ 91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifndef COPYING_UNIT 92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define COPYING_UNIT int 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The functions allocating more room by calling `obstack_chunk_alloc' 97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project jump to the handler pointed to by `obstack_alloc_failed_handler'. 98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This can be set to a user defined function which should either 99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project abort gracefully or use longjump - but shouldn't return. This 100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project variable by default points to the internal function 101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `print_and_abort'. */ 102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void print_and_abort (void); 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid (*obstack_alloc_failed_handler) (void) = print_and_abort; 104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Exit value used when `print_and_abort' is used. */ 106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <stdlib.h> 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef _LIBC 108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint obstack_exit_failure = EXIT_FAILURE; 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "exitfail.h" 111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define obstack_exit_failure exit_failure 112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef _LIBC 115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) 116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* A looong time ago (before 1994, anyway; we're not sure) this global variable 117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project was used by non-GNU-C macros to avoid multiple evaluation. The GNU C 118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project library still exports it because somebody might use it. */ 119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct obstack *_obstack_compat; 120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectcompat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0); 121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Define a macro that either calls functions with the traditional malloc/free 125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project calling interface, or calls functions with the mmalloc/mfree interface 126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (that adds an extra first argument), based on the state of use_extra_arg. 127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project For free, do not use ?:, since some compilers, like the MIPS compilers, 128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project do not allow (expr) ? void : void. */ 129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define CALL_CHUNKFUN(h, size) \ 131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (((h) -> use_extra_arg) \ 132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ 133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) 134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define CALL_FREEFUN(h, old_chunk) \ 136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project do { \ 137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if ((h) -> use_extra_arg) \ 138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ 139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else \ 140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ 141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } while (0) 142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Objects start on multiples of ALIGNMENT (0 means use default). 146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project CHUNKFUN is the function to use to allocate chunks, 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and FREEFUN the function to free them. 148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Return nonzero if successful, calls obstack_alloc_failed_handler if 150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project allocation fails. */ 151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_obstack_begin (struct obstack *h, 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int size, int alignment, 155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void *(*chunkfun) (long), 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void (*freefun) (void *)) 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register struct _obstack_chunk *chunk; /* points to new chunk */ 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (alignment == 0) 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project alignment = DEFAULT_ALIGNMENT; 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (size == 0) 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Default size is what GNU malloc can fit in a 4096-byte block. */ 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Use the values for range checking, because if range checking is off, 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the extra bytes won't be missed terribly, but if range checking is on 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and we used a larger request, a whole extra 4096 bytes would be 169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project allocated. 170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project These number are irrelevant to the new GNU malloc. I suspect it is 172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project less sensitive to the size of the request. */ 173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) 174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project + 4 + DEFAULT_ROUNDING - 1) 175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project & ~(DEFAULT_ROUNDING - 1)); 176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size = 4096 - extra; 177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; 180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; 181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->chunk_size = size; 182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->alignment_mask = alignment - 1; 183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->use_extra_arg = 0; 184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); 186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!chunk) 187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (*obstack_alloc_failed_handler) (); 188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents, 189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project alignment - 1); 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->chunk_limit = chunk->limit 191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project = (char *) chunk + h->chunk_size; 192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project chunk->prev = 0; 193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* The initial chunk now contains no empty object. */ 194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->maybe_empty_object = 0; 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->alloc_failed = 0; 196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return 1; 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_obstack_begin_1 (struct obstack *h, int size, int alignment, 201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void *(*chunkfun) (void *, long), 202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void (*freefun) (void *, void *), 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void *arg) 204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register struct _obstack_chunk *chunk; /* points to new chunk */ 206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (alignment == 0) 208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project alignment = DEFAULT_ALIGNMENT; 209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (size == 0) 210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Default size is what GNU malloc can fit in a 4096-byte block. */ 211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. 213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Use the values for range checking, because if range checking is off, 214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the extra bytes won't be missed terribly, but if range checking is on 215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and we used a larger request, a whole extra 4096 bytes would be 216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project allocated. 217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project These number are irrelevant to the new GNU malloc. I suspect it is 219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project less sensitive to the size of the request. */ 220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) 221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project + 4 + DEFAULT_ROUNDING - 1) 222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project & ~(DEFAULT_ROUNDING - 1)); 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size = 4096 - extra; 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; 228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->chunk_size = size; 229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->alignment_mask = alignment - 1; 230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->extra_arg = arg; 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->use_extra_arg = 1; 232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); 234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!chunk) 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (*obstack_alloc_failed_handler) (); 236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents, 237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project alignment - 1); 238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->chunk_limit = chunk->limit 239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project = (char *) chunk + h->chunk_size; 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project chunk->prev = 0; 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* The initial chunk now contains no empty object. */ 242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->maybe_empty_object = 0; 243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->alloc_failed = 0; 244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return 1; 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate a new current chunk for the obstack *H 248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project on the assumption that LENGTH bytes need to be added 249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project to the current object, or a new object of length LENGTH allocated. 250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Copies any partial object from the end of the old chunk 251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project to the beginning of the new one. */ 252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_obstack_newchunk (struct obstack *h, int length) 255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register struct _obstack_chunk *old_chunk = h->chunk; 257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register struct _obstack_chunk *new_chunk; 258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register long new_size; 259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register long obj_size = h->next_free - h->object_base; 260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register long i; 261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project long already; 262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *object_base; 263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Compute size for new chunk. */ 265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100; 266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (new_size < h->chunk_size) 267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project new_size = h->chunk_size; 268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Allocate and initialize the new chunk. */ 270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project new_chunk = CALL_CHUNKFUN (h, new_size); 271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!new_chunk) 272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (*obstack_alloc_failed_handler) (); 273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->chunk = new_chunk; 274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project new_chunk->prev = old_chunk; 275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; 276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Compute an aligned object_base in the new chunk */ 278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project object_base = 279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask); 280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Move the existing object to the new chunk. 282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Word at a time is fast and is safe if the object 283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project is sufficiently aligned. */ 284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT) 285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = obj_size / sizeof (COPYING_UNIT) - 1; 287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project i >= 0; i--) 288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ((COPYING_UNIT *)object_base)[i] 289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project = ((COPYING_UNIT *)h->object_base)[i]; 290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT, 291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project but that can cross a page boundary on a machine 292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project which does not do strict alignment for COPYING_UNITS. */ 293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT); 294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project already = 0; 297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Copy remaining bytes one by one. */ 298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (i = already; i < obj_size; i++) 299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project object_base[i] = h->object_base[i]; 300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* If the object just copied was the only data in OLD_CHUNK, 302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project free that chunk and remove it from the chain. 303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project But not if that chunk might contain an empty object. */ 304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! h->maybe_empty_object 305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project && (h->object_base 306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents, 307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->alignment_mask))) 308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project new_chunk->prev = old_chunk->prev; 310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project CALL_FREEFUN (h, old_chunk); 311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->object_base = object_base; 314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->next_free = h->object_base + obj_size; 315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* The new chunk certainly contains no empty object yet. */ 316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->maybe_empty_object = 0; 317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef _LIBC 319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlibc_hidden_def (_obstack_newchunk) 320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Return nonzero if object OBJ has been allocated from obstack H. 323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This is here for debugging. 324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project If you use it in a program, you are probably losing. */ 325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Suppress -Wmissing-prototypes warning. We don't want to declare this in 327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack.h because it is just for debugging. */ 328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint _obstack_allocated_p (struct obstack *h, void *obj); 329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_obstack_allocated_p (struct obstack *h, void *obj) 332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ 334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register struct _obstack_chunk *plp; /* point to previous chunk if any */ 335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project lp = (h)->chunk; 337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* We use >= rather than > since the object cannot be exactly at 338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the beginning of the chunk but might be an empty object exactly 339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project at the end of an adjacent chunk. */ 340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) 341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project plp = lp->prev; 343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project lp = plp; 344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return lp != 0; 346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Free objects in obstack H, including OBJ and everything allocate 349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project more recently than OBJ. If OBJ is zero, free everything in H. */ 350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# undef obstack_free 352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectobstack_free (struct obstack *h, void *obj) 355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ 357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register struct _obstack_chunk *plp; /* point to previous chunk if any */ 358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project lp = h->chunk; 360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* We use >= because there cannot be an object at the beginning of a chunk. 361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project But there can be an empty object at that address 362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project at the end of another chunk. */ 363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) 364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project plp = lp->prev; 366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project CALL_FREEFUN (h, lp); 367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project lp = plp; 368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* If we switch chunks, we can't tell whether the new current 369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project chunk contains an empty object, so assume that it may. */ 370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->maybe_empty_object = 1; 371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (lp) 373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->object_base = h->next_free = (char *) (obj); 375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->chunk_limit = lp->limit; 376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project h->chunk = lp; 377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else if (obj != 0) 379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* obj is not in any of the chunks! */ 380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project abort (); 381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef _LIBC 384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Older versions of libc used a function _obstack_free intended to be 385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project called by non-GCC compilers. */ 386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstrong_alias (obstack_free, _obstack_free) 387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint 390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_obstack_memory_used (struct obstack *h) 391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register struct _obstack_chunk* lp; 393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project register int nbytes = 0; 394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (lp = h->chunk; lp != 0; lp = lp->prev) 396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project nbytes += lp->limit - (char *) lp; 398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return nbytes; 400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Define the error handler. */ 403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef _LIBC 404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <libintl.h> 405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else 406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "gettext.h" 407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifndef _ 409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define _(msgid) gettext (msgid) 410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef _LIBC 413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <libio/iolibio.h> 414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifndef __attribute__ 417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This feature is available in gcc versions 2.5 and later. */ 418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) 419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define __attribute__(Spec) /* empty */ 420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project__attribute__ ((noreturn)) 425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_and_abort (void) 426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Don't change any of these strings. Yes, it would be possible to add 428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the newline to the string and use fputs or so. But this must not 429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project happen because the "memory exhausted" message appears in other places 430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project like this and the translation should be reused instead of creating 431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project a very similar string which requires a separate translation. */ 432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef _LIBC 433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (void) __fxprintf (NULL, "%s\n", _("memory exhausted")); 434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else 435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fprintf (stderr, "%s\n", _("memory exhausted")); 436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project exit (obstack_exit_failure); 438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* !ELIDE_CODE */ 441