#include "lib.h"

/*
*	limit : 
*		1. can't use this object in heap area
*		2. last character can't be cKEY
*	type : int
*	argument :
*		1. (sString*) sString array for store data
*		2. int sString array depth
*		3. (char*) Data Buffer to Parse
*		4. int* Buffer Length
*		5. (char) KEY character you want to split
*	return :
*		-1. not support
*		-2. out of array index
*		0. ok
*/
int sSplitToStringArray(sString* sRetArray,
						int iArrayDepth,
						char* sStringBuffer,
						int* iBufferLen,
						char cKEY){
	int iOccurCount=0;
	int i,j,k;
	if(sStringBuffer[*iBufferLen] == cKEY)
		return -1;
	for(i = 0;i < *iBufferLen;i++){
		if(sStringBuffer[i] == cKEY)
			iOccurCount++;
	}

	for(i=0,j=0,k=0;i < *iBufferLen;i++){
		if(sStringBuffer[i] == cKEY){
			j++;
			k=0;
			if(j > iArrayDepth)
				return -2;
		}else{
			sRetArray[j].m_String[k++] = sStringBuffer[i];
		}
	}
	return 0;
}

/*
*	type : int
*	argument : 
*		1. (char*) Data Buffer to Parse
*		2. int* Buffer Length
*		3. (char*) KEY character you want to find
*		4. int* key length
*		5. int* offset begin from data buffer / first key character occur in buffer
*	return :
*		0. success
*		-1. failure
*/
int iFindKeyCharacterFromBuffer(char* sDataBuffer,
						   int* iBufferLength,
						   char* sKEY,
						   int* iKEY_Length,
						   int* iOffset){
	/* Check if Job is over Buffer length return immediate */
	if((*iOffset + *iKEY_Length) > *iBufferLength)
		return -1;
	for(int i = *iOffset;i+*iKEY_Length < *iBufferLength;i++){
		if(memcmp(&sDataBuffer[i],sKEY,*iKEY_Length) == 0){
			*iOffset = i;
			return 0;
		}
	}	
	return -1;
}

/*
*	type : int
*	argument :
*		1. (char*) file path want to read
*		2. (BYTE*) buffer pointer for store file
*		3. (int*)  buffer size and file size return
*	return :
*		0. success
*		-1. file read failure
*		-2. buffer size not enougth
*/

int iFileR(char* sPath,BYTE* pBUF,int* piSize)
{
	struct _stat lfilestat;
	int result;
	FILE* pFile;
	result = _stat( sPath, &lfilestat );
	if( result != 0 )
		return -1;
	if(lfilestat.st_size > *piSize)
		return -2;
	*piSize = lfilestat.st_size;
	pFile = fopen(sPath,"rb");
	if(pFile == NULL)
		return -1;
	result = fread(pBUF,1,*piSize,pFile);
	if(result != *piSize)
	{
		fclose(pFile);
		return -1;
	}
	fclose(pFile);
	return 0;
}

/*
*	type : int
*	argument :
*		1. Windows Handle
*		2. (char*) Title for display
*		3. (char*) buffer for return string
*	return :
*		0. failure
*		n. buffer length
*/
int GetPathDialog(HWND hWnd,char* sTitle,char *pBuffer)   
{   
	BROWSEINFO   bf;   
	LPITEMIDLIST   lpitem;   
	memset(&bf,0,sizeof   BROWSEINFO);   
	bf.hwndOwner=hWnd;   
	bf.lpszTitle=sTitle;   
	bf.ulFlags=BIF_RETURNONLYFSDIRS;
	lpitem=SHBrowseForFolder(&bf);   
	if(lpitem==NULL)
		return   0;   
	SHGetPathFromIDList(lpitem,pBuffer);   
	return   lstrlen(pBuffer);   
}   


#ifndef LIB_UNIT_TEST
#define LIB_UNIT_TEST

void main(int argc,char** argv)
{
	int str_len,offset,keylen,iret;
	sString AA[10];
	char tt[]="AAA BBB CCC DDD EEE FFF GGG";

	str_len = strlen(tt);
	iret = sSplitToStringArray(AA,10,tt,&str_len,' ');

	char test[]="1234567890AA123";
	
	keylen=2;
	str_len= strlen(test);
	offset=0;
	iret = iFindKeyCharacterFromBuffer(test,&str_len,"AA",&keylen,&offset);

	/* iFileR Unit Test */
	/*
	int size,iRet;
	BYTE* pBuffer;
	size = 4096000;
	pBuffer = new BYTE[size];
	//iRet = iFileR("C:\\TWMJ_1032.exe",pBuffer,&size);
	GetPathDialog(NULL,"����O���ɸ�?",(char*)pBuffer);

	delete pBuffer;
	printf("Hello world\r\n");
	*/
}

#endif