xeContainerFormatParser.cpp revision 7704f19df5db9396c8f48f7ecfc7e53718c30470
13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Test Executor
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Test log container format parser.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "xeContainerFormatParser.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deInt32.h"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace xe
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CONTAINERFORMATPARSER_INITIAL_BUFFER_SIZE = 1024
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic int getNextBufferSize (int curSize, int minNewSize)
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return de::max(curSize*2, 1<<deLog2Ceil32(minNewSize));
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
403c827367444ee418f129b2c238299f49d3264554Jarkko PoyryContainerFormatParser::ContainerFormatParser (void)
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_element		(CONTAINERELEMENT_INCOMPLETE)
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_elementLen	(0)
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_state		(STATE_AT_LINE_START)
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_buf			(CONTAINERFORMATPARSER_INITIAL_BUFFER_SIZE)
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c827367444ee418f129b2c238299f49d3264554Jarkko PoyryContainerFormatParser::~ContainerFormatParser (void)
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ContainerFormatParser::clear (void)
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_element		= CONTAINERELEMENT_INCOMPLETE;
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_elementLen	= 0;
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_state			= STATE_AT_LINE_START;
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buf.clear();
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ContainerFormatParser::error (const std::string& what)
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	throw ContainerParseError(what);
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
651592f16d1fc9edde443474e1835746f705ed79a9Jarkko Pöyryvoid ContainerFormatParser::feed (const deUint8* bytes, size_t numBytes)
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Grow buffer if necessary.
681592f16d1fc9edde443474e1835746f705ed79a9Jarkko Pöyry	if (m_buf.getNumFree() < (int)numBytes)
691592f16d1fc9edde443474e1835746f705ed79a9Jarkko Pöyry		m_buf.resize(getNextBufferSize(m_buf.getSize(), m_buf.getNumElements()+(int)numBytes));
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Append to front.
721592f16d1fc9edde443474e1835746f705ed79a9Jarkko Pöyry	m_buf.pushFront(bytes, (int)numBytes);
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// If we haven't parsed complete element, re-try after data feed.
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_element == CONTAINERELEMENT_INCOMPLETE)
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		advance();
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* ContainerFormatParser::getSessionInfoAttribute (void) const
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_element == CONTAINERELEMENT_SESSION_INFO);
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_attribute.c_str();
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* ContainerFormatParser::getSessionInfoValue (void) const
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_element == CONTAINERELEMENT_SESSION_INFO);
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_value.c_str();
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* ContainerFormatParser::getTestCasePath (void) const
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_element == CONTAINERELEMENT_BEGIN_TEST_CASE_RESULT);
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_value.c_str();
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* ContainerFormatParser::getTerminateReason (void) const
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_element == CONTAINERELEMENT_TERMINATE_TEST_CASE_RESULT);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_value.c_str();
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryint ContainerFormatParser::getDataSize (void) const
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_element == CONTAINERELEMENT_TEST_LOG_DATA);
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_elementLen;
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ContainerFormatParser::getData (deUint8* dst, int numBytes, int offset)
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inBounds(offset, 0, m_elementLen) && numBytes > 0 && de::inRange(numBytes+offset, 0, m_elementLen));
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int ndx = 0; ndx < numBytes; ndx++)
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		dst[ndx] = m_buf.peekBack(offset+ndx);
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryint ContainerFormatParser::getChar (int offset) const
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(de::inRange(offset, 0, m_buf.getNumElements()));
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (offset < m_buf.getNumElements())
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return m_buf.peekBack(offset);
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return END_OF_BUFFER;
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ContainerFormatParser::advance (void)
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_element != CONTAINERELEMENT_INCOMPLETE)
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_buf.popBack(m_elementLen);
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_element		= CONTAINERELEMENT_INCOMPLETE;
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_elementLen	= 0;
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_attribute.clear();
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_value.clear();
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (;;)
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int curChar = getChar(m_elementLen);
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (curChar != (int)END_OF_BUFFER)
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_elementLen += 1;
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (curChar == END_OF_STRING)
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_elementLen == 1)
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_element = CONTAINERELEMENT_END_OF_STRING;
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (m_state == STATE_CONTAINER_LINE)
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				parseContainerLine();
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_element = CONTAINERELEMENT_TEST_LOG_DATA;
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (curChar == (int)END_OF_BUFFER)
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_elementLen > 0 && m_state == STATE_DATA)
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_element = CONTAINERELEMENT_TEST_LOG_DATA;
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (curChar == '\r' || curChar == '\n')
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Check for \r\n
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int nextChar = getChar(m_elementLen);
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (curChar == '\n' || (nextChar != (int)END_OF_BUFFER && nextChar != '\n'))
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (m_state == STATE_CONTAINER_LINE)
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					parseContainerLine();
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					m_element = CONTAINERELEMENT_TEST_LOG_DATA;
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_state = STATE_AT_LINE_START;
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// else handle following end or \n in next iteration.
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (m_state == STATE_AT_LINE_START)
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(m_elementLen == 1);
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_state = (curChar == '#') ? STATE_CONTAINER_LINE : STATE_DATA;
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ContainerFormatParser::parseContainerLine (void)
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const struct
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*			name;
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ContainerElement	element;
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} s_elements[] =
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "beginTestCaseResult",		CONTAINERELEMENT_BEGIN_TEST_CASE_RESULT		},
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "endTestCaseResult",			CONTAINERELEMENT_END_TEST_CASE_RESULT		},
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "terminateTestCaseResult",	CONTAINERELEMENT_TERMINATE_TEST_CASE_RESULT	},
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "sessionInfo",				CONTAINERELEMENT_SESSION_INFO				},
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "beginSession",				CONTAINERELEMENT_BEGIN_SESSION				},
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "endSession",					CONTAINERELEMENT_END_SESSION				}
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_elementLen >= 1);
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(getChar(0) == '#');
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int offset = 1;
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int elemNdx = 0; elemNdx < DE_LENGTH_OF_ARRAY(s_elements); elemNdx++)
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool	isMatch	= false;
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int		ndx		= 0;
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (;;)
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int		bufChar		= (offset+ndx < m_elementLen) ? getChar(offset+ndx) : 0;
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bool	bufEnd		= bufChar == 0 || bufChar == ' ' || bufChar == '\r' || bufChar == '\n' || bufChar == (int)END_OF_BUFFER;
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int		elemChar	= s_elements[elemNdx].name[ndx];
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bool	elemEnd		= elemChar == 0;
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (bufEnd || elemEnd)
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				isMatch = bufEnd == elemEnd;
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else if (bufChar != elemChar)
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ndx += 1;
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isMatch)
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_element	 = s_elements[elemNdx].element;
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			offset		+= ndx;
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (m_element)
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case CONTAINERELEMENT_BEGIN_SESSION:
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case CONTAINERELEMENT_END_SESSION:
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case CONTAINERELEMENT_END_TEST_CASE_RESULT:
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break; // No attribute or value.
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case CONTAINERELEMENT_BEGIN_TEST_CASE_RESULT:
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case CONTAINERELEMENT_TERMINATE_TEST_CASE_RESULT:
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (getChar(offset) != ' ')
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				error("Expected value after instruction");
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			offset += 1;
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			parseContainerValue(m_value, offset);
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case CONTAINERELEMENT_SESSION_INFO:
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (getChar(offset) != ' ')
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				error("Expected attribute name after #sessionInfo");
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			offset += 1;
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			parseContainerValue(m_attribute, offset);
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (getChar(offset) != ' ')
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				error("No value for #sessionInfo attribute");
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			offset += 1;
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_attribute == "timestamp")
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_value.clear();
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2687704f19df5db9396c8f48f7ecfc7e53718c30470Pyry Haulos				// \note Candy produces unescaped timestamps.
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				for (;;)
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					const int	curChar	= offset < m_elementLen ? getChar(offset) : 0;
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					const bool	isEnd	= curChar == 0 || curChar == (int)END_OF_BUFFER || curChar == '\n' || curChar == '\t';
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					if (isEnd)
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						break;
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					else
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						m_value.push_back((char)curChar);
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					offset += 1;
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				parseContainerValue(m_value, offset);
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// \todo [2012-06-09 pyry] Implement better way to handle # at the beginning of log lines.
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_element = CONTAINERELEMENT_TEST_LOG_DATA;
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ContainerFormatParser::parseContainerValue (std::string& dst, int& offset) const
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(offset < m_elementLen);
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool	isString	= getChar(offset) == '"' || getChar(offset) == '\'';
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		quotChar	= isString ? getChar(offset) : 0;
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isString)
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		offset += 1;
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	dst.clear();
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (;;)
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int		curChar		= offset < m_elementLen ? getChar(offset) : 0;
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool	isEnd		= curChar == 0 || curChar == (int)END_OF_BUFFER ||
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							  (isString ? (curChar == quotChar) : (curChar == ' ' || curChar == '\n' || curChar == '\r'));
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isEnd)
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// \todo [2012-06-09 pyry] Escapes.
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			dst.push_back((char)curChar);
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		offset += 1;
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isString && getChar(offset) == quotChar)
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		offset += 1;
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // xe
327