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