/*	
 *	clipmems.c
 *
 *	娙堈儊儌儕傾儘働乕僞
 *
 *	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偺儅儖僠僗儗僢僪娐嫬偱傕丄巊梡弌棃傑偡丅
 *	* Sun Oct 02 21:48:17 JST 2016 Naoyuki Sawa
 *	- 64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
 *	  64價僢僩懳墳偺偨傔偺弨旛偱偡偑丄32價僢僩偱傕(intptr_t)偱峴偆曽偑杮摉偼惓偟偄偐傜偱偡丅
 *	  偲偼尵偊丄32價僢僩偱偼偳偪傜偱傕摨偠寢壥偵側傞偺偱丄婛懚偺32價僢僩僐乕僪偵偼塭嬁桳傝傑偣傫丅
 *	- MemSys_Dump()傪32價僢僩斉偲64價僢僩斉偺椉懳墳偵偟傑偟偨丅
 *	  曄峏売強偑懡偐偭偨偺偱丄曄峏慜偺僐乕僪偼僐儊儞僩傾僂僩偟偰巆偟偰偄傑偣傫丅
 *	  曄峏慜偺僐乕僪傪嶲徠偡傞昁梫偑桳傞応崌偼丄慜夞偺傾乕僇僀僽傪嶲徠偟偰壓偝偄丅
 */
#include "clip.h"
/****************************************************************************
 *	
 ****************************************************************************/
#if     (defined(PIECE) || defined(WIN32))
#define USE_MEMSYS_DEBUG	//偙偺僔儞儃儖傪掕媊偡傞偲丄幚峴帪偺僄儔乕専弌張棟偑桳岠偵側傝傑偡丅2016/06/12尰嵼偼丄P/ECE娐嫬,媦傃,Win32娐嫬偱偼忢偵偙偺僔儞儃儖傪掕媊偡傞帠偵偟傑偟偨丅崱屻丄廫暘偵摦嶌専徹弌棃偨傜丄懍搙偑昁梫側応崌偼枹掕媊偵偟偰傕峔偄傑偣傫丅
#endif//(defined(PIECE) || defined(WIN32))
/****************************************************************************
 *	儘乕僇儖娭悢
 ****************************************************************************/
#ifdef  USE_MEMSYS_DEBUG
//{{2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
//static void MemSys_FillDummyData(int hdr) {
//伀2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
static void MemSys_FillDummyData(intptr_t hdr) {
//}}2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
	int size;
	if(hdr & 3) { DIE(); }
	size = *(int*)hdr;
	if((size & 3) || (size < 4)) { DIE(); }
	memset((void*)(hdr + 4), 0xCD, size - 4);			//嬻偒儊儌儕傪僟儈乕僨乕僞偱僋儕傾偟偰偍偔丅僸乕僾偑攋懝偟偨帪偵専弌偟堈偔偡傞偨傔偱偡丅'0xCD'偼VC++偑枹弶婜壔儊儌儕傪僋儕傾偡傞抣偵曧偄傑偟偨丅暿偺抣偱傕峔偄傑偣傫丅
}
#endif//USE_MEMSYS_DEBUG
/****************************************************************************
 *	僌儘乕僶儖娭悢
 ****************************************************************************/
//僸乕僾傪弶婜壔偟傑偡丅
//[in]
//	_buf		僸乕僾偲偟偰弶婜壔偡傞僶僢僼傽偺愭摢傾僪儗僗丅
//	size		_buf偺僶僀僩悢丅
//			4偺攞悢偱丄(4*2)埲忋偺抣傪巜掕偟偰壓偝偄丅
void MemSys_Init(void* _buf, int size/*(4*2)埲忋*/) {
//{{2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
//	int buf = (int)_buf, hdr;
//伀2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
	intptr_t buf = (intptr_t)_buf, hdr;
//}}2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
    #ifdef  USE_MEMSYS_DEBUG
	if(((buf | size) & 3) ||					//僶僢僼傽傾僪儗僗,枖偼,僶僢僼傽僒僀僘偑丄儚乕僪僒僀僘偺攞悢偱側偗傟偽丄僄儔乕掆巭偡傞丅
	   (size < (4 * 2))) { DIE(); }					//僶僢僼傽僒僀僘偑丄儚乕僪僒僀僘偺擇攞枹枮側傜偽丄僄儔乕掆巭偡傞丅愭摢僽儘僢僋偺僽儘僢僋僿僢僟偲丄枛旜偺僽儘僢僋偺僽儘僢僋僿僢僟偺丄彮側偔偲傕2儚乕僪昁梫偩偐傜偱偡丅
    #endif//USE_MEMSYS_DEBUG
	hdr = buf;							//愭摢僽儘僢僋偺僽儘僢僋僿僢僟偺丄傾僪儗僗傪媮傔傞丅
	size -= 4/*枛旜僽儘僢僋偺僽儘僢僋僿僢僟偺暘*/;			//愭摢僽儘僢僋偺僽儘僢僋僿僢僟偺丄僽儘僢僋僒僀僘傪媮傔傞丅
	*(int*)hdr  = size;						//愭摢僽儘僢僋偺僽儘僢僋僿僢僟偵丄僽儘僢僋僒僀僘傪奿擺偡傞丅
    #ifdef  USE_MEMSYS_DEBUG
	MemSys_FillDummyData(hdr);					//嬻偒儊儌儕傪僟儈乕僨乕僞偱僋儕傾偟偰偍偔丅僸乕僾偑攋懝偟偨帪偵専弌偟堈偔偡傞偨傔偱偡丅
    #endif//USE_MEMSYS_DEBUG
	       hdr += size;						//枛旜僽儘僢僋偺僽儘僢僋僿僢僟偺丄傾僪儗僗傪媮傔傞丅
	*(int*)hdr  = 0;						//枛旜僽儘僢僋偺僽儘僢僋僿僢僟偵丄枛旜僽儘僢僋傪帵偡僽儘僢僋僒僀僘(size==0)傪奿擺偡傞丅
}
/*---------------------------------------------------------------------------*/
//儊儌儕傪妋曐偟傑偡丅
//[in]
//	_buf		僸乕僾偲偟偰弶婜壔偟偨僶僢僼傽偺愭摢傾僪儗僗丅
//	size		妋曐偡傞儊儌儕偺僶僀僩悢丅
//			0埲忋偱丄擟堄偺抣傪巜掕弌棃傑偡丅
//[out]
//	栠傝抣		(size>0)偑巜掕偝傟丄儊儌儕妋曐偑惉岟偟偨応崌偼丄妋曐偟偨儊儌儕偺愭摢傾僪儗僗傪曉偟傑偡丅
//			(size>0)偑巜掕偝傟丄儊儌儕妋曐偑幐攕偟偨応崌偼丄NULL億僀儞僞傪曉偟傑偡丅
//			(size==0)偑巜掕偝傟偨応崌偼丄壗傕偣偢偵丄NULL億僀儞僞傪曉偟傑偡丅
//[note]
//	- 摉娭悢偼丄僗儗僢僪僙乕僼偱偡丅
//	  P/ECE偺妱傝崬傒儖乕僠儞撪傗丄Win32偺儅儖僠僗儗僢僪娐嫬偱傕丄巊梡弌棃傑偡丅
void* MemSys_Alloc(void* _buf, int size/*0壜*/) {
//{{2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
//	int buf = (int)_buf, ptr = 0;					//妋曐偡傞僒僀僘偑0僶僀僩偩偭偨応崌,枖偼,妋曐幐攕偟偨応崌偺偨傔偵丄栠傝抣偺億僀儞僞傪NULL偲偟偰偍偔丅
//	int hdr1, size1, hdr2, size2;
//伀2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
	intptr_t buf = (intptr_t)_buf, ptr = 0, hdr1, hdr2;		//妋曐偡傞僒僀僘偑0僶僀僩偩偭偨応崌,枖偼,妋曐幐攕偟偨応崌偺偨傔偵丄栠傝抣偺億僀儞僞傪NULL偲偟偰偍偔丅
	int size1, size2;
//}}2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
    #ifdef  USE_MEMSYS_DEBUG
	if((buf & 3) ||							//僶僢僼傽傾僪儗僗偑丄儚乕僪惍楍偟偰偄側偗傟偽僄儔乕掆巭偡傞丅
	   (size < 0)) { DIE(); }					//妋曐偡傞僒僀僘偑丄0枹枮側傜偽僄儔乕掆巭偡傞丅
    #endif//USE_MEMSYS_DEBUG
	if(size) {							//妋曐偡傞僒僀僘偑0僶僀僩側傜偽丄壗傕偣偢偵NULL億僀儞僞傪曉偡丅妋曐偡傞僒僀僘偑0僶僀僩偱側偗傟偽乧
		size = (size + 3) & ~3;					//妋曐偡傞僒僀僘傪丄儚乕僪僒僀僘偺攞悢偵愗傝忋偘傞丅
		size += 4;						//妋曐偡傞僒僀僘偵丄僽儘僢僋僿僢僟偺儚乕僪僒僀僘傪壛嶼偡傞丅
		hdr1 = buf;						//愭摢僽儘僢僋偺僽儘僢僋僿僢僟偺丄傾僪儗僗傪媮傔傞丅
ENTER_CS;
		for(;;) {
			size1 = *(int*)hdr1;				//尰嵼偺僽儘僢僋僿僢僟偐傜丄尰嵼偺僽儘僢僋偺僽儘僢僋僒僀僘傪庢摼偡傞丅
		    #ifdef  USE_MEMSYS_DEBUG
			if(size1 & 3) { DIE(); }			//僽儘僢僋僒僀僘偑丄儚乕僪僒僀僘偺攞悢偱側偗傟偽丄僄儔乕掆巭偡傞丅偙偙偱掆巭偟偨応崌偼丄晄惓側億僀儞僞傪儕僒僀僘偟傛偆偲偟偨壜擻惈偑桳傝傑偡丅
		    #endif//USE_MEMSYS_DEBUG
			if(size1 > 0) {					//尰嵼偺僽儘僢僋偑丄嬻偒僽儘僢僋側傜偽乧
				if(size1 >= size) {			//尰嵼偺僽儘僢僋偺僽儘僢僋僒僀僘偑丄妋曐偡傞僒僀僘埲忋側傜偽乧
					*(int*)hdr1 = -size;		//尰嵼偺僽儘僢僋偺僽儘僢僋僿僢僟偵丄巊梡拞偺僽儘僢僋偱偁傞帠傪帵偡丄(-僽儘僢僋僒僀僘)傪奿擺偡傞丅
					if(size1 != size) {		//尰嵼偺僽儘僢僋偺僽儘僢僋僒僀僘偑丄妋曐偡傞僒僀僘傛傝傕戝偒偐偭偨応崌偼乧
						*(int*)(hdr1 + size) = size1 - size;	//尰嵼偺僽儘僢僋傪暘妱偡傞埵抲偵丄怴偟偄僽儘僢僋偺僽儘僢僋僿僢僟傪嶌惉偡傞丅
					}
					ptr = hdr1 + 4;			//儖乕僾傪敳偗偰丄尰嵼偺僽儘僢僋偺丄僽儘僢僋僿僢僟偺捈屻傊偺億僀儞僞傪曉偡丅
					break;	//偙偙傑偱
				} else {				//尰嵼偺僽儘僢僋偺僽儘僢僋僒僀僘偑丄妋曐偡傞僒僀僘枹枮側傜偽乧
					hdr2 = hdr1 + size1;		//師偺僽儘僢僋偺僽儘僢僋僿僢僟偺丄傾僪儗僗傪媮傔傞丅
					size2 = *(int*)hdr2;		//師偺僽儘僢僋僿僢僟偐傜丄師偺僽儘僢僋偺僽儘僢僋僒僀僘傪庢摼偡傞丅
				    #ifdef  USE_MEMSYS_DEBUG
					if(size2 & 3) { DIE(); }	//僽儘僢僋僒僀僘偑丄儚乕僪僒僀僘偺攞悢偱側偗傟偽丄僄儔乕掆巭偡傞丅偙偙偱掆巭偟偨応崌偼丄僸乕僾偑攋懝偟偰偄傞壜擻惈偑桳傝傑偡丅
				    #endif//USE_MEMSYS_DEBUG
					if(size2 > 0) {			//師偺僽儘僢僋偑丄嬻偒僽儘僢僋側傜偽乧
						size1 += size2;		//尰嵼偺僽儘僢僋偺僽儘僢僋僒僀僘偵丄師偺僽儘僢僋偺僽儘僢僋僒僀僘傪壛嶼偡傞丅
						*(int*)hdr1 = size1;	//尰嵼偺僽儘僢僋偺僽儘僢僋僿僢僟偵丄尰嵼偺僽儘僢僋偲師偺僽儘僢僋傪壛嶼偟偨僽儘僢僋僒僀僘傪奿擺偡傞丅師偺for儖乕僾偱丄尰嵼偺僽儘僢僋偐傜嵞搙妋曐傪帋傒傞丅
					} else {			//師偺僽儘僢僋偑丄巊梡拞偺僽儘僢僋,枖偼,枛旜僽儘僢僋側傜偽乧
						hdr1 = hdr2;		//尰嵼偺僽儘僢僋傪丄師偺僽儘僢僋傊恑傔傞丅
					}
				}
			} else if(size1 < 0) {				//尰嵼偺僽儘僢僋偑丄巊梡拞偺僽儘僢僋側傜偽乧
				hdr1 -= size1;				//尰嵼偺僽儘僢僋傪丄師偺僽儘僢僋傊恑傔傞丅(size1==(-僽儘僢僋僒僀僘))偱偡偐傜丄師偺僽儘僢僋傊恑傔傞偵偼丄乽hdr1+=(-size1)乿,懄偪,乽hdr1-=size1乿偲偟傑偡丅
			} else {					//尰嵼偺僽儘僢僋偑丄枛旜僽儘僢僋側傜偽乧
				break;	//偙偙傑偱			//妋曐幐攕側偺偱丄儖乕僾傪敳偗偰NULL億僀儞僞傪曉偡丅
			}
		}
LEAVE_CS;
	}
	return (void*)ptr;
}
/*---------------------------------------------------------------------------*/
//儊儌儕傪夝曻偟傑偡丅
//[in]
//	_ptr		夝曻偡傞儊儌儕偺愭摢傾僪儗僗,枖偼,NULL億僀儞僞丅
//			(_ptr==NULL)偑巜掕偝傟偨応崌偼丄壗傕偟傑偣傫丅
//[note]
//	- 摉娭悢偼丄僗儗僢僪僙乕僼偱偡丅
//	  P/ECE偺妱傝崬傒儖乕僠儞撪傗丄Win32偺儅儖僠僗儗僢僪娐嫬偱傕丄巊梡弌棃傑偡丅
void MemSys_Free(void* _ptr/*NULL壜*/) {
//{{2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
//	int ptr = (int)_ptr;
//	int hdr, size;
//伀2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
	intptr_t ptr = (intptr_t)_ptr, hdr;
	int size;
//}}2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
	if(ptr) {							//夝曻偟傛偆偲偟偰偄傞億僀儞僞偑丄NULL億僀儞僞側傜偽壗傕偟側偄丅NULL億僀儞僞偱側偗傟偽乧
	    #ifdef  USE_MEMSYS_DEBUG
		if(ptr & 3) { DIE(); }					//夝曻偟傛偆偲偟偰偄傞億僀儞僞偑丄儚乕僪惍楍偟偰偄側偗傟偽僄儔乕掆巭偡傞丅
	    #endif//USE_MEMSYS_DEBUG
		hdr = ptr - 4;						//夝曻偟傛偆偲偟偰偄傞億僀儞僞偺丄僽儘僢僋僿僢僟偺傾僪儗僗傪媮傔傞丅
ENTER_CS;
		size = *(int*)hdr;					//僽儘僢僋僿僢僟偐傜丄僽儘僢僋僒僀僘傪庢摼偡傞丅巊梡拞偺僽儘僢僋僿僢僟偵奿擺偝傟偰偄傞僽儘僢僋僒僀僘偼丄(-僽儘僢僋僒僀僘)側偺偱丄(size<0)偱偁傞偼偢偱偡丅
	    #ifdef  USE_MEMSYS_DEBUG
		if((size & 3) ||					//僽儘僢僋僒僀僘偑丄儚乕僪僒僀僘偺攞悢偱側偗傟偽丄僄儔乕掆巭偡傞丅偙偙偱掆巭偟偨応崌偼丄晄惓側億僀儞僞傪夝曻偟傛偆偲偟偨壜擻惈偑桳傝傑偡丅
		   (size >= 0)) { DIE(); }				//僽儘僢僋僒僀僘偑丄嬻偒僽儘僢僋傪帵偡僽儘僢僋僒僀僘(size>0),枖偼,枛旜僽儘僢僋傪帵偡僽儘僢僋僒僀僘(size==0)側傜偽丄僄儔乕掆巭偡傞丅偙偙偱掆巭偟偨応崌偼丄晄惓側億僀儞僞傪夝曻偟傛偆偲偟偨,枖偼,嬻偒僽儘僢僋傪夝曻偟傛偆偲偟偨壜擻惈偑桳傝傑偡丅
	    #endif//USE_MEMSYS_DEBUG
		size = -size;						//僽儘僢僋僒僀僘傪丄嬻偒僽儘僢僋傪帵偡僽儘僢僋僒僀僘(size>0)偵曄姺偡傞丅
		*(int*)hdr = size;					//夝曻偟偨僽儘僢僋偺僽儘僢僋僿僢僟偵丄嬻偒僽儘僢僋傪帵偡僽儘僢僋僒僀僘(size>0)傪奿擺偡傞丅
	    #ifdef  USE_MEMSYS_DEBUG
		MemSys_FillDummyData(hdr);				//嬻偒儊儌儕傪僟儈乕僨乕僞偱僋儕傾偟偰偍偔丅僸乕僾偑攋懝偟偨帪偵専弌偟堈偔偡傞偨傔偱偡丅
	    #endif//USE_MEMSYS_DEBUG
LEAVE_CS;
	}
}
/*---------------------------------------------------------------------------*/
//儊儌儕傪儕僒僀僘偟傑偡丅
//[in]
//	_buf		僸乕僾偲偟偰弶婜壔偟偨僶僢僼傽偺愭摢傾僪儗僗丅
//	_ptr		儕僒僀僘偡傞儊儌儕偺愭摢傾僪儗僗,枖偼,NULL億僀儞僞丅
//			(_ptr==NULL)偑巜掕偝傟偨応崌偼丄MemSys_Alloc(_buf,size)偲摨偠摦嶌偲側傝傑偡丅
//	size		儕僒僀僘屻偺僶僀僩悢,枖偼,0丅
//			(size==0)偑巜掕偝傟偨応崌偼丄MemSys_Free(_ptr)偲摨偠摦嶌偲側傝傑偡丅
//[out]
//	栠傝抣		栠傝抣偺巇條偼丄realloc()偲摨條偱偡丅嬶懱揑偵偼丄埲壓偺捠傝偱偡丅
//			(_ptr==NULL)偑巜掕偝傟偨応崌偺栠傝抣偼丄MemSys_Alloc()偺愢柧傪嶲徠偟偰壓偝偄丅
//			(size==0)偑巜掕偝傟偨応崌偺栠傝抣偼丄忢偵丄NULL億僀儞僞偱偡丅
//			(_ptr!=NULL)&&(size>0)偑巜掕偝傟偨応崌丄儊儌儕偺儕僒僀僘偑惉岟偟偨応崌丄儕僒僀僘屻偺儊儌儕偺愭摢傾僪儗僗傪曉偟傑偡丅
//			                                        儊儌儕偺儕僒僀僘偑幐攕偟偨応崌丄NULL億僀儞僞傪曉偟傑偡丅儕僒僀僘慜偺儊儌儕偼惗偒偰偄傑偡丅
//[note]
//	- 摉娭悢偼丄僗儗僢僪僙乕僼偱偡丅
//	  P/ECE偺妱傝崬傒儖乕僠儞撪傗丄Win32偺儅儖僠僗儗僢僪娐嫬偱傕丄巊梡弌棃傑偡丅
void* MemSys_Resize(void* _buf, void* _ptr/*NULL壜*/, int size/*0壜*/) {
	if(!_ptr) {
		return MemSys_Alloc(_buf, size);
	} else if(!size) {
		MemSys_Free(_ptr);
		return NULL;
	} else {
//{{2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
//		int ptr = (int)_ptr;
//		int hdr1, size1;
//伀2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
		intptr_t ptr = (intptr_t)_ptr, hdr1;
		int size1;
//}}2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
	    #ifdef  USE_MEMSYS_DEBUG
//{{2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
//		int buf = (int)_buf;
//伀2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
		intptr_t buf = (intptr_t)_buf;
//}}2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
		if(((buf | ptr) & 3) ||					//僶僢僼傽傾僪儗僗,枖偼,儕僒僀僘偟傛偆偲偟偰偄傞億僀儞僞偑丄儚乕僪惍楍偟偰偄側偗傟偽僄儔乕掆巭偡傞丅
		   (size < 0)) { DIE(); }				//儕僒僀僘屻偺僒僀僘偑丄0枹枮側傜偽僄儔乕掆巭偡傞丅
	    #endif//USE_MEMSYS_DEBUG
		size = (size + 3) & ~3;					//儕僒僀僘屻偺僒僀僘傪丄儚乕僪僒僀僘偺攞悢偵愗傝忋偘傞丅
		size += 4;						//儕僒僀僘屻偺僒僀僘偵丄僽儘僢僋僿僢僟偺儚乕僪僒僀僘傪壛嶼偡傞丅
		hdr1 = ptr - 4;						//儕僒僀僘偟傛偆偲偟偰偄傞億僀儞僞偺丄僽儘僢僋僿僢僟偺傾僪儗僗傪媮傔傞丅
ENTER_CS;
		size1 = *(int*)hdr1;					//僽儘僢僋僿僢僟偐傜丄僽儘僢僋僒僀僘傪庢摼偡傞丅巊梡拞偺僽儘僢僋僿僢僟偵奿擺偝傟偰偄傞僽儘僢僋僒僀僘偼丄(-僽儘僢僋僒僀僘)側偺偱丄(size1<0)偱偁傞偼偢偱偡丅
	    #ifdef  USE_MEMSYS_DEBUG
		if((size1 & 3) ||					//僽儘僢僋僒僀僘偑丄儚乕僪僒僀僘偺攞悢偱側偗傟偽丄僄儔乕掆巭偡傞丅偙偙偱掆巭偟偨応崌偼丄晄惓側億僀儞僞傪夝曻偟傛偆偲偟偨壜擻惈偑桳傝傑偡丅
		   (size1 >= 0)) { DIE(); }				//僽儘僢僋僒僀僘偑丄嬻偒僽儘僢僋傪帵偡僽儘僢僋僒僀僘(size1>0),枖偼,枛旜僽儘僢僋傪帵偡僽儘僢僋僒僀僘(size1==0)側傜偽丄僄儔乕掆巭偡傞丅偙偙偱掆巭偟偨応崌偼丄晄惓側億僀儞僞傪夝曻偟傛偆偲偟偨,枖偼,嬻偒僽儘僢僋傪夝曻偟傛偆偲偟偨壜擻惈偑桳傝傑偡丅
	    #endif//USE_MEMSYS_DEBUG
		size1 = -size1;						//儕僒僀僘慜偺僽儘僢僋僒僀僘傪丄惓悢偵曄姺偡傞丅
		if(size1 > size) {					//儕僒僀僘慜偺僽儘僢僋僒僀僘偑丄儕僒僀僘屻偺僽儘僢僋僒僀僘傛傝傕戝偒偗傟偽乧
			*(int*)hdr1 = -size;				//儕僒僀僘偟偨僽儘僢僋偺僽儘僢僋僿僢僟偵丄巊梡拞偺僽儘僢僋偱偁傞帠傪帵偡丄(-儕僒僀僘屻偺僽儘僢僋僒僀僘)傪奿擺偡傞丅
			*(int*)(hdr1 + size) = size1 - size;		//儕僒僀僘偟偨僽儘僢僋傪暘妱偡傞埵抲偵丄怴偟偄僽儘僢僋偺僽儘僢僋僿僢僟傪嶌惉偡傞丅
		} else if(size1 < size) {				//儕僒僀僘慜偺僽儘僢僋僒僀僘偑丄儕僒僀僘屻偺僽儘僢僋僒僀僘傛傝傕彫偝偗傟偽乧
//{{2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
//			ptr = (int)MemSys_Alloc(_buf, size - 4/*朰傟側偄偱!!*/);	//怴偟偄僽儘僢僋傪妋曐偡傞丅	仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸TODO:偦偺応偱慜曽,枖偼,屻曽傊奼挘弌棃傞応崌偼偦偆偟傠丅偦偺曽偑嬻偒儊儌儕偑彮側偔偰傕儕僒僀僘惉岟弌棃傞壜擻惈偑崅偔側傞丅仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸
//伀2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
			ptr = (intptr_t)MemSys_Alloc(_buf, size - 4/*朰傟側偄偱!!*/);	//怴偟偄僽儘僢僋傪妋曐偡傞丅	仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸TODO:偦偺応偱慜曽,枖偼,屻曽傊奼挘弌棃傞応崌偼偦偆偟傠丅偦偺曽偑嬻偒儊儌儕偑彮側偔偰傕儕僒僀僘惉岟弌棃傞壜擻惈偑崅偔側傞丅仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸仸
//}}2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
			if(ptr) {					//妋曐惉岟側傜偽乧
				memcpy((void*)ptr, _ptr, size1 - 4/*朰傟側偄偱!!*/);	//怴偟偄僽儘僢僋偵丄儕僒僀僘慜偺僽儘僢僋偐傜丄僽儘僢僋僿僢僟傪彍偄偨晹暘傪僐僺乕偡傞丅
				MemSys_Free(_ptr);			//儕僒僀僘慜偺僽儘僢僋傪夝曻偡傞丅
			} else {					//妋曐幐攕側傜偽乧
				/** no job **/				//儕僒僀僘慜偺僽儘僢僋傪夝曻偣偢偵丄NULL億僀儞僞傪曉偡丅偙偙偱婛偵(ptr==NULL)偵側偭偰偄傞偺偱丄柧帵揑偵(ptr=0)傪峴偆昁梫偼桳傝傑偣傫丅
			}
		} else {						//儕僒僀僘屻偺僽儘僢僋僒僀僘偲丄儕僒僀僘慜偺僽儘僢僋僒僀僘偑摨偠側傜偽乧
			/** no job **/
		}
LEAVE_CS;
		return (void*)ptr;
	}
}
/*---------------------------------------------------------------------------*/
#ifdef  USE_MEMSYS_DUMP
//僸乕僾偺忬懺傪僥僉僗僩僟儞僾偟傑偡丅
//[in]
//	fp		弌椡愭僗僩儕乕儉丅
//	_buf		僸乕僾偲偟偰弶婜壔偟偨僶僢僼傽偺愭摢傾僪儗僗丅
void MemSys_Dump(FILE* fp, const void* _buf) {
//{{2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
//	int base = (int)_buf, addr = (int)_buf, size;
//伀2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
	intptr_t base = (intptr_t)_buf, addr = (intptr_t)_buf;
	int size;
//}}2016/10/02曄峏:64價僢僩懳墳偺偨傔偵丄(int)偱傾僪儗僗墘嶼傪峴偭偰偄偨偺傪丄(intptr_t)偱峴偆傛偆偵廋惓偟傑偟偨丅
#ifdef  PIECE
// - P/ECE奐敪娐嫬偺gcc33.exe偼丄彂幃暥帤楍拞偺乽乣%'d乣乿偺乽'乿傪擣幆偟側偄偺偱丄偦偺傑傑偱偼乽warning: unknown conversion type character `'' in format乿偲偄偆寈崘偑昞帵偝傟偰偟傑偄傑偡丅
//   偙偺寈崘傪夞旔偡傞偨傔偵丄摉娭悢撪偱偼fprintf傪娭悢億僀儞僞傪宱桼偟偰屇傃弌偡傛偆偵偟傑偟偨丅
//   偦偆偡傟偽丄gcc33.exe偵偼fprintf偺屇傃弌偟偱偁傞帠偑敾傜側偄偺偱丄寈崘偑昞帵偝傟傑偣傫丅
//   暿偺曽朄偲偟偰丄'-Wno-format'僐儞僷僀儔僆僾僔儑儞傪巜掕偡傞曽朄傕桳傝傑偡偑丄慡偰偺僜乕僗僼傽僀儖偵懳偟偰寈崘偑弌側偔側偭偰偟傑偆偺偼婋尟側偺偱丄尰嵼偺強偼屄暿偵夞旔偡傞帠偵偟傑偟偨丅
// - 偪側傒偵丄僜乕僗僐乕僪忋偼娭悢億僀儞僞傪宱桼偟偰屇傃弌偟偰偄傑偡偑丄惗惉偝傟傞傾僙儞僽儔僐乕僪偱偼fprintf偺捈愙屇傃弌偟偵側傝丄僆乕僶乕僿僢僪偼桳傝傑偣傫丅(clipmems.ps傪尒偰妋擣偟偨丅)
//   娭悢億僀儞僞_fprintf偵丄const廋忺巕傪晅偗偰偄傞偺偱丄僐儞僷僀儔偺嵟揔壔偑岠偔偺偩偲巚偄傑偡丅
int (* const _fprintf)(FILE*,const char*,...) = fprintf;
#undef  fprintf
#define fprintf _fprintf
#endif//PIECE
// * Sun Oct 02 21:48:17 JST 2016 Naoyuki Sawa
// - MemSys_Dump()傪32價僢僩斉偲64價僢僩斉偺椉懳墳偵偟傑偟偨丅
//   曄峏売強偑懡偐偭偨偺偱丄曄峏慜偺僐乕僪偼僐儊儞僩傾僂僩偟偰巆偟偰偄傑偣傫丅
//   曄峏慜偺僐乕僪傪嶲徠偡傞昁梫偑桳傞応崌偼丄慜夞偺傾乕僇僀僽傪嶲徠偟偰壓偝偄丅
// - 32價僢僩斉偲64價僢僩斉偱埲壓偺張棟傪嫟捠壔偡傞偨傔偵丄(intptr_t)偺昞帵寘悢傪儅僋儘掕媊偟傑偟偨丅
//   32價僢僩斉側傜偽(ADDR_DIG=8)丄64價僢僩斉側傜偽(ADDR_DIG=16)偵側傝傑偡丅
// - 埲壓偺張棟偱偼丄(intptr_t)偺挿偝廋忺巕偲偟偰'z'傪巊梡偟偰偄傑偡丅
//   尩枾偵偼'z'偼(intptr_t)偺挿偝廋忺巕偱偼側偔(size_t)偺挿偝廋忺巕側偺偱偡偑丄(intptr_t)偺挿偝廋忺巕偼掕媊偝傟偰偄側偄偺偱巇曽柍偔偦偆偟傑偟偨丅
//   偪側傒偵Linux偺応崌偼丄(intptr_t)偺僼僅乕儅僢僩巜掕巕偲偟偰'PRIxPTR'摍偑掕媊偝傟偰偄傞偦偆偱偡丅
#undef  ADDR_DIG
#define ADDR_DIG (sizeof(intptr_t)*2)
	fprintf(fp, "%*s        僒僀僘  僆僼僙僢僩  僶僀僫儕僨乕僞                                         暥帤楍僨乕僞\n", ADDR_DIG, "傾僪儗僗");
	for(;;) {
		size = *(int*)addr;
		if(size < 0) {
			size = -size;
			if(addr == base) {
				fprintf(fp,   "%*s劕劒劒劒劒劒劒劖%'zd\n",      ADDR_DIG, "",       addr     - base);
			} else {
				fprintf(fp,   "%*s劙劒劒劒劒劒劒劜%'zd\n",      ADDR_DIG, "",       addr     - base);
			}					
				fprintf(fp,   "%*s劔%'12d"     "劔\n",          ADDR_DIG, "", size);
				fprintf(fp, "%0*zX劙劒劒劒劒劒劒劜%'zd\n",      ADDR_DIG, addr + 4, addr + 4 - base);
				fprintf(fp,   "%*s劔            劔\n",          ADDR_DIG, "");
				fprintf(fp,   "%*s劔   巊梡拞   劔           ", ADDR_DIG, "");
				{
					int i, c;
					for(i = 4; i < (4 + 16/*挷惍壜*/); i++) {
						if(i < size) {
							c = *(uint8_t*)(addr + i);
							fprintf(fp, " %02X", c);
						} else {
							fputs("   ", fp);
						}
					}
					if(size > 16/*挷惍壜*/) {
						fputs(" ...    ", fp);
					} else {
						fputs("        ", fp);
					}
					for(i = 4; i < (4 + 16/*挷惍壜*/); i++) {
						if(i < size) {
							c = *(uint8_t*)(addr + i);
							if(!isprint(c)) { c = '.'; }
							fputc(c, fp);
						}
					}
					if(size > 16/*挷惍壜*/) {
						fputs(" ...", fp);
					}
					fputc('\n', fp);
				}
				fprintf(fp,   "%*s劔            劔\n",          ADDR_DIG, "");
		} else if(size > 0) {
			if(addr == base) {
				fprintf(fp,   "%*s劇劅劅劅劅劅劅劉%'zd\n",      ADDR_DIG, "",       addr     - base);
			} else {
				fprintf(fp,   "%*s劌劅劅劅劅劅劅劎%'zd\n",      ADDR_DIG, "",       addr     - base);
			}
				fprintf(fp,   "%*s劆%'12d"     "劆\n",          ADDR_DIG, "", size);
			if(size > 4) {
				fprintf(fp,   "%*s劌劅劅劅劅劅劅劎%'zd\n",      ADDR_DIG, "",       addr + 4 - base);
				fprintf(fp,   "%*s劆            劆\n",          ADDR_DIG, "");
				fprintf(fp,   "%*s劆     嬻     劆\n",          ADDR_DIG, "");
				fprintf(fp,   "%*s劆            劆\n",          ADDR_DIG, "");
			}
		} else {
				fprintf(fp,   "%*s劌劅劅劅劅劅劅劎%'zd\n",      ADDR_DIG, "",       addr     - base);
				fprintf(fp,   "%*s劆%'12d"     "劆\n",          ADDR_DIG, "", size);
				fprintf(fp,   "%*s劋劅劅劅劅劅劅劊%'zd\n",      ADDR_DIG, "",       addr + 4 - base);
				break;
		}
		addr += size;
	}
#undef  ADDR_DIG
#ifdef  PIECE
#undef  _fprintf
#endif//PIECE
}
#endif//USE_MEMSYS_DUMP
/****************************************************************************
 *	巊梡椺
 ****************************************************************************/
//
//	嘆	MemSys_Init(buf,128)		嘇	x=MemSys_Alloc(buf,32)		嘊	y=MemSys_Alloc(buf,48)		嘋	MemSys_Free(x)			嘍	y=MemSys_Resize(buf,y,16)	嘐	y=MemSys_Resize(buf,y,48)	嘑	x=MemSys_Alloc(buf,48)	
//																																			
//	buf	劇劅劅劅劅劅劅劅劉		buf	劕劒劒劒劒劒劒劒劖		buf	劕劒劒劒劒劒劒劒劖		buf	劇劅劅劅劅劅劅劅劉		buf	劇劅劅劅劅劅劅劅劉		buf	劇劅劅劅劅劅劅劅劉		buf	劕劒劒劒劒劒劒劒劖	
//		劆僽儘僢僋僿僢僟劆=124			劔僽儘僢僋僿僢僟劔=-36			劔僽儘僢僋僿僢僟劔=-36			劆僽儘僢僋僿僢僟劆=36			劆僽儘僢僋僿僢僟劆=36			劆僽儘僢僋僿僢僟劆=36			劔僽儘僢僋僿僢僟劔=-52	
//		劌丒丒丒丒丒丒丒劎		buf+4	x 丒丒丒丒丒丒丒劜		buf+4	x 丒丒丒丒丒丒丒劜		buf+4	劌丒丒丒丒丒丒丒劎		buf+4	劌丒丒丒丒丒丒丒劎		buf+4	劌丒丒丒丒丒丒丒劎		buf+4	x 丒丒丒丒丒丒丒劜	
//		劆		劆			劔		劔			劔		劔			劆		劆			劆		劆			劆		劆			劔		劔	
//		劆		劆			劔儐乕僓乕僨乕僞劔			劔儐乕僓乕僨乕僞劔			劆	嬻	劆			劆	嬻	劆			劆	嬻	劆			劔		劔	
//		劆		劆			劔		劔			劔		劔			劆		劆			劆		劆			劆		劆			劔儐乕僓乕僨乕僞劔	
//		劆		劆		buf+36	劙劒劒劒劒劒劒劒劜		buf+36	劙劒劒劒劒劒劒劒劜		buf+36	劙劒劒劒劒劒劒劒劜		buf+36	劙劒劒劒劒劒劒劒劜		buf+36	劌劅劅劅劅劅劅劅劎			劔		劔	
//		劆		劆			劆僽儘僢僋僿僢僟劆=216			劔僽儘僢僋僿僢僟劔=-52			劔僽儘僢僋僿僢僟劔=-52			劔僽儘僢僋僿僢僟劔=-20			劆僽儘僢僋僿僢僟劆=20			劔		劔	
//		劆		劆		buf+40	劌丒丒丒丒丒丒丒劎		buf+40	y 丒丒丒丒丒丒丒劜		buf+40	y 丒丒丒丒丒丒丒劜		buf+40	y 丒丒丒丒丒丒丒劜		buf+40	劌丒丒丒丒丒丒丒劎		buf+40	劌劅劅劅劅劅劅劅劎	
//		劆		劆			劆		劆			劔		劔			劔		劔			劔儐乕僓乕僨乕僞劔			劆	嬻	劆			劆僽儘僢僋僿僢僟劆=4	
//		劆		劆			劆		劆			劔		劔			劔		劔		buf+56	劌劅劅劅劅劅劅劅劎		buf+56	劙劒劒劒劒劒劒劒劜		buf+56	劙劒劒劒劒劒劒劒劜	
//		劆		劆			劆		劆			劔儐乕僓乕僨乕僞劔			劔儐乕僓乕僨乕僞劔			劆僽儘僢僋僿僢僟劆=32			劔僽儘僢僋僿僢僟劔=52			劔僽儘僢僋僿僢僟劔=52	
//		劆	嬻	劆			劆		劆			劔		劔			劔		劔		buf+60	劌丒丒丒丒丒丒丒劎		buf+60	y 丒丒丒丒丒丒丒劜		buf+60	y 丒丒丒丒丒丒丒劜	
//		劆		劆			劆		劆			劔		劔			劔		劔			劆	嬻	劆			劔		劔			劔		劔	
//		劆		劆			劆		劆			劔		劔			劔		劔			劆		劆			劔		劔			劔		劔	
//		劆		劆			劆	嬻	劆		buf+88	劌劅劅劅劅劅劅劅劎		buf+88	劌劅劅劅劅劅劅劅劎		buf+88	劌劅劅劅劅劅劅劅劎			劔儐乕僓乕僨乕僞劔			劔儐乕僓乕僨乕僞劔	
//		劆		劆			劆		劆			劆僽儘僢僋僿僢僟劆=36			劆僽儘僢僋僿僢僟劆=36			劆僽儘僢僋僿僢僟劆=36			劔		劔			劔		劔	
//		劆		劆			劆		劆		buf+92	劌丒丒丒丒丒丒丒劎		buf+92	劌丒丒丒丒丒丒丒劎		buf+92	劌丒丒丒丒丒丒丒劎			劔		劔			劔		劔	
//		劆		劆			劆		劆			劆		劆			劆		劆			劆		劆		buf+108	劙劒劒劒劒劒劒劒劜		buf+108	劌劅劅劅劅劅劅劅劎	
//		劆		劆			劆		劆			劆		劆			劆		劆			劆		劆			劆僽儘僢僋僿僢僟劆=16			劆僽儘僢僋僿僢僟劆=16	
//		劆		劆			劆		劆			劆	嬻	劆			劆	嬻	劆			劆	嬻	劆		buf+112	劌丒丒丒丒丒丒丒劎		buf+112	劌丒丒丒丒丒丒丒劎	
//		劆		劆			劆		劆			劆		劆			劆		劆			劆		劆			劆	嬻	劆			劆	嬻	劆	
//		劆		劆			劆		劆			劆		劆			劆		劆			劆		劆			劆		劆			劆		劆	
//	buf+124	劌劅劅劅劅劅劅劅劎		buf+124	劌劅劅劅劅劅劅劅劎		buf+124	劌劅劅劅劅劅劅劅劎		buf+124	劌劅劅劅劅劅劅劅劎		buf+124	劌劅劅劅劅劅劅劅劎		buf+124	劌劅劅劅劅劅劅劅劎		buf+124	劌劅劅劅劅劅劅劅劎	
//		劆僽儘僢僋僿僢僟劆=0			劆僽儘僢僋僿僢僟劆=0			劆僽儘僢僋僿僢僟劆=0			劆僽儘僢僋僿僢僟劆=0			劆僽儘僢僋僿僢僟劆=0			劆僽儘僢僋僿僢僟劆=0			劆僽儘僢僋僿僢僟劆=0	
//		劋劅劅劅劅劅劅劅劊			劋劅劅劅劅劅劅劅劊			劋劅劅劅劅劅劅劅劊			劋劅劅劅劅劅劅劅劊			劋劅劅劅劅劅劅劅劊			劋劅劅劅劅劅劅劅劊			劋劅劅劅劅劅劅劅劊	
//
/****************************************************************************
 *	僥僗僩僗僀乕僩
 ****************************************************************************/
#if 0
//2016/06/12尰嵼丄Windows偲P/ECE偱惓忢偵摦嶌偡傞帠傪妋擣偟傑偟偨丅
#define nBlock (1<<8)	//嵟戝僽儘僢僋悢		曄峏壜
#ifdef  PIECE
#define nBytes (1<<17)	//僸乕僾僒僀僘			曄峏壜
#else //PIECE
#define nBytes (1<<20)	//僸乕僾僒僀僘			曄峏壜
#endif//PIECE
#define MinSize 1	//儊儌儕僽儘僢僋偺嵟彫僒僀僘	曄峏壜
#define MaxSize (1<<14)	//儊儌儕僽儘僢僋偺嵟戝僒僀僘	曄峏壜
#ifndef PIECE
int seed;
#endif//PIECE
char  buf[nBytes];
int   TBL_BlkSiz[nBlock];
void* TBL_BlkPtr[nBlock];
//儊儌儕僽儘僢僋偵彂偒崬傫偩僨乕僞偑夡傟偰偄側偄偐傪妋擣偡傞僒僽儖乕僠儞
void check() {
	int i, j;
	for(i = 0; i < nBlock; i++) {
		if(TBL_BlkPtr[i]) {	//偙偺儊儌儕僽儘僢僋偑妱傝摉偰傜傟偰偄傟偽乧
			uint8_t* p = TBL_BlkPtr[i];
			for(j = 1; j < TBL_BlkSiz[i]; j++) {
				if(p[j] != (uint8_t)(p[j - 1] + 1)) { DIE(); }	//p[0]傪婲揰偲偟偰+1偢偮憹偊偰偄傞偼偢
			}
		}
	}
}
//儊儌儕僽儘僢僋傪儔儞僟儉偵儕僒僀僘偡傞儖乕僠儞
void resize() {
	int i = RND32_RANGE(seed, 0, nBlock), j;
	int   old_BlkSiz = TBL_BlkSiz[i];
	void* old_BlkPtr = TBL_BlkPtr[i];
	int   new_BlkSiz = RND32_RANGE(seed, MinSize, MaxSize+1);
	void* new_BlkPtr = MemSys_Resize(buf, old_BlkPtr, new_BlkSiz);
	if(old_BlkPtr) {	//儕僒僀僘慜偺儊儌儕僽儘僢僋偑桳傟偽乧
		if(new_BlkPtr) {	//儕僒僀僘惉岟側傜偽乧
			//儕僒僀僘慜偺儊儌儕僽儘僢僋偺僨乕僞偑夡傟偰偄側偄帠傪妋擣偡傞丅
			uint8_t* p = new_BlkPtr;
			for(j = 1; (j < old_BlkSiz) && (j < new_BlkSiz); j++) {
				if(p[j] != (uint8_t)(p[j - 1] + 1)) { DIE(); }
			}
			//儕僒僀僘屻偺僒僀僘偵崌傢偣偰怴偟偄僨乕僞傪彂偒崬傓丅
			p[0] = RND32_RANGE(seed, 0, 256);
			for(j = 1; j < new_BlkSiz; j++) {
				p[j] = (uint8_t)(p[j - 1] + 1);
			}
			if(new_BlkSiz <= old_BlkSiz) {	//弅彫曽岦偺儕僒僀僘側傜偽傾僪儗僗偼曄壔偟側偄偼偢丅
				if(new_BlkPtr != old_BlkPtr) { DIE(); }
			}
			TBL_BlkPtr[i] = new_BlkPtr;
			TBL_BlkSiz[i] = new_BlkSiz;
		} else {	//儕僒僀僘幐攕側傜偽乧
			//儕僒僀僘慜偺儊儌儕僽儘僢僋偺僨乕僞偑夡傟偰偄側偄帠傪妋擣偡傞丅
			uint8_t* p = old_BlkPtr;
			for(j = 1; j < old_BlkSiz; j++) {
				if(p[j] != (uint8_t)(p[j - 1] + 1)) { DIE(); }
			}
			if(new_BlkSiz <= old_BlkSiz) { DIE(); }
		}
	} else {	//儕僒僀僘慜偺儊儌儕僽儘僢僋偑柍偗傟偽乧
		if(new_BlkPtr) {	//儊儌儕僽儘僢僋妱傝摉偰惉岟側傜偽乧
			//儕僒僀僘屻偺僒僀僘偵崌傢偣偰怴偟偄僨乕僞傪彂偒崬傓丅
			uint8_t* p = new_BlkPtr;
			p[0] = RND32_RANGE(seed, 0, 256);
			for(j = 1; j < new_BlkSiz; j++) {
				p[j] = (uint8_t)(p[j - 1] + 1);
			}
			TBL_BlkPtr[i] = new_BlkPtr;
			TBL_BlkSiz[i] = new_BlkSiz;
		}
	}
}
//僥僗僩僾儘僌儔儉偺僄儞僩儕億僀儞僩
int app_main(int argc, char* argv[]) {
	int i, j;
	MemSys_Init(buf, nBytes);
	for(i = 0; i < nBlock; i++) {
		TBL_BlkSiz[i] = RND32_RANGE(seed, MinSize, MaxSize+1);
		TBL_BlkPtr[i] = MemSys_Alloc(buf, TBL_BlkSiz[i]);
		if(TBL_BlkPtr[i]) {	//儊儌儕僽儘僢僋妱傝摉偰惉岟側傜偽乧
			uint8_t* p = TBL_BlkPtr[i];
			p[0] = RND32_RANGE(seed, 0, 256);		//p[0]傪婲揰偲偟偰乧
			for(j = 1; j < TBL_BlkSiz[i]; j++) {
				p[j] = (uint8_t)(p[j - 1] + 1);		//+1偢偮憹偊傞抣傪奿擺偡傞丅
			}
		}
	}
	for(;;) {	//僥僗僩偺柍尷儖乕僾
		int k;
		for(k = 0; k < 10; k++) { resize(); }	//1儖乕僾偁偨傝10夞儕僒僀僘偟偰傒傞丅
		check();	//儊儌儕僽儘僢僋偵彂偒崬傫偩僨乕僞偑夡傟偰偄側偄偐?
		MemSys_Dump(stdout, buf);	//儊儌儕僽儘僢僋傪僟儞僾偡傞丅
#ifdef  PIECE
		schedule();
#endif//PIECE
	}
	return 0;
}
#endif
