aboutsummaryrefslogtreecommitdiff
path: root/mp/src/tier1/splitstring.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/tier1/splitstring.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/tier1/splitstring.cpp')
-rw-r--r--mp/src/tier1/splitstring.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/mp/src/tier1/splitstring.cpp b/mp/src/tier1/splitstring.cpp
new file mode 100644
index 00000000..d2694328
--- /dev/null
+++ b/mp/src/tier1/splitstring.cpp
@@ -0,0 +1,91 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+//
+//
+//==================================================================================================
+
+#include "strtools.h"
+#include "utlvector.h"
+
+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::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();
+}