17b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/******************************************************************************
27b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
37b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @File         PVRTString.cpp
47b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
57b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Title        PVRTString
67b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
77b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Version
87b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
97b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Copyright    Copyright (c) Imagination Technologies Limited.
107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Platform     ANSI compatible
127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description  A string class that can be used as drop-in replacement for
147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens               std::string on platforms/compilers that don't provide a full C++
157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens               standard library.
167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens******************************************************************************/
187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTString.h"
197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifdef _USING_PVRTSTRING_
217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <stdlib.h>
237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <string.h>
247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <stdarg.h>
257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTGlobal.h"
277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst size_t CPVRTString::npos = (size_t) -1;
297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(_WIN32)
317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define vsnprintf _vsnprintf
327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define snprintf _snprintf
337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			CPVRTString
377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Length of _Ptr
397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Constructor
407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens************************************************************************/
417b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString::CPVRTString(const char* _Ptr, size_t _Count) :
427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensm_pString(0), m_Capacity(0)
437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (_Count == npos)
457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (_Ptr == NULL)
477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			 assign(_Ptr, 0);
497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			assign(_Ptr);
537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		assign(_Ptr, _Count);
577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			CPVRTString
617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Right	A string
627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Roff	Offset into _Right
637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Number of chars from _Right to assign to the new string
647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Constructor
657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens************************************************************************/
667b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString::CPVRTString(const CPVRTString& _Right, size_t _Roff, size_t _Count) :
677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensm_pString(0), m_Capacity(0)
687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	assign(_Right, _Roff, _Count);
707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			CPVRTString
747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Length of new string
757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		A char to fill it with
767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Constructor
777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
787b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString::CPVRTString(size_t _Count, char _Ch) :
797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensm_pString(0), m_Capacity(0)
807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	assign(_Count,_Ch);
827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			CPVRTString
867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch	A char
877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Constructor
887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
897b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString::CPVRTString(const char _Ch) :
907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensm_pString(0), m_Capacity(0)
917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	assign( 1, _Ch);
937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			CPVRTString
977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Constructor
987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
997b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString::CPVRTString() :
1007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensm_Size(0), m_Capacity(1)
1017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
1027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pString = (char*)calloc(1, 1);
1037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
1047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
1067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			~CPVRTString
1077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Destructor
1087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
1097b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString::~CPVRTString()
1107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
1117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (m_pString)
1127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		free(m_pString);
1147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pString=NULL;
1157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
1177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
1197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			append
1207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
1217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
1227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Appends a string
1237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
1247b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::append(const char* _Ptr)
1257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
1267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (_Ptr==NULL)
1277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
1297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return append(_Ptr,strlen(_Ptr));
1317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
1327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
1347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			append
1357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
1367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	String length
1377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
1387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Appends a string of length _Count
1397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
1407b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::append(const char* _Ptr, size_t _Count)
1417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
1427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char* pString = m_pString;
1437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t newCapacity = _Count + m_Size + 1;	// +1 for null termination
1447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// extend CPVRTString if necessary
1467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (m_Capacity < newCapacity)
1477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		pString = (char*)malloc(newCapacity);
1497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Capacity = newCapacity;				 // Using low memory profile (but very slow append)
1507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		memmove(pString, m_pString, m_Size);
1517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		pString[m_Capacity-1]='\0';
1527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// append chars from _Ptr
1557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	memmove(pString + m_Size, _Ptr, _Count);
1567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Size += _Count;
1577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	pString[m_Size] = 0;
1587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// remove old CPVRTString if necessary
1607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (pString != m_pString)
1617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (m_pString)
1637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
1647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			free(m_pString);
1657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_pString=NULL;
1667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
1677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pString = pString;
1687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return *this;
1707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
1717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
1737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			append
1747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string
1757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
1767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Appends a string
1777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
1787b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::append(const CPVRTString& _Str)
1797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
1807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return append(_Str.m_pString,_Str.m_Size);
1817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
1827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
1847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			append
1857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string
1867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	A position in string
1877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Number of letters to append
1887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
1897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Appends _Count letters of _Str from _Off in _Str
1907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
1917b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::append(const CPVRTString& _Str, size_t _Off, size_t _Count)
1927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
1937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (_Str.length() < _Off + _Count)
1947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int i32NewCount = (signed)(_Str.length())-(signed)_Off;
1967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(i32NewCount < 0 )
1987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
1997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return *this;
2007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_Count = (size_t) i32NewCount;
2037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return append(_Str.m_pString+_Off,_Count);
2067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
2077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
2097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			append
2107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		A char
2117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Number of times to append _Ch
2127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
2137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Appends _Ch _Count times
2147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
2157b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::append(size_t _Count, char _Ch)
2167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
2177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char* pString = m_pString;
2187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t newCapacity = _Count + m_Size + 1;	// +1 for null termination
2197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// extend CPVRTString if necessary
2207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (m_Capacity < newCapacity)
2217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		pString = (char*)malloc(newCapacity);
2237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Capacity = newCapacity;
2247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		memmove(pString, m_pString, m_Size+1);
2257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char* newChar = &pString[m_Size];
2287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// fill new space with _Ch
2297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=0;i<_Count;++i)
2307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*newChar++ = _Ch;
2327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*newChar = '\0';		// set null terminator
2347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Size+=_Count;			// adjust length of string for new characters
2357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// remove old CPVRTString if necessary
2377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (pString != m_pString)
2387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (m_pString)
2407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			free(m_pString);
2427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_pString=NULL;
2437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pString = pString;
2457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return *this;
2477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
2487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
2507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			assign
2517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr A string
2527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
2537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Assigns the string to the string _Ptr
2547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
2557b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::assign(const char* _Ptr)
2567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
2577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (_Ptr == NULL)
2587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return assign(_Ptr, 0);
2607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return assign(_Ptr, strlen(_Ptr));
2627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
2637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
2657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			assign
2667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr A string
2677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count Length of _Ptr
2687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
2697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Assigns the string to the string _Ptr
2707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
2717b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::assign(const char* _Ptr, size_t _Count)
2727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
2737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(m_Capacity <= _Count)
2747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		free(m_pString);
2767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Capacity = _Count+1;
2777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pString = (char*)malloc(m_Capacity);
2787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		memcpy(m_pString, _Ptr, _Count);
2797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
2817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		memmove(m_pString, _Ptr, _Count);
2827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Size = _Count;
2847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pString[m_Size] = 0;
2857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return *this;
2877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
2887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
2907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			assign
2917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str A string
2927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
2937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Assigns the string to the string _Str
2947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
2957b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::assign(const CPVRTString& _Str)
2967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
2977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return assign(_Str.m_pString, _Str.m_Size);
2987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
2997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
3017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			assign
3027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str A string
3037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off First char to start assignment from
3047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count Length of _Str
3057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
3067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Assigns the string to _Count characters in string _Str starting at _Off
3077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
3087b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::assign(const CPVRTString& _Str, size_t _Off, size_t _Count)
3097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
3107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(_Count==npos)
3117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_Count = _Str.m_Size - _Off;
3137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return assign(&_Str.m_pString[_Off], _Count);
3157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
3167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
3187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			assign
3197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch A string
3207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count Number of times to repeat _Ch
3217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Updated string
3227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Assigns the string to _Count copies of _Ch
3237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
3247b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::assign(size_t _Count,char _Ch)
3257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
3267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (m_Capacity <= _Count)
3277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (m_pString)
3297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			free(m_pString);
3317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_pString=NULL;
3327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pString = (char*)malloc(_Count + 1);
3347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Capacity = _Count+1;
3357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Size = _Count;
3377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	memset(m_pString, _Ch, _Count);
3387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pString[m_Size] = 0;
3397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return *this;
3417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
3427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//const_reference at(size_t _Off) const;
3447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//reference at(size_t _Off);
3457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
3477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			c_str
3487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			const char* pointer of the string
3497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns a const char* pointer of the string
3507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
3517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst char* CPVRTString::c_str() const
3527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
3537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_pString;
3547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
3557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
3577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			capacity
3587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			The size of the character array reserved
3597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the size of the character array reserved
3607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
3617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::capacity() const
3627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
3637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_Capacity;
3647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
3657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
3677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			clear
3687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Clears the string
3697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
3707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTString::clear()
3717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
3727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (m_pString)
3737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		free(m_pString);
3757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pString=NULL;
3767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pString = (char*)calloc(1, 1);
3787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Size = 0;
3797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Capacity = 1;
3807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
3817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
3837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			compare
3847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str A string to compare with
3857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			0 if the strings match
3867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Compares the string with _Str
3877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
3887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::compare(const CPVRTString& _Str) const
3897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
3907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strcmp(m_pString,_Str.m_pString);
3917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
3927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
3947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			<
3957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str A string to compare with
3967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			True on success
3977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Less than operator
3987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
3997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool CPVRTString::operator<(const CPVRTString & _Str) const
4007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
4017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return (strcmp(m_pString, _Str.m_pString) < 0);
4027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
4037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
4057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			compare
4067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Pos1	Position to start comparing from
4077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Num1	Number of chars to compare
4087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str 	A string to compare with
4097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			0 if the strings match
4107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Compares the string with _Str
4117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
4127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::compare(size_t _Pos1, size_t _Num1, const CPVRTString& _Str) const
4137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
4147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	_ASSERT(_Pos1<=m_Size);	// check comparison starts within lhs CPVRTString
4157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int i32Ret;	// value to return if no difference in actual comparisons between chars
4177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stLhsLength = m_Size-_Pos1;
4187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stSearchLength = PVRT_MIN(stLhsLength,PVRT_MIN(_Str.m_Size,_Num1));	// number of comparisons to do
4197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(PVRT_MIN(stLhsLength,_Num1)<PVRT_MIN(_Str.m_Size,_Num1))
4207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = -1;
4227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else if(PVRT_MIN(stLhsLength,_Num1)>PVRT_MIN(_Str.m_Size,_Num1))
4247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = 1;
4267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
4287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = 0;
4307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// do actual comparison
4337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const char* lhptr = &m_pString[_Pos1];
4347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const char* rhptr = _Str.m_pString;
4357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=0;i<stSearchLength;++i)
4367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(*lhptr<*rhptr)
4387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return -1;
4397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else if (*lhptr>*rhptr)
4407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return 1;
4417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		lhptr++;rhptr++;
4427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// no difference found in compared characters
4447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return i32Ret;
4457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
4467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
4487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			compare
4497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Pos1	Position to start comparing from
4507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Num1	Number of chars to compare
4517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str 	A string to compare with
4527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off 	Position in _Str to compare from
4537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Number of chars in _Str to compare with
4547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			0 if the strings match
4557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Compares the string with _Str
4567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
4577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::compare(size_t _Pos1, size_t _Num1, const CPVRTString& _Str, size_t /*_Off*/, size_t _Count) const
4587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
4597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	_ASSERT(_Pos1<=m_Size);	// check comparison starts within lhs CPVRTString
4607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int i32Ret;	// value to return if no difference in actual comparisons between chars
4627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stLhsLength = m_Size-_Pos1;
4637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stSearchLength = PVRT_MIN(stLhsLength,PVRT_MIN(_Str.m_Size,PVRT_MIN(_Num1,_Count)));	// number of comparisons to do
4647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(PVRT_MIN(stLhsLength,_Num1)<PVRT_MIN(_Str.m_Size,_Count))
4657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = -1;
4677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else if(PVRT_MIN(stLhsLength,_Num1)>PVRT_MIN(_Str.m_Size,_Count))
4697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = 1;
4717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
4737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = 0;
4757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// do actual comparison
4797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char* lhptr = &m_pString[_Pos1];
4807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char* rhptr = _Str.m_pString;
4817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=0;i<stSearchLength;++i)
4827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(*lhptr<*rhptr)
4847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return -1;
4857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else if (*lhptr>*rhptr)
4867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return 1;
4877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		lhptr++;rhptr++;
4887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// no difference found in compared characters
4907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return i32Ret;
4917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
4927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
4947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			compare
4957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr A string to compare with
4967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			0 if the strings match
4977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Compares the string with _Ptr
4987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
4997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::compare(const char* _Ptr) const
5007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
5017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strcmp(m_pString,_Ptr);
5027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
5037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
5057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			compare
5067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Pos1	Position to start comparing from
5077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Num1	Number of chars to compare
5087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr 	A string to compare with
5097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			0 if the strings match
5107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Compares the string with _Ptr
5117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
5127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::compare(size_t _Pos1, size_t _Num1, const char* _Ptr) const
5137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
5147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	_ASSERT(_Pos1<=m_Size);	// check comparison starts within lhs CPVRTString
5157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int i32Ret;	// value to return if no difference in actual comparisons between chars
5177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stLhsLength = m_Size-_Pos1;
5187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stRhsLength = strlen(_Ptr);
5197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stSearchLength = PVRT_MIN(stLhsLength,PVRT_MIN(stRhsLength,_Num1));	// number of comparisons to do
5207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(PVRT_MIN(stLhsLength,_Num1)<PVRT_MIN(stRhsLength,_Num1))
5217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = -1;
5237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else if(PVRT_MIN(stLhsLength,_Num1)>PVRT_MIN(stRhsLength,_Num1))
5257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = 1;
5277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
5297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = 0;
5317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// do actual comparison
5347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const char* lhptr = &m_pString[_Pos1];
5357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const char* rhptr = _Ptr;
5367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=0;i<stSearchLength;++i)
5377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(*lhptr<*rhptr)
5397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return -1;
5407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else if (*lhptr>*rhptr)
5417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return 1;
5427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		lhptr++;rhptr++;
5437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// no difference found in compared characters
5457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return i32Ret;
5467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
5477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
5497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			compare
5507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Pos1	Position to start comparing from
5517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Num1	Number of chars to compare
5527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr 	A string to compare with
5537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Number of char to compare
5547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			0 if the strings match
5557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Compares the string with _Str
5567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
5577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::compare(size_t _Pos1, size_t _Num1, const char* _Ptr, size_t _Count) const
5587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
5597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	_ASSERT(_Pos1<=m_Size);	// check comparison starts within lhs CPVRTString
5607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int i32Ret;	// value to return if no difference in actual comparisons between chars
5627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stLhsLength = m_Size-_Pos1;
5637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stRhsLength = strlen(_Ptr);
5647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t stSearchLength = PVRT_MIN(stLhsLength,PVRT_MIN(stRhsLength,PVRT_MIN(_Num1,_Count)));	// number of comparisons to do
5657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(PVRT_MIN(stLhsLength,_Num1)<PVRT_MIN(stRhsLength,_Count))
5667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = -1;
5687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else if(PVRT_MIN(stLhsLength,_Num1)>PVRT_MIN(stRhsLength,_Count))
5707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = 1;
5727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
5747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32Ret = 0;
5767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// do actual comparison
5807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char* lhptr = &m_pString[_Pos1];
5817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const char* rhptr = _Ptr;
5827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=0;i<stSearchLength;++i)
5837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(*lhptr<*rhptr)
5857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return -1;
5867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else if (*lhptr>*rhptr)
5877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return 1;
5887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		lhptr++;rhptr++;
5897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// no difference found in compared characters
5917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return i32Ret;
5927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
5937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
5957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			==
5967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str 	A string to compare with
5977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			True if they match
5987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		== Operator
5997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
6007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool CPVRTString::operator==(const CPVRTString& _Str) const
6017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strcmp(m_pString, _Str.m_pString)==0;
6037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
6067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			==
6077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr 	A string to compare with
6087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			True if they match
6097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		== Operator
6107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
6117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool CPVRTString::operator==(const char* const _Ptr) const
6127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!_Ptr)
6147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return false;
6157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strcmp(m_pString, _Ptr)==0;
6177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
6207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			!=
6217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str 	A string to compare with
6227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			True if they don't match
6237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		!= Operator
6247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
6257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool CPVRTString::operator!=(const CPVRTString& _Str) const
6267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strcmp(m_pString, _Str.m_pString)!=0;
6287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
6317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			!=
6327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr 	A string to compare with
6337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			True if they don't match
6347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		!= Operator
6357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
6367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool CPVRTString::operator!=(const char* const _Ptr) const
6377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!_Ptr)
6397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return true;
6407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strcmp(m_pString, _Ptr)!=0;
6427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
6457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			copy
6467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Modified			_Ptr 	A string to copy to
6477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Size of _Ptr
6487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Position to start copying from
6497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Number of bytes copied
6507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Copies the string to _Ptr
6517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
6527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::copy(char* _Ptr, size_t _Count, size_t _Off) const
6537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(memcpy(_Ptr, &m_pString[_Off], PVRT_MIN(_Count, m_Size - _Off)))
6557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return _Count;
6567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return 0;
6587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
6617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			data
6627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			A const char* version of the string
6637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns a const char* version of the string
6647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
6657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst char* CPVRTString::data() const
6667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_pString;
6687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
6717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			empty
6727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			True if the string is empty
6737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns true if the string is empty
6747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
6757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool CPVRTString::empty() const
6767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return (m_Size == 0);
6787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
6817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			erase
6827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Pos	The position to start erasing from
6837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Number of chars to erase
6847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
6857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Erases a portion of the string
6867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
6877b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::erase(size_t _Pos, size_t _Count)
6887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (_Count == npos || _Pos + _Count >= m_Size)
6907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		resize(_Pos, 0);
6927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
6947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		memmove(&m_pString[_Pos], &m_pString[_Pos + _Count], m_Size + 1 - (_Pos + _Count));
6967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return *this;
6987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
7017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find
7027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	String to search.
7037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Offset to search from.
7047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Number of characters in this string.
7057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first matched string.
7067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Finds a substring within this string.
7077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
7087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find(const char* _Ptr, size_t _Off, size_t _Count) const
7097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
7107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!_Ptr)
7117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return npos;
7127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(_Count > m_Size)
7147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return npos;
7157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	while(_Off < m_Size)
7177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(_Ptr[0] == m_pString[_Off])
7197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
7207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(compare(_Off, _Count, _Ptr) == 0)
7217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return _Off;
7227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
7237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_Off++;
7247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
7277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
7287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
7307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find
7317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	String to search.
7327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Offset to search from.
7337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first matched string.
7347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Erases a portion of the string
7357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
7367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find(const CPVRTString& _Str, size_t _Off) const
7377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
7387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return find(_Str.c_str(), _Off, _Str.length());
7397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
7407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
7427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_first_not_of
7437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		A char
7447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
7457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first char that is not _Ch
7467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the first char that is not _Ch
7477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
7487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_first_not_of(char _Ch, size_t _Off) const
7497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
7507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
7517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_pString[i]!=_Ch)
7537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
7547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
7567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
7577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
7597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_first_not_of
7607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
7617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
7627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first char that is not in _Ptr
7637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the first char that is not in _Ptr
7647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
7657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_first_not_of(const char* _Ptr, size_t _Off) const
7667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
7677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
7687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bFound = false;
7707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
7717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;_Ptr[j]!=0;++j)
7727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
7737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bFound = bFound || (m_pString[i]==_Ptr[j]);
7747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
7757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(!bFound)
7767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{	// return if no match
7777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
7787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
7797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
7817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
7827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
7847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_first_not_of
7857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
7867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
7877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Number of chars in _Ptr
7887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first char that is not in _Ptr
7897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the first char that is not in _Ptr
7907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
7917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_first_not_of(const char* _Ptr, size_t _Off, size_t _Count) const
7927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
7937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
7947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bFound = false;
7967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
7977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Count;++j)
7987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
7997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bFound = bFound || (m_pString[i]==_Ptr[j]);
8007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
8017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(!bFound)
8027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{	// return if no match
8037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
8047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
8057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
8077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
8107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_first_not_of
8117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string
8127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
8137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first char that is not in _Str
8147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the first char that is not in _Str
8157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
8167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_first_not_of(const CPVRTString& _Str, size_t _Off) const
8177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
8187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
8197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bFound = false;
8217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Str
8227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Str.m_Size;++j)
8237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
8247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bFound = bFound || (m_pString[i]==_Str[j]);
8257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
8267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(!bFound)
8277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{	// return if no match
8287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
8297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
8307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
8327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
8357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_first_of
8367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		A char
8377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
8387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first char that is _Ch
8397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the first char that is _Ch
8407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
8417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_first_of(char _Ch, size_t _Off) const
8427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
8437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
8447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_pString[i]==_Ch)
8467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
8477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
8497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
8527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_first_of
8537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
8547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
8557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first char that matches a char in _Ptr
8567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the first char that matches a char in _Ptr
8577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
8587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_first_of(const char* _Ptr, size_t _Off) const
8597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
8607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
8617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
8637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;_Ptr[j]!=0;++j)
8647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
8657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_pString[i]==_Ptr[j])
8667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return i;
8677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
8687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
8707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
8737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_first_of
8747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
8757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
8767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Size of _Ptr
8777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first char that matches a char in _Ptr
8787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the first char that matches a char in _Ptr
8797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
8807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_first_of(const char* _Ptr, size_t _Off, size_t _Count) const
8817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
8827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
8837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
8857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Count;++j)
8867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
8877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_pString[i]==_Ptr[j])
8887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return i;
8897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
8907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
8927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
8967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_first_of
8977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
8987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
8997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Size of _Ptr
9007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first char that matches a char in _Ptr
9017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the first char that matches a char in _Ptr
9027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
9037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_first_ofn(const char* _Ptr, size_t _Off, size_t _Count) const
9047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
9057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (_Ptr == NULL)
9067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return npos;
9087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (strlen(m_pString) < _Count)
9117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	   return npos;
9137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
9167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (m_pString[i] ==_Ptr[0])
9187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
9197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if (i+_Count-1>=m_Size)  // There are not enough caracters in current String
9207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
9217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return npos;
9227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
9237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bool compare = true;
9257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			for(size_t k=1;k<_Count;++k)
9267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
9277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				compare &= (m_pString[i+k] ==_Ptr[k]);
9287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
9297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if (compare == true)
9307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
9317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return i;
9327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
9337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
9347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
9367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
9377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
9397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_first_of
9407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string
9417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
9427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the first char that matches a char in _Str
9437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the first char that matches a char in _Str
9447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
9457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_first_of(const CPVRTString& _Str, size_t _Off) const
9467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
9477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
9487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
9507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Str.m_Size;++j)
9517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
9527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_pString[i]==_Str[j])
9537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return i;
9547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
9557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
9577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
9587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
9607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_last_not_of
9617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		A char
9627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
9637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the last char that is not _Ch
9647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the last char that is not _Ch
9657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
9667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_last_not_of(char _Ch, size_t _Off) const
9677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
9687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=m_Size-_Off-1;i<m_Size;--i)
9697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_pString[i]!=_Ch)
9717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
9727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
9737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
9747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
9767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
9777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
9797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_last_not_of
9807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
9817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
9827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the last char that is not in _Ptr
9837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the last char that is not in _Ptr
9847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
9857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_last_not_of(const char* _Ptr, size_t _Off) const
9867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
9877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=m_Size-_Off-1;i<m_Size;--i)
9887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bFound = true;
9907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
9917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;_Ptr[j]!=0;++j)
9927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
9937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bFound = bFound && (m_pString[i]!=_Ptr[j]);
9947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
9957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(bFound)
9967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{	// return if considered character differed from all characters from _Ptr
9977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
9987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
9997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
10017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
10027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
10047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_last_not_of
10057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
10067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
10077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Length of _Ptr
10087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the last char that is not in _Ptr
10097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the last char that is not in _Ptr
10107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
10117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_last_not_of(const char* _Ptr, size_t _Off, size_t _Count) const
10127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
10137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=m_Size-_Off-1;i<m_Size;--i)
10147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bFound = true;
10167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
10177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Count;++j)
10187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
10197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bFound = bFound && (m_pString[i]!=_Ptr[j]);
10207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
10217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(bFound)
10227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
10237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		    // return if considered character differed from all characters from _Ptr
10247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
10257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
10267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
10287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
10297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
10317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_last_not_of
10327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string
10337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
10347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the last char that is not in _Str
10357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the last char that is not in _Str
10367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
10377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_last_not_of(const CPVRTString& _Str, size_t _Off) const
10387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
10397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=m_Size-_Off-1;i<m_Size;--i)
10407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bFound = true;
10427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
10437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Str.m_Size;++j)
10447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
10457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bFound = bFound && (m_pString[i]!=_Str[j]);
10467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
10477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(bFound)
10487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
10497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens            // return if considered character differed from all characters from _Ptr
10507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
10517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
10527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
10547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
10557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
10577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_last_of
10587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		A char
10597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
10607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the last char that is _Ch
10617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the last char that is _Ch
10627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
10637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_last_of(char _Ch, size_t _Off) const
10647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
10657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=m_Size-_Off-1;i<m_Size;--i)
10667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_pString[i]==_Ch)
10687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
10697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return i;
10707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
10717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
10737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
10747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
10767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_last_of
10777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
10787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
10797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the last char that is in _Ptr
10807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the last char that is in _Ptr
10817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
10827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_last_of(const char* _Ptr, size_t _Off) const
10837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
10847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=m_Size-_Off-1;i<m_Size;--i)
10857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
10877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;_Ptr[j]!=0;++j)
10887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
10897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_pString[i]==_Ptr[j])
10907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return i;
10917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
10927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
10947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
10957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
10977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_last_of
10987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
10997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
11007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Length of _Ptr
11017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the last char that is in _Ptr
11027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the last char that is in _Ptr
11037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
11047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_last_of(const char* _Ptr, size_t _Off, size_t _Count) const
11057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
11067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=m_Size-_Off-1;i<m_Size;--i)
11077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
11097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Count;++j)
11107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
11117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_pString[i]!=_Ptr[j])
11127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return i;
11137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
11147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
11167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
11177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
11197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_last_of
11207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string
11217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
11227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Position of the last char that is in _Str
11237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the position of the last char that is in _Str
11247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
11257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_last_of(const CPVRTString& _Str, size_t _Off) const
11267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
11277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=m_Size-_Off-1;i<m_Size;--i)
11287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Str
11307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Str.m_Size;++j)
11317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
11327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(m_pString[i]!=_Str[j])
11337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return i;
11347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
11357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return npos;
11377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
11387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
11407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_number_of
11417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		A char
11427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
11437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Number of occurances of _Ch in the parent string.
11447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the number of occurances of _Ch in the parent string.
11457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
11467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_number_of(char _Ch, size_t _Off) const
11477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
11487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t occurances=0;
11497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
11507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_pString[i]==_Ch)
11527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			occurances++;
11537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return occurances;
11557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
11567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
11587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_number_of
11597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
11607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
11617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Number of occurances of _Ptr in the parent string.
11627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the number of occurances of _Ptr in the parent string.
11637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
11647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_number_of(const char* _Ptr, size_t _Off) const
11657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
11667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t occurances=0;
11677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bNotHere=false;
11687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
11697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
11717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;_Ptr[j]!=0;++j)
11727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
11737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bNotHere=true;
11747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(bNotHere) break;
11757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
11767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(!bNotHere) occurances++;
11777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else bNotHere = false;
11787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return occurances;
11807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
11817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
11837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_number_of
11847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
11857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
11867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Size of _Ptr
11877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Number of occurances of _Ptr in the parent string.
11887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the number of occurances of _Ptr in the parent string.
11897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
11907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_number_of(const char* _Ptr, size_t _Off, size_t _Count) const
11917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
11927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t occurances=0;
11937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bNotHere=false;
11947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
11957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
11977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Count;++j)
11987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
11997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bNotHere=true;
12007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(bNotHere) break;
12017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
12027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(!bNotHere) occurances++;
12037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else bNotHere = false;
12047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
12057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return occurances;
12067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
12077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
12097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_number_of
12107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string
12117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
12127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Number of occurances of _Str in the parent string.
12137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the number of occurances of _Str in the parent string.
12147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
12157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::find_number_of(const CPVRTString& _Str, size_t _Off) const
12167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
12177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t occurances=0;
12187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bNotHere=false;
12197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
12207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
12217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
12227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Str.m_Size;++j)
12237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
12247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(i+j>m_Size || m_pString[i+j]!=_Str[j])
12257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				bNotHere=true;
12267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(bNotHere)
12277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
12287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
12297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(!bNotHere) occurances++;
12307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else bNotHere = false;
12317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
12327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return occurances;
12337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
12347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
12367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_next_occurance_of
12377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		A char
12387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
12397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Next occurance of _Ch in the parent string.
12407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the next occurance of _Ch in the parent string
12417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					after or at _Off.	If not found, returns the length of the string.
12427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
12437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::find_next_occurance_of(char _Ch, size_t _Off) const
12447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
12457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
12467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
12477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_pString[i]==_Ch)
12487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return (int)i;
12497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
12507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return (int)m_Size;
12517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
12527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
12547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_next_occurance_of
12557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
12567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
12577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Next occurance of _Ptr in the parent string.
12587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the next occurance of _Ptr in the parent string
12597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					after or at _Off.	If not found, returns the length of the string.
12607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
12617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::find_next_occurance_of(const char* _Ptr, size_t _Off) const
12627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
12637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bHere=true;
12647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
12657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
12667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
12677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;_Ptr[j]!=0;++j)
12687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
12697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bHere=false;
12707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(!bHere) break;
12717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
12727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(bHere) return (int)i;
12737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bHere=true;
12747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
12757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return (int)m_Size;
12767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
12777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
12797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_next_occurance_of
12807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
12817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
12827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Size of _Ptr
12837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Next occurance of _Ptr in the parent string.
12847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the next occurance of _Ptr in the parent string
12857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					after or at _Off.	If not found, returns the length of the string.
12867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
12877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::find_next_occurance_of(const char* _Ptr, size_t _Off, size_t _Count) const
12887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
12897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bHere=true;
12907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
12917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
12927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
12937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Count;++j)
12947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
12957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bHere=false;
12967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(!bHere) break;
12977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
12987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(bHere) return (int)i;
12997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bHere=true;
13007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return (int)m_Size;
13027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
13037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
13057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_next_occurance_of
13067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string
13077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
13087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Next occurance of _Str in the parent string.
13097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the next occurance of _Str in the parent string
13107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					after or at _Off.	If not found, returns the length of the string.
13117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
13127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::find_next_occurance_of(const CPVRTString& _Str, size_t _Off) const
13137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
13147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bHere=true;
13157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i<m_Size;++i)
13167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
13177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Str
13187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Str.m_Size;++j)
13197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
13207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(i+j>m_Size || m_pString[i+j]!=_Str[j]) bHere=false;
13217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(!bHere) break;
13227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
13237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(bHere) return (int)i;
13247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bHere=true;
13257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return (int)m_Size;
13277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
13287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
13307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_previous_occurance_of
13317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		A char
13327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
13337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Previous occurance of _Ch in the parent string.
13347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the previous occurance of _Ch in the parent string
13357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					before _Off.	If not found, returns -1.
13367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
13377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::find_previous_occurance_of(char _Ch, size_t _Off) const
13387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
13397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i>0;--i)
13407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
13417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_pString[i]==_Ch)
13427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return (int)i;
13437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return -1;
13457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
13467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
13487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_previous_occurance_of
13497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
13507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
13517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Previous occurance of _Ptr in the parent string.
13527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the previous occurance of _Ptr in the parent string
13537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					before _Off.	If not found, returns -1.
13547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
13557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::find_previous_occurance_of(const char* _Ptr, size_t _Off) const
13567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
13577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bHere=true;
13587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i>0;--i)
13597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
13607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
13617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;_Ptr[j]!=0;++j)
13627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
13637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bHere=false;
13647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(!bHere) break;
13657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
13667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(bHere) return (int)i;
13677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bHere=true;
13687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return -1;
13707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
13717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
13737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_previous_occurance_of
13747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr	A string
13757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
13767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Size of _Ptr
13777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Previous occurance of _Ptr in the parent string.
13787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the previous occurance of _Ptr in the parent string
13797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					before _Off.	If not found, returns -1.
13807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
13817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::find_previous_occurance_of(const char* _Ptr, size_t _Off, size_t _Count) const
13827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
13837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bHere=true;
13847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i>0;--i)
13857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
13867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Ptr
13877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Count;++j)
13887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
13897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(i+j>m_Size || m_pString[i+j]!=_Ptr[j]) bHere=false;
13907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(!bHere) break;
13917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
13927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(bHere) return (int)i;
13937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bHere=true;
13947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return -1;
13967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
13977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
13997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			find_previous_occurance_of
14007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string
14017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start position of the find
14027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Previous occurance of _Str in the parent string.
14037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the previous occurance of _Str in the parent string
14047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					before _Off.	If not found, returns -1.
14057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
14067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensint CPVRTString::find_previous_occurance_of(const CPVRTString& _Str, size_t _Off) const
14077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
14087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bHere=true;
14097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(size_t i=_Off;i>0;--i)
14107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
14117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// compare against each char from _Str
14127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(size_t j=0;j<_Str.m_Size;++j)
14137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
14147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(i+j>m_Size || m_pString[i+j]!=_Str[j]) bHere=false;
14157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(!bHere) break;
14167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
14177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(bHere) return (int)i;
14187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bHere=true;
14197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
14207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return -1;
14217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
14227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
14247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			left
14257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				iSize	number of characters to return (excluding null character)
14267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			The leftmost 'iSize' characters of the string.
14277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the leftmost characters of the string (excluding
14287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					the null character) in a new CPVRTString. If iSize is
14297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					larger than the string, a copy of the original string is returned.
14307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
14317b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString CPVRTString::left(size_t iSize) const
14327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
14337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(iSize>=m_Size) return *this;
14347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return CPVRTString(m_pString,iSize);
14357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
14367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
14387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			right
14397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				iSize	number of characters to return (excluding null character)
14407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			The rightmost 'iSize' characters of the string.
14417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the rightmost characters of the string (excluding
14427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					the null character) in a new CPVRTString. If iSize is
14437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					larger than the string, a copy of the original string is returned.
14447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
14457b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString CPVRTString::right(size_t iSize) const
14467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
14477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(iSize>=m_Size) return *this;
14487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return CPVRTString(m_pString+(m_Size-iSize),iSize);
14497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
14507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& CPVRTString::insert(size_t _P0, const char* _Ptr)
14527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//{
14537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//	return replace(_P0, 0, _Ptr);
14547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//}
14557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& CPVRTString::insert(size_t _P0, const char* _Ptr, size_t _Count)
14577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//{
14587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//	return replace(_P0, 0, _Ptr, _Count);
14597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//}
14607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& CPVRTString::insert(size_t _P0, const CPVRTString& _Str)
14627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//{
14637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//	return replace(_P0, 0, _Str);
14647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//}
14657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& CPVRTString::insert(size_t _P0, const CPVRTString& _Str, size_t _Off, size_t _Count)
14677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//{
14687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//	return replace(_P0, 0, _Str, _Off, _Count);
14697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//}
14707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& CPVRTString::insert(size_t _P0, size_t _Count, char _Ch)
14727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//{
14737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//	return replace(_P0, 0, _Count, _Ch);
14747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//}
14757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
14777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			length
14787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Length of the string
14797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the length of the string
14807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
14817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::length() const
14827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
14837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_Size;
14847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
14857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
14877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			max_size
14887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			The maximum number of chars that the string can contain
14897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the maximum number of chars that the string can contain
14907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
14917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::max_size() const
14927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
14937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return 0x7FFFFFFF;
14947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
14957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
14977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			push_back
14987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch A char to append
14997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Appends _Ch to the string
15007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
15017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTString::push_back(char _Ch)
15027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
15037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	append(1, _Ch);
15047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
15057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& replace(size_t _Pos1, size_t _Num1, const char* _Ptr)
15077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& replace(size_t _Pos1, size_t _Num1, const CPVRTString& _Str)
15087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& replace(size_t _Pos1, size_t _Num1, const char* _Ptr, size_t _Num2)
15097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& replace(size_t _Pos1, size_t _Num1, const CPVRTString& _Str, size_t _Pos2, size_t _Num2)
15107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//CPVRTString& replace(size_t _Pos1, size_t _Num1, size_t _Count, char _Ch)
15117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
15137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			reserve
15147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count Size of string to reserve
15157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Reserves space for _Count number of chars
15167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
15177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTString::reserve(size_t _Count)
15187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
15197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (_Count >= m_Capacity)
15207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
15217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pString = (char*)realloc(m_pString, _Count + 1);
15227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Capacity = _Count + 1;
15237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
15247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
15257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
15277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			resize
15287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count 	Size of string to resize to
15297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch		Character to use to fill any additional space
15307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Resizes the string to _Count in length
15317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
15327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTString::resize(size_t _Count, char _Ch)
15337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
15347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (_Count <= m_Size)
15357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
15367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Size = _Count;
15377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_pString[m_Size] = 0;
15387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
15397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
15407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
15417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		append(_Count - m_Size,_Ch);
15427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
15437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
15447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//size_t rfind(char _Ch, size_t _Off = npos) const;
15467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//size_t rfind(const char* _Ptr, size_t _Off = npos) const;
15477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//size_t rfind(const char* _Ptr, size_t _Off = npos, size_t _Count) const;
15487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//size_t rfind(const CPVRTString& _Str, size_t _Off = npos) const;
15497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
15517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			size
15527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Size of the string
15537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the size of the string
15547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
15557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capenssize_t CPVRTString::size() const
15567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
15577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_Size;
15587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
15597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
15617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			substr
15627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off	Start of the substring
15637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Count	Length of the substring
15647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			A substring of the string
15657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Returns the size of the string
15667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
15677b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString CPVRTString::substr(size_t _Off, size_t _Count) const
15687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
15697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return CPVRTString(*this, _Off, _Count);
15707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
15717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
15737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			swap
15747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Str	A string to swap with
15757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Swaps the contents of the string with _Str
15767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
15777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTString::swap(CPVRTString& _Str)
15787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
15797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t Size = _Str.m_Size;
15807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t Capacity = _Str.m_Capacity;
15817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char* pString = _Str.m_pString;
15827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	_Str.m_Size = m_Size;
15837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	_Str.m_Capacity = m_Capacity;
15847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	_Str.m_pString = m_pString;
15857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Size = Size;
15867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Capacity = Capacity;
15877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pString = pString;
15887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
15897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
15917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			toLower
15927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
15937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Converts the string to lower case
15947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
15957b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString&  CPVRTString::toLower()
15967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
15977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int i = 0;
15987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	while ( (m_pString[i] = (m_pString[i]>='A'&&m_pString[i]<='Z') ? ('a'+m_pString[i])-'A': m_pString[i]) != 0) i++;
15997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return *this;
16007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
16017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
16037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			toUpper
16047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
16057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Converts the string to upper case
16067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
16077b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString&  CPVRTString::toUpper()
16087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
16097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int i = 0;
16107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	while ( (m_pString[i] = (m_pString[i]>='a'&&m_pString[i]<='z') ? ('A'+m_pString[i])-'a': m_pString[i]) != 0) i++;
16117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return *this;
16127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
16137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
16157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			Format
16167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				pFormat A string containing the formating
16177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			A formatted string
16187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		return the formatted string
16197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens************************************************************************/
16207b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString CPVRTString::format(const char *pFormat, ...)
16217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
16227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_list arg;
16237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_start(arg, pFormat);
16257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(_WIN32)
16267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t bufSize = _vscprintf(pFormat,arg);
16277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else
16287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t bufSize = vsnprintf(NULL,0,pFormat,arg);
16297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
16307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_end(arg);
16317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char*	buf=new char[bufSize + 1];
16337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_start(arg, pFormat);
16357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	vsnprintf(buf, bufSize + 1, pFormat, arg);
16367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_end(arg);
16377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTString returnString(buf);
16397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	delete [] buf;
16407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*this = returnString;
16417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return returnString;
16427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
16437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
16457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			+=
16467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch A char
16477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
16487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		+= Operator
16497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
16507b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::operator+=(char _Ch)
16517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
16527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return append(1, _Ch);
16537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
16547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
16567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			+=
16577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr A string
16587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
16597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		+= Operator
16607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
16617b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::operator+=(const char* _Ptr)
16627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
16637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return append(_Ptr);
16647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
16657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
16677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			+=
16687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Right A string
16697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
16707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		+= Operator
16717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
16727b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::operator+=(const CPVRTString& _Right)
16737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
16747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return append(_Right);
16757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
16767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
16787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			=
16797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ch A char
16807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
16817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		= Operator
16827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
16837b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::operator=(char _Ch)
16847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
16857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return assign(1, _Ch);
16867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
16877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
16897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			=
16907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Ptr A string
16917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
16927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		= Operator
16937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
16947b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::operator=(const char* _Ptr)
16957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
16967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return assign(_Ptr);
16977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
16987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
17007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			=
17017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Right A string
17027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
17037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		= Operator
17047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
17057b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::operator=(const CPVRTString& _Right)
17067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
17077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return assign(_Right);
17087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
17097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
17117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			[]
17127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off An index into the string
17137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			A character
17147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		[] Operator
17157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
17167b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString::const_reference CPVRTString::operator[](size_t _Off) const
17177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
17187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_pString[_Off];
17197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
17207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
17227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			[]
17237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Off An index into the string
17247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			A character
17257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		[] Operator
17267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
17277b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString::reference CPVRTString::operator[](size_t _Off)
17287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
17297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_pString[_Off];
17307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
17317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
17337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			+
17347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Left A string
17357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Right A string
17367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
17377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		+ Operator
17387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
17397b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString operator+ (const CPVRTString& _Left, const CPVRTString& _Right)
17407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
17417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return CPVRTString(_Left).append(_Right);
17427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
17437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
17457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			+
17467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Left A string
17477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Right A string
17487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
17497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		+ Operator
17507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
17517b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString operator+ (const CPVRTString& _Left, const char* _Right)
17527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
17537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return CPVRTString(_Left).append(_Right);
17547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
17557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
17577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			+
17587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Left A string
17597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Right A string
17607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
17617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		+ Operator
17627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
17637b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString operator+ (const CPVRTString& _Left, const char _Right)
17647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
17657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return CPVRTString(_Left).append(_Right);
17667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
17677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
17697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			+
17707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Left A string
17717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Right A string
17727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
17737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		+ Operator
17747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
17757b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString operator+ (const char* _Left, const CPVRTString& _Right)
17767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
17777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return CPVRTString(_Left).append(_Right);
17787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
17797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
17817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			+
17827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Left A string
17837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				_Right A string
17847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			An updated string
17857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		+ Operator
17867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
17877b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString operator+ (const char _Left, const CPVRTString& _Right)
17887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
17897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return CPVRTString(_Left).append(_Right);
17907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
17917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*************************************************************************
17937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens* MISCELLANEOUS UTILITY FUNCTIONS
17947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/
17957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
17967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			PVRTStringGetFileExtension
17977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				strFilePath A string
17987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Extension
17997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Extracts the file extension from a file path.
18007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					Returns an empty CPVRTString if no extension is found.
18017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens************************************************************************/
18027b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString PVRTStringGetFileExtension(const CPVRTString& strFilePath)
18037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
18047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTString::size_type idx = strFilePath.find_last_of ( '.' );
18057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens    if (idx == CPVRTString::npos)
18077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens    	return CPVRTString("");
18087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens    else
18097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens    	return strFilePath.substr(idx);
18107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
18117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
18137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			PVRTStringGetContainingDirectoryPath
18147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				strFilePath A string
18157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Directory
18167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Extracts the directory portion from a file path.
18177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens************************************************************************/
18187b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString PVRTStringGetContainingDirectoryPath(const CPVRTString& strFilePath)
18197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
18207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t i32sep = strFilePath.find_last_of('/');
18217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(i32sep == strFilePath.npos)
18227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
18237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32sep = strFilePath.find_last_of('\\');
18247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(i32sep == strFilePath.npos)
18257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{	// can't find an actual \ or /, so return an empty string
18267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return CPVRTString("");
18277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
18287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
18297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strFilePath.substr(0,i32sep);
18307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
18317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
18337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			PVRTStringGetFileName
18347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				strFilePath A string
18357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			FileName
18367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Extracts the name and extension portion from a file path.
18377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens************************************************************************/
18387b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString PVRTStringGetFileName(const CPVRTString& strFilePath)
18397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
18407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t i32sep = strFilePath.find_last_of('/');
18417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(i32sep == strFilePath.npos)
18427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
18437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i32sep = strFilePath.find_last_of('\\');
18447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(i32sep == strFilePath.npos)
18457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{	// can't find an actual \ or / so leave it be
18467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return strFilePath;
18477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
18487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
18497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strFilePath.substr(i32sep+1,strFilePath.length());
18507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
18517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
18537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			PVRTStringStripWhiteSpaceFromStartOf
18547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				strLine A string
18557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Result of the white space stripping
18567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		strips white space characters from the beginning of a CPVRTString.
18577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens************************************************************************/
18587b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString PVRTStringStripWhiteSpaceFromStartOf(const CPVRTString& strLine)
18597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
18607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t start = strLine.find_first_not_of(" \t	\n\r");
18617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(start!=strLine.npos)
18627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return strLine.substr(start,strLine.length()-(start));
18637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strLine;
18647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
18657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
18687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			PVRTStringStripWhiteSpaceFromEndOf
18697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				strLine A string
18707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			Result of the white space stripping
18717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		strips white space characters from the end of a CPVRTString.
18727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens************************************************************************/
18737b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString PVRTStringStripWhiteSpaceFromEndOf(const CPVRTString& strLine)
18747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
18757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t end = strLine.find_last_not_of(" \t	\n\r");
18767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(end!=strLine.npos)
18777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return strLine.substr(0,end+1);
18787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return strLine;
18797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
18807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***********************************************************************
18827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function			PVRTStringFromFormattedStr
18837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input				pFormat A string containing the formating
18847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Returns			A formatted string
18857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description		Creates a formatted string
18867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens************************************************************************/
18877b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString PVRTStringFromFormattedStr(const char *pFormat, ...)
18887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
18897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_list arg;
18907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_start(arg, pFormat);
18927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(_WIN32)
18937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t bufSize = _vscprintf(pFormat,arg);
18947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else
18957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	size_t bufSize = vsnprintf(NULL,0,pFormat,arg);
18967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
18977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_end(arg);
18987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char* buf = new char[bufSize + 1];
19007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_start(arg, pFormat);
19027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	vsnprintf(buf, bufSize + 1, pFormat, arg);
19037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	va_end(arg);
19047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTString returnString(buf);
19067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	delete [] buf;
19077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return returnString;
19087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
19097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens///*!***************************************************************************
19117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// Substitute one character by another
19147b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::substitute(char _src,char _subDes, bool _all)
19157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
19167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int len = (int) length();
19177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char  c=_src;
19187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char  s=_subDes;
19197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int  i=0;
19207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	while(i<len)
19217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
19227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_pString[i]==c)
19237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
19247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_pString[i]=s;
19257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(!_all) break;
19267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
19277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		i++;
19287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
19297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return *this;
19307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
19317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// Substitute one string by another ( Need time to improved )
19347b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTString& CPVRTString::substitute(const char* _src, const char* _dest, bool _all)
19357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
19367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (this->length() == 0)
19377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
19387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
19397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
19407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int pos=0;
19417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTString src = _src;
19427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTString dest = _dest;
19437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTString ori;
19447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	while(pos<=m_Size-src.length())
19467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
19477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(this->compare(pos,src.length(),_src)==0)
19487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
19497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			ori = this->c_str();
19507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			CPVRTString sub1, sub2, result;
19517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			sub1.assign(ori,0,pos);
19527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			sub2.assign(ori,pos+src.length(),m_Size - (pos+src.length()));
19537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			this->assign("");
19557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			this->append(sub1);
19567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			this->append(dest);
19577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			this->append(sub2);
19587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(!_all)
19607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
19617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					break;
19627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
19637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			pos += (unsigned int) dest.length();
19647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			continue;
19657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
19667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		pos++;
19677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
19687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return *this;
19707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
19717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif // _USING_PVRTSTRING_
19747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*****************************************************************************
19767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens End of file (PVRTString.cpp)
19777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
19787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1979