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.
129 lines
2.5 KiB
129 lines
2.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=====================================================================================//
|
|
|
|
#include "filesystem.h"
|
|
#include "filesystem_helpers.h"
|
|
#include "characterset.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
// wordbreak parsing set
|
|
static characterset_t g_BreakSet, g_BreakSetIncludingColons;
|
|
|
|
static void InitializeCharacterSets()
|
|
{
|
|
static bool s_CharacterSetInitialized = false;
|
|
if (!s_CharacterSetInitialized)
|
|
{
|
|
CharacterSetBuild( &g_BreakSet, "{}()'" );
|
|
CharacterSetBuild( &g_BreakSetIncludingColons, "{}()':" );
|
|
s_CharacterSetInitialized = true;
|
|
}
|
|
}
|
|
|
|
|
|
const char* ParseFileInternal( const char* pFileBytes, char* pTokenOut, bool* pWasQuoted, characterset_t *pCharSet, size_t nMaxTokenLen )
|
|
{
|
|
pTokenOut[0] = 0;
|
|
|
|
if (pWasQuoted)
|
|
*pWasQuoted = false;
|
|
|
|
if (!pFileBytes)
|
|
return 0;
|
|
|
|
InitializeCharacterSets();
|
|
|
|
// YWB: Ignore colons as token separators in COM_Parse
|
|
static bool com_ignorecolons = false;
|
|
characterset_t& breaks = pCharSet ? *pCharSet : (com_ignorecolons ? g_BreakSet : g_BreakSetIncludingColons);
|
|
|
|
int c;
|
|
unsigned int len = 0;
|
|
|
|
// skip whitespace
|
|
skipwhite:
|
|
|
|
while ( (c = *pFileBytes) <= ' ')
|
|
{
|
|
if (c == 0)
|
|
return 0; // end of file;
|
|
pFileBytes++;
|
|
}
|
|
|
|
// skip // comments
|
|
if (c=='/' && pFileBytes[1] == '/')
|
|
{
|
|
while (*pFileBytes && *pFileBytes != '\n')
|
|
pFileBytes++;
|
|
goto skipwhite;
|
|
}
|
|
|
|
// skip c-style comments
|
|
if (c=='/' && pFileBytes[1] == '*' )
|
|
{
|
|
// Skip "/*"
|
|
pFileBytes += 2;
|
|
|
|
while ( *pFileBytes )
|
|
{
|
|
if ( *pFileBytes == '*' &&
|
|
pFileBytes[1] == '/' )
|
|
{
|
|
pFileBytes += 2;
|
|
break;
|
|
}
|
|
|
|
pFileBytes++;
|
|
}
|
|
|
|
goto skipwhite;
|
|
}
|
|
|
|
// handle quoted strings specially
|
|
if (c == '\"')
|
|
{
|
|
if (pWasQuoted)
|
|
*pWasQuoted = true;
|
|
|
|
pFileBytes++;
|
|
while (1)
|
|
{
|
|
c = *pFileBytes++;
|
|
if (c=='\"' || !c)
|
|
{
|
|
pTokenOut[len] = 0;
|
|
return pFileBytes;
|
|
}
|
|
pTokenOut[len] = c;
|
|
len += ( len < nMaxTokenLen-1 ) ? 1 : 0;
|
|
}
|
|
}
|
|
|
|
// parse single characters
|
|
if ( IN_CHARACTERSET( breaks, c ) )
|
|
{
|
|
pTokenOut[len] = c;
|
|
len += ( len < nMaxTokenLen-1 ) ? 1 : 0;
|
|
pTokenOut[len] = 0;
|
|
return pFileBytes+1;
|
|
}
|
|
|
|
// parse a regular word
|
|
do
|
|
{
|
|
pTokenOut[len] = c;
|
|
pFileBytes++;
|
|
len += ( len < nMaxTokenLen-1 ) ? 1 : 0;
|
|
c = *pFileBytes;
|
|
if ( IN_CHARACTERSET( breaks, c ) )
|
|
break;
|
|
} while (c>32);
|
|
|
|
pTokenOut[len] = 0;
|
|
return pFileBytes;
|
|
}
|