Counter Strike : Global Offensive Source Code
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//================ Copyright (c) 1996-2009 Valve Corporation. All Rights Reserved. =================
//
//
//
//==================================================================================================
#include "strtools.h"
#include "utlvector.h"
CSplitString::CSplitString() { m_szBuffer = nullptr; }
CSplitString::CSplitString(const char *pString, const char **pSeparators, int nSeparators) { Construct(pString, pSeparators, nSeparators); };
CSplitString::CSplitString( const char *pString, const char *pSeparator) { Construct( pString, &pSeparator, 1 ); }
CSplitString::~CSplitString() { if(m_szBuffer) delete [] m_szBuffer; }
void CSplitString::Set(const char *pString, const char **pSeparators, int nSeparators) { delete[] m_szBuffer; Construct(pString, pSeparators, nSeparators); }
void CSplitString::Construct( const char *pString, const char **pSeparators, int nSeparators ) { //////////////////////////////////////////////////////////////////////////
// make a duplicate of the original string. We'll use pieces of this duplicate to tokenize the string
// and create NULL-terminated tokens of the original string
//
int nOriginalStringLength = V_strlen(pString); m_szBuffer = new char[nOriginalStringLength + 1]; memcpy(m_szBuffer, pString, nOriginalStringLength + 1);
this->Purge(); const char *pCurPos = pString; while ( 1 ) { int iFirstSeparator = -1; const char *pFirstSeparator = 0; for ( int i=0; i < nSeparators; i++ ) { const char *pTest = V_stristr( pCurPos, pSeparators[i] ); if ( pTest && (!pFirstSeparator || pTest < pFirstSeparator) ) { iFirstSeparator = i; pFirstSeparator = pTest; } }
if ( pFirstSeparator ) { // Split on this separator and continue on.
int separatorLen = strlen( pSeparators[iFirstSeparator] ); if ( pFirstSeparator > pCurPos ) { //////////////////////////////////////////////////////////////////////////
/// Cut the token out of the duplicate string
char *pTokenInDuplicate = m_szBuffer + (pCurPos - pString); int nTokenLength = pFirstSeparator-pCurPos; Assert(nTokenLength > 0 && !memcmp(pTokenInDuplicate,pCurPos,nTokenLength)); pTokenInDuplicate[nTokenLength] = '\0';
this->AddToTail( pTokenInDuplicate /*AllocString( pCurPos, pFirstSeparator-pCurPos )*/ ); }
pCurPos = pFirstSeparator + separatorLen; } else { // Copy the rest of the string
if ( int nTokenLength = strlen( pCurPos ) ) { //////////////////////////////////////////////////////////////////////////
// There's no need to cut this token, because there's no separator after it.
// just add its copy in the buffer to the tail
char *pTokenInDuplicate = m_szBuffer + (pCurPos - pString); Assert(!memcmp(pTokenInDuplicate, pCurPos, nTokenLength));
this->AddToTail( pTokenInDuplicate/*AllocString( pCurPos, -1 )*/ ); } return; } } }
void CSplitString::PurgeAndDeleteElements() { Purge(); }
|