151 lines
3.0 KiB
C++
151 lines
3.0 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
/*
|
|
** The copyright to the contents herein is the property of Valve, L.L.C.
|
|
** The contents may be used and/or copied only with the written permission of
|
|
** Valve, L.L.C., or in accordance with the terms and conditions stipulated in
|
|
** the agreement/contract under which the contents have been supplied.
|
|
**
|
|
*******************************************************************************
|
|
**
|
|
** Contents:
|
|
**
|
|
** TokenLine.cpp: implementation of the TokenLine class.
|
|
**
|
|
******************************************************************************/
|
|
|
|
#include "TokenLine.h"
|
|
#include <string.h>
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
TokenLine::~TokenLine()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
bool TokenLine::SetLine(const char * newLine)
|
|
{
|
|
m_tokenNumber = 0;
|
|
|
|
if (!newLine || ( strlen(newLine) >= (MAX_LINE_CHARS-1) ) )
|
|
{
|
|
memset( m_fullLine, 0, MAX_LINE_CHARS );
|
|
memset( m_tokenBuffer, 0, MAX_LINE_CHARS );
|
|
return false;
|
|
}
|
|
|
|
strncpy( m_fullLine, newLine, MAX_LINE_CHARS-1 );
|
|
m_fullLine[ MAX_LINE_CHARS-1 ] = '\0';
|
|
|
|
strncpy( m_tokenBuffer, newLine, MAX_LINE_CHARS-1 );
|
|
m_tokenBuffer[ MAX_LINE_CHARS-1 ] = '\0';
|
|
|
|
// parse tokens
|
|
char * charPointer = m_tokenBuffer;
|
|
|
|
while (*charPointer && (m_tokenNumber < MAX_LINE_TOKENS))
|
|
{
|
|
while (*charPointer && ((*charPointer <= 32) || (*charPointer > 126)))
|
|
charPointer++;
|
|
|
|
if (*charPointer)
|
|
{
|
|
m_token[m_tokenNumber] = charPointer;
|
|
|
|
// special treatment for quotes
|
|
if (*charPointer == '\"')
|
|
{
|
|
charPointer++;
|
|
m_token[m_tokenNumber] = charPointer;
|
|
while (*charPointer && (*charPointer != '\"') )
|
|
charPointer++;
|
|
|
|
}
|
|
else
|
|
{
|
|
m_token[m_tokenNumber] = charPointer;
|
|
while (*charPointer && ((*charPointer > 32) && (*charPointer <= 126)))
|
|
charPointer++;
|
|
}
|
|
|
|
m_tokenNumber++;
|
|
|
|
if (*charPointer)
|
|
{
|
|
*charPointer=0;
|
|
charPointer++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return (m_tokenNumber != MAX_LINE_TOKENS);
|
|
}
|
|
|
|
char * TokenLine::GetLine()
|
|
{
|
|
return m_fullLine;
|
|
}
|
|
|
|
char * TokenLine::GetToken(int i)
|
|
{
|
|
if (i >= m_tokenNumber)
|
|
return NULL;
|
|
return m_token[i];
|
|
|
|
}
|
|
|
|
// if the given parm is not present return NULL
|
|
// otherwise return the address of the following token, or an empty string
|
|
char* TokenLine::CheckToken(char * parm)
|
|
{
|
|
for (int i = 0 ; i < m_tokenNumber; i ++)
|
|
{
|
|
if (!m_token[i])
|
|
continue;
|
|
if ( !strcmp (parm,m_token[i]) )
|
|
{
|
|
char * ret = m_token[i+1];
|
|
// if this token doesn't exist, since index i was the last
|
|
// return an empty string
|
|
if ( (i+1) == m_tokenNumber ) ret = "";
|
|
return ret;
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
int TokenLine::CountToken()
|
|
{
|
|
int c = 0;
|
|
for (int i = 0 ; i < m_tokenNumber; i ++)
|
|
{
|
|
if (m_token[i])
|
|
c++;
|
|
}
|
|
return c;
|
|
}
|
|
|
|
char* TokenLine::GetRestOfLine(int i)
|
|
{
|
|
if (i >= m_tokenNumber)
|
|
return NULL;
|
|
return m_fullLine + (m_token[i] - m_tokenBuffer);
|
|
}
|
|
|
|
TokenLine::TokenLine(char * string)
|
|
{
|
|
SetLine(string);
|
|
}
|
|
|
|
TokenLine::TokenLine()
|
|
{
|
|
|
|
}
|