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