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);
}
}