#include "cxstring.h"
#include <crtdbg.h>
#define ASSERTSTRING _ASSERT(m_pszString != NULL );
// FOR FUNCTION DESCRIPTIONS PLEASE REFER THE HEADER. SINCE THE CODE IS SELF-EXPLANATORY I HAVE NOT
// WRITTEN ANY COMMENTS
CXString::CXString() // default constructor
{ m_pszString = NULL; }
CXString::CXString(const CXString &xString)
{
m_pszString = new char[xString.Length()];
memset(m_pszString,NULL,xString.Length());
strcpy(m_pszString,xString.GetCharString());
}
CXString::CXString(char ch,int nRepeat) // for repeating the character the 'nRepeat' times
{
m_pszString = new char[nRepeat + 1];
memset(m_pszString,NULL,(nRepeat+1));
for(int nCount=0;nCount<nRepeat;nCount++)
m_pszString[nCount] = ch;
m_pszString[nCount] = '\0';
}
CXString::CXString(char *pszString)
{
m_pszString = new char[strlen(pszString)];
strcpy(m_pszString,pszString);
}
CXString::CXString(int nVal)
{
m_pszString = new char[7]; // with the calculation that the number will +/-64500 and the base it 10
memset(m_pszString,NULL,7);
itoa(nVal,m_pszString,10);
}
CXString::CXString(long lVal)
{
m_pszString = new char[15]; // since its always base 10 else the size has to be 33 bytes
memset(m_pszString,NULL,15);
ltoa(lVal,m_pszString,10); // with base 10
}
CXString::CXString(float fVal,int nDec)
{
m_pszString = new char[15 + nDec ];
memset(m_pszString,NULL,( 15 + nDec ));
gcvt(fVal,nDec,m_pszString);
}
CXString::CXString(double dblVal,int nDec)
{
m_pszString = new char[15 + nDec ];
memset(m_pszString,NULL,( 15 + nDec ));
gcvt(dblVal,nDec,m_pszString);
}
CXString::CXString(wchar_t wcsVal)
{
m_pszString = new char[wcslen(&wcsVal)];
memset(m_pszString,NULL,wcslen(&wcsVal));
wcstombs(m_pszString,&wcsVal,wcslen(&wcsVal));
}
int CXString::Length() const
{
if(m_pszString != NULL) return strlen(m_pszString);
else return 0;
}
char CXString::GetAt(int nPos)
{
ASSERTSTRING;
return m_pszString[nPos];
}
void CXString::Empty()
{
ASSERTSTRING;
memset(m_pszString,NULL,this->Length());
delete[] m_pszString;
}
bool CXString::IsEmpty()
{
if( this->Length() == 0 ) return true; // returns true if the string is empty
else return false; // returns false if there is something on the string
}
void CXString::SetAt(char nChar,int nPos)
{
ASSERTSTRING;
m_pszString[nPos] = nChar;
}
int CXString::Compare(CXString *cxsNewString)
{
ASSERTSTRING;
return strcmp(m_pszString,cxsNewString->GetCharString());
}
int CXString::Compare(char *pszNewString)
{
ASSERTSTRING;
return strcmp(m_pszString,pszNewString);
}
int CXString::CompareNoCase(CXString *cxsNewString)
{
ASSERTSTRING;
return stricmp(m_pszString,cxsNewString->GetCharString());
}
int CXString::CompareNoCase(char *pszNewString)
{
ASSERTSTRING;
return stricmp(m_pszString,pszNewString);
}
CXString CXString::Mid(int nFirst,int nCount)
{
ASSERTSTRING;
char *pszTempString = new char[nCount + 1];
memset(pszTempString,NULL,(nCount + 1));
for(int nPos = 0; nPos <= nCount ; nPos++)
pszTempString[nPos] = m_pszString[nPos + nFirst];
pszTempString[nPos] = '\0';
CXString xsTemp(pszTempString);
//delete []pszTempString;
return xsTemp;
}
CXString CXString::Left(int nCount)
{
ASSERTSTRING;
char *pszTempString = new char[nCount + 1];
memset(pszTempString,NULL,(nCount + 1));
for(int nPos = 0; nPos <= nCount; nPos++)
pszTempString[nPos] = m_pszString[nPos];
pszTempString[nPos] = '\0';
CXString xsTemp(pszTempString);
//delete pszTempString;
return xsTemp;
}
CXString CXString::Right(int nCount)
{
ASSERTSTRING;
char *pszTempString = new char[nCount + 1];
memset(pszTempString,NULL,(nCount + 1));
for(int nPos = 0; nPos <= nCount; nPos++)
pszTempString[nPos] = m_pszString[(this->Length() - nCount ) + nPos];
pszTempString[nPos] = '\0';
CXString xsTemp(pszTempString);
//delete []pszTempString;
return xsTemp;
}
CXString CXString::MakeUpper(bool bFlag)
{
ASSERTSTRING;
if( false == bFlag )
{
char *pszTempString = new char[this->Length()];
memset(pszTempString,NULL,this->Length());
strcpy(pszTempString,m_pszString);
strupr(pszTempString);
CXString xsTemp(pszTempString);
//delete []pszTempString;
return xsTemp;
}
else
{
strupr(m_pszString);
return *this;
}
}
CXString CXString::MakeLower(bool bFlag)
{
ASSERTSTRING;
if( false == bFlag )
{
char *pszTempString = new char[this->Length()];
memset(pszTempString,NULL,this->Length());
strcpy(pszTempString,m_pszString);
strlwr(pszTempString);
CXString xsTemp(pszTempString);
//delete []pszTempString;
return xsTemp;
}
else
{
strlwr(m_pszString);
return *this;
}
}
CXString CXString::MakeReverse(bool bFlag)
{
ASSERTSTRING;
if( false == bFlag )
{
char *pszTempString = new char[this->Length()];
memset(pszTempString,NULL,this->Length());
strcpy(pszTempString,m_pszString);
strrev(pszTempString);
CXString xsTemp(pszTempString);
//delete []pszTempString;
return xsTemp;
}
else
{
strrev(m_pszString);
return *this;
}
}
CXString CXString::Replace(char chOld,char chNew,bool bFlag,int nOccur)
{
ASSERTSTRING;
int nOccurCount = 0;
int nPos = 0;
if( false == bFlag )
{
char *pszTempString = new char[this->Length()];
memset(pszTempString,NULL,this->Length());
strcpy(pszTempString,m_pszString);
while(!((nOccur == 0)?false:((nOccurCount<nOccur)?false:true)) && (nPos <= (int)strlen(pszTempString) ))
{
if( pszTempString[nPos] == chOld )
{
pszTempString[nPos] = chNew;
if( nOccur != 0 ) nOccurCount++;
}
nPos++;
}
CXString xsTemp(pszTempString);
//delete []pszTempString;
return xsTemp;
}
else
{
while((!((nOccur == 0)?false:((nOccurCount<nOccur)?false:true))) && (nPos <= (int)strlen(m_pszString) ))
{
if( m_pszString[nPos] == chOld )
{
m_pszString[nPos] = chNew;
if( nOccur != 0 ) nOccurCount++;
}
nPos++;
}
return *this;
}
}
CXString CXString::Replace(char *pszOld,char *pszNew,bool bFlag,int nOccur)
{
ASSERTSTRING;
int nPos = 0;
int nOccurCount = 0;
if( false == bFlag )
{
char *pszTempString = new char[strlen(m_pszString)];
memset(pszTempString,NULL,this->Length());
strcpy(pszTempString,m_pszString);
while(!((nOccur == 0)?false:((nOccurCount<nOccur)?false:true)) && (nPos <= (int)strlen(pszTempString) ))
{
if( 0 == MidPrivate(pszTempString,nPos,int(strlen(pszOld))-1).Compare(pszOld) )
{
for(int nSubPos = 0;pszTempString[nPos + strlen(pszOld) + nSubPos ] != '\0' ;nSubPos++)
{
pszTempString[nPos + nSubPos ] = pszTempString[nPos + strlen(pszOld) + nSubPos ];
}
pszTempString[nSubPos + nPos] = '\0';
InsertPrivate(pszTempString,pszNew,nPos);
nPos = 0;
if( nOccur != 0 ) nOccurCount++;
}
nPos++;
}
CXString xsTemp(pszTempString);
return xsTemp;
}
else
{
while(!((nOccur == 0)?false:((nOccurCount<nOccur)?false:true)) && (nPos <= (int)strlen(m_pszString) ))
{
if( 0 == Mid(nPos,int(strlen(pszOld))-1).Compare(pszOld) )
{
for(int nSubPos = 0;m_pszString[nPos + strlen(pszOld) + nSubPos ] != '\0' ;nSubPos++)
{
m_pszString[nPos + nSubPos ] = m_pszString[nPos + strlen(pszOld) + nSubPos ];
}
m_pszString[nSubPos + nPos] = '\0';
InsertPrivate(m_pszString,pszNew,nPos);
nPos = 0;
if( nOccur != 0 ) nOccurCount++;
}
nPos++;
}
return *this;
}
}
int CXString::ToInt()
{
ASSERTSTRING;
return atoi(m_pszString);
}
float CXString::ToFloat()
{
ASSERTSTRING;
return (float)atof(m_pszString);
}
double CXString::ToDouble()
{
ASSERTSTRING;
return atof(m_pszString);
}
wchar_t CXString::ToWideChar()
{
ASSERTSTRING;
wchar_t wcsString;
mbstowcs(&wcsString,m_pszString,strlen(m_pszString));
return wcsString;
}
void CXString::Insert(char chChar,int nPos)
{
ASSERTSTRING;
char *pszTemp = new char[strlen(m_pszString) + 1];
memset(pszTemp,NULL,sizeof(pszTemp));
strcpy(pszTemp,m_pszString);
realloc(m_pszString,strlen(m_pszString) + 2);
memset(m_pszString,NULL,sizeof(pszTemp) + 2);
CXString xsTemp(pszTemp);
CXString xsLeftTemp = xsTemp.Left(nPos -1 );
CXString xsRightTemp = xsTemp.Right(int(strlen(pszTemp)) - (nPos) );
memset(m_pszString,NULL,sizeof(pszTemp) + 2);
strcat(m_pszString,xsLeftTemp.GetCharString());
strcat(m_pszString,&chChar);
strcat(m_pszString,xsRightTemp.GetCharString());
}
void CXString::Insert(char *pszString,int nPos)
{
ASSERTSTRING;
char *pszTemp = new char[strlen(m_pszString) + 1];
memset(pszTemp,NULL,sizeof(pszTemp));
strcpy(pszTemp,m_pszString);
realloc(m_pszString,strlen(m_pszString) + strlen(pszString));
memset(m_pszString,NULL,strlen(m_pszString) + strlen(pszString));
CXString xsTemp(pszTemp);
CXString xsLeftTemp = xsTemp.Left(nPos -1 );
CXString xsRightTemp = xsTemp.Right(int(strlen(pszTemp)) - (nPos) );
memset(m_pszString,NULL,strlen(m_pszString) + strlen(pszString));
strcat(m_pszString,xsLeftTemp.GetCharString());
strcat(m_pszString,pszString);
strcat(m_pszString,xsRightTemp.GetCharString());
}
char* CXString::GetCharString() const
{
ASSERTSTRING;
return m_pszString;
}
void CXString::InsertPrivate(char *pszOldString,char *pszNewString,int nPos)
{
char *pszTemp = new char[strlen(pszOldString) + 1];
memset(pszTemp,NULL,sizeof(pszTemp));
strcpy(pszTemp,pszOldString);
realloc(pszOldString,strlen(pszOldString) + strlen(pszNewString));
memset(pszOldString,NULL,strlen(pszOldString) + strlen(pszNewString));
CXString xsTemp(pszTemp);
CXString xsLeftTemp = xsTemp.Left(nPos -1 );
CXString xsRightTemp = xsTemp.Right(int(strlen(pszTemp)) - (nPos) );
memset(pszOldString,NULL,strlen(m_pszString) + strlen(pszNewString));
strcat(pszOldString,xsLeftTemp.GetCharString());
strcat(pszOldString,pszNewString);
strcat(pszOldString,xsRightTemp.GetCharString());
}
CXString CXString::MidPrivate(char *pszString,int nFirst,int nCount)
{
char *pszTempString = new char[nCount + 1];
memset(pszTempString,NULL,(nCount + 1));
for(int nPos = 0; nPos <= nCount ; nPos++)
pszTempString[nPos] = pszString[nPos + nFirst];
pszTempString[nPos] = '\0';
CXString xsTemp(pszTempString);
return xsTemp;
}
int CXString::Find(char chChar,int nPos)
{
ASSERTSTRING;
for(int nCount = nPos;nCount<(int)strlen(m_pszString);nCount++)
{
if( m_pszString[nCount] == chChar )
return nCount;
}
return 0;
}
int CXString::Find(char *pszString,int nPos)
{
ASSERTSTRING;
char *szTemp = new char[int(strlen(pszString)+1)];
for(int nCount = nPos;nCount<(int)strlen(m_pszString);nCount++)
{
for(int nSubCount =0;nSubCount<(int)strlen(pszString);nSubCount++)
szTemp[nSubCount] = m_pszString[nSubCount + nCount];
szTemp[nSubCount] = '\0';
if( 0 == strcmp(szTemp,pszString) )
return nCount;
}
return 0;
}
int CXString::ReverseFind(char chChar,int nPos)
{
ASSERTSTRING;
for(int nCount = (int(strlen(m_pszString)) - nPos);nCount>0;nCount--)
{
if( m_pszString[nCount] == chChar )
return nCount;
}
return 0;
}
int CXString::ReverseFind(char *pszString,int nPos)
{
ASSERTSTRING;
char *szTemp = new char[int(strlen(pszString)+1)];
for(int nCount = (int(strlen(m_pszString)) - nPos);nCount>0;nCount--)
{
for(int nSubCount =0;nSubCount<(int)strlen(pszString);nSubCount++)
szTemp[nSubCount] = m_pszString[nCount - strlen(pszString) + nSubCount];
szTemp[nSubCount] = '\0';
if( 0 == strcmp(szTemp,pszString) )
return nCount;
}
return 0;
}
CXString CXString::operator =( CXString xString)
{
m_pszString = new char[xString.Length()+1];
memset(m_pszString,NULL,sizeof(m_pszString));
strcpy(m_pszString,xString.GetCharString());
return *this;
}
CXString CXString::operator =(char *pszString)
{
m_pszString = new char[strlen(pszString)+1];
memset(m_pszString,NULL,sizeof(m_pszString));
strcpy(m_pszString,pszString);
return *this;
}
CXString CXString::operator =(char chChar)
{
m_pszString = new char[2];
m_pszString[0] = chChar;
m_pszString[1] = '\0';
return *this;
}
int CXString::operator ==(CXString xString)
{
ASSERTSTRING;
return strcmp(m_pszString,xString.GetCharString());
}
int CXString::operator ==(char *pszString)
{
ASSERTSTRING;
return strcmp(m_pszString,pszString);
}
int CXString::operator ==(char chChar)
{
ASSERTSTRING;
return strcmp(m_pszString,&chChar);
}
CXString CXString::operator +(CXString xString)
{
ASSERTSTRING;
strcat(m_pszString,xString.GetCharString());
return *this;
}
CXString CXString::operator +(char *pszString)
{
ASSERTSTRING;
strcat(m_pszString,pszString);
return *this;
}
CXString CXString::operator +(char chChar)
{
ASSERTSTRING;
strcat(m_pszString,&chChar);
return *this;
}
CXString CXString::TrimLeft(char chChar,bool bFlag)
{
ASSERTSTRING;
bool bComplete = false;
if( m_pszString[0] != chChar )
return *this;
if( bFlag == false )
{
char *pszString = new char[strlen(m_pszString)];
memset(pszString,NULL,strlen(m_pszString));
strcpy(pszString,m_pszString);
while( bComplete == false )
{
if( pszString[0] == chChar )
{
for(int nSubPos = 0;nSubPos < (int)strlen(pszString);nSubPos++)
{
pszString[nSubPos] = pszString[nSubPos + 1];
}
pszString[nSubPos] = '\0';
}
else
bComplete = true;
}
CXString xsTemp(pszString);
return xsTemp;
}
else
{
while( bComplete == false )
{
if( m_pszString[0] == chChar )
{
for(int nSubPos = 0;nSubPos < (int)strlen(m_pszString);nSubPos++)
{
m_pszString[nSubPos] = m_pszString[nSubPos + 1];
}
m_pszString[nSubPos] = '\0';
}
else
bComplete = true;
}
return *this;
}
}
CXString CXString::TrimRight(char chChar, bool bFlag)
{
ASSERTSTRING;
bool bComplete = false;
if( m_pszString[strlen(m_pszString) - 1] != chChar )
return *this;
if( bFlag == false )
{
char *pszString = new char[strlen(m_pszString)];
memset(pszString,NULL,strlen(m_pszString));
strcpy(pszString,m_pszString);
while( bComplete == false )
{
if( pszString[strlen(pszString) - 1] == chChar )
{
pszString[strlen(pszString) - 1] = '\0';
}
else
bComplete = true;
}
CXString xsTemp(pszString);
return xsTemp;
}
else
{
while( bComplete == false )
{
if( m_pszString[strlen(m_pszString)] == chChar )
{
m_pszString[strlen(m_pszString)] = '\0';
}
else
bComplete = true;
}
return *this;
}
}
CXString CXString::Remove(char chChar)
{
ASSERTSTRING;
for(int nPos = 0;nPos < this->Length();nPos++)
{
if( m_pszString[nPos] == chChar )
{
for(int nSubPos = 0;nSubPos < this->Length();nSubPos++)
m_pszString[nSubPos + nPos] = m_pszString[nSubPos + nPos + 1];
m_pszString[nSubPos] = '\0';
}
}
return *this;
}