#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "obstack.h"
#define OBSTACK_INTERFACE_VERSION 1
#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
#ifndef ELIDE_CODE
#if defined (__STDC__) && __STDC__
#define POINTER void *
#else
#define POINTER char *
#endif
struct
fooalign {
char
x;
double
d;};
#define DEFAULT_ALIGNMENT \
((PTR_INT_TYPE) ((
char
*) &((
struct
fooalign *) 0)->d - (
char
*) 0))
union
fooround {
long
x;
double
d;};
#define DEFAULT_ROUNDING (sizeof (union fooround))
#ifndef COPYING_UNIT
#define COPYING_UNIT int
#endif
#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
#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;
struct
obstack *_obstack;
#if defined (__STDC__) && __STDC__
#define CALL_CHUNKFUN(h, size) \
(((h) -> use_extra_arg) \
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
: (*(
struct
_obstack_chunk *(*) (
long
)) (h)->chunkfun) ((size)))
#define CALL_FREEFUN(h, old_chunk) \
do
{ \
if
((h) -> use_extra_arg) \
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
else
\
(*(
void
(*) (
void
*)) (h)->freefun) ((old_chunk)); \
}
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
int
_obstack_begin (h, size, alignment, chunkfun, freefun)
struct
obstack *h;
int
size;
int
alignment;
#if defined (__STDC__) && __STDC__
POINTER (*chunkfun) (
long
);
void
(*freefun) (
void
*);
#else
POINTER (*chunkfun) ();
void
(*freefun) ();
#endif
{
register
struct
_obstack_chunk *chunk;
if
(alignment == 0)
alignment = (
int
) DEFAULT_ALIGNMENT;
if
(size == 0)
{
int
extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ 4 + DEFAULT_ROUNDING - 1)
& ~(DEFAULT_ROUNDING - 1));
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->freefun = freefun;
#endif
h->chunk_size = size;
h->alignment_mask = alignment - 1;
h->use_extra_arg = 0;
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
if
(!chunk)
(*obstack_alloc_failed_handler) ();
h->next_free = h->object_base = chunk->contents;
h->chunk_limit = chunk->limit
= (
char
*) chunk + h->chunk_size;
chunk->prev = 0;
h->maybe_empty_object = 0;
h->alloc_failed = 0;
return
1;
}
int
_obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
struct
obstack *h;
int
size;
int
alignment;
#if defined (__STDC__) && __STDC__
POINTER (*chunkfun) (POINTER,
long
);
void
(*freefun) (POINTER, POINTER);
#else
POINTER (*chunkfun) ();
void
(*freefun) ();
#endif
POINTER arg;
{
register
struct
_obstack_chunk *chunk;
if
(alignment == 0)
alignment = (
int
) DEFAULT_ALIGNMENT;
if
(size == 0)
{
int
extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ 4 + DEFAULT_ROUNDING - 1)
& ~(DEFAULT_ROUNDING - 1));
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->freefun = freefun;
#endif
h->chunk_size = size;
h->alignment_mask = alignment - 1;
h->extra_arg = arg;
h->use_extra_arg = 1;
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
if
(!chunk)
(*obstack_alloc_failed_handler) ();
h->next_free = h->object_base = chunk->contents;
h->chunk_limit = chunk->limit
= (
char
*) chunk + h->chunk_size;
chunk->prev = 0;
h->maybe_empty_object = 0;
h->alloc_failed = 0;
return
1;
}
void
_obstack_newchunk (h, length)
struct
obstack *h;
int
length;
{
register
struct
_obstack_chunk *old_chunk = h->chunk;
register
struct
_obstack_chunk *new_chunk;
register
long
new_size;
register
long
obj_size = h->next_free - h->object_base;
register
long
i;
long
already;
new_size = (obj_size + length) + (obj_size >> 3) + 100;
if
(new_size < h->chunk_size)
new_size = h->chunk_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->limit = h->chunk_limit = (
char
*) new_chunk + new_size;
if
(h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
{
for
(i = obj_size /
sizeof
(COPYING_UNIT) - 1;
i >= 0; i--)
((COPYING_UNIT *)new_chunk->contents)[i]
= ((COPYING_UNIT *)h->object_base)[i];
already = obj_size /
sizeof
(COPYING_UNIT) *
sizeof
(COPYING_UNIT);
}
else
already = 0;
for
(i = already; i < obj_size; i++)
new_chunk->contents[i] = h->object_base[i];
if
(h->object_base == old_chunk->contents && ! h->maybe_empty_object)
{
new_chunk->prev = old_chunk->prev;
CALL_FREEFUN (h, old_chunk);
}
h->object_base = new_chunk->contents;
h->next_free = h->object_base + obj_size;
h->maybe_empty_object = 0;
}
#if defined (__STDC__) && __STDC__
int
_obstack_allocated_p (
struct
obstack *h, POINTER obj);
#endif
int
_obstack_allocated_p (h, obj)
struct
obstack *h;
POINTER obj;
{
register
struct
_obstack_chunk *lp;
register
struct
_obstack_chunk *plp;
lp = (h)->chunk;
while
(lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
{
plp = lp->prev;
lp = plp;
}
return
lp != 0;
}
#undef obstack_free
void
_obstack_free (h, obj)
struct
obstack *h;
POINTER obj;
{
register
struct
_obstack_chunk *lp;
register
struct
_obstack_chunk *plp;
lp = h->chunk;
while
(lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
{
plp = lp->prev;
CALL_FREEFUN (h, lp);
lp = plp;
h->maybe_empty_object = 1;
}
if
(lp)
{
h->object_base = h->next_free = (
char
*) (obj);
h->chunk_limit = lp->limit;
h->chunk = lp;
}
else
if
(obj != 0)
abort
();
}
void
obstack_free (h, obj)
struct
obstack *h;
POINTER obj;
{
register
struct
_obstack_chunk *lp;
register
struct
_obstack_chunk *plp;
lp = h->chunk;
while
(lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
{
plp = lp->prev;
CALL_FREEFUN (h, lp);
lp = plp;
h->maybe_empty_object = 1;
}
if
(lp)
{
h->object_base = h->next_free = (
char
*) (obj);
h->chunk_limit = lp->limit;
h->chunk = lp;
}
else
if
(obj != 0)
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;
}
#ifndef _
# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
# 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 defined (__STDC__) && __STDC__
POINTER (obstack_base) (obstack)
struct
obstack *obstack;
{
return
obstack_base (obstack);
}
POINTER (obstack_next_free) (obstack)
struct
obstack *obstack;
{
return
obstack_next_free (obstack);
}
int
(obstack_object_size) (obstack)
struct
obstack *obstack;
{
return
obstack_object_size (obstack);
}
int
(obstack_room) (obstack)
struct
obstack *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)
struct
obstack *obstack;
POINTER pointer;
int
length;
{
obstack_grow (obstack, pointer, length);
}
void
(obstack_grow0) (obstack, pointer, length)
struct
obstack *obstack;
POINTER pointer;
int
length;
{
obstack_grow0 (obstack, pointer, length);
}
void
(obstack_1grow) (obstack, character)
struct
obstack *obstack;
int
character;
{
obstack_1grow (obstack, character);
}
void
(obstack_blank) (obstack, length)
struct
obstack *obstack;
int
length;
{
obstack_blank (obstack, length);
}
void
(obstack_1grow_fast) (obstack, character)
struct
obstack *obstack;
int
character;
{
obstack_1grow_fast (obstack, character);
}
void
(obstack_blank_fast) (obstack, length)
struct
obstack *obstack;
int
length;
{
obstack_blank_fast (obstack, length);
}
POINTER (obstack_finish) (obstack)
struct
obstack *obstack;
{
return
obstack_finish (obstack);
}
POINTER (obstack_alloc) (obstack, length)
struct
obstack *obstack;
int
length;
{
return
obstack_alloc (obstack, length);
}
POINTER (obstack_copy) (obstack, pointer, length)
struct
obstack *obstack;
POINTER pointer;
int
length;
{
return
obstack_copy (obstack, pointer, length);
}
POINTER (obstack_copy0) (obstack, pointer, length)
struct
obstack *obstack;
POINTER pointer;
int
length;
{
return
obstack_copy0 (obstack, pointer, length);
}
#endif /* __STDC__ */
#endif /* 0 */
#endif /* !ELIDE_CODE */