#include "precompiled.h"

TokenLine::TokenLine()
{
	Q_memset(m_token, 0, sizeof(m_token));
	Q_memset(m_fullLine, 0, sizeof(m_fullLine));
	Q_memset(m_tokenBuffer, 0, sizeof(m_tokenBuffer));

	m_tokenNumber = 0;
}

TokenLine::TokenLine(char *string)
{
	SetLine(string);
}

TokenLine::~TokenLine()
{

}

bool TokenLine::SetLine(const char *newLine)
{
	m_tokenNumber = 0;

	if (!newLine || (Q_strlen(newLine) >= (MAX_LINE_CHARS - 1)))
	{
		Q_memset(m_fullLine, 0, sizeof(m_fullLine));
		Q_memset(m_tokenBuffer, 0, sizeof(m_tokenBuffer));
		return false;
	}

	Q_strlcpy(m_fullLine, newLine);
	Q_strlcpy(m_tokenBuffer, newLine);

	// parse tokens
	char *charPointer = m_tokenBuffer;
	while (*charPointer && (m_tokenNumber < MAX_LINE_TOKENS))
	{
		// skip nonprintable chars
		while (*charPointer && ((*charPointer <= ' ') || (*charPointer > '~')))
			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 (!Q_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 (m_tokenNumber == (i + 1))
				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);
}