/*
 *	obstack.h
 *
 *	Obstack - Pool of memory containing a stack of objects.
 *
 *	* Mon Oct 05 21:33:13 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	- 「Obstack」(http://gcc.gnu.org/onlinedocs/libiberty/Obstacks.html)互換モジュールです。
 *	  関数仕様は「Obstack」と同じで、実装は独自です。
 *	  オリジナル版の「Obstack」は速度を重視してやや複雑ですが、当実装は単純に実装しました。
 *	- 関数仕様や使い方の説明は、上記のドキュメントの他、以下のドキュメントも参考になります。
 *	  「Wikipedia - Obstack」(http://en.wikipedia.org/wiki/Obstack)
 *	  「IBM developerWorks Japan - メモリー管理の内側」(http://www.ibm.com/developerworks/jp/linux/library/l-memory/)
 *	* Tue Oct 06 23:01:47 JST 2015 Naoyuki Sawa
 *	- obstack_free()のobject引数指定を対応しました。
 *	  objectにNULL以外を指定すると、object以降(objectも含む)に作成したオブジェクトだけを開放します。
 *	  もっとも実際にそんな処理を行いたいケースはほとんど無く、大抵はobstack_free()のobject引数にはNULLを指定すると思います。
 *	  唯一、object引数指定が役に立つケースとしては、下記の用法ぐらいです。
 *	  │obstack_free(o,obstack_base(o)); //現在作成中のオブジェクトの状態を取り消して0バイトに戻す。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __OBSTACK_H__
#define __OBSTACK_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	
 ****************************************************************************/
//■「GNU libiberty - 2.3.1 Obstacks」(http://gcc.gnu.org/onlinedocs/libiberty/Obstacks.html)
//□2.3.1.1 Creating Obstacks
struct obstack {
	struct _obstack_chunk*	chunk;
};
/*--------------------------------------------------------------------------*/
//□2.3.1.2 Preparing for Using Obstacks
void obstack_init(struct obstack* o);
//□2.3.1.3 Allocation in an Obstack
void* obstack_alloc(struct obstack* o, int size);
void* obstack_copy(struct obstack* o, void* data, int size);
void* obstack_copy0(struct obstack* o, void* data, int size);
//□2.3.1.4 Freeing Objects in an Obstack
void obstack_free(struct obstack* o, void* object);
//□2.3.1.6 Growing Objects
void obstack_blank(struct obstack* o, int size);
void obstack_grow(struct obstack* o, void* data, int size);
void obstack_grow0(struct obstack* o, void* data, int size);
void obstack_1grow(struct obstack* o, int data);
void obstack_ptr_grow(struct obstack* o, void* data);
void obstack_int_grow(struct obstack* o, int data);
void* obstack_finish(struct obstack* o);
//□2.3.1.7 Extra Fast Growing Objects
int obstack_room(struct obstack* o);
void obstack_blank_fast(struct obstack* o, int size);
void obstack_1grow_fast(struct obstack* o, int data);
void obstack_ptr_grow_fast(struct obstack* o, void* data);
void obstack_int_grow_fast(struct obstack* o, int data);
//□2.3.1.8 Status of an Obstack
void* obstack_base(struct obstack* o);
void* obstack_next_free(struct obstack* o);
int obstack_object_size(struct obstack* o);
//□2.3.1.9 Alignment of Data in Obstacks
#define obstack_alignment_mask(o)	(3)
//□2.3.1.10 Obstack Chunks
#define obstack_chunk_size(o)		(1024)
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__OBSTACK_H__
