/*	
 *	clipmems.h
 *
 *	簡易メモリアロケータ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016 Naoyuki Sawa
 *
 *	* Sun Jun 12 21:31:45 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	- 小さな実行環境でライブラリのメモリアロケータが使えない場合のための、単純な簡易メモリアロケータです。
 *	  下記の記事を参考にさせて頂きました。(実装は同じではありません。)
 *	  「the Developer Toolbox - Simple Malloc & Free Functions」(http://www.flipcode.com/archives/Simple_Malloc_Free_Functions.shtml)
 *	  特に、空きブロックの連結を、メモリ解放時でなく、メモリ確保時に行うという方法を、参考にさせて頂きました。
 *	- 上記の記事では、ブロックが空きか使用中かを、ブロックヘッダに格納するサイズの最下位ビットを使ってマークしていました。
 *	  それに対して当実装では、使用中ならばブロックヘッダに格納するサイズをマイナス値にして格納して、区別する事にしました。
 *	  どちらでも本質的な違いは無いのですが、もし今後アセンブラ化する場合に、後者の方が効率よく処理出来ると思ったからです。
 *	- 当モジュールの関数名プレフィクス'MemSys'は、上記の記事の関数名プレフィクス'MSYS'に由来しています。
 *	  ただし、'MSYS'ではMinGWのMSYSと似ていて紛らわしいので、少し変えて'MemSys'にする事にしました。
 *	- MemSys_Alloc(),MemSys_Free(),MemSys_Resize()はスレッドセーフです。
 *	  P/ECEの割り込みルーチン内や、Win32のマルチスレッド環境でも、使用出来ます。
 */
#ifndef __CLIP_MEMS_H__
#define __CLIP_MEMS_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
#ifndef __RENESAS__
#define USE_MEMSYS_DUMP	//MemSys_Dump()が不要ならばこのシンボル定義をコメントアウトしてください。
#endif//__RENESAS__
/****************************************************************************
 *	グローバル関数宣言
 ****************************************************************************/
void MemSys_Init(void* _buf, int size/*(4*2)以上*/);
void* MemSys_Alloc(void* _buf, int size/*0可*/);				//スレッドセーフ
void MemSys_Free(void* _ptr/*NULL可*/);						//スレッドセーフ
void* MemSys_Resize(void* _buf, void* _ptr/*NULL可*/, int size/*0可*/);		//スレッドセーフ
#ifdef  USE_MEMSYS_DUMP
void MemSys_Dump(FILE* fp, const void* _buf);
#endif//USE_MEMSYS_DUMP
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_MEMS_H__
