www.pudn.com > agobot3-priv4.rar > cstring.cpp


/*	Agobot3 - a modular IRC bot for Win32 / Linux 
	Copyright (C) 2003 Ago 
 
	This program is free software; you can redistribute it and/or 
	modify it under the terms of the GNU General Public License 
	as published by the Free Software Foundation; either version 2 
	of the License, or (at your option) any later version. 
 
	This program is distributed in the hope that it will be useful, 
	but WITHOUT ANY WARRANTY; without even the implied warranty of 
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
	GNU General Public License for more details. 
 
	You should have received a copy of the GNU General Public License 
	along with this program; if not, write to the Free Software 
	Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */ 
 
#include "main.h" 
#include "cstring.h" 
#include "utility.h" 
 
#include  
 
CString::CString() { m_szString=NULL; m_iLength=0; m_bIsCryptStr=false; m_szTemp=NULL; } 
CString::CString(const char *szString) { m_szString=NULL; m_iLength=0; Assign(szString); m_bIsCryptStr=false; m_szTemp=NULL; } 
CString::CString(const CString &pString) { m_szString=NULL; m_iLength=0; Assign(pString); m_bIsCryptStr=false; m_szTemp=NULL; } 
CString::CString(const int iValue) { char szTemp[16]; sprintf(szTemp, "%d", iValue); m_szString=NULL; m_iLength=0; Assign(szTemp); m_bIsCryptStr=false; m_szTemp=NULL; } 
 
CString::~CString() { if(m_szString) free(m_szString); m_szString=NULL; if(m_szTemp) free(m_szTemp); m_szTemp=NULL; m_iLength=0; } 
 
void CString::Assign(const char *szString) 
{	if(m_szString) free(m_szString); m_iLength=::strlen(szString); 
	m_szString=(char*)malloc(m_iLength+1); memset(m_szString, 0, m_iLength+1); ::strncpy(m_szString, szString, m_iLength); } 
void CString::Assign(const CString &pString) { Assign(pString.CStr()); } 
void CString::Assign(const int iValue) { char szTemp[16]; sprintf(szTemp, "%d", iValue); Assign(szTemp); } 
 
void CString::Append(const char *szString) 
{	m_iLength+=::strlen(szString); char *szTemp=(char*)malloc(m_iLength+1); 
	::strcpy(szTemp, m_szString); ::strcat(szTemp, szString); 
	if(m_szString) free(m_szString); m_szString=szTemp; } 
void CString::Append(const CString &pString) { Append(pString.CStr()); } 
void CString::Append(const int iValue) { char szTemp[16]; sprintf(szTemp, "%d", iValue); Append(szTemp); } 
 
int CString::Compare(const char *szString) const 
{	if(m_bIsCryptStr) return Decrypt().Compare(szString); 
	else return ::strcmp(m_szString, szString); } 
int CString::Compare(const CString &pString) const { return Compare(pString.CStr()); } 
int CString::CompareNoCase(const char *szString) const 
{	if(m_bIsCryptStr) return Decrypt().CompareNoCase(szString); 
	else return stricmp(m_szString, szString); } 
int CString::CompareNoCase(const CString &pString) const { return Compare(pString.CStr()); } 
 
CString CString::Decrypt() const 
{	if(!m_iCryptKey) return CString(""); CString sRetVal; 
	char *pTemp=sRetVal.GetBuffer(GetLength()); 
	for(int i=0; i vTokens; CString sTemp(m_szString); char *szText=sTemp.Str(); 
	bool bInQuotes=false; while(*szText) 
	{	while(*szText==szDelim[0]) szText++;	// skip leading whitespace 
		bInQuotes=(*szText=='\"');				// see if this token is quoted 
		if(bInQuotes) szText++;					// skip leading quote 
		vTokens.push_back(szText);				// store position of current token 
		if(bInQuotes) 
		{	// find next quote followed by a space or terminator 
			while(*szText&&!(*szText=='\"'&&(szText[1]==' '||szText[1]=='\0'))) szText++; 
			if(*szText) 
			{	*szText='\0'; if(szText[1]) szText+=2; } 
		} 
		else // !bInQuotes 
		{	// skip to next non-whitespace/delimiter character 
			while(*szText&&*szText!=szDelim[0]) szText++; 
			if(*szText&&*szText==szDelim[0]) 
			{	*szText='\0'; szText++; } 
		} // if(bInQuotes) 
	} // while(*szText) 
	if(iNum>=vTokens.size()) return CString(""); 
	return CString(vTokens.at(iNum)); } 
CString CString::Token(int iNum, const char *szDelim) { return Token(iNum, szDelim, false); } 
 
void CString::operator=(const CString &sStr) { Assign(sStr); } 
void CString::operator=(const char *szStr) { Assign(szStr); } 
char &CString::operator[](int iPos) 
{	if(m_bIsCryptStr) return Decrypt().operator[](iPos); 
	return m_szString[iPos]; } 
const char &CString::operator[](int iPos) const 
{	if(m_bIsCryptStr) return Decrypt().operator[](iPos); 
	return m_szString[iPos]; } 
 
const char *CString::CStr() const 
{	return (const char *)m_szString; } 
const char *CString::CStr() 
{	if(m_bIsCryptStr) 
	{	if(!m_szTemp) free(m_szTemp); CString sDecrypt=Decrypt(); 
		m_szTemp=(char*)malloc(sDecrypt.GetLength()); 
		strcpy(m_szTemp, sDecrypt.CStr()); return (const char *)m_szTemp; } 
	return (const char *)m_szString; } 
char *CString::Str() 
{	if(m_bIsCryptStr) 
	{	if(!m_szTemp) free(m_szTemp); CString sDecrypt=Decrypt(); 
		m_szTemp=(char*)malloc(sDecrypt.GetLength()); 
		strcpy(m_szTemp, sDecrypt.CStr()); return m_szTemp; } 
	return m_szString; }