diff options
Diffstat (limited to 'Source/cmXMLParser.h')
-rw-r--r-- | Source/cmXMLParser.h | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/Source/cmXMLParser.h b/Source/cmXMLParser.h new file mode 100644 index 0000000..d916075 --- /dev/null +++ b/Source/cmXMLParser.h @@ -0,0 +1,112 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#ifndef cmXMLParser_h +#define cmXMLParser_h + +#include "cmStandardIncludes.h" + +extern "C" +{ + void cmXMLParserStartElement(void*, const char*, const char**); + void cmXMLParserEndElement(void*, const char*); + void cmXMLParserCharacterDataHandler(void*, const char*, int); +} + +/** \class cmXMLParser + * \brief Helper class for performing XML parsing + * + * Superclass for all XML parsers. + */ +class cmXMLParser +{ +public: + cmXMLParser(); + virtual ~cmXMLParser(); + + //! Parse given XML string + virtual int Parse(const char* string); + + //! Parse given XML file + virtual int ParseFile(const char* file); + + /** + * When parsing fragments of XML or streaming XML, use the following + * three methods. InitializeParser method initialize parser but does + * not perform any actual parsing. ParseChunk parses framgent of + * XML. This has to match to what was already parsed. CleanupParser + * finishes parsing. If there were errors, CleanupParser will report + * them. + */ + virtual int InitializeParser(); + virtual int ParseChunk(const char* inputString, + std::string::size_type length); + virtual int CleanupParser(); + +protected: + //! This variable is true if there was a parse error while parsing in + //chunks. + int ParseError; + + //1 Expat parser structure. Exists only during call to Parse(). + void* Parser; + + /** + * Called before each block of input is read from the stream to check if + * parsing is complete. Can be replaced by subclasses to change the + * terminating condition for parsing. Parsing always stops when the end of + * file is reached in the stream. + */ + + virtual int ParsingComplete(); + + /** + * Called when a new element is opened in the XML source. Should be + * replaced by subclasses to handle each element. name = Name of new + * element. atts = Null-terminated array of attribute name/value pairs. + * Even indices are attribute names, and odd indices are values. + */ + virtual void StartElement(const char* name, const char** atts); + + //! Called at the end of an element in the XML source opened when + //StartElement was called. + virtual void EndElement(const char* name); + + //! Called when there is character data to handle. + virtual void CharacterDataHandler(const char* data, int length); + + //! Called by Parse to report an XML syntax error. + virtual void ReportXmlParseError(); + + /** Called by ReportXmlParseError with basic error info. */ + virtual void ReportError(int line, int column, const char* msg); + + //! Utility for convenience of subclasses. Wraps isspace C library + // routine. + static int IsSpace(char c); + + //! Send the given buffer to the XML parser. + virtual int ParseBuffer(const char* buffer, + std::string::size_type length); + + //! Send the given c-style string to the XML parser. + int ParseBuffer(const char* buffer); + + /** Helps subclasses search for attributes on elements. */ + static const char* FindAttribute(const char** atts, const char* attribute); + + //! Callbacks for the expat + friend void cmXMLParserStartElement(void*, const char*, const char**); + friend void cmXMLParserEndElement(void*, const char*); + friend void cmXMLParserCharacterDataHandler(void*, const char*, int); +}; + +#endif |