obstack.c revision 53475
153475Sobrien/* obstack.h - object stack macros
253475Sobrien   Copyright (C) 1988,89,90,91,92,93,94,96,97, 98 Free Software Foundation, Inc.
353451Speter
453475Sobrien   the C library, however.  The master source lives in /gd/gnu/lib.
553475Sobrien
653475SobrienNOTE: The canonical source of this file is maintained with the
753475SobrienGNU C Library.  Bugs can be reported to bug-glibc@prep.ai.mit.edu.
853475Sobrien
953451SpeterThis program is free software; you can redistribute it and/or modify it
1053451Speterunder the terms of the GNU General Public License as published by the
1153451SpeterFree Software Foundation; either version 2, or (at your option) any
1253451Speterlater version.
1353451Speter
1453451SpeterThis program is distributed in the hope that it will be useful,
1553451Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of
1653451SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1753451SpeterGNU General Public License for more details.
1853451Speter
1953451SpeterYou should have received a copy of the GNU General Public License
2053475Sobrienalong with this program; if not, write to the Free Software Foundation,
2153475SobrienInc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
2253451Speter
2353475Sobrien/* $FreeBSD: head/gnu/usr.bin/grep/obstack.c 53475 1999-11-20 23:42:44Z obrien $ */
2453475Sobrien
2553475Sobrien#ifdef HAVE_CONFIG_H
2653475Sobrien#include <config.h>
2753475Sobrien#endif
2853475Sobrien
2953451Speter#include "obstack.h"
3053451Speter
3153475Sobrien/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
3253475Sobrien   incremented whenever callers compiled using an old obstack.h can no
3353475Sobrien   longer properly call the functions in this obstack.c.  */
3453475Sobrien#define OBSTACK_INTERFACE_VERSION 1
3553451Speter
3653451Speter/* Comment out all this code if we are using the GNU C Library, and are not
3753475Sobrien   actually compiling the library itself, and the installed library
3853475Sobrien   supports the same library interface we do.  This code is part of the GNU
3953475Sobrien   C Library, but also included in many other GNU distributions.  Compiling
4053451Speter   and linking in this code is a waste when using the GNU C library
4153451Speter   (especially if it is a shared library).  Rather than having every GNU
4253475Sobrien   program understand `configure --with-gnu-libc' and omit the object
4353475Sobrien   files, it is simpler to just do this in the source for each such file.  */
4453451Speter
4553475Sobrien#include <stdio.h>		/* Random thing to get __GNU_LIBRARY__.  */
4653475Sobrien#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1
4753475Sobrien#include <gnu-versions.h>
4853475Sobrien#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
4953475Sobrien#define ELIDE_CODE
5053475Sobrien#endif
5153475Sobrien#endif
5253451Speter
5353451Speter
5453475Sobrien#ifndef ELIDE_CODE
5553475Sobrien
5653475Sobrien
5753475Sobrien#if defined (__STDC__) && __STDC__
5853451Speter#define POINTER void *
5953451Speter#else
6053451Speter#define POINTER char *
6153451Speter#endif
6253451Speter
6353451Speter/* Determine default alignment.  */
6453451Speterstruct fooalign {char x; double d;};
6553451Speter#define DEFAULT_ALIGNMENT  \
6653475Sobrien  ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
6753451Speter/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
6853451Speter   But in fact it might be less smart and round addresses to as much as
6953451Speter   DEFAULT_ROUNDING.  So we prepare for it to do that.  */
7053451Speterunion fooround {long x; double d;};
7153451Speter#define DEFAULT_ROUNDING (sizeof (union fooround))
7253451Speter
7353451Speter/* When we copy a long block of data, this is the unit to do it with.
7453451Speter   On some machines, copying successive ints does not work;
7553451Speter   in such a case, redefine COPYING_UNIT to `long' (if that works)
7653451Speter   or `char' as a last resort.  */
7753451Speter#ifndef COPYING_UNIT
7853451Speter#define COPYING_UNIT int
7953451Speter#endif
8053451Speter
8153475Sobrien
8253475Sobrien/* The functions allocating more room by calling `obstack_chunk_alloc'
8353475Sobrien   jump to the handler pointed to by `obstack_alloc_failed_handler'.
8453475Sobrien   This variable by default points to the internal function
8553475Sobrien   `print_and_abort'.  */
8653475Sobrien#if defined (__STDC__) && __STDC__
8753475Sobrienstatic void print_and_abort (void);
8853475Sobrienvoid (*obstack_alloc_failed_handler) (void) = print_and_abort;
8953475Sobrien#else
9053475Sobrienstatic void print_and_abort ();
9153475Sobrienvoid (*obstack_alloc_failed_handler) () = print_and_abort;
9253475Sobrien#endif
9353475Sobrien
9453475Sobrien/* Exit value used when `print_and_abort' is used.  */
9553475Sobrien#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
9653475Sobrien#include <stdlib.h>
9753475Sobrien#endif
9853475Sobrien#ifndef EXIT_FAILURE
9953475Sobrien#define EXIT_FAILURE 1
10053475Sobrien#endif
10153475Sobrienint obstack_exit_failure = EXIT_FAILURE;
10253475Sobrien
10353451Speter/* The non-GNU-C macros copy the obstack into this global variable
10453451Speter   to avoid multiple evaluation.  */
10553451Speter
10653451Speterstruct obstack *_obstack;
10753451Speter
10853451Speter/* Define a macro that either calls functions with the traditional malloc/free
10953451Speter   calling interface, or calls functions with the mmalloc/mfree interface
11053451Speter   (that adds an extra first argument), based on the state of use_extra_arg.
11153451Speter   For free, do not use ?:, since some compilers, like the MIPS compilers,
11253451Speter   do not allow (expr) ? void : void.  */
11353451Speter
11453475Sobrien#if defined (__STDC__) && __STDC__
11553451Speter#define CALL_CHUNKFUN(h, size) \
11653451Speter  (((h) -> use_extra_arg) \
11753451Speter   ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
11853475Sobrien   : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
11953451Speter
12053451Speter#define CALL_FREEFUN(h, old_chunk) \
12153451Speter  do { \
12253451Speter    if ((h) -> use_extra_arg) \
12353451Speter      (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
12453451Speter    else \
12553475Sobrien      (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
12653451Speter  } while (0)
12753475Sobrien#else
12853475Sobrien#define CALL_CHUNKFUN(h, size) \
12953475Sobrien  (((h) -> use_extra_arg) \
13053475Sobrien   ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
13153475Sobrien   : (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size)))
13253451Speter
13353475Sobrien#define CALL_FREEFUN(h, old_chunk) \
13453475Sobrien  do { \
13553475Sobrien    if ((h) -> use_extra_arg) \
13653475Sobrien      (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
13753475Sobrien    else \
13853475Sobrien      (*(void (*) ()) (h)->freefun) ((old_chunk)); \
13953475Sobrien  } while (0)
14053475Sobrien#endif
14153475Sobrien
14253451Speter
14353451Speter/* Initialize an obstack H for use.  Specify chunk size SIZE (0 means default).
14453451Speter   Objects start on multiples of ALIGNMENT (0 means use default).
14553451Speter   CHUNKFUN is the function to use to allocate chunks,
14653475Sobrien   and FREEFUN the function to free them.
14753451Speter
14853475Sobrien   Return nonzero if successful, zero if out of memory.
14953475Sobrien   To recover from an out of memory error,
15053475Sobrien   free up some memory, then call this again.  */
15153475Sobrien
15253475Sobrienint
15353451Speter_obstack_begin (h, size, alignment, chunkfun, freefun)
15453451Speter     struct obstack *h;
15553451Speter     int size;
15653451Speter     int alignment;
15753475Sobrien#if defined (__STDC__) && __STDC__
15853475Sobrien     POINTER (*chunkfun) (long);
15953475Sobrien     void (*freefun) (void *);
16053475Sobrien#else
16153451Speter     POINTER (*chunkfun) ();
16253451Speter     void (*freefun) ();
16353475Sobrien#endif
16453451Speter{
16553475Sobrien  register struct _obstack_chunk *chunk; /* points to new chunk */
16653451Speter
16753451Speter  if (alignment == 0)
16853475Sobrien    alignment = (int) DEFAULT_ALIGNMENT;
16953451Speter  if (size == 0)
17053451Speter    /* Default size is what GNU malloc can fit in a 4096-byte block.  */
17153451Speter    {
17253451Speter      /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
17353451Speter	 Use the values for range checking, because if range checking is off,
17453451Speter	 the extra bytes won't be missed terribly, but if range checking is on
17553451Speter	 and we used a larger request, a whole extra 4096 bytes would be
17653451Speter	 allocated.
17753451Speter
17853451Speter	 These number are irrelevant to the new GNU malloc.  I suspect it is
17953451Speter	 less sensitive to the size of the request.  */
18053451Speter      int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
18153451Speter		    + 4 + DEFAULT_ROUNDING - 1)
18253451Speter		   & ~(DEFAULT_ROUNDING - 1));
18353451Speter      size = 4096 - extra;
18453451Speter    }
18553451Speter
18653475Sobrien#if defined (__STDC__) && __STDC__
18753475Sobrien  h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
18853475Sobrien  h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
18953475Sobrien#else
19053451Speter  h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
19153451Speter  h->freefun = freefun;
19253475Sobrien#endif
19353451Speter  h->chunk_size = size;
19453451Speter  h->alignment_mask = alignment - 1;
19553451Speter  h->use_extra_arg = 0;
19653451Speter
19753451Speter  chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
19853475Sobrien  if (!chunk)
19953475Sobrien    (*obstack_alloc_failed_handler) ();
20053451Speter  h->next_free = h->object_base = chunk->contents;
20153451Speter  h->chunk_limit = chunk->limit
20253451Speter    = (char *) chunk + h->chunk_size;
20353451Speter  chunk->prev = 0;
20453451Speter  /* The initial chunk now contains no empty object.  */
20553451Speter  h->maybe_empty_object = 0;
20653475Sobrien  h->alloc_failed = 0;
20753475Sobrien  return 1;
20853451Speter}
20953451Speter
21053475Sobrienint
21153451Speter_obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
21253451Speter     struct obstack *h;
21353451Speter     int size;
21453451Speter     int alignment;
21553475Sobrien#if defined (__STDC__) && __STDC__
21653475Sobrien     POINTER (*chunkfun) (POINTER, long);
21753475Sobrien     void (*freefun) (POINTER, POINTER);
21853475Sobrien#else
21953451Speter     POINTER (*chunkfun) ();
22053451Speter     void (*freefun) ();
22153475Sobrien#endif
22253451Speter     POINTER arg;
22353451Speter{
22453475Sobrien  register struct _obstack_chunk *chunk; /* points to new chunk */
22553451Speter
22653451Speter  if (alignment == 0)
22753475Sobrien    alignment = (int) DEFAULT_ALIGNMENT;
22853451Speter  if (size == 0)
22953451Speter    /* Default size is what GNU malloc can fit in a 4096-byte block.  */
23053451Speter    {
23153451Speter      /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
23253451Speter	 Use the values for range checking, because if range checking is off,
23353451Speter	 the extra bytes won't be missed terribly, but if range checking is on
23453451Speter	 and we used a larger request, a whole extra 4096 bytes would be
23553451Speter	 allocated.
23653451Speter
23753451Speter	 These number are irrelevant to the new GNU malloc.  I suspect it is
23853451Speter	 less sensitive to the size of the request.  */
23953451Speter      int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
24053451Speter		    + 4 + DEFAULT_ROUNDING - 1)
24153451Speter		   & ~(DEFAULT_ROUNDING - 1));
24253451Speter      size = 4096 - extra;
24353451Speter    }
24453451Speter
24553475Sobrien#if defined(__STDC__) && __STDC__
24653475Sobrien  h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
24753475Sobrien  h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
24853475Sobrien#else
24953451Speter  h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
25053451Speter  h->freefun = freefun;
25153475Sobrien#endif
25253451Speter  h->chunk_size = size;
25353451Speter  h->alignment_mask = alignment - 1;
25453451Speter  h->extra_arg = arg;
25553451Speter  h->use_extra_arg = 1;
25653451Speter
25753451Speter  chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
25853475Sobrien  if (!chunk)
25953475Sobrien    (*obstack_alloc_failed_handler) ();
26053451Speter  h->next_free = h->object_base = chunk->contents;
26153451Speter  h->chunk_limit = chunk->limit
26253451Speter    = (char *) chunk + h->chunk_size;
26353451Speter  chunk->prev = 0;
26453451Speter  /* The initial chunk now contains no empty object.  */
26553451Speter  h->maybe_empty_object = 0;
26653475Sobrien  h->alloc_failed = 0;
26753475Sobrien  return 1;
26853451Speter}
26953451Speter
27053451Speter/* Allocate a new current chunk for the obstack *H
27153451Speter   on the assumption that LENGTH bytes need to be added
27253451Speter   to the current object, or a new object of length LENGTH allocated.
27353451Speter   Copies any partial object from the end of the old chunk
27453451Speter   to the beginning of the new one.  */
27553451Speter
27653451Spetervoid
27753451Speter_obstack_newchunk (h, length)
27853451Speter     struct obstack *h;
27953451Speter     int length;
28053451Speter{
28153475Sobrien  register struct _obstack_chunk *old_chunk = h->chunk;
28253475Sobrien  register struct _obstack_chunk *new_chunk;
28353451Speter  register long	new_size;
28453475Sobrien  register long obj_size = h->next_free - h->object_base;
28553475Sobrien  register long i;
28653475Sobrien  long already;
28753451Speter
28853451Speter  /* Compute size for new chunk.  */
28953451Speter  new_size = (obj_size + length) + (obj_size >> 3) + 100;
29053451Speter  if (new_size < h->chunk_size)
29153451Speter    new_size = h->chunk_size;
29253451Speter
29353451Speter  /* Allocate and initialize the new chunk.  */
29453475Sobrien  new_chunk = CALL_CHUNKFUN (h, new_size);
29553475Sobrien  if (!new_chunk)
29653475Sobrien    (*obstack_alloc_failed_handler) ();
29753475Sobrien  h->chunk = new_chunk;
29853451Speter  new_chunk->prev = old_chunk;
29953451Speter  new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
30053451Speter
30153451Speter  /* Move the existing object to the new chunk.
30253451Speter     Word at a time is fast and is safe if the object
30353451Speter     is sufficiently aligned.  */
30453451Speter  if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
30553451Speter    {
30653451Speter      for (i = obj_size / sizeof (COPYING_UNIT) - 1;
30753451Speter	   i >= 0; i--)
30853451Speter	((COPYING_UNIT *)new_chunk->contents)[i]
30953451Speter	  = ((COPYING_UNIT *)h->object_base)[i];
31053451Speter      /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT,
31153451Speter	 but that can cross a page boundary on a machine
31253451Speter	 which does not do strict alignment for COPYING_UNITS.  */
31353451Speter      already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
31453451Speter    }
31553451Speter  else
31653451Speter    already = 0;
31753451Speter  /* Copy remaining bytes one by one.  */
31853451Speter  for (i = already; i < obj_size; i++)
31953451Speter    new_chunk->contents[i] = h->object_base[i];
32053451Speter
32153451Speter  /* If the object just copied was the only data in OLD_CHUNK,
32253451Speter     free that chunk and remove it from the chain.
32353451Speter     But not if that chunk might contain an empty object.  */
32453451Speter  if (h->object_base == old_chunk->contents && ! h->maybe_empty_object)
32553451Speter    {
32653451Speter      new_chunk->prev = old_chunk->prev;
32753451Speter      CALL_FREEFUN (h, old_chunk);
32853451Speter    }
32953451Speter
33053451Speter  h->object_base = new_chunk->contents;
33153451Speter  h->next_free = h->object_base + obj_size;
33253451Speter  /* The new chunk certainly contains no empty object yet.  */
33353451Speter  h->maybe_empty_object = 0;
33453451Speter}
33553451Speter
33653451Speter/* Return nonzero if object OBJ has been allocated from obstack H.
33753451Speter   This is here for debugging.
33853451Speter   If you use it in a program, you are probably losing.  */
33953451Speter
34053475Sobrien#if defined (__STDC__) && __STDC__
34153475Sobrien/* Suppress -Wmissing-prototypes warning.  We don't want to declare this in
34253475Sobrien   obstack.h because it is just for debugging.  */
34353475Sobrienint _obstack_allocated_p (struct obstack *h, POINTER obj);
34453475Sobrien#endif
34553475Sobrien
34653451Speterint
34753451Speter_obstack_allocated_p (h, obj)
34853451Speter     struct obstack *h;
34953451Speter     POINTER obj;
35053451Speter{
35153475Sobrien  register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
35253475Sobrien  register struct _obstack_chunk *plp;	/* point to previous chunk if any */
35353451Speter
35453451Speter  lp = (h)->chunk;
35553451Speter  /* We use >= rather than > since the object cannot be exactly at
35653451Speter     the beginning of the chunk but might be an empty object exactly
35753475Sobrien     at the end of an adjacent chunk.  */
35853475Sobrien  while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
35953451Speter    {
36053451Speter      plp = lp->prev;
36153451Speter      lp = plp;
36253451Speter    }
36353451Speter  return lp != 0;
36453451Speter}
36553451Speter
36653451Speter/* Free objects in obstack H, including OBJ and everything allocate
36753451Speter   more recently than OBJ.  If OBJ is zero, free everything in H.  */
36853451Speter
36953451Speter#undef obstack_free
37053451Speter
37153451Speter/* This function has two names with identical definitions.
37253451Speter   This is the first one, called from non-ANSI code.  */
37353451Speter
37453451Spetervoid
37553451Speter_obstack_free (h, obj)
37653451Speter     struct obstack *h;
37753451Speter     POINTER obj;
37853451Speter{
37953475Sobrien  register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
38053475Sobrien  register struct _obstack_chunk *plp;	/* point to previous chunk if any */
38153451Speter
38253451Speter  lp = h->chunk;
38353451Speter  /* We use >= because there cannot be an object at the beginning of a chunk.
38453451Speter     But there can be an empty object at that address
38553451Speter     at the end of another chunk.  */
38653475Sobrien  while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
38753451Speter    {
38853451Speter      plp = lp->prev;
38953451Speter      CALL_FREEFUN (h, lp);
39053451Speter      lp = plp;
39153451Speter      /* If we switch chunks, we can't tell whether the new current
39253451Speter	 chunk contains an empty object, so assume that it may.  */
39353451Speter      h->maybe_empty_object = 1;
39453451Speter    }
39553451Speter  if (lp)
39653451Speter    {
39753475Sobrien      h->object_base = h->next_free = (char *) (obj);
39853451Speter      h->chunk_limit = lp->limit;
39953451Speter      h->chunk = lp;
40053451Speter    }
40153451Speter  else if (obj != 0)
40253451Speter    /* obj is not in any of the chunks! */
40353451Speter    abort ();
40453451Speter}
40553451Speter
40653451Speter/* This function is used from ANSI code.  */
40753451Speter
40853451Spetervoid
40953451Speterobstack_free (h, obj)
41053451Speter     struct obstack *h;
41153451Speter     POINTER obj;
41253451Speter{
41353475Sobrien  register struct _obstack_chunk *lp;	/* below addr of any objects in this chunk */
41453475Sobrien  register struct _obstack_chunk *plp;	/* point to previous chunk if any */
41553451Speter
41653451Speter  lp = h->chunk;
41753451Speter  /* We use >= because there cannot be an object at the beginning of a chunk.
41853451Speter     But there can be an empty object at that address
41953451Speter     at the end of another chunk.  */
42053475Sobrien  while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
42153451Speter    {
42253451Speter      plp = lp->prev;
42353451Speter      CALL_FREEFUN (h, lp);
42453451Speter      lp = plp;
42553451Speter      /* If we switch chunks, we can't tell whether the new current
42653451Speter	 chunk contains an empty object, so assume that it may.  */
42753451Speter      h->maybe_empty_object = 1;
42853451Speter    }
42953451Speter  if (lp)
43053451Speter    {
43153475Sobrien      h->object_base = h->next_free = (char *) (obj);
43253451Speter      h->chunk_limit = lp->limit;
43353451Speter      h->chunk = lp;
43453451Speter    }
43553451Speter  else if (obj != 0)
43653451Speter    /* obj is not in any of the chunks! */
43753451Speter    abort ();
43853451Speter}
43953451Speter
44053475Sobrienint
44153475Sobrien_obstack_memory_used (h)
44253475Sobrien     struct obstack *h;
44353475Sobrien{
44453475Sobrien  register struct _obstack_chunk* lp;
44553475Sobrien  register int nbytes = 0;
44653475Sobrien
44753475Sobrien  for (lp = h->chunk; lp != 0; lp = lp->prev)
44853475Sobrien    {
44953475Sobrien      nbytes += lp->limit - (char *) lp;
45053475Sobrien    }
45153475Sobrien  return nbytes;
45253475Sobrien}
45353475Sobrien
45453475Sobrien/* Define the error handler.  */
45553475Sobrien#ifndef _
45653475Sobrien# ifdef HAVE_LIBINTL_H
45753475Sobrien#  include <libintl.h>
45853475Sobrien#  ifndef _
45953475Sobrien#   define _(Str) gettext (Str)
46053475Sobrien#  endif
46153475Sobrien# else
46253475Sobrien#  define _(Str) (Str)
46353475Sobrien# endif
46453475Sobrien#endif
46553475Sobrien
46653475Sobrienstatic void
46753475Sobrienprint_and_abort ()
46853475Sobrien{
46953475Sobrien  fputs (_("memory exhausted\n"), stderr);
47053475Sobrien  exit (obstack_exit_failure);
47153475Sobrien}
47253475Sobrien
47353451Speter#if 0
47453451Speter/* These are now turned off because the applications do not use it
47553451Speter   and it uses bcopy via obstack_grow, which causes trouble on sysV.  */
47653451Speter
47753451Speter/* Now define the functional versions of the obstack macros.
47853451Speter   Define them to simply use the corresponding macros to do the job.  */
47953451Speter
48053475Sobrien#if defined (__STDC__) && __STDC__
48153451Speter/* These function definitions do not work with non-ANSI preprocessors;
48253451Speter   they won't pass through the macro names in parentheses.  */
48353451Speter
48453451Speter/* The function names appear in parentheses in order to prevent
48553451Speter   the macro-definitions of the names from being expanded there.  */
48653451Speter
48753451SpeterPOINTER (obstack_base) (obstack)
48853451Speter     struct obstack *obstack;
48953451Speter{
49053451Speter  return obstack_base (obstack);
49153451Speter}
49253451Speter
49353451SpeterPOINTER (obstack_next_free) (obstack)
49453451Speter     struct obstack *obstack;
49553451Speter{
49653451Speter  return obstack_next_free (obstack);
49753451Speter}
49853451Speter
49953451Speterint (obstack_object_size) (obstack)
50053451Speter     struct obstack *obstack;
50153451Speter{
50253451Speter  return obstack_object_size (obstack);
50353451Speter}
50453451Speter
50553451Speterint (obstack_room) (obstack)
50653451Speter     struct obstack *obstack;
50753451Speter{
50853451Speter  return obstack_room (obstack);
50953451Speter}
51053451Speter
51153475Sobrienint (obstack_make_room) (obstack, length)
51253475Sobrien     struct obstack *obstack;
51353475Sobrien     int length;
51453475Sobrien{
51553475Sobrien  return obstack_make_room (obstack, length);
51653475Sobrien}
51753475Sobrien
51853451Spetervoid (obstack_grow) (obstack, pointer, length)
51953451Speter     struct obstack *obstack;
52053451Speter     POINTER pointer;
52153451Speter     int length;
52253451Speter{
52353451Speter  obstack_grow (obstack, pointer, length);
52453451Speter}
52553451Speter
52653451Spetervoid (obstack_grow0) (obstack, pointer, length)
52753451Speter     struct obstack *obstack;
52853451Speter     POINTER pointer;
52953451Speter     int length;
53053451Speter{
53153451Speter  obstack_grow0 (obstack, pointer, length);
53253451Speter}
53353451Speter
53453451Spetervoid (obstack_1grow) (obstack, character)
53553451Speter     struct obstack *obstack;
53653451Speter     int character;
53753451Speter{
53853451Speter  obstack_1grow (obstack, character);
53953451Speter}
54053451Speter
54153451Spetervoid (obstack_blank) (obstack, length)
54253451Speter     struct obstack *obstack;
54353451Speter     int length;
54453451Speter{
54553451Speter  obstack_blank (obstack, length);
54653451Speter}
54753451Speter
54853451Spetervoid (obstack_1grow_fast) (obstack, character)
54953451Speter     struct obstack *obstack;
55053451Speter     int character;
55153451Speter{
55253451Speter  obstack_1grow_fast (obstack, character);
55353451Speter}
55453451Speter
55553451Spetervoid (obstack_blank_fast) (obstack, length)
55653451Speter     struct obstack *obstack;
55753451Speter     int length;
55853451Speter{
55953451Speter  obstack_blank_fast (obstack, length);
56053451Speter}
56153451Speter
56253451SpeterPOINTER (obstack_finish) (obstack)
56353451Speter     struct obstack *obstack;
56453451Speter{
56553451Speter  return obstack_finish (obstack);
56653451Speter}
56753451Speter
56853451SpeterPOINTER (obstack_alloc) (obstack, length)
56953451Speter     struct obstack *obstack;
57053451Speter     int length;
57153451Speter{
57253451Speter  return obstack_alloc (obstack, length);
57353451Speter}
57453451Speter
57553451SpeterPOINTER (obstack_copy) (obstack, pointer, length)
57653451Speter     struct obstack *obstack;
57753451Speter     POINTER pointer;
57853451Speter     int length;
57953451Speter{
58053451Speter  return obstack_copy (obstack, pointer, length);
58153451Speter}
58253451Speter
58353451SpeterPOINTER (obstack_copy0) (obstack, pointer, length)
58453451Speter     struct obstack *obstack;
58553451Speter     POINTER pointer;
58653451Speter     int length;
58753451Speter{
58853451Speter  return obstack_copy0 (obstack, pointer, length);
58953451Speter}
59053451Speter
59153451Speter#endif /* __STDC__ */
59253451Speter
59353451Speter#endif /* 0 */
59453451Speter
59553475Sobrien#endif	/* !ELIDE_CODE */
596