// This may look like C code, but it is really -*- C++ -*-
Copyright (C) 1988 Free Software Foundation
written by Doug Lea (dl@rocky.oswego.edu)
This file is part of the GNU C++ Library. This library is free
software; you can redistribute it and/or modify it under the terms of
the GNU Library General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your
option) any later version. This library is distributed in the hope
that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
Obstack(int size
= 4080, int alignment
= 4); // 4080=4096-mallocslop
int contains(void* p
); // does Obstack hold pointer p?
void grow(const void* data
, int size
);
void grow(const void* data
, int size
, char terminator
);
void grow(const char* s
);
void blank_fast(int size
);
void* finish(char terminator
);
void* copy(const void* data
, int size
);
void* copy(const void* data
, int size
, char terminator
);
void* copy(const char* s
);
void shrink(int size
= 1); // suggested by ken@cs.rochester.edu
int OK(); // rep invariant
inline Obstack::~Obstack()
inline void* Obstack::base()
inline void* Obstack::next_free()
inline int Obstack::alignment_mask()
inline int Obstack::chunk_size()
inline int Obstack::size()
return nextfree
- objectbase
;
inline int Obstack::room()
return chunklimit
- nextfree
;
inline void Obstack:: grow(const void* data
, int size
)
if (nextfree
+size
> chunklimit
)
memcpy(nextfree
, data
, size
);
inline void Obstack:: grow(const void* data
, int size
, char terminator
)
if (nextfree
+size
+1 > chunklimit
)
memcpy(nextfree
, data
, size
);
*(nextfree
)++ = terminator
;
inline void Obstack:: grow(const char* s
)
grow((const void*)s
, strlen(s
), 0);
inline void Obstack:: grow(char c
)
if (nextfree
+1 > chunklimit
)
inline void Obstack:: blank(int size
)
if (nextfree
+size
> chunklimit
)
inline void* Obstack::finish(char terminator
)
inline void* Obstack::copy(const void* data
, int size
)
inline void* Obstack::copy(const void* data
, int size
, char terminator
)
grow(data
, size
, terminator
);
inline void* Obstack::copy(const char* s
)
grow((const void*)s
, strlen(s
), 0);
inline void* Obstack::copy(char c
)
inline void* Obstack::alloc(int size
)
inline void Obstack:: free(void* obj
)
if (obj
>= (void*)chunk
&& obj
<(void*)chunklimit
)
nextfree
= objectbase
= (char *) obj
;
inline void Obstack:: grow_fast(char c
)
inline void Obstack:: blank_fast(int size
)
inline void Obstack:: shrink(int size
) // from ken@cs.rochester.edu
if (nextfree
>= objectbase
+ size
)