⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kstring.cpp

📁 一个简单而又高效的嵌入式操作系统.包括GUI及文件系统.仿Windows设计,类似于MFC风格
💻 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)<nLen)
		{
			LPTSTR s=m_pData;
			HeapFree(s);
			m_pData=(LPTSTR)HeapAlloc(nLen);
			if(bCopy)CopyMemory(m_pData,s,m_nLength);
		}
	}
	else m_pData=(LPTSTR)HeapAlloc(nLen);
}

void KString::FreeExtra()
{
	if(m_pData)
	{
		LPTSTR s=m_pData;
		HeapFree(s);
		m_pData=(LPTSTR)HeapAlloc(m_nLength+1);
		CopyMemory(m_pData,s,m_nLength);
	}
}

int KString::strlen(LPCTSTR sz)
{
	if(sz)
	{
		LPTSTR s=(LPTSTR)sz;
		while(*s)s++;
		return s-sz;
	}
	else return 0;
}

void KString::strncpy(LPCTSTR sz,int nCount)
{
	AllocBuffer(nCount,FALSE);
	CopyMemory(m_pData,sz,nCount);
	m_pData[nCount]=0;
	m_nLength=nCount;
}

void KString::strncat(LPCTSTR sz, int nCount)
{
	int nSize2=m_nLength+nCount;
	AllocBuffer(nSize2,TRUE);
	CopyMemory(m_pData+m_nLength,sz,nCount);
	m_nLength+=nCount;
	m_pData[m_nLength]=0;
}

int KString::Compare(LPCTSTR sz,int nCount)
{
	TCHAR c1,c2;
	int r=0;
	LPTSTR s1=m_pData;
	LPTSTR s2=(LPTSTR)sz;
	if(nCount>0)
	{
		do
		{
			c1=*s1++;c2=*s2++;
			if(c1>c2){r=1;break;}
			if(c1<c2){r=-1;break;}
		}while(--nCount && c1 && c2);
	}
	else if(nCount<0)
	{
		nCount=-nCount;
		do
		{
			c1=*s1++;c2=*s2++;
			c1=c1>='a' && c1<='z'?c1-32:c1;
			c2=c2>='a' && c1<='z'?c2-32:c2;
			if(c1>c2){r=1;break;}
			if(c1<c2){r=-1;break;}
		}while(--nCount && c1 && c2);
	}
	else r=0;
	return r;
}

KString KString::Left(int nCount)
{
	KString str;
	nCount=min(m_nLength,nCount);
	str.strncpy(m_pData,nCount);
	return str;
}

KString KString::Right(int nCount)
{
	KString str;
	nCount=min(m_nLength,nCount);
	str.strncpy(m_pData+m_nLength-nCount,nCount);
	return str;
}

KString KString::Mid(int nFirst, int nCount)
{
	KString str;
	if(nCount<0)nCount=m_nLength-nFirst;
	else nCount=min(m_nLength-nFirst,nCount);
	str.strncpy(m_pData+nFirst,nCount);
	return str;
}

int KString::Find(LPCTSTR sz,int nStart)
{
	LPTSTR s1,s2,str=m_pData+nStart;
	while(*str)
	{
		s1=str;s2=(LPTSTR)sz;
		while(*s1 && *s2 && *s1==*s2)
		{
			s1++;s2++;
		}
		if(!(*s2))return str-m_pData;
		str++;
	}
	return -1;
}

int KString::Find(TCHAR ch,int nStart)
{
	LPTSTR s=m_pData+nStart;
	while(*s)
	{
		if(*s==ch)return s-m_pData;
		s++;
	}
	return -1;
}

int KString::ReverseFind(TCHAR ch)
{
	LPTSTR s=m_pData+m_nLength;
	while(*(--s))
	{
		if(*s==ch)return s-m_pData;
	}
	return -1;
}

int KString::FindOneOf(LPCTSTR szCharSet)
{
	TCHAR c;
	LPTSTR s2,str=m_pData;
	while(*str)
	{
		c=*str++;
		s2=(LPTSTR)szCharSet;
		while(*s2)
		{
			if(*s2==c)return str-m_pData-1;
			s2++;
		}
	}
	return -1;
}

void KString::MakeUpper()
{
	LPTSTR s=m_pData;
	while(*s)
	{
		if(*s>='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<nCnt;i++)*p++=p2[i];
				i=(nStyle & SF_WIDTHMASK)>>SF_WIDTHSHIFT;
				c=(TCHAR)nStyle;c=c?c:' ';
				for(;i>nCnt;i--)*p++=c;
				if(!(nStyle & SF_LEFT))for(i=0;i<nCnt;i++)*p++=p2[i];
				nStyle &= ~ SF_START;
				break;
			case 'e': //指数格式
			case 'E': //指数格式
			case 'f': //浮点格式
			case 'g': //常用格式
			case 'G': //常用标准格式
				if(c=='g' || c=='G')
				{
					i=(nStyle & SF_WIDTHMASK)>>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<nCnt;i++)*p++=p2[i];
				i=(nStyle & SF_WIDTHMASK)>>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<nCnt;i++)*p++=p2[i];
				nStyle &= ~ SF_START;
				break;
			case 'n': //地址
			case 'p': //地址
				nStyle &= ~ SF_START;
				break;
			case 's':
			case 'S':
				str=(LPTSTR)(*pVar++);
				while(*str)*p++=*str++;
				nStyle &= ~ SF_START;
				break;
			case '-': //数字左齐
				nStyle|= SF_LEFT;
				break;
			case '+': //启用+-符号
				nStyle |= SF_PSIGN; 
				break;
			case '.': //后面的数字是小数位宽度
				nStyle |= SF_PREC;
				break;
			case '%': //%的替用符号
				*p++=c;
				nStyle &= ~ SF_START;
				break;
				break;
			case '0': //数字右齐时左边空白填0
			case '#': //数字右齐时左边空白填#
			case '$': //数字右齐时左边空白填$
				if(!(nStyle & 0xff))
				{
					nStyle &=~0xff;nStyle|=c;
					break;
				}
			default:
				if(c>='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_PRECSHIFT;
					}
					else //总宽度
					{
						
						i=(nStyle & SF_WIDTHMASK)>>SF_WIDTHSHIFT;
						i=i*10+(c-'0');
						nStyle &=~SF_WIDTHMASK;
						nStyle |=i<<SF_WIDTHSHIFT;
					}
				}
			}
		}
		else if(c=='%')nStyle=SF_START;
		else *p++=c;
	}
	strncpy(aBuf,p-aBuf);
	HeapFree(aBuf);
}

int KString::toInt()
{
	TCHAR c;
	LPTSTR s=m_pData;
	int nSign=0;
	int nValue=0;
	while(*s)
	{
		c=*s++;
		if(c>='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;nBase<j;nBase++)k*=10;
		dValue+=1.0/k;
		aBuf[i++]='.';
		do
		{
			dValue*=10;
			nBase=(TCHAR)dValue;
			dValue-=nBase;
			if(dValue>0.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;i<nAT;i++)
		{
			*s++=m_pData[i];
		}
		nAT0=nAT+nOldLen;
		for(i=0;i<nNewLen;i++)
		{
			*s++=szNew[i];
		}
	}
	for(i=nAT0;i<m_nLength;i++)
	{
		*s++=m_pData[i];
	}
	strncpy(str,s-str);
	HeapFree(str);
	return nCount;
}

void KString::TrimRight(LPCTSTR szTarget)
{
	TCHAR c;
	LPTSTR s2,str=m_pData+m_nLength;
	while(str>m_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);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -