From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/public/filesystem_helpers.cpp | 129 +++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 mp/src/public/filesystem_helpers.cpp (limited to 'mp/src/public/filesystem_helpers.cpp') diff --git a/mp/src/public/filesystem_helpers.cpp b/mp/src/public/filesystem_helpers.cpp new file mode 100644 index 00000000..4e1ea169 --- /dev/null +++ b/mp/src/public/filesystem_helpers.cpp @@ -0,0 +1,129 @@ +//========= 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; +} -- cgit v1.2.3