www.pudn.com > GOS.rar > KString.cpp


// KString.cpp: implementation of the KString class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "..\stdafx.h" 
#include "KString.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
KString::KString() 
{ 
	m_nLength=0; 
	m_pData=NULL; 
} 
 
KString::KString(LPCTSTR sz) 
{ 
	m_nLength=0; 
	m_pData=NULL; 
	strncpy(sz,strlen(sz)); 
} 
 
KString::KString(const KString& str) 
{ 
	m_nLength=0; 
	m_pData=NULL; 
	strncpy(str.m_pData,str.m_nLength); 
} 
 
KString::~KString() 
{ 
	if(m_pData)HeapFree(m_pData); 
} 
 
void KString::AllocBuffer(int nLen, BOOL bCopy) 
{ 
	nLen=nLen+1; 
	if(m_pData) 
	{ 
		if(HeapAllocSize(m_pData)0) 
	{ 
		do 
		{ 
			c1=*s1++;c2=*s2++; 
			if(c1>c2){r=1;break;} 
			if(c1='a' && c1<='z'?c1-32:c1; 
			c2=c2>='a' && c1<='z'?c2-32:c2; 
			if(c1>c2){r=1;break;} 
			if(c1='a' && *s<='z')*s-=32; 
		s++; 
	} 
} 
 
void KString::MakeLower() 
{ 
	LPTSTR s=m_pData; 
	while(*s) 
	{ 
		if(*s>='A' && *s<='Z')*s+=32; 
		s++; 
	} 
} 
 
#define SF_START		0x010000 
#define SF_LEFT			0x020000 
#define SF_PSIGN		0x040000 
#define SF_PREC			0x080000 
#define SF_PRECMASK		0x000f00 
#define SF_WIDTHMASK	0x00f000 
#define SF_PRECSHIFT	8 
#define SF_WIDTHSHIFT	12 
void KString::Format(LPCTSTR szFormat, ...) 
{ 
 
	int i,nCnt,nStyle=0; 
	TCHAR c; 
	LPTSTR str,szFmt,aBuf,p,p2; 
	int* pVar; 
 
	szFmt=(LPTSTR)szFormat; 
	pVar=(int*)(&szFormat+1); 
	aBuf=(LPTSTR)HeapAlloc(1024); 
	p=aBuf; 
	p2=aBuf+1000; 
 
	while(*szFmt) 
	{ 
		c=*szFmt++; 
		if(nStyle & SF_START) 
		{ 
			switch(c) 
			{ 
			case 'c': //字符 
			case 'C': 
				*p++=(TCHAR)(*pVar++); 
				nStyle &= ~ SF_START; 
				break; 
			case 'd': //小数 
			case 'i': //小数 
			case 'u': //无符号 
			case 'o': //八进制 
			case 'x': //16进制小写 
			case 'X': //16进制大写 
				if(c=='x' || c=='o')nCnt=fmtHex(p2,*pVar++,FALSE); 
				else if(c=='X')nCnt=fmtHex(p2,*pVar++,TRUE); 
				else nCnt=fmtInt(p2,*pVar++,(nStyle & SF_PSIGN)?2:1); 
				if(nStyle & SF_LEFT)for(i=0;i>SF_WIDTHSHIFT; 
				c=(TCHAR)nStyle;c=c?c:' '; 
				for(;i>nCnt;i--)*p++=c; 
				if(!(nStyle & SF_LEFT))for(i=0;i>SF_WIDTHSHIFT; 
					i=i>0?-i:-6; 
				} 
				else 
				{ 
					i=(nStyle & SF_PRECMASK)>>SF_PRECSHIFT; 
					i=i>0?i:4; 
				} 
				nCnt=fmtDouble(p2,*(double*)pVar++, 
					i,(nStyle & SF_PSIGN)?2:1); 
				pVar++; 
				if(nStyle & SF_LEFT)for(i=0;i>SF_WIDTHSHIFT; 
				if(c=='g' || c=='G')i=0; 
				c=(TCHAR)nStyle;c=c?c:' '; 
				for(;i>nCnt;i--)*p++=c; 
				if(!(nStyle & SF_LEFT))for(i=0;i='0' && c<='9') 
				{ 
					if(!(nStyle & 0xff))nStyle &=~0xff;nStyle|=' '; 
					if(nStyle & SF_PREC)//小数位精度 
					{ 
						i=(nStyle & SF_PRECMASK)>>SF_PRECSHIFT; 
						i=i*10+(c-'0'); 
						nStyle &=~SF_PRECMASK; 
						nStyle |=i<>SF_WIDTHSHIFT; 
						i=i*10+(c-'0'); 
						nStyle &=~SF_WIDTHMASK; 
						nStyle |=i<='0' && c<='9') 
		{ 
			nValue*=10;nValue+=c-'0'; 
		} 
		else if(c=='-') 
		{ 
			if(nSign)break; 
			else {nSign=-1;continue;} 
		} 
		else if(c=='+') 
		{ 
			if(nSign)break; 
			else {nSign=1;continue;} 
		} 
		else break; 
	} 
	return nSign<0?-nValue:nValue; 
} 
 
int KString::toHex() 
{ 
	TCHAR c; 
	int nSign=1; 
	int nBase,nValue=0; 
	LPTSTR s=m_pData; 
	while(*s) 
	{ 
		c=*s++; 
		if(c>='0' && c<='9')nBase=c-48; 
		else if(c>='a' && c<='f')nBase=c-87; 
		else if(c>='A' && c<='F')nBase=c-55; 
		else if(c=='-'){nSign=-1;continue;} 
		else continue; 
		nValue<<=4;nValue+=nBase; 
	} 
	return nSign<0?-nValue:nValue; 
} 
 
 
 
double KString::toDouble() 
{ 
	TCHAR c; 
	LPTSTR s=m_pData; 
	int nSign=0; 
	int nFloat=0; 
	double dValue=0; 
	while(*s) 
	{ 
		c=*s++; 
		if(c>='0' && c<='9') 
		{ 
			dValue*=10;dValue+=c-'0'; 
			if(nFloat)nFloat*=10; 
		} 
		else if(c=='.') 
		{ 
			if(nFloat)break; 
			else 
			{ 
				nFloat=1; 
				if(!nSign)nSign=1; 
				continue; 
			} 
		} 
		else if(c=='-') 
		{ 
			if(nSign)break; 
			else {nSign=-1;continue;} 
		} 
		else if(c=='+') 
		{ 
			if(nSign)break; 
			else {nSign=1;continue;} 
		} 
		else break; 
	} 
	dValue=nFloat>0?dValue/nFloat:dValue; 
	return nSign<0?-dValue:dValue; 
} 
 
int KString::fmtInt(TCHAR aBuf[], int nValue,int nSign) 
{ 
	TCHAR nBase; 
	int j,i=0; 
	int nVal=nValue; 
	if(nValue) 
	{ 
		nVal=(nVal<0)?-nVal:nVal; 
		do 
		{ 
			nBase=(TCHAR)(nVal%10); 
			aBuf[i]=nBase+48; 
			nVal/=10; 
			i++; 
		}while(nVal); 
		if(nValue>0 && nSign>1){aBuf[i++]='+';} 
		if(nValue<0 && nSign>0){aBuf[i++]='-';} 
		for(j=(i-1)/2;j>=0;j--){nBase=aBuf[j];aBuf[j]=aBuf[i-j-1];aBuf[i-j-1]=nBase;} 
	} 
	else 
	{ 
		aBuf[i++]='0'; 
	} 
	return i; 
} 
 
int KString::fmtHex(TCHAR aBuf[], int nValue,BOOL bUpper) 
{ 
	TCHAR nBase; 
	int j,i=0; 
	UINT nVal=(UINT)nValue; 
	if(nValue) 
	{ 
		do 
		{ 
			nBase=(TCHAR)(nVal & 0xf); 
			if(nBase<10)aBuf[i]=nBase+48; 
			else if(bUpper)aBuf[i]=nBase+55; 
			else aBuf[i]=nBase+87; 
			nVal>>=4; 
			i++; 
		}while(nVal); 
		for(j=(i-1)/2;j>=0;j--){nBase=aBuf[j];aBuf[j]=aBuf[i-j-1];aBuf[i-j-1]=nBase;} 
	} 
	else 
	{ 
		aBuf[i++]='0'; 
	} 
	return i; 
} 
 
int KString::fmtDouble(TCHAR aBuf[], double dValue,int nPrec,int nSign) 
{ 
	TCHAR nBase; 
	int k,j,i=0; 
 
	if(dValue>0){if(nSign>1)aBuf[i++]='+';} 
	else if(dValue<0) 
	{ 
		dValue=-dValue; 
		if(nSign>0)aBuf[i++]='-'; 
	} 
	j=(int)(nPrec?dValue:dValue+0.5); 
	dValue-=j; 
	i+=fmtInt(aBuf+i,j,0); 
	j=(nPrec<0)?-nPrec-i-1:nPrec; 
	if(j>0 && (nPrec>0 || dValue>0)) 
	{ 
		k=2; 
		for(nBase=0;nBase0.9999999999){dValue=0;nBase+=1;} 
			aBuf[i]=nBase+48; 
			i++; 
			if(nPrec<0 && dValue==0)break; 
		}while(--j); 
	} 
	return i; 
} 
 
int KString::Replace(LPCTSTR szOld, LPCTSTR szNew) 
{ 
	int nAT,nAT0=0; 
	int i,nCount=0; 
	int nOldLen=strlen(szOld); 
	int nNewLen=strlen(szNew); 
	LPTSTR s,str; 
	s=str=(LPTSTR)HeapAlloc(1024); 
	while((nAT=Find(szOld,nAT0))!=-1) 
	{ 
		nCount++; 
		for(i=nAT0;im_pData) 
	{ 
		c=*(--str); 
		s2=(LPTSTR)szTarget; 
		while(*s2 && *s2!=c) 
		{ 
			s2++; 
		} 
		if(!*s2) 
		{ 
			*(++str)=0; 
			m_nLength=str-m_pData; 
			break; 
		} 
	} 
} 
 
void KString::TrimLeft(LPCTSTR szTarget) 
{ 
	LPTSTR s2,str=m_pData; 
	while(*str) 
	{ 
		s2=(LPTSTR)szTarget; 
		while(*s2 && *s2!=*str) 
		{ 
			s2++; 
		} 
		if(!*s2) 
		{ 
			s2=m_pData; 
			do 
			{ 
				*s2++=*str++; 
			}while(*str); 
			*s2=0; 
			m_nLength=s2-m_pData; 
			break; 
		} 
		str++; 
	} 
} 
 
LPTSTR KString::GetBuffer(int nMinBufLength) 
{ 
	AllocBuffer(nMinBufLength,TRUE); 
	return m_pData; 
} 
 
void KString::ReleaseBuffer(int nNewLength) 
{ 
	if(nNewLength>-1) 
	{ 
		m_nLength=nNewLength; 
		m_pData[m_nLength]=0; 
	} 
	else 
	{ 
		m_nLength=strlen(m_pData); 
	} 
}