Team Fortress 2 Source Code as on 22/4/2020
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 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; }
|