//----------------------------------------------------------------------------- // Parses the next token, given a set of character breaks to stop at //----------------------------------------------------------------------------- int CUtlBufferEditor::ParseToken( characterset_t *pBreaks, char *pTokenBuf, int nMaxLen, bool bParseComments ) { Assert( nMaxLen > 0 ); pTokenBuf[0] = 0; // skip whitespace + comments while ( true ) { if ( !IsValid() ) return -1; EatWhiteSpace(); if ( bParseComments ) { if ( !EatCPPComment() ) break; } else { break; } } char c = GetChar(); // End of buffer if ( c == 0 ) return -1; // handle quoted strings specially if ( c == '\"' ) { int nLen = 0; while( IsValid() ) { c = GetChar(); if ( c == '\"' || !c ) { pTokenBuf[nLen] = 0; return nLen; } pTokenBuf[nLen] = c; if ( ++nLen == nMaxLen ) { pTokenBuf[nLen-1] = 0; return nMaxLen; } } // In this case, we hit the end of the buffer before hitting the end qoute pTokenBuf[nLen] = 0; return nLen; } // parse single characters if ( IN_CHARACTERSET( *pBreaks, c ) ) { pTokenBuf[0] = c; pTokenBuf[1] = 0; return 1; } // parse a regular word int nLen = 0; while ( true ) { pTokenBuf[nLen] = c; if ( ++nLen == nMaxLen ) { pTokenBuf[nLen-1] = 0; return nMaxLen; } c = GetChar(); if ( !IsValid() ) break; if ( IN_CHARACTERSET( *pBreaks, c ) || c == '\"' || c <= ' ' ) { SeekGet( SEEK_CURRENT, -1 ); break; } } pTokenBuf[nLen] = 0; return nLen; }
const char* ParseFile( const char* pFileBytes, char* pToken, bool* pWasQuoted, characterset_t *pCharSet ) { 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; int len = 0; pToken[0] = 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) { pToken[len] = 0; return pFileBytes; } pToken[len] = c; len++; } } // parse single characters if ( IN_CHARACTERSET( breaks, c ) ) { pToken[len] = c; len++; pToken[len] = 0; return pFileBytes+1; } // parse a regular word do { pToken[len] = c; pFileBytes++; len++; c = *pFileBytes; if ( IN_CHARACTERSET( breaks, c ) ) break; } while (c>32); pToken[len] = 0; return pFileBytes; }