| /****************************************************************************** | |
| @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) | |
| *****************************************************************************/ | |