This is the stock 2.3 file (+ FreeBSD id). Since someone added 2.0 rather

than vendor importing the virgin 2.0 sources, we have to manually put this
on the HEAD branch.
This commit is contained in:
obrien 1999-11-20 23:42:44 +00:00
parent 6cd485fb34
commit 3f3aac940d
5 changed files with 425 additions and 187 deletions

View File

@ -1,42 +1,43 @@
#ifdef BSD /* Emulate getpagesize on systems that lack it. */
#ifndef BSD4_1
#define HAVE_GETPAGESIZE /* $FreeBSD$ */
#endif
#endif
#ifndef HAVE_GETPAGESIZE #ifndef HAVE_GETPAGESIZE
#ifdef VMS # ifdef VMS
#define getpagesize() 512 # define getpagesize() 512
#endif # endif
#ifdef HAVE_UNISTD_H # ifdef HAVE_UNISTD_H
#include <unistd.h> # include <unistd.h>
#endif # endif
#ifdef _SC_PAGESIZE # ifdef _SC_PAGESIZE
#define getpagesize() sysconf(_SC_PAGESIZE) # define getpagesize() sysconf(_SC_PAGESIZE)
#else # else /* no _SC_PAGESIZE */
# ifdef HAVE_SYS_PARAM_H
#ifdef HAVE_SYS_PARAM_H # include <sys/param.h>
#include <sys/param.h> # ifdef EXEC_PAGESIZE
# define getpagesize() EXEC_PAGESIZE
#ifdef EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */
#define getpagesize() EXEC_PAGESIZE # ifdef NBPG
#else # define getpagesize() NBPG * CLSIZE
#ifdef NBPG # ifndef CLSIZE
#define getpagesize() NBPG * CLSIZE # define CLSIZE 1
#ifndef CLSIZE # endif /* no CLSIZE */
#define CLSIZE 1 # else /* no NBPG */
#endif /* no CLSIZE */ # ifdef NBPC
#else /* no NBPG */ # define getpagesize() NBPC
#define getpagesize() NBPC # else /* no NBPC */
#endif /* no NBPG */ # ifdef PAGESIZE
#endif /* no EXEC_PAGESIZE */ # define getpagesize() PAGESIZE
#else /* !HAVE_SYS_PARAM_H */ # endif /* PAGESIZE */
#define getpagesize() 8192 /* punt totally */ # endif /* no NBPC */
#endif /* !HAVE_SYS_PARAM_H */ # endif /* no NBPG */
#endif /* no _SC_PAGESIZE */ # endif /* no EXEC_PAGESIZE */
# else /* no HAVE_SYS_PARAM_H */
#endif /* not HAVE_GETPAGESIZE */ # define getpagesize() 8192 /* punt totally */
# endif /* no HAVE_SYS_PARAM_H */
# endif /* no _SC_PAGESIZE */
#endif /* no HAVE_GETPAGESIZE */

View File

@ -1,5 +1,5 @@
/* grep.h - interface to grep driver for searching subroutines. /* grep.h - interface to grep driver for searching subroutines.
Copyright (C) 1992 Free Software Foundation, Inc. Copyright (C) 1992, 1998 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -13,11 +13,18 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
#if __STDC__ /* $FreeBSD$ */
extern void fatal(const char *, int); #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) || __STRICT_ANSI__
# define __attribute__(x)
#endif
extern void fatal PARAMS ((const char *, int)) __attribute__((noreturn));
extern char *xmalloc PARAMS ((size_t size));
extern char *xrealloc PARAMS ((char *ptr, size_t size));
/* Grep.c expects the matchers vector to be terminated /* Grep.c expects the matchers vector to be terminated
by an entry with a NULL name, and to contain at least by an entry with a NULL name, and to contain at least
@ -26,25 +33,15 @@ extern void fatal(const char *, int);
extern struct matcher extern struct matcher
{ {
char *name; char *name;
void (*compile)(char *, size_t); void (*compile) PARAMS ((char *, size_t));
char *(*execute)(char *, size_t, char **); char *(*execute) PARAMS ((char *, size_t, char **));
} matchers[]; } matchers[];
#else
extern void fatal();
extern struct matcher
{
char *name;
void (*compile)();
char *(*execute)();
} matchers[];
#endif
/* Exported from grep.c. */ /* Exported from grep.c. */
extern char *matcher; extern char const *matcher;
/* Exported from fgrepmat.c, egrepmat.c, grepmat.c. */
extern char const default_matcher[];
/* The following flags are exported from grep for the matchers /* The following flags are exported from grep for the matchers
to look at. */ to look at. */

View File

@ -1,10 +1,9 @@
/* kwset.h - header declaring the keyword set library. /* kwset.h - header declaring the keyword set library.
Copyright 1989 Free Software Foundation Copyright (C) 1989, 1998 Free Software Foundation, Inc.
Written August 1989 by Mike Haertel.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option) the Free Software Foundation; either version 2, or (at your option)
any later version. any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
@ -14,11 +13,15 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
/* Written August 1989 by Mike Haertel.
The author may be reached (Email) at the address mike@ai.mit.edu, The author may be reached (Email) at the address mike@ai.mit.edu,
or (US mail) as Mike Haertel c/o Free Software Foundation. */ or (US mail) as Mike Haertel c/o Free Software Foundation. */
/* $FreeBSD$ */
struct kwsmatch struct kwsmatch
{ {
int index; /* Index number of matching keyword. */ int index; /* Index number of matching keyword. */
@ -26,24 +29,22 @@ struct kwsmatch
size_t size[1]; /* Length of each submatch. */ size_t size[1]; /* Length of each submatch. */
}; };
#if __STDC__ typedef ptr_t kwset_t;
typedef void *kwset_t;
/* Return an opaque pointer to a newly allocated keyword set, or NULL /* Return an opaque pointer to a newly allocated keyword set, or NULL
if enough memory cannot be obtained. The argument if non-NULL if enough memory cannot be obtained. The argument if non-NULL
specifies a table of character translations to be applied to all specifies a table of character translations to be applied to all
pattern and search text. */ pattern and search text. */
extern kwset_t kwsalloc(char *); extern kwset_t kwsalloc PARAMS((char *));
/* Incrementally extend the keyword set to include the given string. /* Incrementally extend the keyword set to include the given string.
Return NULL for success, or an error message. Remember an index Return NULL for success, or an error message. Remember an index
number for each keyword included in the set. */ number for each keyword included in the set. */
extern char *kwsincr(kwset_t, char *, size_t); extern char *kwsincr PARAMS((kwset_t, char *, size_t));
/* When the keyword set has been completely built, prepare it for /* When the keyword set has been completely built, prepare it for
use. Return NULL for success, or an error message. */ use. Return NULL for success, or an error message. */
extern char *kwsprep(kwset_t); extern char *kwsprep PARAMS((kwset_t));
/* Search through the given buffer for a member of the keyword set. /* Search through the given buffer for a member of the keyword set.
Return a pointer to the leftmost longest match found, or NULL if Return a pointer to the leftmost longest match found, or NULL if
@ -51,19 +52,8 @@ extern char *kwsprep(kwset_t);
the matching substring in the integer it points to. Similarly, the matching substring in the integer it points to. Similarly,
if foundindex is non-NULL, store the index of the particular if foundindex is non-NULL, store the index of the particular
keyword found therein. */ keyword found therein. */
extern char *kwsexec(kwset_t, char *, size_t, struct kwsmatch *); extern char *kwsexec PARAMS((kwset_t, char *, size_t, struct kwsmatch *));
/* Deallocate the given keyword set and all its associated storage. */ /* Deallocate the given keyword set and all its associated storage. */
extern void kwsfree(kwset_t); extern void kwsfree PARAMS((kwset_t));
#else
typedef char *kwset_t;
extern kwset_t kwsalloc();
extern char *kwsincr();
extern char *kwsprep();
extern char *kwsexec();
extern void kwsfree();
#endif

View File

@ -1,5 +1,10 @@
/* obstack.c - subroutines used implicitly by object stack macros /* obstack.h - object stack macros
Copyright (C) 1988, 1993 Free Software Foundation, Inc. Copyright (C) 1988,89,90,91,92,93,94,96,97, 98 Free Software Foundation, Inc.
the C library, however. The master source lives in /gd/gnu/lib.
NOTE: The canonical source of this file is maintained with the
GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the under the terms of the GNU General Public License as published by the
@ -12,26 +17,44 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software Foundation,
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* $FreeBSD$ */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "obstack.h" #include "obstack.h"
/* This is just to get __GNU_LIBRARY__ defined. */ /* NOTE BEFORE MODIFYING THIS FILE: This version number must be
#include <stdio.h> incremented whenever callers compiled using an old obstack.h can no
longer properly call the functions in this obstack.c. */
#define OBSTACK_INTERFACE_VERSION 1
/* Comment out all this code if we are using the GNU C Library, and are not /* Comment out all this code if we are using the GNU C Library, and are not
actually compiling the library itself. This code is part of the GNU C actually compiling the library itself, and the installed library
Library, but also included in many other GNU distributions. Compiling supports the same library interface we do. This code is part of the GNU
C Library, but also included in many other GNU distributions. Compiling
and linking in this code is a waste when using the GNU C library and linking in this code is a waste when using the GNU C library
(especially if it is a shared library). Rather than having every GNU (especially if it is a shared library). Rather than having every GNU
program understand `configure --with-gnu-libc' and omit the object files, program understand `configure --with-gnu-libc' and omit the object
it is simpler to just do this in the source for each such file. */ files, it is simpler to just do this in the source for each such file. */
#if defined (_LIBC) || !defined (__GNU_LIBRARY__) #include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */
#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1
#include <gnu-versions.h>
#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
#define ELIDE_CODE
#endif
#endif
#ifdef __STDC__ #ifndef ELIDE_CODE
#if defined (__STDC__) && __STDC__
#define POINTER void * #define POINTER void *
#else #else
#define POINTER char * #define POINTER char *
@ -40,7 +63,7 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Determine default alignment. */ /* Determine default alignment. */
struct fooalign {char x; double d;}; struct fooalign {char x; double d;};
#define DEFAULT_ALIGNMENT \ #define DEFAULT_ALIGNMENT \
((PTR_INT_TYPE) ((char *)&((struct fooalign *) 0)->d - (char *)0)) ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. /* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
But in fact it might be less smart and round addresses to as much as But in fact it might be less smart and round addresses to as much as
DEFAULT_ROUNDING. So we prepare for it to do that. */ DEFAULT_ROUNDING. So we prepare for it to do that. */
@ -55,6 +78,28 @@ union fooround {long x; double d;};
#define COPYING_UNIT int #define COPYING_UNIT int
#endif #endif
/* The functions allocating more room by calling `obstack_chunk_alloc'
jump to the handler pointed to by `obstack_alloc_failed_handler'.
This variable by default points to the internal function
`print_and_abort'. */
#if defined (__STDC__) && __STDC__
static void print_and_abort (void);
void (*obstack_alloc_failed_handler) (void) = print_and_abort;
#else
static void print_and_abort ();
void (*obstack_alloc_failed_handler) () = print_and_abort;
#endif
/* Exit value used when `print_and_abort' is used. */
#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifndef EXIT_FAILURE
#define EXIT_FAILURE 1
#endif
int obstack_exit_failure = EXIT_FAILURE;
/* The non-GNU-C macros copy the obstack into this global variable /* The non-GNU-C macros copy the obstack into this global variable
to avoid multiple evaluation. */ to avoid multiple evaluation. */
@ -66,37 +111,61 @@ struct obstack *_obstack;
For free, do not use ?:, since some compilers, like the MIPS compilers, For free, do not use ?:, since some compilers, like the MIPS compilers,
do not allow (expr) ? void : void. */ do not allow (expr) ? void : void. */
#if defined (__STDC__) && __STDC__
#define CALL_CHUNKFUN(h, size) \ #define CALL_CHUNKFUN(h, size) \
(((h) -> use_extra_arg) \ (((h) -> use_extra_arg) \
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
: (*(h)->chunkfun) ((size))) : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
#define CALL_FREEFUN(h, old_chunk) \ #define CALL_FREEFUN(h, old_chunk) \
do { \ do { \
if ((h) -> use_extra_arg) \ if ((h) -> use_extra_arg) \
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
else \ else \
(*(h)->freefun) ((old_chunk)); \ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
} while (0) } while (0)
#else
#define CALL_CHUNKFUN(h, size) \
(((h) -> use_extra_arg) \
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
: (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size)))
#define CALL_FREEFUN(h, old_chunk) \
do { \
if ((h) -> use_extra_arg) \
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
else \
(*(void (*) ()) (h)->freefun) ((old_chunk)); \
} while (0)
#endif
/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). /* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
Objects start on multiples of ALIGNMENT (0 means use default). Objects start on multiples of ALIGNMENT (0 means use default).
CHUNKFUN is the function to use to allocate chunks, CHUNKFUN is the function to use to allocate chunks,
and FREEFUN the function to free them. */ and FREEFUN the function to free them.
void Return nonzero if successful, zero if out of memory.
To recover from an out of memory error,
free up some memory, then call this again. */
int
_obstack_begin (h, size, alignment, chunkfun, freefun) _obstack_begin (h, size, alignment, chunkfun, freefun)
struct obstack *h; struct obstack *h;
int size; int size;
int alignment; int alignment;
#if defined (__STDC__) && __STDC__
POINTER (*chunkfun) (long);
void (*freefun) (void *);
#else
POINTER (*chunkfun) (); POINTER (*chunkfun) ();
void (*freefun) (); void (*freefun) ();
#endif
{ {
register struct _obstack_chunk* chunk; /* points to new chunk */ register struct _obstack_chunk *chunk; /* points to new chunk */
if (alignment == 0) if (alignment == 0)
alignment = DEFAULT_ALIGNMENT; alignment = (int) DEFAULT_ALIGNMENT;
if (size == 0) if (size == 0)
/* Default size is what GNU malloc can fit in a 4096-byte block. */ /* Default size is what GNU malloc can fit in a 4096-byte block. */
{ {
@ -114,34 +183,48 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
size = 4096 - extra; size = 4096 - extra;
} }
#if defined (__STDC__) && __STDC__
h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
#else
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
h->freefun = freefun; h->freefun = freefun;
#endif
h->chunk_size = size; h->chunk_size = size;
h->alignment_mask = alignment - 1; h->alignment_mask = alignment - 1;
h->use_extra_arg = 0; h->use_extra_arg = 0;
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
if (!chunk)
(*obstack_alloc_failed_handler) ();
h->next_free = h->object_base = chunk->contents; h->next_free = h->object_base = chunk->contents;
h->chunk_limit = chunk->limit h->chunk_limit = chunk->limit
= (char *) chunk + h->chunk_size; = (char *) chunk + h->chunk_size;
chunk->prev = 0; chunk->prev = 0;
/* The initial chunk now contains no empty object. */ /* The initial chunk now contains no empty object. */
h->maybe_empty_object = 0; h->maybe_empty_object = 0;
h->alloc_failed = 0;
return 1;
} }
void int
_obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg) _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
struct obstack *h; struct obstack *h;
int size; int size;
int alignment; int alignment;
#if defined (__STDC__) && __STDC__
POINTER (*chunkfun) (POINTER, long);
void (*freefun) (POINTER, POINTER);
#else
POINTER (*chunkfun) (); POINTER (*chunkfun) ();
void (*freefun) (); void (*freefun) ();
#endif
POINTER arg; POINTER arg;
{ {
register struct _obstack_chunk* chunk; /* points to new chunk */ register struct _obstack_chunk *chunk; /* points to new chunk */
if (alignment == 0) if (alignment == 0)
alignment = DEFAULT_ALIGNMENT; alignment = (int) DEFAULT_ALIGNMENT;
if (size == 0) if (size == 0)
/* Default size is what GNU malloc can fit in a 4096-byte block. */ /* Default size is what GNU malloc can fit in a 4096-byte block. */
{ {
@ -159,20 +242,29 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
size = 4096 - extra; size = 4096 - extra;
} }
#if defined(__STDC__) && __STDC__
h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
#else
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
h->freefun = freefun; h->freefun = freefun;
#endif
h->chunk_size = size; h->chunk_size = size;
h->alignment_mask = alignment - 1; h->alignment_mask = alignment - 1;
h->extra_arg = arg; h->extra_arg = arg;
h->use_extra_arg = 1; h->use_extra_arg = 1;
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
if (!chunk)
(*obstack_alloc_failed_handler) ();
h->next_free = h->object_base = chunk->contents; h->next_free = h->object_base = chunk->contents;
h->chunk_limit = chunk->limit h->chunk_limit = chunk->limit
= (char *) chunk + h->chunk_size; = (char *) chunk + h->chunk_size;
chunk->prev = 0; chunk->prev = 0;
/* The initial chunk now contains no empty object. */ /* The initial chunk now contains no empty object. */
h->maybe_empty_object = 0; h->maybe_empty_object = 0;
h->alloc_failed = 0;
return 1;
} }
/* Allocate a new current chunk for the obstack *H /* Allocate a new current chunk for the obstack *H
@ -186,12 +278,12 @@ _obstack_newchunk (h, length)
struct obstack *h; struct obstack *h;
int length; int length;
{ {
register struct _obstack_chunk* old_chunk = h->chunk; register struct _obstack_chunk *old_chunk = h->chunk;
register struct _obstack_chunk* new_chunk; register struct _obstack_chunk *new_chunk;
register long new_size; register long new_size;
register int obj_size = h->next_free - h->object_base; register long obj_size = h->next_free - h->object_base;
register int i; register long i;
int already; long already;
/* Compute size for new chunk. */ /* Compute size for new chunk. */
new_size = (obj_size + length) + (obj_size >> 3) + 100; new_size = (obj_size + length) + (obj_size >> 3) + 100;
@ -199,7 +291,10 @@ _obstack_newchunk (h, length)
new_size = h->chunk_size; new_size = h->chunk_size;
/* Allocate and initialize the new chunk. */ /* Allocate and initialize the new chunk. */
new_chunk = h->chunk = CALL_CHUNKFUN (h, new_size); new_chunk = CALL_CHUNKFUN (h, new_size);
if (!new_chunk)
(*obstack_alloc_failed_handler) ();
h->chunk = new_chunk;
new_chunk->prev = old_chunk; new_chunk->prev = old_chunk;
new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
@ -242,19 +337,25 @@ _obstack_newchunk (h, length)
This is here for debugging. This is here for debugging.
If you use it in a program, you are probably losing. */ If you use it in a program, you are probably losing. */
#if defined (__STDC__) && __STDC__
/* Suppress -Wmissing-prototypes warning. We don't want to declare this in
obstack.h because it is just for debugging. */
int _obstack_allocated_p (struct obstack *h, POINTER obj);
#endif
int int
_obstack_allocated_p (h, obj) _obstack_allocated_p (h, obj)
struct obstack *h; struct obstack *h;
POINTER obj; POINTER obj;
{ {
register struct _obstack_chunk* lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
register struct _obstack_chunk* plp; /* point to previous chunk if any */ register struct _obstack_chunk *plp; /* point to previous chunk if any */
lp = (h)->chunk; lp = (h)->chunk;
/* We use >= rather than > since the object cannot be exactly at /* We use >= rather than > since the object cannot be exactly at
the beginning of the chunk but might be an empty object exactly the beginning of the chunk but might be an empty object exactly
at the end of an adjacent chunk. */ at the end of an adjacent chunk. */
while (lp != 0 && ((POINTER)lp >= obj || (POINTER)(lp)->limit < obj)) while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
{ {
plp = lp->prev; plp = lp->prev;
lp = plp; lp = plp;
@ -275,14 +376,14 @@ _obstack_free (h, obj)
struct obstack *h; struct obstack *h;
POINTER obj; POINTER obj;
{ {
register struct _obstack_chunk* lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
register struct _obstack_chunk* plp; /* point to previous chunk if any */ register struct _obstack_chunk *plp; /* point to previous chunk if any */
lp = h->chunk; lp = h->chunk;
/* We use >= because there cannot be an object at the beginning of a chunk. /* We use >= because there cannot be an object at the beginning of a chunk.
But there can be an empty object at that address But there can be an empty object at that address
at the end of another chunk. */ at the end of another chunk. */
while (lp != 0 && ((POINTER)lp >= obj || (POINTER)(lp)->limit < obj)) while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
{ {
plp = lp->prev; plp = lp->prev;
CALL_FREEFUN (h, lp); CALL_FREEFUN (h, lp);
@ -293,7 +394,7 @@ _obstack_free (h, obj)
} }
if (lp) if (lp)
{ {
h->object_base = h->next_free = (char *)(obj); h->object_base = h->next_free = (char *) (obj);
h->chunk_limit = lp->limit; h->chunk_limit = lp->limit;
h->chunk = lp; h->chunk = lp;
} }
@ -309,14 +410,14 @@ obstack_free (h, obj)
struct obstack *h; struct obstack *h;
POINTER obj; POINTER obj;
{ {
register struct _obstack_chunk* lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
register struct _obstack_chunk* plp; /* point to previous chunk if any */ register struct _obstack_chunk *plp; /* point to previous chunk if any */
lp = h->chunk; lp = h->chunk;
/* We use >= because there cannot be an object at the beginning of a chunk. /* We use >= because there cannot be an object at the beginning of a chunk.
But there can be an empty object at that address But there can be an empty object at that address
at the end of another chunk. */ at the end of another chunk. */
while (lp != 0 && ((POINTER)lp >= obj || (POINTER)(lp)->limit < obj)) while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
{ {
plp = lp->prev; plp = lp->prev;
CALL_FREEFUN (h, lp); CALL_FREEFUN (h, lp);
@ -327,7 +428,7 @@ obstack_free (h, obj)
} }
if (lp) if (lp)
{ {
h->object_base = h->next_free = (char *)(obj); h->object_base = h->next_free = (char *) (obj);
h->chunk_limit = lp->limit; h->chunk_limit = lp->limit;
h->chunk = lp; h->chunk = lp;
} }
@ -336,6 +437,39 @@ obstack_free (h, obj)
abort (); abort ();
} }
int
_obstack_memory_used (h)
struct obstack *h;
{
register struct _obstack_chunk* lp;
register int nbytes = 0;
for (lp = h->chunk; lp != 0; lp = lp->prev)
{
nbytes += lp->limit - (char *) lp;
}
return nbytes;
}
/* Define the error handler. */
#ifndef _
# ifdef HAVE_LIBINTL_H
# include <libintl.h>
# ifndef _
# define _(Str) gettext (Str)
# endif
# else
# define _(Str) (Str)
# endif
#endif
static void
print_and_abort ()
{
fputs (_("memory exhausted\n"), stderr);
exit (obstack_exit_failure);
}
#if 0 #if 0
/* These are now turned off because the applications do not use it /* These are now turned off because the applications do not use it
and it uses bcopy via obstack_grow, which causes trouble on sysV. */ and it uses bcopy via obstack_grow, which causes trouble on sysV. */
@ -343,7 +477,7 @@ obstack_free (h, obj)
/* Now define the functional versions of the obstack macros. /* Now define the functional versions of the obstack macros.
Define them to simply use the corresponding macros to do the job. */ Define them to simply use the corresponding macros to do the job. */
#ifdef __STDC__ #if defined (__STDC__) && __STDC__
/* These function definitions do not work with non-ANSI preprocessors; /* These function definitions do not work with non-ANSI preprocessors;
they won't pass through the macro names in parentheses. */ they won't pass through the macro names in parentheses. */
@ -374,6 +508,13 @@ int (obstack_room) (obstack)
return obstack_room (obstack); return obstack_room (obstack);
} }
int (obstack_make_room) (obstack, length)
struct obstack *obstack;
int length;
{
return obstack_make_room (obstack, length);
}
void (obstack_grow) (obstack, pointer, length) void (obstack_grow) (obstack, pointer, length)
struct obstack *obstack; struct obstack *obstack;
POINTER pointer; POINTER pointer;
@ -451,4 +592,4 @@ POINTER (obstack_copy0) (obstack, pointer, length)
#endif /* 0 */ #endif /* 0 */
#endif /* _LIBC or not __GNU_LIBRARY__. */ #endif /* !ELIDE_CODE */

View File

@ -1,5 +1,10 @@
/* obstack.h - object stack macros /* obstack.h - object stack macros
Copyright (C) 1988, 1992 Free Software Foundation, Inc. Copyright (C) 1988,89,90,91,92,93,94,96,97, 98 Free Software Foundation, Inc.
the C library, however. The master source lives in /gd/gnu/lib.
NOTE: The canonical source of this file is maintained with the
GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the under the terms of the GNU General Public License as published by the
@ -12,8 +17,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software Foundation,
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* $FreeBSD$ */
/* Summary: /* Summary:
@ -100,47 +107,59 @@ break the ordinary 'growth' macro.
/* Don't do the contents of this file more than once. */ /* Don't do the contents of this file more than once. */
#ifndef __OBSTACKS__ #ifndef _OBSTACK_H
#define __OBSTACKS__ #define _OBSTACK_H 1
#ifdef __cplusplus
extern "C" {
#endif
/* We use subtraction of (char *)0 instead of casting to int /* We use subtraction of (char *) 0 instead of casting to int
because on word-addressable machines a simple cast to int because on word-addressable machines a simple cast to int
may ignore the byte-within-word field of the pointer. */ may ignore the byte-within-word field of the pointer. */
#ifndef __PTR_TO_INT #ifndef __PTR_TO_INT
#define __PTR_TO_INT(P) ((P) - (char *)0) #define __PTR_TO_INT(P) ((P) - (char *) 0)
#endif #endif
#ifndef __INT_TO_PTR #ifndef __INT_TO_PTR
#define __INT_TO_PTR(P) ((P) + (char *)0) #define __INT_TO_PTR(P) ((P) + (char *) 0)
#endif #endif
/* We need the type of the resulting object. In ANSI C it is ptrdiff_t /* We need the type of the resulting object. In ANSI C it is ptrdiff_t
but in traditional C it is usually long. If we are in ANSI C and but in traditional C it is usually long. If we are in ANSI C and
don't already have ptrdiff_t get it. */ don't already have ptrdiff_t get it. */
#if defined (__STDC__) && ! defined (offsetof) #if defined (__STDC__) && __STDC__ && ! defined (offsetof)
#if defined (__GNUC__) && defined (IN_GCC) #if defined (__GNUC__) && defined (IN_GCC)
/* On Next machine, the system's stddef.h screws up if included /* On Next machine, the system's stddef.h screws up if included
after we have defined just ptrdiff_t, so include all of gstddef.h. after we have defined just ptrdiff_t, so include all of stddef.h.
Otherwise, define just ptrdiff_t, which is all we need. */ Otherwise, define just ptrdiff_t, which is all we need. */
#ifndef __NeXT__ #ifndef __NeXT__
#define __need_ptrdiff_t #define __need_ptrdiff_t
#endif #endif
#endif
/* While building GCC, the stddef.h that goes with GCC has this name. */
#include "gstddef.h"
#else
#include <stddef.h> #include <stddef.h>
#endif #endif
#endif
#ifdef __STDC__ #if defined (__STDC__) && __STDC__
#define PTR_INT_TYPE ptrdiff_t #define PTR_INT_TYPE ptrdiff_t
#else #else
#define PTR_INT_TYPE long #define PTR_INT_TYPE long
#endif #endif
#if defined (_LIBC) || defined (HAVE_STRING_H)
#include <string.h>
#define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
#else
#ifdef memcpy
#define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
#else
#define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
#endif
#endif
struct _obstack_chunk /* Lives at front of each chunk. */ struct _obstack_chunk /* Lives at front of each chunk. */
{ {
char *limit; /* 1 past end of this chunk */ char *limit; /* 1 past end of this chunk */
@ -151,39 +170,54 @@ struct _obstack_chunk /* Lives at front of each chunk. */
struct obstack /* control current object in current chunk */ struct obstack /* control current object in current chunk */
{ {
long chunk_size; /* preferred size to allocate chunks in */ long chunk_size; /* preferred size to allocate chunks in */
struct _obstack_chunk* chunk; /* address of current struct obstack_chunk */ struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
char *object_base; /* address of object we are building */ char *object_base; /* address of object we are building */
char *next_free; /* where to add next char to current object */ char *next_free; /* where to add next char to current object */
char *chunk_limit; /* address of char after current chunk */ char *chunk_limit; /* address of char after current chunk */
PTR_INT_TYPE temp; /* Temporary for some macros. */ PTR_INT_TYPE temp; /* Temporary for some macros. */
int alignment_mask; /* Mask of alignment for each object. */ int alignment_mask; /* Mask of alignment for each object. */
#if defined (__STDC__) && __STDC__
/* These prototypes vary based on `use_extra_arg', and we use
casts to the prototypeless function type in all assignments,
but having prototypes here quiets -Wstrict-prototypes. */
struct _obstack_chunk *(*chunkfun) (void *, long);
void (*freefun) (void *, struct _obstack_chunk *);
void *extra_arg; /* first arg for chunk alloc/dealloc funcs */
#else
struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */ struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */
void (*freefun) (); /* User's function to free a chunk. */ void (*freefun) (); /* User's function to free a chunk. */
char *extra_arg; /* first arg for chunk alloc/dealloc funcs */ char *extra_arg; /* first arg for chunk alloc/dealloc funcs */
#endif
unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */
unsigned maybe_empty_object:1;/* There is a possibility that the current unsigned maybe_empty_object:1;/* There is a possibility that the current
chunk contains a zero-length object. This chunk contains a zero-length object. This
prevents freeing the chunk if we allocate prevents freeing the chunk if we allocate
a bigger chunk to replace it. */ a bigger chunk to replace it. */
unsigned alloc_failed:1; /* No longer used, as we now call the failed
handler on error, but retained for binary
compatibility. */
}; };
/* Declare the external functions we use; they are in obstack.c. */ /* Declare the external functions we use; they are in obstack.c. */
#ifdef __STDC__ #if defined (__STDC__) && __STDC__
extern void _obstack_newchunk (struct obstack *, int); extern void _obstack_newchunk (struct obstack *, int);
extern void _obstack_free (struct obstack *, void *); extern void _obstack_free (struct obstack *, void *);
extern void _obstack_begin (struct obstack *, int, int, extern int _obstack_begin (struct obstack *, int, int,
void *(*) (), void (*) ()); void *(*) (long), void (*) (void *));
extern void _obstack_begin_1 (struct obstack *, int, int, extern int _obstack_begin_1 (struct obstack *, int, int,
void *(*) (), void (*) (), void *); void *(*) (void *, long),
void (*) (void *, void *), void *);
extern int _obstack_memory_used (struct obstack *);
#else #else
extern void _obstack_newchunk (); extern void _obstack_newchunk ();
extern void _obstack_free (); extern void _obstack_free ();
extern void _obstack_begin (); extern int _obstack_begin ();
extern void _obstack_begin_1 (); extern int _obstack_begin_1 ();
extern int _obstack_memory_used ();
#endif #endif
#ifdef __STDC__ #if defined (__STDC__) && __STDC__
/* Do the function-declarations after the structs /* Do the function-declarations after the structs
but before defining the macros. */ but before defining the macros. */
@ -211,6 +245,7 @@ void * obstack_finish (struct obstack *obstack);
int obstack_object_size (struct obstack *obstack); int obstack_object_size (struct obstack *obstack);
int obstack_room (struct obstack *obstack); int obstack_room (struct obstack *obstack);
void obstack_make_room (struct obstack *obstack, int size);
void obstack_1grow_fast (struct obstack *obstack, int data_char); void obstack_1grow_fast (struct obstack *obstack, int data_char);
void obstack_ptr_grow_fast (struct obstack *obstack, void *data); void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
void obstack_int_grow_fast (struct obstack *obstack, int data); void obstack_int_grow_fast (struct obstack *obstack, int data);
@ -220,11 +255,24 @@ void * obstack_base (struct obstack *obstack);
void * obstack_next_free (struct obstack *obstack); void * obstack_next_free (struct obstack *obstack);
int obstack_alignment_mask (struct obstack *obstack); int obstack_alignment_mask (struct obstack *obstack);
int obstack_chunk_size (struct obstack *obstack); int obstack_chunk_size (struct obstack *obstack);
int obstack_memory_used (struct obstack *obstack);
#endif /* __STDC__ */ #endif /* __STDC__ */
/* Non-ANSI C cannot really support alternative functions for these macros, /* Non-ANSI C cannot really support alternative functions for these macros,
so we do not declare them. */ so we do not declare them. */
/* Error handler called when `obstack_chunk_alloc' failed to allocate
more memory. This can be set to a user defined function. The
default action is to print a message and abort. */
#if defined (__STDC__) && __STDC__
extern void (*obstack_alloc_failed_handler) (void);
#else
extern void (*obstack_alloc_failed_handler) ();
#endif
/* Exit value used when `print_and_abort' is used. */
extern int obstack_exit_failure;
/* Pointer to beginning of object being allocated or to be allocated next. /* Pointer to beginning of object being allocated or to be allocated next.
Note that this might not be the final address of the object Note that this might not be the final address of the object
@ -244,6 +292,35 @@ int obstack_chunk_size (struct obstack *obstack);
#define obstack_alignment_mask(h) ((h)->alignment_mask) #define obstack_alignment_mask(h) ((h)->alignment_mask)
/* To prevent prototype warnings provide complete argument list in
standard C version. */
#if defined (__STDC__) && __STDC__
#define obstack_init(h) \
_obstack_begin ((h), 0, 0, \
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
#define obstack_begin(h, size) \
_obstack_begin ((h), (size), 0, \
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
_obstack_begin ((h), (size), (alignment), \
(void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun))
#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
_obstack_begin_1 ((h), (size), (alignment), \
(void *(*) (void *, long)) (chunkfun), \
(void (*) (void *, void *)) (freefun), (arg))
#define obstack_chunkfun(h, newchunkfun) \
((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
#define obstack_freefun(h, newfreefun) \
((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
#else
#define obstack_init(h) \ #define obstack_init(h) \
_obstack_begin ((h), 0, 0, \ _obstack_begin ((h), 0, 0, \
(void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free) (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free)
@ -260,12 +337,25 @@ int obstack_chunk_size (struct obstack *obstack);
_obstack_begin_1 ((h), (size), (alignment), \ _obstack_begin_1 ((h), (size), (alignment), \
(void *(*) ()) (chunkfun), (void (*) ()) (freefun), (arg)) (void *(*) ()) (chunkfun), (void (*) ()) (freefun), (arg))
#define obstack_chunkfun(h, newchunkfun) \
((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))
#define obstack_freefun(h, newfreefun) \
((h) -> freefun = (void (*)()) (newfreefun))
#endif
#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar) #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
#define obstack_blank_fast(h,n) ((h)->next_free += (n)) #define obstack_blank_fast(h,n) ((h)->next_free += (n))
#define obstack_memory_used(h) _obstack_memory_used (h)
#if defined (__GNUC__) && defined (__STDC__) #if defined (__GNUC__) && defined (__STDC__) && __STDC__
#if __GNUC__ < 2 || defined(NeXT) /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
does not implement __extension__. But that compiler doesn't define
__GNUC_MINOR__. */
#if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
#define __extension__ #define __extension__
#endif #endif
@ -284,18 +374,21 @@ int obstack_chunk_size (struct obstack *obstack);
({ struct obstack *__o = (OBSTACK); \ ({ struct obstack *__o = (OBSTACK); \
(unsigned) (__o->chunk_limit - __o->next_free); }) (unsigned) (__o->chunk_limit - __o->next_free); })
/* Note that the call to _obstack_newchunk is enclosed in (..., 0) #define obstack_make_room(OBSTACK,length) \
so that we can avoid having void expressions __extension__ \
in the arms of the conditional expression. ({ struct obstack *__o = (OBSTACK); \
Casting the third operand to void was tried before, int __len = (length); \
but some compilers won't accept it. */ if (__o->chunk_limit - __o->next_free < __len) \
_obstack_newchunk (__o, __len); \
(void) 0; })
#define obstack_grow(OBSTACK,where,length) \ #define obstack_grow(OBSTACK,where,length) \
__extension__ \ __extension__ \
({ struct obstack *__o = (OBSTACK); \ ({ struct obstack *__o = (OBSTACK); \
int __len = (length); \ int __len = (length); \
((__o->next_free + __len > __o->chunk_limit) \ if (__o->next_free + __len > __o->chunk_limit) \
? (_obstack_newchunk (__o, __len), 0) : 0); \ _obstack_newchunk (__o, __len); \
bcopy (where, __o->next_free, __len); \ _obstack_memcpy (__o->next_free, (char *) (where), __len); \
__o->next_free += __len; \ __o->next_free += __len; \
(void) 0; }) (void) 0; })
@ -303,18 +396,18 @@ __extension__ \
__extension__ \ __extension__ \
({ struct obstack *__o = (OBSTACK); \ ({ struct obstack *__o = (OBSTACK); \
int __len = (length); \ int __len = (length); \
((__o->next_free + __len + 1 > __o->chunk_limit) \ if (__o->next_free + __len + 1 > __o->chunk_limit) \
? (_obstack_newchunk (__o, __len + 1), 0) : 0), \ _obstack_newchunk (__o, __len + 1); \
bcopy (where, __o->next_free, __len), \ _obstack_memcpy (__o->next_free, (char *) (where), __len); \
__o->next_free += __len, \ __o->next_free += __len; \
*(__o->next_free)++ = 0; \ *(__o->next_free)++ = 0; \
(void) 0; }) (void) 0; })
#define obstack_1grow(OBSTACK,datum) \ #define obstack_1grow(OBSTACK,datum) \
__extension__ \ __extension__ \
({ struct obstack *__o = (OBSTACK); \ ({ struct obstack *__o = (OBSTACK); \
((__o->next_free + 1 > __o->chunk_limit) \ if (__o->next_free + 1 > __o->chunk_limit) \
? (_obstack_newchunk (__o, 1), 0) : 0), \ _obstack_newchunk (__o, 1); \
*(__o->next_free)++ = (datum); \ *(__o->next_free)++ = (datum); \
(void) 0; }) (void) 0; })
@ -325,28 +418,28 @@ __extension__ \
#define obstack_ptr_grow(OBSTACK,datum) \ #define obstack_ptr_grow(OBSTACK,datum) \
__extension__ \ __extension__ \
({ struct obstack *__o = (OBSTACK); \ ({ struct obstack *__o = (OBSTACK); \
((__o->next_free + sizeof (void *) > __o->chunk_limit) \ if (__o->next_free + sizeof (void *) > __o->chunk_limit) \
? (_obstack_newchunk (__o, sizeof (void *)), 0) : 0), \ _obstack_newchunk (__o, sizeof (void *)); \
*((void **)__o->next_free)++ = ((void *)datum); \ *((void **)__o->next_free)++ = ((void *)datum); \
(void) 0; }) (void) 0; })
#define obstack_int_grow(OBSTACK,datum) \ #define obstack_int_grow(OBSTACK,datum) \
__extension__ \ __extension__ \
({ struct obstack *__o = (OBSTACK); \ ({ struct obstack *__o = (OBSTACK); \
((__o->next_free + sizeof (int) > __o->chunk_limit) \ if (__o->next_free + sizeof (int) > __o->chunk_limit) \
? (_obstack_newchunk (__o, sizeof (int)), 0) : 0), \ _obstack_newchunk (__o, sizeof (int)); \
*((int *)__o->next_free)++ = ((int)datum); \ *((int *)__o->next_free)++ = ((int)datum); \
(void) 0; }) (void) 0; })
#define obstack_ptr_grow_fast(h,aptr) (*((void **)(h)->next_free)++ = (void *)aptr) #define obstack_ptr_grow_fast(h,aptr) (*((void **) (h)->next_free)++ = (void *)aptr)
#define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint) #define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
#define obstack_blank(OBSTACK,length) \ #define obstack_blank(OBSTACK,length) \
__extension__ \ __extension__ \
({ struct obstack *__o = (OBSTACK); \ ({ struct obstack *__o = (OBSTACK); \
int __len = (length); \ int __len = (length); \
((__o->chunk_limit - __o->next_free < __len) \ if (__o->chunk_limit - __o->next_free < __len) \
? (_obstack_newchunk (__o, __len), 0) : 0); \ _obstack_newchunk (__o, __len); \
__o->next_free += __len; \ __o->next_free += __len; \
(void) 0; }) (void) 0; })
@ -373,15 +466,16 @@ __extension__ \
#define obstack_finish(OBSTACK) \ #define obstack_finish(OBSTACK) \
__extension__ \ __extension__ \
({ struct obstack *__o1 = (OBSTACK); \ ({ struct obstack *__o1 = (OBSTACK); \
void *value = (void *) __o1->object_base; \ void *value; \
value = (void *) __o1->object_base; \
if (__o1->next_free == value) \ if (__o1->next_free == value) \
__o1->maybe_empty_object = 1; \ __o1->maybe_empty_object = 1; \
__o1->next_free \ __o1->next_free \
= __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
& ~ (__o1->alignment_mask)); \ & ~ (__o1->alignment_mask)); \
((__o1->next_free - (char *)__o1->chunk \ if (__o1->next_free - (char *)__o1->chunk \
> __o1->chunk_limit - (char *)__o1->chunk) \ > __o1->chunk_limit - (char *)__o1->chunk) \
? (__o1->next_free = __o1->chunk_limit) : 0); \ __o1->next_free = __o1->chunk_limit; \
__o1->object_base = __o1->next_free; \ __o1->object_base = __o1->next_free; \
value; }) value; })
@ -401,44 +495,55 @@ __extension__ \
#define obstack_room(h) \ #define obstack_room(h) \
(unsigned) ((h)->chunk_limit - (h)->next_free) (unsigned) ((h)->chunk_limit - (h)->next_free)
/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
so that we can avoid having void expressions
in the arms of the conditional expression.
Casting the third operand to void was tried before,
but some compilers won't accept it. */
#define obstack_make_room(h,length) \
( (h)->temp = (length), \
(((h)->next_free + (h)->temp > (h)->chunk_limit) \
? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
#define obstack_grow(h,where,length) \ #define obstack_grow(h,where,length) \
( (h)->temp = (length), \ ( (h)->temp = (length), \
(((h)->next_free + (h)->temp > (h)->chunk_limit) \ (((h)->next_free + (h)->temp > (h)->chunk_limit) \
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
bcopy (where, (h)->next_free, (h)->temp), \ _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp), \
(h)->next_free += (h)->temp) (h)->next_free += (h)->temp)
#define obstack_grow0(h,where,length) \ #define obstack_grow0(h,where,length) \
( (h)->temp = (length), \ ( (h)->temp = (length), \
(((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \ (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \
? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \ ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \
bcopy (where, (h)->next_free, (h)->temp), \ _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp), \
(h)->next_free += (h)->temp, \ (h)->next_free += (h)->temp, \
*((h)->next_free)++ = 0) *((h)->next_free)++ = 0)
#define obstack_1grow(h,datum) \ #define obstack_1grow(h,datum) \
( (((h)->next_free + 1 > (h)->chunk_limit) \ ( (((h)->next_free + 1 > (h)->chunk_limit) \
? (_obstack_newchunk ((h), 1), 0) : 0), \ ? (_obstack_newchunk ((h), 1), 0) : 0), \
*((h)->next_free)++ = (datum)) (*((h)->next_free)++ = (datum)))
#define obstack_ptr_grow(h,datum) \ #define obstack_ptr_grow(h,datum) \
( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \
? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \
*((char **)(((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *)datum)) (*((char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *) datum)))
#define obstack_int_grow(h,datum) \ #define obstack_int_grow(h,datum) \
( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ ( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
*((int *)(((h)->next_free+=sizeof(int))-sizeof(int))) = ((int)datum)) (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = ((int) datum)))
#define obstack_ptr_grow_fast(h,aptr) (*((char **)(h)->next_free)++ = (char *)aptr) #define obstack_ptr_grow_fast(h,aptr) (*((char **) (h)->next_free)++ = (char *) aptr)
#define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint) #define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
#define obstack_blank(h,length) \ #define obstack_blank(h,length) \
( (h)->temp = (length), \ ( (h)->temp = (length), \
(((h)->chunk_limit - (h)->next_free < (h)->temp) \ (((h)->chunk_limit - (h)->next_free < (h)->temp) \
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
(h)->next_free += (h)->temp) ((h)->next_free += (h)->temp))
#define obstack_alloc(h,length) \ #define obstack_alloc(h,length) \
(obstack_blank ((h), (length)), obstack_finish ((h))) (obstack_blank ((h), (length)), obstack_finish ((h)))
@ -457,22 +562,22 @@ __extension__ \
(h)->next_free \ (h)->next_free \
= __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \ = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \
& ~ ((h)->alignment_mask)), \ & ~ ((h)->alignment_mask)), \
(((h)->next_free - (char *)(h)->chunk \ (((h)->next_free - (char *) (h)->chunk \
> (h)->chunk_limit - (char *)(h)->chunk) \ > (h)->chunk_limit - (char *) (h)->chunk) \
? ((h)->next_free = (h)->chunk_limit) : 0), \ ? ((h)->next_free = (h)->chunk_limit) : 0), \
(h)->object_base = (h)->next_free, \ (h)->object_base = (h)->next_free, \
__INT_TO_PTR ((h)->temp)) __INT_TO_PTR ((h)->temp))
#ifdef __STDC__ #if defined (__STDC__) && __STDC__
#define obstack_free(h,obj) \ #define obstack_free(h,obj) \
( (h)->temp = (char *)(obj) - (char *) (h)->chunk, \ ( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
(((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
? (int) ((h)->next_free = (h)->object_base \ ? (int) ((h)->next_free = (h)->object_base \
= (h)->temp + (char *) (h)->chunk) \ = (h)->temp + (char *) (h)->chunk) \
: (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0))) : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))
#else #else
#define obstack_free(h,obj) \ #define obstack_free(h,obj) \
( (h)->temp = (char *)(obj) - (char *) (h)->chunk, \ ( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
(((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
? (int) ((h)->next_free = (h)->object_base \ ? (int) ((h)->next_free = (h)->object_base \
= (h)->temp + (char *) (h)->chunk) \ = (h)->temp + (char *) (h)->chunk) \
@ -481,4 +586,8 @@ __extension__ \
#endif /* not __GNUC__ or not __STDC__ */ #endif /* not __GNUC__ or not __STDC__ */
#endif /* not __OBSTACKS__ */ #ifdef __cplusplus
} /* C++ */
#endif
#endif /* obstack.h */