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