//#define		PROC_DECODE

//#ifdef _WIN32
//#else
//	#include <piece.h>
//#endif

//#include "mem_ctrl.h"
//#include "decode.h"

#include <windows.h>
#include "decode.h"

#define		N	4096
#define		F	18



int decode(BYTE* pDst, BYTE* pSrc)
{
	int i, j, k, r;
	BYTE flags, len;
	BYTE* pBuf;
	DWORD pos;
	DWORD di;
	DWORD size;
//	BYTE *TmpBuf=SMEM(MEM_WORK);
	static BYTE TmpBuf[1024 * 1024]; /* このぐらいあれば充分？ */
	BYTE* pDst0 = pDst;

// pGrpBuf をテンポラリにしてみたり
//	pBuf = pGrpBuf;
//	pBuf = TmpBuf + MAX_LY*MAX_LX-N-F;
	pBuf = TmpBuf;
	r = N - F;
	for(i=0; i<N + F - 1; i++)	*(pBuf+i) = 0;
#if _WIN32
	size = *(DWORD*)pSrc;
#else
	size = *pSrc + (*(pSrc+1)<<8) + (*(pSrc+2)<<16) + (*(pSrc+3)<<24);
#endif
	pSrc+=4;
	di = 0;
	while(di < size){
		flags = *(pSrc++);
		for(j=0; j<8; j++){
			if(di >= size) break;
			if(flags & 0x80){
				*(pBuf + r++) = *(pDst++) = *(pSrc++);
				r &= (N - 1);
				di++;
			}
			else{
				pos = *(pSrc++);
				len = *(pSrc++);
				pos |= ((len & 0xf0)<<4);
				len = (len & 0x0f) + 2;
				for(k=0; k<=len; k++){
					*(pBuf + r++) = *(pDst++) = *(pBuf + ((pos + k) & (N - 1)));
					r &= (N - 1);
					di++;
					if(di >= size) break;
				}
			}
			flags <<= 1;
		}
	}

	return pDst - pDst0;
}



