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