Import dEQP.

Import drawElements Quality Program from an internal repository.

Bug: 17388917
Change-Id: Ic109fe4a57e31b2a816113d90fbdf51a43e7abeb
diff --git a/executor/xeXMLParser.hpp b/executor/xeXMLParser.hpp
new file mode 100644
index 0000000..372b219
--- /dev/null
+++ b/executor/xeXMLParser.hpp
@@ -0,0 +1,257 @@
+#ifndef _XEXMLPARSER_HPP
+#define _XEXMLPARSER_HPP
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program Test Executor
+ * ------------------------------------------
+ *
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief XML Parser.
+ *
+ * \todo [2012-06-07 pyry] Not supported / handled properly:
+ *  - xml namespaces (<ns:Element>)
+ *  - backslash escapes in strings
+ *  - &quot; -style escapes
+ *  - utf-8
+ *//*--------------------------------------------------------------------*/
+
+#include "xeDefs.hpp"
+#include "deRingBuffer.hpp"
+
+#include <string>
+#include <map>
+
+namespace xe
+{
+namespace xml
+{
+
+enum Token
+{
+	TOKEN_INCOMPLETE = 0,					//!< Not enough data to determine token.
+	TOKEN_END_OF_STRING,					//!< End of document string.
+	TOKEN_DATA,								//!< Block of data (anything outside tags).
+	TOKEN_COMMENT,							//!< <!-- comment -->
+	TOKEN_IDENTIFIER,						//!< Identifier (in tags).
+	TOKEN_STRING,							//!< String (in tags).
+	TOKEN_TAG_START,						//!< <
+	TOKEN_TAG_END,							//!< >
+	TOKEN_END_TAG_START,					//!< </
+	TOKEN_EMPTY_ELEMENT_END,				//!< />
+	TOKEN_PROCESSING_INSTRUCTION_START,		//!< <?
+	TOKEN_PROCESSING_INSTRUCTION_END,		//!< ?>
+	TOKEN_EQUAL,							//!< =
+	TOKEN_ENTITY,							//!< Entity reference, such as &amp;
+
+	TOKEN_LAST
+};
+
+enum Element
+{
+	ELEMENT_INCOMPLETE = 0,	//!< Incomplete element.
+	ELEMENT_START,			//!< Element start.
+	ELEMENT_END,			//!< Element end.
+	ELEMENT_DATA,			//!< Data element.
+	ELEMENT_END_OF_STRING,	//!< End of document string.
+
+	ELEMENT_LAST
+};
+
+const char* getTokenName (Token token);
+
+// \todo [2012-10-17 pyry] Add line number etc.
+class ParseError : public xe::ParseError
+{
+public:
+	ParseError (const std::string& message) : xe::ParseError(message) {}
+};
+
+class Tokenizer
+{
+public:
+						Tokenizer			(void);
+						~Tokenizer			(void);
+
+	void				clear				(void);		//!< Resets tokenizer to initial state.
+
+	void				feed				(const deUint8* bytes, int numBytes);
+	void				advance				(void);
+
+	Token				getToken			(void) const		{ return m_curToken;	}
+	int					getTokenLen			(void) const		{ return m_curTokenLen;	}
+	deUint8				getTokenByte		(int offset) const	{ DE_ASSERT(m_curToken != TOKEN_INCOMPLETE && m_curToken != TOKEN_END_OF_STRING); return m_buf.peekBack(offset); }
+	void				getTokenStr			(std::string& dst) const;
+	void				appendTokenStr		(std::string& dst) const;
+
+	void				getString			(std::string& dst) const;
+
+private:
+						Tokenizer			(const Tokenizer& other);
+	Tokenizer&			operator=			(const Tokenizer& other);
+
+	int					getChar				(int offset) const;
+
+	void				error				(const std::string& what);
+
+	enum State
+	{
+		STATE_DATA = 0,
+		STATE_TAG,
+		STATE_IDENTIFIER,
+		STATE_VALUE,
+		STATE_COMMENT,
+		STATE_ENTITY,
+
+		STATE_LAST
+	};
+
+	enum
+	{
+		END_OF_STRING	= 0,			//!< End of string (0).
+		END_OF_BUFFER	= 0xffffffff	//!< End of current data buffer.
+	};
+
+	Token						m_curToken;			//!< Current token.
+	int							m_curTokenLen;		//!< Length of current token.
+
+	State						m_state;			//!< Tokenization state.
+
+	de::RingBuffer<deUint8>		m_buf;
+};
+
+class Parser
+{
+public:
+	typedef std::map<std::string, std::string>		AttributeMap;
+	typedef AttributeMap::const_iterator			AttributeIter;
+
+						Parser				(void);
+						~Parser				(void);
+
+	void				clear				(void);		//!< Resets parser to initial state.
+
+	void				feed				(const deUint8* bytes, int numBytes);
+	void				advance				(void);
+
+	Element				getElement			(void) const						{ return m_element;										}
+
+	// For ELEMENT_START / ELEMENT_END.
+	const char*			getElementName		(void) const						{ return m_elementName.c_str();							}
+
+	// For ELEMENT_START.
+	bool				hasAttribute		(const char* name) const			{ return m_attributes.find(name) != m_attributes.end();	}
+	const char*			getAttribute		(const char* name) const			{ return m_attributes.find(name)->second.c_str();		}
+	const AttributeMap&	attributes			(void) const						{ return m_attributes;									}
+
+	// For ELEMENT_DATA.
+	int					getDataSize			(void) const;
+	deUint8				getDataByte			(int offset) const;
+	void				getDataStr			(std::string& dst) const;
+	void				appendDataStr		(std::string& dst) const;
+
+private:
+						Parser				(const Parser& other);
+	Parser&				operator=			(const Parser& other);
+
+	void				parseEntityValue	(void);
+
+	void				error				(const std::string& what);
+
+	enum State
+	{
+		STATE_DATA = 0,						//!< Initial state - assuming data or tag open.
+		STATE_ENTITY,						//!< Parsed entity is stored - overrides data.
+		STATE_IN_PROCESSING_INSTRUCTION,	//!< In processing instruction.
+		STATE_START_TAG_OPEN,				//!< Start tag open.
+		STATE_END_TAG_OPEN,					//!< End tag open.
+		STATE_EXPECTING_END_TAG_CLOSE,		//!< Expecting end tag close.
+		STATE_ATTRIBUTE_LIST,				//!< Expecting attribute list.
+		STATE_EXPECTING_ATTRIBUTE_EQ,		//!< Got attribute name, expecting =.
+		STATE_EXPECTING_ATTRIBUTE_VALUE,	//!< Expecting attribute value.
+		STATE_YIELD_EMPTY_ELEMENT_END,		//!< Empty element: start has been reported but not end.
+
+		STATE_LAST
+	};
+
+	Tokenizer			m_tokenizer;
+
+	Element				m_element;
+	std::string			m_elementName;
+	AttributeMap		m_attributes;
+
+	State				m_state;
+	std::string			m_attribName;
+	std::string			m_entityValue;		//!< Data override, such as entity value.
+};
+
+// Inline implementations
+
+inline void Tokenizer::getTokenStr (std::string& dst) const
+{
+	DE_ASSERT(m_curToken != TOKEN_INCOMPLETE && m_curToken != TOKEN_END_OF_STRING);
+	dst.resize(m_curTokenLen);
+	for (int ndx = 0; ndx < m_curTokenLen; ndx++)
+		dst[ndx] = m_buf.peekBack(ndx);
+}
+
+inline void Tokenizer::appendTokenStr (std::string& dst) const
+{
+	DE_ASSERT(m_curToken != TOKEN_INCOMPLETE && m_curToken != TOKEN_END_OF_STRING);
+
+	size_t oldLen = dst.size();
+	dst.resize(oldLen+m_curTokenLen);
+
+	for (int ndx = 0; ndx < m_curTokenLen; ndx++)
+		dst[oldLen+ndx] = m_buf.peekBack(ndx);
+}
+
+inline int Parser::getDataSize (void) const
+{
+	if (m_state != STATE_ENTITY)
+		return m_tokenizer.getTokenLen();
+	else
+		return (int)m_entityValue.size();
+}
+
+inline deUint8 Parser::getDataByte (int offset) const
+{
+	if (m_state != STATE_ENTITY)
+		return m_tokenizer.getTokenByte(offset);
+	else
+		return (deUint8)m_entityValue[offset];
+}
+
+inline void Parser::getDataStr (std::string& dst) const
+{
+	if (m_state != STATE_ENTITY)
+		return m_tokenizer.getTokenStr(dst);
+	else
+		dst = m_entityValue;
+}
+
+inline void Parser::appendDataStr (std::string& dst) const
+{
+	if (m_state != STATE_ENTITY)
+		return m_tokenizer.appendTokenStr(dst);
+	else
+		dst += m_entityValue;
+}
+
+} // xml
+} // xe
+
+#endif // _XEXMLPARSER_HPP