mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
CUtlMemory has been modified to fit the size of the in-engine structure. The new types seem to be either int64 or unsigned (size_t?).
104 lines
2.9 KiB
C++
104 lines
2.9 KiB
C++
//================ Copyright (c) 1996-2009 Valve Corporation. All Rights Reserved. =================
|
|
//
|
|
//
|
|
//
|
|
//==================================================================================================
|
|
|
|
#include "core/stdafx.h"
|
|
#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 = 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.
|
|
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();
|
|
}
|