r5sdk/r5dev/tier1/splitstring.cpp
Kawe Mazidjatari 9f428f1567 Move tier0 lib headers to public
This commit does not change any logic or behavior of the code.
2023-04-06 23:50:48 +02:00

104 lines
2.9 KiB
C++

//================ Copyright (c) 1996-2009 Valve Corporation. All Rights Reserved. =================
//
//
//
//==================================================================================================
#include "core/stdafx.h"
#include "tier1/strtools.h"
#include "tier1/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
//
size_t nOriginalStringLength = 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 = strstr(pCurPos, pSeparators[i]);
if (pTest && (!pFirstSeparator || pTest < pFirstSeparator))
{
iFirstSeparator = i;
pFirstSeparator = pTest;
}
}
if (pFirstSeparator)
{
// Split on this separator and continue on.
size_t separatorLen = strlen(pSeparators[iFirstSeparator]);
if (pFirstSeparator > pCurPos)
{
//////////////////////////////////////////////////////////////////////////
/// Cut the token out of the duplicate string
char* pTokenInDuplicate = m_szBuffer + (pCurPos - pString);
int64 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 (size_t 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();
}