|  | /****************************************************************************** | 
|  |  | 
|  | @File         PVRTString.cpp | 
|  |  | 
|  | @Title        PVRTString | 
|  |  | 
|  | @Version | 
|  |  | 
|  | @Copyright    Copyright (c) Imagination Technologies Limited. | 
|  |  | 
|  | @Platform     ANSI compatible | 
|  |  | 
|  | @Description  A string class that can be used as drop-in replacement for | 
|  | std::string on platforms/compilers that don't provide a full C++ | 
|  | standard library. | 
|  |  | 
|  | ******************************************************************************/ | 
|  | #include "PVRTString.h" | 
|  |  | 
|  | #ifdef _USING_PVRTSTRING_ | 
|  |  | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <stdarg.h> | 
|  |  | 
|  | #include "PVRTGlobal.h" | 
|  |  | 
|  | const size_t CPVRTString::npos = (size_t) -1; | 
|  |  | 
|  | #if defined(_WIN32) | 
|  | #define vsnprintf _vsnprintf | 
|  | #define snprintf _snprintf | 
|  | #endif | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			CPVRTString | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Count	Length of _Ptr | 
|  | @Description		Constructor | 
|  | ************************************************************************/ | 
|  | CPVRTString::CPVRTString(const char* _Ptr, size_t _Count) : | 
|  | m_pString(0), m_Capacity(0) | 
|  | { | 
|  | if (_Count == npos) | 
|  | { | 
|  | if (_Ptr == NULL) | 
|  | { | 
|  | assign(_Ptr, 0); | 
|  | } | 
|  | else | 
|  | { | 
|  | assign(_Ptr); | 
|  | } | 
|  | } | 
|  | else | 
|  | assign(_Ptr, _Count); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			CPVRTString | 
|  | @Input				_Right	A string | 
|  | @Input				_Roff	Offset into _Right | 
|  | @Input				_Count	Number of chars from _Right to assign to the new string | 
|  | @Description		Constructor | 
|  | ************************************************************************/ | 
|  | CPVRTString::CPVRTString(const CPVRTString& _Right, size_t _Roff, size_t _Count) : | 
|  | m_pString(0), m_Capacity(0) | 
|  | { | 
|  | assign(_Right, _Roff, _Count); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			CPVRTString | 
|  | @Input				_Count	Length of new string | 
|  | @Input				_Ch		A char to fill it with | 
|  | @Description		Constructor | 
|  | *************************************************************************/ | 
|  | CPVRTString::CPVRTString(size_t _Count, char _Ch) : | 
|  | m_pString(0), m_Capacity(0) | 
|  | { | 
|  | assign(_Count,_Ch); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			CPVRTString | 
|  | @Input				_Ch	A char | 
|  | @Description		Constructor | 
|  | *************************************************************************/ | 
|  | CPVRTString::CPVRTString(const char _Ch) : | 
|  | m_pString(0), m_Capacity(0) | 
|  | { | 
|  | assign( 1, _Ch); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			CPVRTString | 
|  | @Description		Constructor | 
|  | *************************************************************************/ | 
|  | CPVRTString::CPVRTString() : | 
|  | m_Size(0), m_Capacity(1) | 
|  | { | 
|  | m_pString = (char*)calloc(1, 1); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			~CPVRTString | 
|  | @Description		Destructor | 
|  | *************************************************************************/ | 
|  | CPVRTString::~CPVRTString() | 
|  | { | 
|  | if (m_pString) | 
|  | { | 
|  | free(m_pString); | 
|  | m_pString=NULL; | 
|  | } | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			append | 
|  | @Input				_Ptr	A string | 
|  | @Returns			Updated string | 
|  | @Description		Appends a string | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::append(const char* _Ptr) | 
|  | { | 
|  | if (_Ptr==NULL) | 
|  | { | 
|  | return *this; | 
|  | } | 
|  | return append(_Ptr,strlen(_Ptr)); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			append | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Count	String length | 
|  | @Returns			Updated string | 
|  | @Description		Appends a string of length _Count | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::append(const char* _Ptr, size_t _Count) | 
|  | { | 
|  | char* pString = m_pString; | 
|  | size_t newCapacity = _Count + m_Size + 1;	// +1 for null termination | 
|  |  | 
|  | // extend CPVRTString if necessary | 
|  | if (m_Capacity < newCapacity) | 
|  | { | 
|  | pString = (char*)malloc(newCapacity); | 
|  | m_Capacity = newCapacity;				 // Using low memory profile (but very slow append) | 
|  | memmove(pString, m_pString, m_Size); | 
|  | pString[m_Capacity-1]='\0'; | 
|  | } | 
|  |  | 
|  | // append chars from _Ptr | 
|  | memmove(pString + m_Size, _Ptr, _Count); | 
|  | m_Size += _Count; | 
|  | pString[m_Size] = 0; | 
|  |  | 
|  | // remove old CPVRTString if necessary | 
|  | if (pString != m_pString) | 
|  | { | 
|  | if (m_pString) | 
|  | { | 
|  | free(m_pString); | 
|  | m_pString=NULL; | 
|  | } | 
|  | m_pString = pString; | 
|  | } | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			append | 
|  | @Input				_Str	A string | 
|  | @Returns			Updated string | 
|  | @Description		Appends a string | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::append(const CPVRTString& _Str) | 
|  | { | 
|  | return append(_Str.m_pString,_Str.m_Size); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			append | 
|  | @Input				_Str	A string | 
|  | @Input				_Off	A position in string | 
|  | @Input				_Count	Number of letters to append | 
|  | @Returns			Updated string | 
|  | @Description		Appends _Count letters of _Str from _Off in _Str | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::append(const CPVRTString& _Str, size_t _Off, size_t _Count) | 
|  | { | 
|  | if (_Str.length() < _Off + _Count) | 
|  | { | 
|  | int i32NewCount = (signed)(_Str.length())-(signed)_Off; | 
|  |  | 
|  | if(i32NewCount < 0 ) | 
|  | { | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | _Count = (size_t) i32NewCount; | 
|  | } | 
|  |  | 
|  | return append(_Str.m_pString+_Off,_Count); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			append | 
|  | @Input				_Ch		A char | 
|  | @Input				_Count	Number of times to append _Ch | 
|  | @Returns			Updated string | 
|  | @Description		Appends _Ch _Count times | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::append(size_t _Count, char _Ch) | 
|  | { | 
|  | char* pString = m_pString; | 
|  | size_t newCapacity = _Count + m_Size + 1;	// +1 for null termination | 
|  | // extend CPVRTString if necessary | 
|  | if (m_Capacity < newCapacity) | 
|  | { | 
|  | pString = (char*)malloc(newCapacity); | 
|  | m_Capacity = newCapacity; | 
|  | memmove(pString, m_pString, m_Size+1); | 
|  | } | 
|  |  | 
|  | char* newChar = &pString[m_Size]; | 
|  | // fill new space with _Ch | 
|  | for(size_t i=0;i<_Count;++i) | 
|  | { | 
|  | *newChar++ = _Ch; | 
|  | } | 
|  | *newChar = '\0';		// set null terminator | 
|  | m_Size+=_Count;			// adjust length of string for new characters | 
|  |  | 
|  | // remove old CPVRTString if necessary | 
|  | if (pString != m_pString) | 
|  | { | 
|  | if (m_pString) | 
|  | { | 
|  | free(m_pString); | 
|  | m_pString=NULL; | 
|  | } | 
|  | m_pString = pString; | 
|  | } | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			assign | 
|  | @Input				_Ptr A string | 
|  | @Returns			Updated string | 
|  | @Description		Assigns the string to the string _Ptr | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::assign(const char* _Ptr) | 
|  | { | 
|  | if (_Ptr == NULL) | 
|  | { | 
|  | return assign(_Ptr, 0); | 
|  | } | 
|  | return assign(_Ptr, strlen(_Ptr)); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			assign | 
|  | @Input				_Ptr A string | 
|  | @Input				_Count Length of _Ptr | 
|  | @Returns			Updated string | 
|  | @Description		Assigns the string to the string _Ptr | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::assign(const char* _Ptr, size_t _Count) | 
|  | { | 
|  | if(m_Capacity <= _Count) | 
|  | { | 
|  | free(m_pString); | 
|  | m_Capacity = _Count+1; | 
|  | m_pString = (char*)malloc(m_Capacity); | 
|  | memcpy(m_pString, _Ptr, _Count); | 
|  | } | 
|  | else | 
|  | memmove(m_pString, _Ptr, _Count); | 
|  |  | 
|  | m_Size = _Count; | 
|  | m_pString[m_Size] = 0; | 
|  |  | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			assign | 
|  | @Input				_Str A string | 
|  | @Returns			Updated string | 
|  | @Description		Assigns the string to the string _Str | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::assign(const CPVRTString& _Str) | 
|  | { | 
|  | return assign(_Str.m_pString, _Str.m_Size); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			assign | 
|  | @Input				_Str A string | 
|  | @Input				_Off First char to start assignment from | 
|  | @Input				_Count Length of _Str | 
|  | @Returns			Updated string | 
|  | @Description		Assigns the string to _Count characters in string _Str starting at _Off | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::assign(const CPVRTString& _Str, size_t _Off, size_t _Count) | 
|  | { | 
|  | if(_Count==npos) | 
|  | { | 
|  | _Count = _Str.m_Size - _Off; | 
|  | } | 
|  | return assign(&_Str.m_pString[_Off], _Count); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			assign | 
|  | @Input				_Ch A string | 
|  | @Input				_Count Number of times to repeat _Ch | 
|  | @Returns			Updated string | 
|  | @Description		Assigns the string to _Count copies of _Ch | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::assign(size_t _Count,char _Ch) | 
|  | { | 
|  | if (m_Capacity <= _Count) | 
|  | { | 
|  | if (m_pString) | 
|  | { | 
|  | free(m_pString); | 
|  | m_pString=NULL; | 
|  | } | 
|  | m_pString = (char*)malloc(_Count + 1); | 
|  | m_Capacity = _Count+1; | 
|  | } | 
|  | m_Size = _Count; | 
|  | memset(m_pString, _Ch, _Count); | 
|  | m_pString[m_Size] = 0; | 
|  |  | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | //const_reference at(size_t _Off) const; | 
|  | //reference at(size_t _Off); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			c_str | 
|  | @Returns			const char* pointer of the string | 
|  | @Description		Returns a const char* pointer of the string | 
|  | *************************************************************************/ | 
|  | const char* CPVRTString::c_str() const | 
|  | { | 
|  | return m_pString; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			capacity | 
|  | @Returns			The size of the character array reserved | 
|  | @Description		Returns the size of the character array reserved | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::capacity() const | 
|  | { | 
|  | return m_Capacity; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			clear | 
|  | @Description		Clears the string | 
|  | *************************************************************************/ | 
|  | void CPVRTString::clear() | 
|  | { | 
|  | if (m_pString) | 
|  | { | 
|  | free(m_pString); | 
|  | m_pString=NULL; | 
|  | } | 
|  | m_pString = (char*)calloc(1, 1); | 
|  | m_Size = 0; | 
|  | m_Capacity = 1; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			compare | 
|  | @Input				_Str A string to compare with | 
|  | @Returns			0 if the strings match | 
|  | @Description		Compares the string with _Str | 
|  | *************************************************************************/ | 
|  | int CPVRTString::compare(const CPVRTString& _Str) const | 
|  | { | 
|  | return strcmp(m_pString,_Str.m_pString); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			< | 
|  | @Input				_Str A string to compare with | 
|  | @Returns			True on success | 
|  | @Description		Less than operator | 
|  | *************************************************************************/ | 
|  | bool CPVRTString::operator<(const CPVRTString & _Str) const | 
|  | { | 
|  | return (strcmp(m_pString, _Str.m_pString) < 0); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			compare | 
|  | @Input				_Pos1	Position to start comparing from | 
|  | @Input				_Num1	Number of chars to compare | 
|  | @Input				_Str 	A string to compare with | 
|  | @Returns			0 if the strings match | 
|  | @Description		Compares the string with _Str | 
|  | *************************************************************************/ | 
|  | int CPVRTString::compare(size_t _Pos1, size_t _Num1, const CPVRTString& _Str) const | 
|  | { | 
|  | _ASSERT(_Pos1<=m_Size);	// check comparison starts within lhs CPVRTString | 
|  |  | 
|  | int i32Ret;	// value to return if no difference in actual comparisons between chars | 
|  | size_t stLhsLength = m_Size-_Pos1; | 
|  | size_t stSearchLength = PVRT_MIN(stLhsLength,PVRT_MIN(_Str.m_Size,_Num1));	// number of comparisons to do | 
|  | if(PVRT_MIN(stLhsLength,_Num1)<PVRT_MIN(_Str.m_Size,_Num1)) | 
|  | { | 
|  | i32Ret = -1; | 
|  | } | 
|  | else if(PVRT_MIN(stLhsLength,_Num1)>PVRT_MIN(_Str.m_Size,_Num1)) | 
|  | { | 
|  | i32Ret = 1; | 
|  | } | 
|  | else | 
|  | { | 
|  | i32Ret = 0; | 
|  | } | 
|  |  | 
|  | // do actual comparison | 
|  | const char* lhptr = &m_pString[_Pos1]; | 
|  | const char* rhptr = _Str.m_pString; | 
|  | for(size_t i=0;i<stSearchLength;++i) | 
|  | { | 
|  | if(*lhptr<*rhptr) | 
|  | return -1; | 
|  | else if (*lhptr>*rhptr) | 
|  | return 1; | 
|  | lhptr++;rhptr++; | 
|  | } | 
|  | // no difference found in compared characters | 
|  | return i32Ret; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			compare | 
|  | @Input				_Pos1	Position to start comparing from | 
|  | @Input				_Num1	Number of chars to compare | 
|  | @Input				_Str 	A string to compare with | 
|  | @Input				_Off 	Position in _Str to compare from | 
|  | @Input				_Count	Number of chars in _Str to compare with | 
|  | @Returns			0 if the strings match | 
|  | @Description		Compares the string with _Str | 
|  | *************************************************************************/ | 
|  | int CPVRTString::compare(size_t _Pos1, size_t _Num1, const CPVRTString& _Str, size_t /*_Off*/, size_t _Count) const | 
|  | { | 
|  | _ASSERT(_Pos1<=m_Size);	// check comparison starts within lhs CPVRTString | 
|  |  | 
|  | int i32Ret;	// value to return if no difference in actual comparisons between chars | 
|  | size_t stLhsLength = m_Size-_Pos1; | 
|  | size_t stSearchLength = PVRT_MIN(stLhsLength,PVRT_MIN(_Str.m_Size,PVRT_MIN(_Num1,_Count)));	// number of comparisons to do | 
|  | if(PVRT_MIN(stLhsLength,_Num1)<PVRT_MIN(_Str.m_Size,_Count)) | 
|  | { | 
|  | i32Ret = -1; | 
|  | } | 
|  | else if(PVRT_MIN(stLhsLength,_Num1)>PVRT_MIN(_Str.m_Size,_Count)) | 
|  | { | 
|  | i32Ret = 1; | 
|  | } | 
|  | else | 
|  | { | 
|  | i32Ret = 0; | 
|  | } | 
|  |  | 
|  |  | 
|  | // do actual comparison | 
|  | char* lhptr = &m_pString[_Pos1]; | 
|  | char* rhptr = _Str.m_pString; | 
|  | for(size_t i=0;i<stSearchLength;++i) | 
|  | { | 
|  | if(*lhptr<*rhptr) | 
|  | return -1; | 
|  | else if (*lhptr>*rhptr) | 
|  | return 1; | 
|  | lhptr++;rhptr++; | 
|  | } | 
|  | // no difference found in compared characters | 
|  | return i32Ret; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			compare | 
|  | @Input				_Ptr A string to compare with | 
|  | @Returns			0 if the strings match | 
|  | @Description		Compares the string with _Ptr | 
|  | *************************************************************************/ | 
|  | int CPVRTString::compare(const char* _Ptr) const | 
|  | { | 
|  | return strcmp(m_pString,_Ptr); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			compare | 
|  | @Input				_Pos1	Position to start comparing from | 
|  | @Input				_Num1	Number of chars to compare | 
|  | @Input				_Ptr 	A string to compare with | 
|  | @Returns			0 if the strings match | 
|  | @Description		Compares the string with _Ptr | 
|  | *************************************************************************/ | 
|  | int CPVRTString::compare(size_t _Pos1, size_t _Num1, const char* _Ptr) const | 
|  | { | 
|  | _ASSERT(_Pos1<=m_Size);	// check comparison starts within lhs CPVRTString | 
|  |  | 
|  | int i32Ret;	// value to return if no difference in actual comparisons between chars | 
|  | size_t stLhsLength = m_Size-_Pos1; | 
|  | size_t stRhsLength = strlen(_Ptr); | 
|  | size_t stSearchLength = PVRT_MIN(stLhsLength,PVRT_MIN(stRhsLength,_Num1));	// number of comparisons to do | 
|  | if(PVRT_MIN(stLhsLength,_Num1)<PVRT_MIN(stRhsLength,_Num1)) | 
|  | { | 
|  | i32Ret = -1; | 
|  | } | 
|  | else if(PVRT_MIN(stLhsLength,_Num1)>PVRT_MIN(stRhsLength,_Num1)) | 
|  | { | 
|  | i32Ret = 1; | 
|  | } | 
|  | else | 
|  | { | 
|  | i32Ret = 0; | 
|  | } | 
|  |  | 
|  | // do actual comparison | 
|  | const char* lhptr = &m_pString[_Pos1]; | 
|  | const char* rhptr = _Ptr; | 
|  | for(size_t i=0;i<stSearchLength;++i) | 
|  | { | 
|  | if(*lhptr<*rhptr) | 
|  | return -1; | 
|  | else if (*lhptr>*rhptr) | 
|  | return 1; | 
|  | lhptr++;rhptr++; | 
|  | } | 
|  | // no difference found in compared characters | 
|  | return i32Ret; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			compare | 
|  | @Input				_Pos1	Position to start comparing from | 
|  | @Input				_Num1	Number of chars to compare | 
|  | @Input				_Ptr 	A string to compare with | 
|  | @Input				_Count	Number of char to compare | 
|  | @Returns			0 if the strings match | 
|  | @Description		Compares the string with _Str | 
|  | *************************************************************************/ | 
|  | int CPVRTString::compare(size_t _Pos1, size_t _Num1, const char* _Ptr, size_t _Count) const | 
|  | { | 
|  | _ASSERT(_Pos1<=m_Size);	// check comparison starts within lhs CPVRTString | 
|  |  | 
|  | int i32Ret;	// value to return if no difference in actual comparisons between chars | 
|  | size_t stLhsLength = m_Size-_Pos1; | 
|  | size_t stRhsLength = strlen(_Ptr); | 
|  | size_t stSearchLength = PVRT_MIN(stLhsLength,PVRT_MIN(stRhsLength,PVRT_MIN(_Num1,_Count)));	// number of comparisons to do | 
|  | if(PVRT_MIN(stLhsLength,_Num1)<PVRT_MIN(stRhsLength,_Count)) | 
|  | { | 
|  | i32Ret = -1; | 
|  | } | 
|  | else if(PVRT_MIN(stLhsLength,_Num1)>PVRT_MIN(stRhsLength,_Count)) | 
|  | { | 
|  | i32Ret = 1; | 
|  | } | 
|  | else | 
|  | { | 
|  | i32Ret = 0; | 
|  | } | 
|  |  | 
|  |  | 
|  | // do actual comparison | 
|  | char* lhptr = &m_pString[_Pos1]; | 
|  | const char* rhptr = _Ptr; | 
|  | for(size_t i=0;i<stSearchLength;++i) | 
|  | { | 
|  | if(*lhptr<*rhptr) | 
|  | return -1; | 
|  | else if (*lhptr>*rhptr) | 
|  | return 1; | 
|  | lhptr++;rhptr++; | 
|  | } | 
|  | // no difference found in compared characters | 
|  | return i32Ret; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			== | 
|  | @Input				_Str 	A string to compare with | 
|  | @Returns			True if they match | 
|  | @Description		== Operator | 
|  | *************************************************************************/ | 
|  | bool CPVRTString::operator==(const CPVRTString& _Str) const | 
|  | { | 
|  | return strcmp(m_pString, _Str.m_pString)==0; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			== | 
|  | @Input				_Ptr 	A string to compare with | 
|  | @Returns			True if they match | 
|  | @Description		== Operator | 
|  | *************************************************************************/ | 
|  | bool CPVRTString::operator==(const char* const _Ptr) const | 
|  | { | 
|  | if(!_Ptr) | 
|  | return false; | 
|  |  | 
|  | return strcmp(m_pString, _Ptr)==0; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			!= | 
|  | @Input				_Str 	A string to compare with | 
|  | @Returns			True if they don't match | 
|  | @Description		!= Operator | 
|  | *************************************************************************/ | 
|  | bool CPVRTString::operator!=(const CPVRTString& _Str) const | 
|  | { | 
|  | return strcmp(m_pString, _Str.m_pString)!=0; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			!= | 
|  | @Input				_Ptr 	A string to compare with | 
|  | @Returns			True if they don't match | 
|  | @Description		!= Operator | 
|  | *************************************************************************/ | 
|  | bool CPVRTString::operator!=(const char* const _Ptr) const | 
|  | { | 
|  | if(!_Ptr) | 
|  | return true; | 
|  |  | 
|  | return strcmp(m_pString, _Ptr)!=0; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			copy | 
|  | @Modified			_Ptr 	A string to copy to | 
|  | @Input				_Count	Size of _Ptr | 
|  | @Input				_Off	Position to start copying from | 
|  | @Returns			Number of bytes copied | 
|  | @Description		Copies the string to _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::copy(char* _Ptr, size_t _Count, size_t _Off) const | 
|  | { | 
|  | if(memcpy(_Ptr, &m_pString[_Off], PVRT_MIN(_Count, m_Size - _Off))) | 
|  | return _Count; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			data | 
|  | @Returns			A const char* version of the string | 
|  | @Description		Returns a const char* version of the string | 
|  | *************************************************************************/ | 
|  | const char* CPVRTString::data() const | 
|  | { | 
|  | return m_pString; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			empty | 
|  | @Returns			True if the string is empty | 
|  | @Description		Returns true if the string is empty | 
|  | *************************************************************************/ | 
|  | bool CPVRTString::empty() const | 
|  | { | 
|  | return (m_Size == 0); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			erase | 
|  | @Input				_Pos	The position to start erasing from | 
|  | @Input				_Count	Number of chars to erase | 
|  | @Returns			An updated string | 
|  | @Description		Erases a portion of the string | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::erase(size_t _Pos, size_t _Count) | 
|  | { | 
|  | if (_Count == npos || _Pos + _Count >= m_Size) | 
|  | { | 
|  | resize(_Pos, 0); | 
|  | } | 
|  | else | 
|  | { | 
|  | memmove(&m_pString[_Pos], &m_pString[_Pos + _Count], m_Size + 1 - (_Pos + _Count)); | 
|  | } | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find | 
|  | @Input				_Ptr	String to search. | 
|  | @Input				_Off	Offset to search from. | 
|  | @Input				_Count	Number of characters in this string. | 
|  | @Returns			Position of the first matched string. | 
|  | @Description		Finds a substring within this string. | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find(const char* _Ptr, size_t _Off, size_t _Count) const | 
|  | { | 
|  | if(!_Ptr) | 
|  | return npos; | 
|  |  | 
|  | if(_Count > m_Size) | 
|  | return npos; | 
|  |  | 
|  | while(_Off < m_Size) | 
|  | { | 
|  | if(_Ptr[0] == m_pString[_Off]) | 
|  | { | 
|  | if(compare(_Off, _Count, _Ptr) == 0) | 
|  | return _Off; | 
|  | } | 
|  | _Off++; | 
|  | } | 
|  |  | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find | 
|  | @Input				_Str	String to search. | 
|  | @Input				_Off	Offset to search from. | 
|  | @Returns			Position of the first matched string. | 
|  | @Description		Erases a portion of the string | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find(const CPVRTString& _Str, size_t _Off) const | 
|  | { | 
|  | return find(_Str.c_str(), _Off, _Str.length()); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_first_not_of | 
|  | @Input				_Ch		A char | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the first char that is not _Ch | 
|  | @Description		Returns the position of the first char that is not _Ch | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_first_not_of(char _Ch, size_t _Off) const | 
|  | { | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | if(m_pString[i]!=_Ch) | 
|  | return i; | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_first_not_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the first char that is not in _Ptr | 
|  | @Description		Returns the position of the first char that is not in _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_first_not_of(const char* _Ptr, size_t _Off) const | 
|  | { | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | bool bFound = false; | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;_Ptr[j]!=0;++j) | 
|  | { | 
|  | bFound = bFound || (m_pString[i]==_Ptr[j]); | 
|  | } | 
|  | if(!bFound) | 
|  | {	// return if no match | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_first_not_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Input				_Count	Number of chars in _Ptr | 
|  | @Returns			Position of the first char that is not in _Ptr | 
|  | @Description		Returns the position of the first char that is not in _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_first_not_of(const char* _Ptr, size_t _Off, size_t _Count) const | 
|  | { | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | bool bFound = false; | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Count;++j) | 
|  | { | 
|  | bFound = bFound || (m_pString[i]==_Ptr[j]); | 
|  | } | 
|  | if(!bFound) | 
|  | {	// return if no match | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_first_not_of | 
|  | @Input				_Str	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the first char that is not in _Str | 
|  | @Description		Returns the position of the first char that is not in _Str | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_first_not_of(const CPVRTString& _Str, size_t _Off) const | 
|  | { | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | bool bFound = false; | 
|  | // compare against each char from _Str | 
|  | for(size_t j=0;j<_Str.m_Size;++j) | 
|  | { | 
|  | bFound = bFound || (m_pString[i]==_Str[j]); | 
|  | } | 
|  | if(!bFound) | 
|  | {	// return if no match | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_first_of | 
|  | @Input				_Ch		A char | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the first char that is _Ch | 
|  | @Description		Returns the position of the first char that is _Ch | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_first_of(char _Ch, size_t _Off) const | 
|  | { | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | if(m_pString[i]==_Ch) | 
|  | return i; | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_first_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the first char that matches a char in _Ptr | 
|  | @Description		Returns the position of the first char that matches a char in _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_first_of(const char* _Ptr, size_t _Off) const | 
|  | { | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;_Ptr[j]!=0;++j) | 
|  | { | 
|  | if(m_pString[i]==_Ptr[j]) | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_first_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Input				_Count	Size of _Ptr | 
|  | @Returns			Position of the first char that matches a char in _Ptr | 
|  | @Description		Returns the position of the first char that matches a char in _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_first_of(const char* _Ptr, size_t _Off, size_t _Count) const | 
|  | { | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Count;++j) | 
|  | { | 
|  | if(m_pString[i]==_Ptr[j]) | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_first_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Input				_Count	Size of _Ptr | 
|  | @Returns			Position of the first char that matches a char in _Ptr | 
|  | @Description		Returns the position of the first char that matches a char in _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_first_ofn(const char* _Ptr, size_t _Off, size_t _Count) const | 
|  | { | 
|  | if (_Ptr == NULL) | 
|  | { | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | if (strlen(m_pString) < _Count) | 
|  | { | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | if (m_pString[i] ==_Ptr[0]) | 
|  | { | 
|  | if (i+_Count-1>=m_Size)  // There are not enough caracters in current String | 
|  | { | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | bool compare = true; | 
|  | for(size_t k=1;k<_Count;++k) | 
|  | { | 
|  | compare &= (m_pString[i+k] ==_Ptr[k]); | 
|  | } | 
|  | if (compare == true) | 
|  | { | 
|  | return i; | 
|  | } | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_first_of | 
|  | @Input				_Str	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the first char that matches a char in _Str | 
|  | @Description		Returns the position of the first char that matches a char in _Str | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_first_of(const CPVRTString& _Str, size_t _Off) const | 
|  | { | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Str.m_Size;++j) | 
|  | { | 
|  | if(m_pString[i]==_Str[j]) | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_last_not_of | 
|  | @Input				_Ch		A char | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the last char that is not _Ch | 
|  | @Description		Returns the position of the last char that is not _Ch | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_last_not_of(char _Ch, size_t _Off) const | 
|  | { | 
|  | for(size_t i=m_Size-_Off-1;i<m_Size;--i) | 
|  | { | 
|  | if(m_pString[i]!=_Ch) | 
|  | { | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_last_not_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the last char that is not in _Ptr | 
|  | @Description		Returns the position of the last char that is not in _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_last_not_of(const char* _Ptr, size_t _Off) const | 
|  | { | 
|  | for(size_t i=m_Size-_Off-1;i<m_Size;--i) | 
|  | { | 
|  | bool bFound = true; | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;_Ptr[j]!=0;++j) | 
|  | { | 
|  | bFound = bFound && (m_pString[i]!=_Ptr[j]); | 
|  | } | 
|  | if(bFound) | 
|  | {	// return if considered character differed from all characters from _Ptr | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_last_not_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Input				_Count	Length of _Ptr | 
|  | @Returns			Position of the last char that is not in _Ptr | 
|  | @Description		Returns the position of the last char that is not in _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_last_not_of(const char* _Ptr, size_t _Off, size_t _Count) const | 
|  | { | 
|  | for(size_t i=m_Size-_Off-1;i<m_Size;--i) | 
|  | { | 
|  | bool bFound = true; | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Count;++j) | 
|  | { | 
|  | bFound = bFound && (m_pString[i]!=_Ptr[j]); | 
|  | } | 
|  | if(bFound) | 
|  | { | 
|  | // return if considered character differed from all characters from _Ptr | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_last_not_of | 
|  | @Input				_Str	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the last char that is not in _Str | 
|  | @Description		Returns the position of the last char that is not in _Str | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_last_not_of(const CPVRTString& _Str, size_t _Off) const | 
|  | { | 
|  | for(size_t i=m_Size-_Off-1;i<m_Size;--i) | 
|  | { | 
|  | bool bFound = true; | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Str.m_Size;++j) | 
|  | { | 
|  | bFound = bFound && (m_pString[i]!=_Str[j]); | 
|  | } | 
|  | if(bFound) | 
|  | { | 
|  | // return if considered character differed from all characters from _Ptr | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_last_of | 
|  | @Input				_Ch		A char | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the last char that is _Ch | 
|  | @Description		Returns the position of the last char that is _Ch | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_last_of(char _Ch, size_t _Off) const | 
|  | { | 
|  | for(size_t i=m_Size-_Off-1;i<m_Size;--i) | 
|  | { | 
|  | if(m_pString[i]==_Ch) | 
|  | { | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_last_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the last char that is in _Ptr | 
|  | @Description		Returns the position of the last char that is in _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_last_of(const char* _Ptr, size_t _Off) const | 
|  | { | 
|  | for(size_t i=m_Size-_Off-1;i<m_Size;--i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;_Ptr[j]!=0;++j) | 
|  | { | 
|  | if(m_pString[i]==_Ptr[j]) | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_last_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Input				_Count	Length of _Ptr | 
|  | @Returns			Position of the last char that is in _Ptr | 
|  | @Description		Returns the position of the last char that is in _Ptr | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_last_of(const char* _Ptr, size_t _Off, size_t _Count) const | 
|  | { | 
|  | for(size_t i=m_Size-_Off-1;i<m_Size;--i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Count;++j) | 
|  | { | 
|  | if(m_pString[i]!=_Ptr[j]) | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_last_of | 
|  | @Input				_Str	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Position of the last char that is in _Str | 
|  | @Description		Returns the position of the last char that is in _Str | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_last_of(const CPVRTString& _Str, size_t _Off) const | 
|  | { | 
|  | for(size_t i=m_Size-_Off-1;i<m_Size;--i) | 
|  | { | 
|  | // compare against each char from _Str | 
|  | for(size_t j=0;j<_Str.m_Size;++j) | 
|  | { | 
|  | if(m_pString[i]!=_Str[j]) | 
|  | return i; | 
|  | } | 
|  | } | 
|  | return npos; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_number_of | 
|  | @Input				_Ch		A char | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Number of occurances of _Ch in the parent string. | 
|  | @Description		Returns the number of occurances of _Ch in the parent string. | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_number_of(char _Ch, size_t _Off) const | 
|  | { | 
|  | size_t occurances=0; | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | if(m_pString[i]==_Ch) | 
|  | occurances++; | 
|  | } | 
|  | return occurances; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_number_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Number of occurances of _Ptr in the parent string. | 
|  | @Description		Returns the number of occurances of _Ptr in the parent string. | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_number_of(const char* _Ptr, size_t _Off) const | 
|  | { | 
|  | size_t occurances=0; | 
|  | bool bNotHere=false; | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;_Ptr[j]!=0;++j) | 
|  | { | 
|  | if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bNotHere=true; | 
|  | if(bNotHere) break; | 
|  | } | 
|  | if(!bNotHere) occurances++; | 
|  | else bNotHere = false; | 
|  | } | 
|  | return occurances; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_number_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Input				_Count	Size of _Ptr | 
|  | @Returns			Number of occurances of _Ptr in the parent string. | 
|  | @Description		Returns the number of occurances of _Ptr in the parent string. | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_number_of(const char* _Ptr, size_t _Off, size_t _Count) const | 
|  | { | 
|  | size_t occurances=0; | 
|  | bool bNotHere=false; | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Count;++j) | 
|  | { | 
|  | if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bNotHere=true; | 
|  | if(bNotHere) break; | 
|  | } | 
|  | if(!bNotHere) occurances++; | 
|  | else bNotHere = false; | 
|  | } | 
|  | return occurances; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_number_of | 
|  | @Input				_Str	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Number of occurances of _Str in the parent string. | 
|  | @Description		Returns the number of occurances of _Str in the parent string. | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::find_number_of(const CPVRTString& _Str, size_t _Off) const | 
|  | { | 
|  | size_t occurances=0; | 
|  | bool bNotHere=false; | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Str.m_Size;++j) | 
|  | { | 
|  | if(i+j>m_Size || m_pString[i+j]!=_Str[j]) | 
|  | bNotHere=true; | 
|  | if(bNotHere) | 
|  | break; | 
|  | } | 
|  | if(!bNotHere) occurances++; | 
|  | else bNotHere = false; | 
|  | } | 
|  | return occurances; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_next_occurance_of | 
|  | @Input				_Ch		A char | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Next occurance of _Ch in the parent string. | 
|  | @Description		Returns the next occurance of _Ch in the parent string | 
|  | after or at _Off.	If not found, returns the length of the string. | 
|  | *************************************************************************/ | 
|  | int CPVRTString::find_next_occurance_of(char _Ch, size_t _Off) const | 
|  | { | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | if(m_pString[i]==_Ch) | 
|  | return (int)i; | 
|  | } | 
|  | return (int)m_Size; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_next_occurance_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Next occurance of _Ptr in the parent string. | 
|  | @Description		Returns the next occurance of _Ptr in the parent string | 
|  | after or at _Off.	If not found, returns the length of the string. | 
|  | *************************************************************************/ | 
|  | int CPVRTString::find_next_occurance_of(const char* _Ptr, size_t _Off) const | 
|  | { | 
|  | bool bHere=true; | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;_Ptr[j]!=0;++j) | 
|  | { | 
|  | if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bHere=false; | 
|  | if(!bHere) break; | 
|  | } | 
|  | if(bHere) return (int)i; | 
|  | bHere=true; | 
|  | } | 
|  | return (int)m_Size; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_next_occurance_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Input				_Count	Size of _Ptr | 
|  | @Returns			Next occurance of _Ptr in the parent string. | 
|  | @Description		Returns the next occurance of _Ptr in the parent string | 
|  | after or at _Off.	If not found, returns the length of the string. | 
|  | *************************************************************************/ | 
|  | int CPVRTString::find_next_occurance_of(const char* _Ptr, size_t _Off, size_t _Count) const | 
|  | { | 
|  | bool bHere=true; | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Count;++j) | 
|  | { | 
|  | if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bHere=false; | 
|  | if(!bHere) break; | 
|  | } | 
|  | if(bHere) return (int)i; | 
|  | bHere=true; | 
|  | } | 
|  | return (int)m_Size; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_next_occurance_of | 
|  | @Input				_Str	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Next occurance of _Str in the parent string. | 
|  | @Description		Returns the next occurance of _Str in the parent string | 
|  | after or at _Off.	If not found, returns the length of the string. | 
|  | *************************************************************************/ | 
|  | int CPVRTString::find_next_occurance_of(const CPVRTString& _Str, size_t _Off) const | 
|  | { | 
|  | bool bHere=true; | 
|  | for(size_t i=_Off;i<m_Size;++i) | 
|  | { | 
|  | // compare against each char from _Str | 
|  | for(size_t j=0;j<_Str.m_Size;++j) | 
|  | { | 
|  | if(i+j>m_Size || m_pString[i+j]!=_Str[j]) bHere=false; | 
|  | if(!bHere) break; | 
|  | } | 
|  | if(bHere) return (int)i; | 
|  | bHere=true; | 
|  | } | 
|  | return (int)m_Size; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_previous_occurance_of | 
|  | @Input				_Ch		A char | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Previous occurance of _Ch in the parent string. | 
|  | @Description		Returns the previous occurance of _Ch in the parent string | 
|  | before _Off.	If not found, returns -1. | 
|  | *************************************************************************/ | 
|  | int CPVRTString::find_previous_occurance_of(char _Ch, size_t _Off) const | 
|  | { | 
|  | for(size_t i=_Off;i>0;--i) | 
|  | { | 
|  | if(m_pString[i]==_Ch) | 
|  | return (int)i; | 
|  | } | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_previous_occurance_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Previous occurance of _Ptr in the parent string. | 
|  | @Description		Returns the previous occurance of _Ptr in the parent string | 
|  | before _Off.	If not found, returns -1. | 
|  | *************************************************************************/ | 
|  | int CPVRTString::find_previous_occurance_of(const char* _Ptr, size_t _Off) const | 
|  | { | 
|  | bool bHere=true; | 
|  | for(size_t i=_Off;i>0;--i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;_Ptr[j]!=0;++j) | 
|  | { | 
|  | if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bHere=false; | 
|  | if(!bHere) break; | 
|  | } | 
|  | if(bHere) return (int)i; | 
|  | bHere=true; | 
|  | } | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_previous_occurance_of | 
|  | @Input				_Ptr	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Input				_Count	Size of _Ptr | 
|  | @Returns			Previous occurance of _Ptr in the parent string. | 
|  | @Description		Returns the previous occurance of _Ptr in the parent string | 
|  | before _Off.	If not found, returns -1. | 
|  | *************************************************************************/ | 
|  | int CPVRTString::find_previous_occurance_of(const char* _Ptr, size_t _Off, size_t _Count) const | 
|  | { | 
|  | bool bHere=true; | 
|  | for(size_t i=_Off;i>0;--i) | 
|  | { | 
|  | // compare against each char from _Ptr | 
|  | for(size_t j=0;j<_Count;++j) | 
|  | { | 
|  | if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bHere=false; | 
|  | if(!bHere) break; | 
|  | } | 
|  | if(bHere) return (int)i; | 
|  | bHere=true; | 
|  | } | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			find_previous_occurance_of | 
|  | @Input				_Str	A string | 
|  | @Input				_Off	Start position of the find | 
|  | @Returns			Previous occurance of _Str in the parent string. | 
|  | @Description		Returns the previous occurance of _Str in the parent string | 
|  | before _Off.	If not found, returns -1. | 
|  | *************************************************************************/ | 
|  | int CPVRTString::find_previous_occurance_of(const CPVRTString& _Str, size_t _Off) const | 
|  | { | 
|  | bool bHere=true; | 
|  | for(size_t i=_Off;i>0;--i) | 
|  | { | 
|  | // compare against each char from _Str | 
|  | for(size_t j=0;j<_Str.m_Size;++j) | 
|  | { | 
|  | if(i+j>m_Size || m_pString[i+j]!=_Str[j]) bHere=false; | 
|  | if(!bHere) break; | 
|  | } | 
|  | if(bHere) return (int)i; | 
|  | bHere=true; | 
|  | } | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			left | 
|  | @Input				iSize	number of characters to return (excluding null character) | 
|  | @Returns			The leftmost 'iSize' characters of the string. | 
|  | @Description		Returns the leftmost characters of the string (excluding | 
|  | the null character) in a new CPVRTString. If iSize is | 
|  | larger than the string, a copy of the original string is returned. | 
|  | *************************************************************************/ | 
|  | CPVRTString CPVRTString::left(size_t iSize) const | 
|  | { | 
|  | if(iSize>=m_Size) return *this; | 
|  | return CPVRTString(m_pString,iSize); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			right | 
|  | @Input				iSize	number of characters to return (excluding null character) | 
|  | @Returns			The rightmost 'iSize' characters of the string. | 
|  | @Description		Returns the rightmost characters of the string (excluding | 
|  | the null character) in a new CPVRTString. If iSize is | 
|  | larger than the string, a copy of the original string is returned. | 
|  | *************************************************************************/ | 
|  | CPVRTString CPVRTString::right(size_t iSize) const | 
|  | { | 
|  | if(iSize>=m_Size) return *this; | 
|  | return CPVRTString(m_pString+(m_Size-iSize),iSize); | 
|  | } | 
|  |  | 
|  | //CPVRTString& CPVRTString::insert(size_t _P0, const char* _Ptr) | 
|  | //{ | 
|  | //	return replace(_P0, 0, _Ptr); | 
|  | //} | 
|  |  | 
|  | //CPVRTString& CPVRTString::insert(size_t _P0, const char* _Ptr, size_t _Count) | 
|  | //{ | 
|  | //	return replace(_P0, 0, _Ptr, _Count); | 
|  | //} | 
|  |  | 
|  | //CPVRTString& CPVRTString::insert(size_t _P0, const CPVRTString& _Str) | 
|  | //{ | 
|  | //	return replace(_P0, 0, _Str); | 
|  | //} | 
|  |  | 
|  | //CPVRTString& CPVRTString::insert(size_t _P0, const CPVRTString& _Str, size_t _Off, size_t _Count) | 
|  | //{ | 
|  | //	return replace(_P0, 0, _Str, _Off, _Count); | 
|  | //} | 
|  |  | 
|  | //CPVRTString& CPVRTString::insert(size_t _P0, size_t _Count, char _Ch) | 
|  | //{ | 
|  | //	return replace(_P0, 0, _Count, _Ch); | 
|  | //} | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			length | 
|  | @Returns			Length of the string | 
|  | @Description		Returns the length of the string | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::length() const | 
|  | { | 
|  | return m_Size; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			max_size | 
|  | @Returns			The maximum number of chars that the string can contain | 
|  | @Description		Returns the maximum number of chars that the string can contain | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::max_size() const | 
|  | { | 
|  | return 0x7FFFFFFF; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			push_back | 
|  | @Input				_Ch A char to append | 
|  | @Description		Appends _Ch to the string | 
|  | *************************************************************************/ | 
|  | void CPVRTString::push_back(char _Ch) | 
|  | { | 
|  | append(1, _Ch); | 
|  | } | 
|  |  | 
|  | //CPVRTString& replace(size_t _Pos1, size_t _Num1, const char* _Ptr) | 
|  | //CPVRTString& replace(size_t _Pos1, size_t _Num1, const CPVRTString& _Str) | 
|  | //CPVRTString& replace(size_t _Pos1, size_t _Num1, const char* _Ptr, size_t _Num2) | 
|  | //CPVRTString& replace(size_t _Pos1, size_t _Num1, const CPVRTString& _Str, size_t _Pos2, size_t _Num2) | 
|  | //CPVRTString& replace(size_t _Pos1, size_t _Num1, size_t _Count, char _Ch) | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			reserve | 
|  | @Input				_Count Size of string to reserve | 
|  | @Description		Reserves space for _Count number of chars | 
|  | *************************************************************************/ | 
|  | void CPVRTString::reserve(size_t _Count) | 
|  | { | 
|  | if (_Count >= m_Capacity) | 
|  | { | 
|  | m_pString = (char*)realloc(m_pString, _Count + 1); | 
|  | m_Capacity = _Count + 1; | 
|  | } | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			resize | 
|  | @Input				_Count 	Size of string to resize to | 
|  | @Input				_Ch		Character to use to fill any additional space | 
|  | @Description		Resizes the string to _Count in length | 
|  | *************************************************************************/ | 
|  | void CPVRTString::resize(size_t _Count, char _Ch) | 
|  | { | 
|  | if (_Count <= m_Size) | 
|  | { | 
|  | m_Size = _Count; | 
|  | m_pString[m_Size] = 0; | 
|  | } | 
|  | else | 
|  | { | 
|  | append(_Count - m_Size,_Ch); | 
|  | } | 
|  | } | 
|  |  | 
|  | //size_t rfind(char _Ch, size_t _Off = npos) const; | 
|  | //size_t rfind(const char* _Ptr, size_t _Off = npos) const; | 
|  | //size_t rfind(const char* _Ptr, size_t _Off = npos, size_t _Count) const; | 
|  | //size_t rfind(const CPVRTString& _Str, size_t _Off = npos) const; | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			size | 
|  | @Returns			Size of the string | 
|  | @Description		Returns the size of the string | 
|  | *************************************************************************/ | 
|  | size_t CPVRTString::size() const | 
|  | { | 
|  | return m_Size; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			substr | 
|  | @Input				_Off	Start of the substring | 
|  | @Input				_Count	Length of the substring | 
|  | @Returns			A substring of the string | 
|  | @Description		Returns the size of the string | 
|  | *************************************************************************/ | 
|  | CPVRTString CPVRTString::substr(size_t _Off, size_t _Count) const | 
|  | { | 
|  | return CPVRTString(*this, _Off, _Count); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			swap | 
|  | @Input				_Str	A string to swap with | 
|  | @Description		Swaps the contents of the string with _Str | 
|  | *************************************************************************/ | 
|  | void CPVRTString::swap(CPVRTString& _Str) | 
|  | { | 
|  | size_t Size = _Str.m_Size; | 
|  | size_t Capacity = _Str.m_Capacity; | 
|  | char* pString = _Str.m_pString; | 
|  | _Str.m_Size = m_Size; | 
|  | _Str.m_Capacity = m_Capacity; | 
|  | _Str.m_pString = m_pString; | 
|  | m_Size = Size; | 
|  | m_Capacity = Capacity; | 
|  | m_pString = pString; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			toLower | 
|  | @Returns			An updated string | 
|  | @Description		Converts the string to lower case | 
|  | *************************************************************************/ | 
|  | CPVRTString&  CPVRTString::toLower() | 
|  | { | 
|  | int i = 0; | 
|  | while ( (m_pString[i] = (m_pString[i]>='A'&&m_pString[i]<='Z') ? ('a'+m_pString[i])-'A': m_pString[i]) != 0) i++; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			toUpper | 
|  | @Returns			An updated string | 
|  | @Description		Converts the string to upper case | 
|  | *************************************************************************/ | 
|  | CPVRTString&  CPVRTString::toUpper() | 
|  | { | 
|  | int i = 0; | 
|  | while ( (m_pString[i] = (m_pString[i]>='a'&&m_pString[i]<='z') ? ('A'+m_pString[i])-'a': m_pString[i]) != 0) i++; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			Format | 
|  | @Input				pFormat A string containing the formating | 
|  | @Returns			A formatted string | 
|  | @Description		return the formatted string | 
|  | ************************************************************************/ | 
|  | CPVRTString CPVRTString::format(const char *pFormat, ...) | 
|  | { | 
|  | va_list arg; | 
|  |  | 
|  | va_start(arg, pFormat); | 
|  | #if defined(_WIN32) | 
|  | size_t bufSize = _vscprintf(pFormat,arg); | 
|  | #else | 
|  | size_t bufSize = vsnprintf(NULL,0,pFormat,arg); | 
|  | #endif | 
|  | va_end(arg); | 
|  |  | 
|  | char*	buf=new char[bufSize + 1]; | 
|  |  | 
|  | va_start(arg, pFormat); | 
|  | vsnprintf(buf, bufSize + 1, pFormat, arg); | 
|  | va_end(arg); | 
|  |  | 
|  | CPVRTString returnString(buf); | 
|  | delete [] buf; | 
|  | *this = returnString; | 
|  | return returnString; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			+= | 
|  | @Input				_Ch A char | 
|  | @Returns			An updated string | 
|  | @Description		+= Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::operator+=(char _Ch) | 
|  | { | 
|  | return append(1, _Ch); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			+= | 
|  | @Input				_Ptr A string | 
|  | @Returns			An updated string | 
|  | @Description		+= Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::operator+=(const char* _Ptr) | 
|  | { | 
|  | return append(_Ptr); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			+= | 
|  | @Input				_Right A string | 
|  | @Returns			An updated string | 
|  | @Description		+= Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::operator+=(const CPVRTString& _Right) | 
|  | { | 
|  | return append(_Right); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			= | 
|  | @Input				_Ch A char | 
|  | @Returns			An updated string | 
|  | @Description		= Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::operator=(char _Ch) | 
|  | { | 
|  | return assign(1, _Ch); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			= | 
|  | @Input				_Ptr A string | 
|  | @Returns			An updated string | 
|  | @Description		= Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::operator=(const char* _Ptr) | 
|  | { | 
|  | return assign(_Ptr); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			= | 
|  | @Input				_Right A string | 
|  | @Returns			An updated string | 
|  | @Description		= Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString& CPVRTString::operator=(const CPVRTString& _Right) | 
|  | { | 
|  | return assign(_Right); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			[] | 
|  | @Input				_Off An index into the string | 
|  | @Returns			A character | 
|  | @Description		[] Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString::const_reference CPVRTString::operator[](size_t _Off) const | 
|  | { | 
|  | return m_pString[_Off]; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			[] | 
|  | @Input				_Off An index into the string | 
|  | @Returns			A character | 
|  | @Description		[] Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString::reference CPVRTString::operator[](size_t _Off) | 
|  | { | 
|  | return m_pString[_Off]; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			+ | 
|  | @Input				_Left A string | 
|  | @Input				_Right A string | 
|  | @Returns			An updated string | 
|  | @Description		+ Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString operator+ (const CPVRTString& _Left, const CPVRTString& _Right) | 
|  | { | 
|  | return CPVRTString(_Left).append(_Right); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			+ | 
|  | @Input				_Left A string | 
|  | @Input				_Right A string | 
|  | @Returns			An updated string | 
|  | @Description		+ Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString operator+ (const CPVRTString& _Left, const char* _Right) | 
|  | { | 
|  | return CPVRTString(_Left).append(_Right); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			+ | 
|  | @Input				_Left A string | 
|  | @Input				_Right A string | 
|  | @Returns			An updated string | 
|  | @Description		+ Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString operator+ (const CPVRTString& _Left, const char _Right) | 
|  | { | 
|  | return CPVRTString(_Left).append(_Right); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			+ | 
|  | @Input				_Left A string | 
|  | @Input				_Right A string | 
|  | @Returns			An updated string | 
|  | @Description		+ Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString operator+ (const char* _Left, const CPVRTString& _Right) | 
|  | { | 
|  | return CPVRTString(_Left).append(_Right); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			+ | 
|  | @Input				_Left A string | 
|  | @Input				_Right A string | 
|  | @Returns			An updated string | 
|  | @Description		+ Operator | 
|  | *************************************************************************/ | 
|  | CPVRTString operator+ (const char _Left, const CPVRTString& _Right) | 
|  | { | 
|  | return CPVRTString(_Left).append(_Right); | 
|  | } | 
|  |  | 
|  | /************************************************************************* | 
|  | * MISCELLANEOUS UTILITY FUNCTIONS | 
|  | *************************************************************************/ | 
|  | /*!*********************************************************************** | 
|  | @Function			PVRTStringGetFileExtension | 
|  | @Input				strFilePath A string | 
|  | @Returns			Extension | 
|  | @Description		Extracts the file extension from a file path. | 
|  | Returns an empty CPVRTString if no extension is found. | 
|  | ************************************************************************/ | 
|  | CPVRTString PVRTStringGetFileExtension(const CPVRTString& strFilePath) | 
|  | { | 
|  | CPVRTString::size_type idx = strFilePath.find_last_of ( '.' ); | 
|  |  | 
|  | if (idx == CPVRTString::npos) | 
|  | return CPVRTString(""); | 
|  | else | 
|  | return strFilePath.substr(idx); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			PVRTStringGetContainingDirectoryPath | 
|  | @Input				strFilePath A string | 
|  | @Returns			Directory | 
|  | @Description		Extracts the directory portion from a file path. | 
|  | ************************************************************************/ | 
|  | CPVRTString PVRTStringGetContainingDirectoryPath(const CPVRTString& strFilePath) | 
|  | { | 
|  | size_t i32sep = strFilePath.find_last_of('/'); | 
|  | if(i32sep == strFilePath.npos) | 
|  | { | 
|  | i32sep = strFilePath.find_last_of('\\'); | 
|  | if(i32sep == strFilePath.npos) | 
|  | {	// can't find an actual \ or /, so return an empty string | 
|  | return CPVRTString(""); | 
|  | } | 
|  | } | 
|  | return strFilePath.substr(0,i32sep); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			PVRTStringGetFileName | 
|  | @Input				strFilePath A string | 
|  | @Returns			FileName | 
|  | @Description		Extracts the name and extension portion from a file path. | 
|  | ************************************************************************/ | 
|  | CPVRTString PVRTStringGetFileName(const CPVRTString& strFilePath) | 
|  | { | 
|  | size_t i32sep = strFilePath.find_last_of('/'); | 
|  | if(i32sep == strFilePath.npos) | 
|  | { | 
|  | i32sep = strFilePath.find_last_of('\\'); | 
|  | if(i32sep == strFilePath.npos) | 
|  | {	// can't find an actual \ or / so leave it be | 
|  | return strFilePath; | 
|  | } | 
|  | } | 
|  | return strFilePath.substr(i32sep+1,strFilePath.length()); | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			PVRTStringStripWhiteSpaceFromStartOf | 
|  | @Input				strLine A string | 
|  | @Returns			Result of the white space stripping | 
|  | @Description		strips white space characters from the beginning of a CPVRTString. | 
|  | ************************************************************************/ | 
|  | CPVRTString PVRTStringStripWhiteSpaceFromStartOf(const CPVRTString& strLine) | 
|  | { | 
|  | size_t start = strLine.find_first_not_of(" \t	\n\r"); | 
|  | if(start!=strLine.npos) | 
|  | return strLine.substr(start,strLine.length()-(start)); | 
|  | return strLine; | 
|  | } | 
|  |  | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			PVRTStringStripWhiteSpaceFromEndOf | 
|  | @Input				strLine A string | 
|  | @Returns			Result of the white space stripping | 
|  | @Description		strips white space characters from the end of a CPVRTString. | 
|  | ************************************************************************/ | 
|  | CPVRTString PVRTStringStripWhiteSpaceFromEndOf(const CPVRTString& strLine) | 
|  | { | 
|  | size_t end = strLine.find_last_not_of(" \t	\n\r"); | 
|  | if(end!=strLine.npos) | 
|  | return strLine.substr(0,end+1); | 
|  | return strLine; | 
|  | } | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @Function			PVRTStringFromFormattedStr | 
|  | @Input				pFormat A string containing the formating | 
|  | @Returns			A formatted string | 
|  | @Description		Creates a formatted string | 
|  | ************************************************************************/ | 
|  | CPVRTString PVRTStringFromFormattedStr(const char *pFormat, ...) | 
|  | { | 
|  | va_list arg; | 
|  |  | 
|  | va_start(arg, pFormat); | 
|  | #if defined(_WIN32) | 
|  | size_t bufSize = _vscprintf(pFormat,arg); | 
|  | #else | 
|  | size_t bufSize = vsnprintf(NULL,0,pFormat,arg); | 
|  | #endif | 
|  | va_end(arg); | 
|  |  | 
|  | char* buf = new char[bufSize + 1]; | 
|  |  | 
|  | va_start(arg, pFormat); | 
|  | vsnprintf(buf, bufSize + 1, pFormat, arg); | 
|  | va_end(arg); | 
|  |  | 
|  | CPVRTString returnString(buf); | 
|  | delete [] buf; | 
|  | return returnString; | 
|  | } | 
|  |  | 
|  | ///*!*************************************************************************** | 
|  |  | 
|  |  | 
|  | // Substitute one character by another | 
|  | CPVRTString& CPVRTString::substitute(char _src,char _subDes, bool _all) | 
|  | { | 
|  | int len = (int) length(); | 
|  | char  c=_src; | 
|  | char  s=_subDes; | 
|  | int  i=0; | 
|  | while(i<len) | 
|  | { | 
|  | if(m_pString[i]==c) | 
|  | { | 
|  | m_pString[i]=s; | 
|  | if(!_all) break; | 
|  | } | 
|  | i++; | 
|  | } | 
|  | return *this; | 
|  | } | 
|  |  | 
|  |  | 
|  | // Substitute one string by another ( Need time to improved ) | 
|  | CPVRTString& CPVRTString::substitute(const char* _src, const char* _dest, bool _all) | 
|  | { | 
|  | if (this->length() == 0) | 
|  | { | 
|  | return *this; | 
|  | } | 
|  | unsigned int pos=0; | 
|  | CPVRTString src = _src; | 
|  | CPVRTString dest = _dest; | 
|  | CPVRTString ori; | 
|  |  | 
|  | while(pos<=m_Size-src.length()) | 
|  | { | 
|  | if(this->compare(pos,src.length(),_src)==0) | 
|  | { | 
|  | ori = this->c_str(); | 
|  | CPVRTString sub1, sub2, result; | 
|  | sub1.assign(ori,0,pos); | 
|  | sub2.assign(ori,pos+src.length(),m_Size - (pos+src.length())); | 
|  |  | 
|  | this->assign(""); | 
|  | this->append(sub1); | 
|  | this->append(dest); | 
|  | this->append(sub2); | 
|  |  | 
|  | if(!_all) | 
|  | { | 
|  | break; | 
|  | } | 
|  | pos += (unsigned int) dest.length(); | 
|  | continue; | 
|  | } | 
|  | pos++; | 
|  | } | 
|  |  | 
|  | return *this; | 
|  | } | 
|  |  | 
|  |  | 
|  | #endif // _USING_PVRTSTRING_ | 
|  |  | 
|  | /***************************************************************************** | 
|  | End of file (PVRTString.cpp) | 
|  | *****************************************************************************/ | 
|  |  |