mirror of
				https://github.com/cjcliffe/CubicSDR.git
				synced 2025-11-04 05:30:23 -05:00 
			
		
		
		
	
		
			
	
	
		
			1803 lines
		
	
	
		
			63 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			1803 lines
		
	
	
		
			63 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								www.sourceforge.net/projects/tinyxml
							 | 
						||
| 
								 | 
							
								Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This software is provided 'as-is', without any express or implied
							 | 
						||
| 
								 | 
							
								warranty. In no event will the authors be held liable for any
							 | 
						||
| 
								 | 
							
								damages arising from the use of this software.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Permission is granted to anyone to use this software for any
							 | 
						||
| 
								 | 
							
								purpose, including commercial applications, and to alter it and
							 | 
						||
| 
								 | 
							
								redistribute it freely, subject to the following restrictions:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1. The origin of this software must not be misrepresented; you must
							 | 
						||
| 
								 | 
							
								not claim that you wrote the original software. If you use this
							 | 
						||
| 
								 | 
							
								software in a product, an acknowledgment in the product documentation
							 | 
						||
| 
								 | 
							
								would be appreciated but is not required.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								2. Altered source versions must be plainly marked as such, and
							 | 
						||
| 
								 | 
							
								must not be misrepresented as being the original software.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								3. This notice may not be removed or altered from any source
							 | 
						||
| 
								 | 
							
								distribution.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef TINYXML_INCLUDED
							 | 
						||
| 
								 | 
							
								#define TINYXML_INCLUDED
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef _MSC_VER
							 | 
						||
| 
								 | 
							
								#pragma warning( push )
							 | 
						||
| 
								 | 
							
								#pragma warning( disable : 4530 )
							 | 
						||
| 
								 | 
							
								#pragma warning( disable : 4786 )
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <ctype.h>
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include <assert.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Help out windows:
							 | 
						||
| 
								 | 
							
								#if defined( _DEBUG ) && !defined( DEBUG )
							 | 
						||
| 
								 | 
							
								#define DEBUG
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									#include <string>
							 | 
						||
| 
								 | 
							
								 	#include <iostream>
							 | 
						||
| 
								 | 
							
									#include <sstream>
							 | 
						||
| 
								 | 
							
									#define TIXML_STRING		std::string
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
									#include "tinystr.h"
							 | 
						||
| 
								 | 
							
									#define TIXML_STRING		TiXmlString
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Deprecated library function hell. Compilers want to use the
							 | 
						||
| 
								 | 
							
								// new safe versions. This probably doesn't fully address the problem,
							 | 
						||
| 
								 | 
							
								// but it gets closer. There are too many compilers for me to fully
							 | 
						||
| 
								 | 
							
								// test. If you get compilation troubles, undefine TIXML_SAFE
							 | 
						||
| 
								 | 
							
								#define TIXML_SAFE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef TIXML_SAFE
							 | 
						||
| 
								 | 
							
									#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
							 | 
						||
| 
								 | 
							
										// Microsoft visual studio, version 2005 and higher.
							 | 
						||
| 
								 | 
							
										#define TIXML_SNPRINTF _snprintf_s
							 | 
						||
| 
								 | 
							
										#define TIXML_SNSCANF  _snscanf_s
							 | 
						||
| 
								 | 
							
										#define TIXML_SSCANF   sscanf_s
							 | 
						||
| 
								 | 
							
									#elif defined(_MSC_VER) && (_MSC_VER >= 1200 )
							 | 
						||
| 
								 | 
							
										// Microsoft visual studio, version 6 and higher.
							 | 
						||
| 
								 | 
							
										//#pragma message( "Using _sn* functions." )
							 | 
						||
| 
								 | 
							
										#define TIXML_SNPRINTF _snprintf
							 | 
						||
| 
								 | 
							
										#define TIXML_SNSCANF  _snscanf
							 | 
						||
| 
								 | 
							
										#define TIXML_SSCANF   sscanf
							 | 
						||
| 
								 | 
							
									#elif defined(__GNUC__) && (__GNUC__ >= 3 )
							 | 
						||
| 
								 | 
							
										// GCC version 3 and higher.s
							 | 
						||
| 
								 | 
							
										//#warning( "Using sn* functions." )
							 | 
						||
| 
								 | 
							
										#define TIXML_SNPRINTF snprintf
							 | 
						||
| 
								 | 
							
										#define TIXML_SNSCANF  snscanf
							 | 
						||
| 
								 | 
							
										#define TIXML_SSCANF   sscanf
							 | 
						||
| 
								 | 
							
									#else
							 | 
						||
| 
								 | 
							
										#define TIXML_SSCANF   sscanf
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								#endif	
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TiXmlDocument;
							 | 
						||
| 
								 | 
							
								class TiXmlElement;
							 | 
						||
| 
								 | 
							
								class TiXmlComment;
							 | 
						||
| 
								 | 
							
								class TiXmlUnknown;
							 | 
						||
| 
								 | 
							
								class TiXmlAttribute;
							 | 
						||
| 
								 | 
							
								class TiXmlText;
							 | 
						||
| 
								 | 
							
								class TiXmlDeclaration;
							 | 
						||
| 
								 | 
							
								class TiXmlParsingData;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const int TIXML_MAJOR_VERSION = 2;
							 | 
						||
| 
								 | 
							
								const int TIXML_MINOR_VERSION = 5;
							 | 
						||
| 
								 | 
							
								const int TIXML_PATCH_VERSION = 3;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*	Internal structure for tracking location of items 
							 | 
						||
| 
								 | 
							
									in the XML file.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								struct TiXmlCursor
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									TiXmlCursor()		{ Clear(); }
							 | 
						||
| 
								 | 
							
									void Clear()		{ row = col = -1; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									int row;	// 0 based.
							 | 
						||
| 
								 | 
							
									int col;	// 0 based.
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									If you call the Accept() method, it requires being passed a TiXmlVisitor
							 | 
						||
| 
								 | 
							
									class to handle callbacks. For nodes that contain other nodes (Document, Element)
							 | 
						||
| 
								 | 
							
									you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves
							 | 
						||
| 
								 | 
							
									are simple called with Visit().
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									If you return 'true' from a Visit method, recursive parsing will continue. If you return
							 | 
						||
| 
								 | 
							
									false, <b>no children of this node or its sibilings</b> will be Visited.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									All flavors of Visit methods have a default implementation that returns 'true' (continue 
							 | 
						||
| 
								 | 
							
									visiting). You need to only override methods that are interesting to you.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									You should never change the document from a callback.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@sa TiXmlNode::Accept()
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlVisitor
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									virtual ~TiXmlVisitor() {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Visit a document.
							 | 
						||
| 
								 | 
							
									virtual bool VisitEnter( const TiXmlDocument& /*doc*/ )			{ return true; }
							 | 
						||
| 
								 | 
							
									/// Visit a document.
							 | 
						||
| 
								 | 
							
									virtual bool VisitExit( const TiXmlDocument& /*doc*/ )			{ return true; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Visit an element.
							 | 
						||
| 
								 | 
							
									virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ )	{ return true; }
							 | 
						||
| 
								 | 
							
									/// Visit an element.
							 | 
						||
| 
								 | 
							
									virtual bool VisitExit( const TiXmlElement& /*element*/ )		{ return true; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Visit a declaration
							 | 
						||
| 
								 | 
							
									virtual bool Visit( const TiXmlDeclaration& /*declaration*/ )	{ return true; }
							 | 
						||
| 
								 | 
							
									/// Visit a text node
							 | 
						||
| 
								 | 
							
									virtual bool Visit( const TiXmlText& /*text*/ )					{ return true; }
							 | 
						||
| 
								 | 
							
									/// Visit a comment node
							 | 
						||
| 
								 | 
							
									virtual bool Visit( const TiXmlComment& /*comment*/ )			{ return true; }
							 | 
						||
| 
								 | 
							
									/// Visit an unknow node
							 | 
						||
| 
								 | 
							
									virtual bool Visit( const TiXmlUnknown& /*unknown*/ )			{ return true; }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Only used by Attribute::Query functions
							 | 
						||
| 
								 | 
							
								enum 
							 | 
						||
| 
								 | 
							
								{ 
							 | 
						||
| 
								 | 
							
									TIXML_SUCCESS,
							 | 
						||
| 
								 | 
							
									TIXML_NO_ATTRIBUTE,
							 | 
						||
| 
								 | 
							
									TIXML_WRONG_TYPE
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Used by the parsing routines.
							 | 
						||
| 
								 | 
							
								enum TiXmlEncoding
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									TIXML_ENCODING_UNKNOWN,
							 | 
						||
| 
								 | 
							
									TIXML_ENCODING_UTF8,
							 | 
						||
| 
								 | 
							
									TIXML_ENCODING_LEGACY
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** TiXmlBase is a base class for every class in TinyXml.
							 | 
						||
| 
								 | 
							
									It does little except to establish that TinyXml classes
							 | 
						||
| 
								 | 
							
									can be printed and provide some utility functions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									In XML, the document and elements can contain
							 | 
						||
| 
								 | 
							
									other elements and other types of nodes.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@verbatim
							 | 
						||
| 
								 | 
							
									A Document can contain:	Element	(container or leaf)
							 | 
						||
| 
								 | 
							
															Comment (leaf)
							 | 
						||
| 
								 | 
							
															Unknown (leaf)
							 | 
						||
| 
								 | 
							
															Declaration( leaf )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									An Element can contain:	Element (container or leaf)
							 | 
						||
| 
								 | 
							
															Text	(leaf)
							 | 
						||
| 
								 | 
							
															Attributes (not on tree)
							 | 
						||
| 
								 | 
							
															Comment (leaf)
							 | 
						||
| 
								 | 
							
															Unknown (leaf)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									A Decleration contains: Attributes (not on tree)
							 | 
						||
| 
								 | 
							
									@endverbatim
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlBase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									friend class TiXmlNode;
							 | 
						||
| 
								 | 
							
									friend class TiXmlElement;
							 | 
						||
| 
								 | 
							
									friend class TiXmlDocument;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									TiXmlBase()	:	userData(0)		{}
							 | 
						||
| 
								 | 
							
									virtual ~TiXmlBase()			{}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**	All TinyXml classes can print themselves to a filestream
							 | 
						||
| 
								 | 
							
										or the string class (TiXmlString in non-STL mode, std::string
							 | 
						||
| 
								 | 
							
										in STL mode.) Either or both cfile and str can be null.
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										This is a formatted print, and will insert 
							 | 
						||
| 
								 | 
							
										tabs and newlines.
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										(For an unformatted stream, use the << operator.)
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual void Print( FILE* cfile, int depth ) const = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**	The world does not agree on whether white space should be kept or
							 | 
						||
| 
								 | 
							
										not. In order to make everyone happy, these global, static functions
							 | 
						||
| 
								 | 
							
										are provided to set whether or not TinyXml will condense all white space
							 | 
						||
| 
								 | 
							
										into a single space or not. The default is to condense. Note changing this
							 | 
						||
| 
								 | 
							
										value is not thread safe.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									static void SetCondenseWhiteSpace( bool condense )		{ condenseWhiteSpace = condense; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Return the current white space setting.
							 | 
						||
| 
								 | 
							
									static bool IsWhiteSpaceCondensed()						{ return condenseWhiteSpace; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Return the position, in the original source file, of this node or attribute.
							 | 
						||
| 
								 | 
							
										The row and column are 1-based. (That is the first row and first column is
							 | 
						||
| 
								 | 
							
										1,1). If the returns values are 0 or less, then the parser does not have
							 | 
						||
| 
								 | 
							
										a row and column value.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Generally, the row and column value will be set when the TiXmlDocument::Load(),
							 | 
						||
| 
								 | 
							
										TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set
							 | 
						||
| 
								 | 
							
										when the DOM was created from operator>>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The values reflect the initial load. Once the DOM is modified programmatically
							 | 
						||
| 
								 | 
							
										(by adding or changing nodes and attributes) the new values will NOT update to
							 | 
						||
| 
								 | 
							
										reflect changes in the document.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										There is a minor performance cost to computing the row and column. Computation
							 | 
						||
| 
								 | 
							
										can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										@sa TiXmlDocument::SetTabSize()
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									int Row() const			{ return location.row + 1; }
							 | 
						||
| 
								 | 
							
									int Column() const		{ return location.col + 1; }	///< See Row()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void  SetUserData( void* user )			{ userData = user; }	///< Set a pointer to arbitrary user data.
							 | 
						||
| 
								 | 
							
									void* GetUserData()						{ return userData; }	///< Get a pointer to arbitrary user data.
							 | 
						||
| 
								 | 
							
									const void* GetUserData() const 		{ return userData; }	///< Get a pointer to arbitrary user data.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Table that returs, for a given lead byte, the total number of bytes
							 | 
						||
| 
								 | 
							
									// in the UTF-8 sequence.
							 | 
						||
| 
								 | 
							
									static const int utf8ByteTable[256];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const char* Parse(	const char* p, 
							 | 
						||
| 
								 | 
							
																TiXmlParsingData* data, 
							 | 
						||
| 
								 | 
							
																TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, 
							 | 
						||
| 
								 | 
							
										or they will be transformed into entities!
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									enum
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										TIXML_NO_ERROR = 0,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_OPENING_FILE,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_OUT_OF_MEMORY,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_PARSING_ELEMENT,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_READING_ELEMENT_VALUE,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_READING_ATTRIBUTES,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_PARSING_EMPTY,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_READING_END_TAG,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_PARSING_UNKNOWN,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_PARSING_COMMENT,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_PARSING_DECLARATION,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_DOCUMENT_EMPTY,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_EMBEDDED_NULL,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_PARSING_CDATA,
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_DOCUMENT_TOP_ONLY,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										TIXML_ERROR_STRING_COUNT
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
									inline static bool IsWhiteSpace( char c )		
							 | 
						||
| 
								 | 
							
									{ 
							 | 
						||
| 
								 | 
							
										return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); 
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									inline static bool IsWhiteSpace( int c )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if ( c < 256 )
							 | 
						||
| 
								 | 
							
											return IsWhiteSpace( (char) c );
							 | 
						||
| 
								 | 
							
										return false;	// Again, only truly correct for English/Latin...but usually works.
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									static bool	StreamWhiteSpace( std::istream * in, TIXML_STRING * tag );
							 | 
						||
| 
								 | 
							
									static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*	Reads an XML name into the string provided. Returns
							 | 
						||
| 
								 | 
							
										a pointer just past the last character of the name,
							 | 
						||
| 
								 | 
							
										or 0 if the function has an error.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*	Reads text. Returns a pointer past the given end tag.
							 | 
						||
| 
								 | 
							
										Wickedly complex options, but it keeps the (sensitive) code in one place.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									static const char* ReadText(	const char* in,				// where to start
							 | 
						||
| 
								 | 
							
																	TIXML_STRING* text,			// the string read
							 | 
						||
| 
								 | 
							
																	bool ignoreWhiteSpace,		// whether to keep the white space
							 | 
						||
| 
								 | 
							
																	const char* endTag,			// what ends this text
							 | 
						||
| 
								 | 
							
																	bool ignoreCase,			// whether to ignore case in the end tag
							 | 
						||
| 
								 | 
							
																	TiXmlEncoding encoding );	// the current encoding
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// If an entity has been found, transform it into a character.
							 | 
						||
| 
								 | 
							
									static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Get a character, while interpreting entities.
							 | 
						||
| 
								 | 
							
									// The length can be from 0 to 4 bytes.
							 | 
						||
| 
								 | 
							
									inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										assert( p );
							 | 
						||
| 
								 | 
							
										if ( encoding == TIXML_ENCODING_UTF8 )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											*length = utf8ByteTable[ *((const unsigned char*)p) ];
							 | 
						||
| 
								 | 
							
											assert( *length >= 0 && *length < 5 );
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											*length = 1;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if ( *length == 1 )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											if ( *p == '&' )
							 | 
						||
| 
								 | 
							
												return GetEntity( p, _value, length, encoding );
							 | 
						||
| 
								 | 
							
											*_value = *p;
							 | 
						||
| 
								 | 
							
											return p+1;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else if ( *length )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											//strncpy( _value, p, *length );	// lots of compilers don't like this function (unsafe),
							 | 
						||
| 
								 | 
							
																				// and the null terminator isn't needed
							 | 
						||
| 
								 | 
							
											for( int i=0; p[i] && i<*length; ++i ) {
							 | 
						||
| 
								 | 
							
												_value[i] = p[i];
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return p + (*length);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											// Not valid text.
							 | 
						||
| 
								 | 
							
											return 0;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Return true if the next characters in the stream are any of the endTag sequences.
							 | 
						||
| 
								 | 
							
									// Ignore case only works for english, and should only be relied on when comparing
							 | 
						||
| 
								 | 
							
									// to English words: StringEqual( p, "version", true ) is fine.
							 | 
						||
| 
								 | 
							
									static bool StringEqual(	const char* p,
							 | 
						||
| 
								 | 
							
																const char* endTag,
							 | 
						||
| 
								 | 
							
																bool ignoreCase,
							 | 
						||
| 
								 | 
							
																TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static const char* errorString[ TIXML_ERROR_STRING_COUNT ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlCursor location;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /// Field containing a generic user pointer
							 | 
						||
| 
								 | 
							
									void*			userData;
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									// None of these methods are reliable for any language except English.
							 | 
						||
| 
								 | 
							
									// Good for approximation, not great for accuracy.
							 | 
						||
| 
								 | 
							
									static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
									static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
									inline static int ToLower( int v, TiXmlEncoding encoding )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if ( encoding == TIXML_ENCODING_UTF8 )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											if ( v < 128 ) return tolower( v );
							 | 
						||
| 
								 | 
							
											return v;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											return tolower( v );
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
									TiXmlBase( const TiXmlBase& );				// not implemented.
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlBase& base );	// not allowed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									struct Entity
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										const char*     str;
							 | 
						||
| 
								 | 
							
										unsigned int	strLength;
							 | 
						||
| 
								 | 
							
										char		    chr;
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
									enum
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										NUM_ENTITY = 5,
							 | 
						||
| 
								 | 
							
										MAX_ENTITY_LENGTH = 6
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
									static Entity entity[ NUM_ENTITY ];
							 | 
						||
| 
								 | 
							
									static bool condenseWhiteSpace;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** The parent class for everything in the Document Object Model.
							 | 
						||
| 
								 | 
							
									(Except for attributes).
							 | 
						||
| 
								 | 
							
									Nodes have siblings, a parent, and children. A node can be
							 | 
						||
| 
								 | 
							
									in a document, or stand on its own. The type of a TiXmlNode
							 | 
						||
| 
								 | 
							
									can be queried, and it can be cast to its more defined type.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlNode : public TiXmlBase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									friend class TiXmlDocument;
							 | 
						||
| 
								 | 
							
									friend class TiXmlElement;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL	
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									    /** An input stream operator, for every class. Tolerant of newlines and
							 | 
						||
| 
								 | 
							
										    formatting, but doesn't expect them.
							 | 
						||
| 
								 | 
							
									    */
							 | 
						||
| 
								 | 
							
									    friend std::istream& operator >> (std::istream& in, TiXmlNode& base);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									    /** An output stream operator, for every class. Note that this outputs
							 | 
						||
| 
								 | 
							
										    without any newlines or formatting, as opposed to Print(), which
							 | 
						||
| 
								 | 
							
										    includes tabs and new lines.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										    The operator<< and operator>> are not completely symmetric. Writing
							 | 
						||
| 
								 | 
							
										    a node to a stream is very well defined. You'll get a nice stream
							 | 
						||
| 
								 | 
							
										    of output, without any extra whitespace or newlines.
							 | 
						||
| 
								 | 
							
										    
							 | 
						||
| 
								 | 
							
										    But reading is not as well defined. (As it always is.) If you create
							 | 
						||
| 
								 | 
							
										    a TiXmlElement (for example) and read that from an input stream,
							 | 
						||
| 
								 | 
							
										    the text needs to define an element or junk will result. This is
							 | 
						||
| 
								 | 
							
										    true of all input streams, but it's worth keeping in mind.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										    A TiXmlDocument will read nodes until it reads a root element, and
							 | 
						||
| 
								 | 
							
											all the children of that root element.
							 | 
						||
| 
								 | 
							
									    */	
							 | 
						||
| 
								 | 
							
									    friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/// Appends the XML node or attribute to a std::string.
							 | 
						||
| 
								 | 
							
										friend std::string& operator<< (std::string& out, const TiXmlNode& base );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** The types of XML nodes supported by TinyXml. (All the
							 | 
						||
| 
								 | 
							
											unsupported types are picked up by UNKNOWN.)
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									enum NodeType
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										DOCUMENT,
							 | 
						||
| 
								 | 
							
										ELEMENT,
							 | 
						||
| 
								 | 
							
										COMMENT,
							 | 
						||
| 
								 | 
							
										UNKNOWN,
							 | 
						||
| 
								 | 
							
										TEXT,
							 | 
						||
| 
								 | 
							
										DECLARATION,
							 | 
						||
| 
								 | 
							
										TYPECOUNT
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual ~TiXmlNode();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** The meaning of 'value' changes for the specific type of
							 | 
						||
| 
								 | 
							
										TiXmlNode.
							 | 
						||
| 
								 | 
							
										@verbatim
							 | 
						||
| 
								 | 
							
										Document:	filename of the xml file
							 | 
						||
| 
								 | 
							
										Element:	name of the element
							 | 
						||
| 
								 | 
							
										Comment:	the comment text
							 | 
						||
| 
								 | 
							
										Unknown:	the tag contents
							 | 
						||
| 
								 | 
							
										Text:		the text string
							 | 
						||
| 
								 | 
							
										@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The subclasses will wrap this function.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const char *Value() const { return value.c_str (); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/** Return Value() as a std::string. If you only use STL,
							 | 
						||
| 
								 | 
							
									    this is more efficient than calling Value().
							 | 
						||
| 
								 | 
							
										Only available in STL mode.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const std::string& ValueStr() const { return value; }
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const TIXML_STRING& ValueTStr() const { return value; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Changes the value of the node. Defined as:
							 | 
						||
| 
								 | 
							
										@verbatim
							 | 
						||
| 
								 | 
							
										Document:	filename of the xml file
							 | 
						||
| 
								 | 
							
										Element:	name of the element
							 | 
						||
| 
								 | 
							
										Comment:	the comment text
							 | 
						||
| 
								 | 
							
										Unknown:	the tag contents
							 | 
						||
| 
								 | 
							
										Text:		the text string
							 | 
						||
| 
								 | 
							
										@endverbatim
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void SetValue(const char * _value) { value = _value;}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/// STL std::string form.
							 | 
						||
| 
								 | 
							
									void SetValue( const std::string& _value )	{ value = _value; }
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Delete all the children of this node. Does not affect 'this'.
							 | 
						||
| 
								 | 
							
									void Clear();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// One step up the DOM.
							 | 
						||
| 
								 | 
							
									TiXmlNode* Parent()							{ return parent; }
							 | 
						||
| 
								 | 
							
									const TiXmlNode* Parent() const				{ return parent; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const TiXmlNode* FirstChild()	const		{ return firstChild; }	///< The first child of this node. Will be null if there are no children.
							 | 
						||
| 
								 | 
							
									TiXmlNode* FirstChild()						{ return firstChild; }
							 | 
						||
| 
								 | 
							
									const TiXmlNode* FirstChild( const char * value ) const;			///< The first child of this node with the matching 'value'. Will be null if none found.
							 | 
						||
| 
								 | 
							
									/// The first child of this node with the matching 'value'. Will be null if none found.
							 | 
						||
| 
								 | 
							
									TiXmlNode* FirstChild( const char * _value ) {
							 | 
						||
| 
								 | 
							
										// Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe)
							 | 
						||
| 
								 | 
							
										// call the method, cast the return back to non-const.
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value ));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									const TiXmlNode* LastChild() const	{ return lastChild; }		/// The last child of this node. Will be null if there are no children.
							 | 
						||
| 
								 | 
							
									TiXmlNode* LastChild()	{ return lastChild; }
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									const TiXmlNode* LastChild( const char * value ) const;			/// The last child of this node matching 'value'. Will be null if there are no children.
							 | 
						||
| 
								 | 
							
									TiXmlNode* LastChild( const char * _value ) {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value ));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									const TiXmlNode* FirstChild( const std::string& _value ) const	{	return FirstChild (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									TiXmlNode* FirstChild( const std::string& _value )				{	return FirstChild (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									const TiXmlNode* LastChild( const std::string& _value ) const	{	return LastChild (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									TiXmlNode* LastChild( const std::string& _value )				{	return LastChild (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** An alternate way to walk the children of a node.
							 | 
						||
| 
								 | 
							
										One way to iterate over nodes is:
							 | 
						||
| 
								 | 
							
										@verbatim
							 | 
						||
| 
								 | 
							
											for( child = parent->FirstChild(); child; child = child->NextSibling() )
							 | 
						||
| 
								 | 
							
										@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										IterateChildren does the same thing with the syntax:
							 | 
						||
| 
								 | 
							
										@verbatim
							 | 
						||
| 
								 | 
							
											child = 0;
							 | 
						||
| 
								 | 
							
											while( child = parent->IterateChildren( child ) )
							 | 
						||
| 
								 | 
							
										@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										IterateChildren takes the previous child as input and finds
							 | 
						||
| 
								 | 
							
										the next one. If the previous child is null, it returns the
							 | 
						||
| 
								 | 
							
										first. IterateChildren will return null when done.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const;
							 | 
						||
| 
								 | 
							
									TiXmlNode* IterateChildren( const TiXmlNode* previous ) {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// This flavor of IterateChildren searches for children with a particular 'value'
							 | 
						||
| 
								 | 
							
									const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const;
							 | 
						||
| 
								 | 
							
									TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const	{	return IterateChildren (_value.c_str (), previous);	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) {	return IterateChildren (_value.c_str (), previous);	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Add a new node related to this. Adds a child past the LastChild.
							 | 
						||
| 
								 | 
							
										Returns a pointer to the new object or NULL if an error occured.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Add a new node related to this. Adds a child past the LastChild.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										NOTE: the node to be added is passed by pointer, and will be
							 | 
						||
| 
								 | 
							
										henceforth owned (and deleted) by tinyXml. This method is efficient
							 | 
						||
| 
								 | 
							
										and avoids an extra copy, but should be used with care as it
							 | 
						||
| 
								 | 
							
										uses a different memory model than the other insert functions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										@sa InsertEndChild
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlNode* LinkEndChild( TiXmlNode* addThis );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Add a new node related to this. Adds a child before the specified child.
							 | 
						||
| 
								 | 
							
										Returns a pointer to the new object or NULL if an error occured.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Add a new node related to this. Adds a child after the specified child.
							 | 
						||
| 
								 | 
							
										Returns a pointer to the new object or NULL if an error occured.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlNode* InsertAfterChild(  TiXmlNode* afterThis, const TiXmlNode& addThis );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Replace a child of this node.
							 | 
						||
| 
								 | 
							
										Returns a pointer to the new object or NULL if an error occured.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Delete a child of this node.
							 | 
						||
| 
								 | 
							
									bool RemoveChild( TiXmlNode* removeThis );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Navigate to a sibling node.
							 | 
						||
| 
								 | 
							
									const TiXmlNode* PreviousSibling() const			{ return prev; }
							 | 
						||
| 
								 | 
							
									TiXmlNode* PreviousSibling()						{ return prev; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Navigate to a sibling node.
							 | 
						||
| 
								 | 
							
									const TiXmlNode* PreviousSibling( const char * ) const;
							 | 
						||
| 
								 | 
							
									TiXmlNode* PreviousSibling( const char *_prev ) {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									const TiXmlNode* PreviousSibling( const std::string& _value ) const	{	return PreviousSibling (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									TiXmlNode* PreviousSibling( const std::string& _value ) 			{	return PreviousSibling (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									const TiXmlNode* NextSibling( const std::string& _value) const		{	return NextSibling (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									TiXmlNode* NextSibling( const std::string& _value) 					{	return NextSibling (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Navigate to a sibling node.
							 | 
						||
| 
								 | 
							
									const TiXmlNode* NextSibling() const				{ return next; }
							 | 
						||
| 
								 | 
							
									TiXmlNode* NextSibling()							{ return next; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Navigate to a sibling node with the given 'value'.
							 | 
						||
| 
								 | 
							
									const TiXmlNode* NextSibling( const char * ) const;
							 | 
						||
| 
								 | 
							
									TiXmlNode* NextSibling( const char* _next ) {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Convenience function to get through elements.
							 | 
						||
| 
								 | 
							
										Calls NextSibling and ToElement. Will skip all non-Element
							 | 
						||
| 
								 | 
							
										nodes. Returns 0 if there is not another element.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const TiXmlElement* NextSiblingElement() const;
							 | 
						||
| 
								 | 
							
									TiXmlElement* NextSiblingElement() {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Convenience function to get through elements.
							 | 
						||
| 
								 | 
							
										Calls NextSibling and ToElement. Will skip all non-Element
							 | 
						||
| 
								 | 
							
										nodes. Returns 0 if there is not another element.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const TiXmlElement* NextSiblingElement( const char * ) const;
							 | 
						||
| 
								 | 
							
									TiXmlElement* NextSiblingElement( const char *_next ) {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									const TiXmlElement* NextSiblingElement( const std::string& _value) const	{	return NextSiblingElement (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									TiXmlElement* NextSiblingElement( const std::string& _value)				{	return NextSiblingElement (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Convenience function to get through elements.
							 | 
						||
| 
								 | 
							
									const TiXmlElement* FirstChildElement()	const;
							 | 
						||
| 
								 | 
							
									TiXmlElement* FirstChildElement() {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Convenience function to get through elements.
							 | 
						||
| 
								 | 
							
									const TiXmlElement* FirstChildElement( const char * _value ) const;
							 | 
						||
| 
								 | 
							
									TiXmlElement* FirstChildElement( const char * _value ) {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									const TiXmlElement* FirstChildElement( const std::string& _value ) const	{	return FirstChildElement (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									TiXmlElement* FirstChildElement( const std::string& _value )				{	return FirstChildElement (_value.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Query the type (as an enumerated value, above) of this node.
							 | 
						||
| 
								 | 
							
										The possible types are: DOCUMENT, ELEMENT, COMMENT,
							 | 
						||
| 
								 | 
							
																UNKNOWN, TEXT, and DECLARATION.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									int Type() const	{ return type; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Return a pointer to the Document this node lives in.
							 | 
						||
| 
								 | 
							
										Returns null if not in a document.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const TiXmlDocument* GetDocument() const;
							 | 
						||
| 
								 | 
							
									TiXmlDocument* GetDocument() {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Returns true if this node has no children.
							 | 
						||
| 
								 | 
							
									bool NoChildren() const						{ return !firstChild; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const TiXmlDocument*    ToDocument()    const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual const TiXmlElement*     ToElement()     const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual const TiXmlComment*     ToComment()     const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual const TiXmlUnknown*     ToUnknown()     const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual const TiXmlText*        ToText()        const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual TiXmlDocument*          ToDocument()    { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlElement*           ToElement()	    { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlComment*           ToComment()     { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlUnknown*           ToUnknown()	    { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlText*	            ToText()        { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlDeclaration*       ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Create an exact duplicate of this node and return it. The memory must be deleted
							 | 
						||
| 
								 | 
							
										by the caller. 
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual TiXmlNode* Clone() const = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the 
							 | 
						||
| 
								 | 
							
										XML tree will be conditionally visited and the host will be called back
							 | 
						||
| 
								 | 
							
										via the TiXmlVisitor interface.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse
							 | 
						||
| 
								 | 
							
										the XML for the callbacks, so the performance of TinyXML is unchanged by using this
							 | 
						||
| 
								 | 
							
										interface versus any other.)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The interface has been based on ideas from:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										- http://www.saxproject.org/
							 | 
						||
| 
								 | 
							
										- http://c2.com/cgi/wiki?HierarchicalVisitorPattern 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Which are both good references for "visiting".
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										An example of using Accept():
							 | 
						||
| 
								 | 
							
										@verbatim
							 | 
						||
| 
								 | 
							
										TiXmlPrinter printer;
							 | 
						||
| 
								 | 
							
										tinyxmlDoc.Accept( &printer );
							 | 
						||
| 
								 | 
							
										const char* xmlcstr = printer.CStr();
							 | 
						||
| 
								 | 
							
										@endverbatim
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual bool Accept( TiXmlVisitor* visitor ) const = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
									TiXmlNode( NodeType _type );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Copy to the allocated object. Shared functionality between Clone, Copy constructor,
							 | 
						||
| 
								 | 
							
									// and the assignment operator.
							 | 
						||
| 
								 | 
							
									void CopyTo( TiXmlNode* target ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									    // The real work of the input operator.
							 | 
						||
| 
								 | 
							
									virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0;
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Figure out what is at *p, and parse it. Returns null if it is not an xml node.
							 | 
						||
| 
								 | 
							
									TiXmlNode* Identify( const char* start, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlNode*		parent;
							 | 
						||
| 
								 | 
							
									NodeType		type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlNode*		firstChild;
							 | 
						||
| 
								 | 
							
									TiXmlNode*		lastChild;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TIXML_STRING	value;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlNode*		prev;
							 | 
						||
| 
								 | 
							
									TiXmlNode*		next;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
									TiXmlNode( const TiXmlNode& );				// not implemented.
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlNode& base );	// not allowed.
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** An attribute is a name-value pair. Elements have an arbitrary
							 | 
						||
| 
								 | 
							
									number of attributes, each with a unique name.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@note The attributes are not TiXmlNodes, since they are not
							 | 
						||
| 
								 | 
							
										  part of the tinyXML document object model. There are other
							 | 
						||
| 
								 | 
							
										  suggested ways to look at this problem.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlAttribute : public TiXmlBase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									friend class TiXmlAttributeSet;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									/// Construct an empty attribute.
							 | 
						||
| 
								 | 
							
									TiXmlAttribute() : TiXmlBase()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										document = 0;
							 | 
						||
| 
								 | 
							
										prev = next = 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/// std::string constructor.
							 | 
						||
| 
								 | 
							
									TiXmlAttribute( const std::string& _name, const std::string& _value )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										name = _name;
							 | 
						||
| 
								 | 
							
										value = _value;
							 | 
						||
| 
								 | 
							
										document = 0;
							 | 
						||
| 
								 | 
							
										prev = next = 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Construct an attribute with a name and value.
							 | 
						||
| 
								 | 
							
									TiXmlAttribute( const char * _name, const char * _value )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										name = _name;
							 | 
						||
| 
								 | 
							
										value = _value;
							 | 
						||
| 
								 | 
							
										document = 0;
							 | 
						||
| 
								 | 
							
										prev = next = 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const char*		Name()  const		{ return name.c_str(); }		///< Return the name of this attribute.
							 | 
						||
| 
								 | 
							
									const char*		Value() const		{ return value.c_str(); }		///< Return the value of this attribute.
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									const std::string& ValueStr() const	{ return value; }				///< Return the value of this attribute.
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
									int				IntValue() const;									///< Return the value of this attribute, converted to an integer.
							 | 
						||
| 
								 | 
							
									double			DoubleValue() const;								///< Return the value of this attribute, converted to a double.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Get the tinyxml string representation
							 | 
						||
| 
								 | 
							
									const TIXML_STRING& NameTStr() const { return name; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** QueryIntValue examines the value string. It is an alternative to the
							 | 
						||
| 
								 | 
							
										IntValue() method with richer error checking.
							 | 
						||
| 
								 | 
							
										If the value is an integer, it is stored in 'value' and 
							 | 
						||
| 
								 | 
							
										the call returns TIXML_SUCCESS. If it is not
							 | 
						||
| 
								 | 
							
										an integer, it returns TIXML_WRONG_TYPE.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										A specialized but useful call. Note that for success it returns 0,
							 | 
						||
| 
								 | 
							
										which is the opposite of almost all other TinyXml calls.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									int QueryIntValue( int* _value ) const;
							 | 
						||
| 
								 | 
							
									/// QueryDoubleValue examines the value string. See QueryIntValue().
							 | 
						||
| 
								 | 
							
									int QueryDoubleValue( double* _value ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void SetName( const char* _name )	{ name = _name; }				///< Set the name of this attribute.
							 | 
						||
| 
								 | 
							
									void SetValue( const char* _value )	{ value = _value; }				///< Set the value.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void SetIntValue( int _value );										///< Set the value from an integer.
							 | 
						||
| 
								 | 
							
									void SetDoubleValue( double _value );								///< Set the value from a double.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/// STL std::string form.
							 | 
						||
| 
								 | 
							
									void SetName( const std::string& _name )	{ name = _name; }	
							 | 
						||
| 
								 | 
							
									/// STL std::string form.	
							 | 
						||
| 
								 | 
							
									void SetValue( const std::string& _value )	{ value = _value; }
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Get the next sibling attribute in the DOM. Returns null at end.
							 | 
						||
| 
								 | 
							
									const TiXmlAttribute* Next() const;
							 | 
						||
| 
								 | 
							
									TiXmlAttribute* Next() {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); 
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Get the previous sibling attribute in the DOM. Returns null at beginning.
							 | 
						||
| 
								 | 
							
									const TiXmlAttribute* Previous() const;
							 | 
						||
| 
								 | 
							
									TiXmlAttribute* Previous() {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); 
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; }
							 | 
						||
| 
								 | 
							
									bool operator<( const TiXmlAttribute& rhs )	 const { return name < rhs.name; }
							 | 
						||
| 
								 | 
							
									bool operator>( const TiXmlAttribute& rhs )  const { return name > rhs.name; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*	Attribute parsing starts: first letter of the name
							 | 
						||
| 
								 | 
							
														 returns: the next char after the value end quote
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Prints this Attribute to a FILE stream.
							 | 
						||
| 
								 | 
							
									virtual void Print( FILE* cfile, int depth ) const {
							 | 
						||
| 
								 | 
							
										Print( cfile, depth, 0 );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									void Print( FILE* cfile, int depth, TIXML_STRING* str ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// [internal use]
							 | 
						||
| 
								 | 
							
									// Set the document pointer so the attribute can report errors.
							 | 
						||
| 
								 | 
							
									void SetDocument( TiXmlDocument* doc )	{ document = doc; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
									TiXmlAttribute( const TiXmlAttribute& );				// not implemented.
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlAttribute& base );	// not allowed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlDocument*	document;	// A pointer back to a document, for error reporting.
							 | 
						||
| 
								 | 
							
									TIXML_STRING name;
							 | 
						||
| 
								 | 
							
									TIXML_STRING value;
							 | 
						||
| 
								 | 
							
									TiXmlAttribute*	prev;
							 | 
						||
| 
								 | 
							
									TiXmlAttribute*	next;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*	A class used to manage a group of attributes.
							 | 
						||
| 
								 | 
							
									It is only used internally, both by the ELEMENT and the DECLARATION.
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									The set can be changed transparent to the Element and Declaration
							 | 
						||
| 
								 | 
							
									classes that use it, but NOT transparent to the Attribute
							 | 
						||
| 
								 | 
							
									which has to implement a next() and previous() method. Which makes
							 | 
						||
| 
								 | 
							
									it a bit problematic and prevents the use of STL.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									This version is implemented with circular lists because:
							 | 
						||
| 
								 | 
							
										- I like circular lists
							 | 
						||
| 
								 | 
							
										- it demonstrates some independence from the (typical) doubly linked list.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlAttributeSet
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									TiXmlAttributeSet();
							 | 
						||
| 
								 | 
							
									~TiXmlAttributeSet();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void Add( TiXmlAttribute* attribute );
							 | 
						||
| 
								 | 
							
									void Remove( TiXmlAttribute* attribute );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const TiXmlAttribute* First()	const	{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
							 | 
						||
| 
								 | 
							
									TiXmlAttribute* First()					{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
							 | 
						||
| 
								 | 
							
									const TiXmlAttribute* Last() const		{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
							 | 
						||
| 
								 | 
							
									TiXmlAttribute* Last()					{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const TiXmlAttribute*	Find( const char* _name ) const;
							 | 
						||
| 
								 | 
							
									TiXmlAttribute*	Find( const char* _name ) {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									const TiXmlAttribute*	Find( const std::string& _name ) const;
							 | 
						||
| 
								 | 
							
									TiXmlAttribute*	Find( const std::string& _name ) {
							 | 
						||
| 
								 | 
							
										return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
									//*ME:	Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element),
							 | 
						||
| 
								 | 
							
									//*ME:	this class must be also use a hidden/disabled copy-constructor !!!
							 | 
						||
| 
								 | 
							
									TiXmlAttributeSet( const TiXmlAttributeSet& );	// not allowed
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlAttributeSet& );	// not allowed (as TiXmlAttribute)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlAttribute sentinel;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** The element is a container class. It has a value, the element name,
							 | 
						||
| 
								 | 
							
									and can contain other elements, text, comments, and unknowns.
							 | 
						||
| 
								 | 
							
									Elements also contain an arbitrary number of attributes.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlElement : public TiXmlNode
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									/// Construct an element.
							 | 
						||
| 
								 | 
							
									TiXmlElement (const char * in_value);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/// std::string constructor.
							 | 
						||
| 
								 | 
							
									TiXmlElement( const std::string& _value );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlElement( const TiXmlElement& );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlElement& base );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual ~TiXmlElement();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Given an attribute name, Attribute() returns the value
							 | 
						||
| 
								 | 
							
										for the attribute of that name, or null if none exists.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const char* Attribute( const char* name ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Given an attribute name, Attribute() returns the value
							 | 
						||
| 
								 | 
							
										for the attribute of that name, or null if none exists.
							 | 
						||
| 
								 | 
							
										If the attribute exists and can be converted to an integer,
							 | 
						||
| 
								 | 
							
										the integer value will be put in the return 'i', if 'i'
							 | 
						||
| 
								 | 
							
										is non-null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const char* Attribute( const char* name, int* i ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Given an attribute name, Attribute() returns the value
							 | 
						||
| 
								 | 
							
										for the attribute of that name, or null if none exists.
							 | 
						||
| 
								 | 
							
										If the attribute exists and can be converted to an double,
							 | 
						||
| 
								 | 
							
										the double value will be put in the return 'd', if 'd'
							 | 
						||
| 
								 | 
							
										is non-null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const char* Attribute( const char* name, double* d ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** QueryIntAttribute examines the attribute - it is an alternative to the
							 | 
						||
| 
								 | 
							
										Attribute() method with richer error checking.
							 | 
						||
| 
								 | 
							
										If the attribute is an integer, it is stored in 'value' and 
							 | 
						||
| 
								 | 
							
										the call returns TIXML_SUCCESS. If it is not
							 | 
						||
| 
								 | 
							
										an integer, it returns TIXML_WRONG_TYPE. If the attribute
							 | 
						||
| 
								 | 
							
										does not exist, then TIXML_NO_ATTRIBUTE is returned.
							 | 
						||
| 
								 | 
							
									*/	
							 | 
						||
| 
								 | 
							
									int QueryIntAttribute( const char* name, int* _value ) const;
							 | 
						||
| 
								 | 
							
									/// QueryDoubleAttribute examines the attribute - see QueryIntAttribute().
							 | 
						||
| 
								 | 
							
									int QueryDoubleAttribute( const char* name, double* _value ) const;
							 | 
						||
| 
								 | 
							
									/// QueryFloatAttribute examines the attribute - see QueryIntAttribute().
							 | 
						||
| 
								 | 
							
									int QueryFloatAttribute( const char* name, float* _value ) const {
							 | 
						||
| 
								 | 
							
										double d;
							 | 
						||
| 
								 | 
							
										int result = QueryDoubleAttribute( name, &d );
							 | 
						||
| 
								 | 
							
										if ( result == TIXML_SUCCESS ) {
							 | 
						||
| 
								 | 
							
											*_value = (float)d;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return result;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/** Template form of the attribute query which will try to read the
							 | 
						||
| 
								 | 
							
										attribute into the specified type. Very easy, very powerful, but
							 | 
						||
| 
								 | 
							
										be careful to make sure to call this with the correct type.
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										NOTE: This method doesn't work correctly for 'string' types.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										@return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										const TiXmlAttribute* node = attributeSet.Find( name );
							 | 
						||
| 
								 | 
							
										if ( !node )
							 | 
						||
| 
								 | 
							
											return TIXML_NO_ATTRIBUTE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										std::stringstream sstream( node->ValueStr() );
							 | 
						||
| 
								 | 
							
										sstream >> *outValue;
							 | 
						||
| 
								 | 
							
										if ( !sstream.fail() )
							 | 
						||
| 
								 | 
							
											return TIXML_SUCCESS;
							 | 
						||
| 
								 | 
							
										return TIXML_WRONG_TYPE;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									/*
							 | 
						||
| 
								 | 
							
									 This is - in theory - a bug fix for "QueryValueAtribute returns truncated std::string"
							 | 
						||
| 
								 | 
							
									 but template specialization is hard to get working cross-compiler. Leaving the bug for now.
							 | 
						||
| 
								 | 
							
									 
							 | 
						||
| 
								 | 
							
									// The above will fail for std::string because the space character is used as a seperator.
							 | 
						||
| 
								 | 
							
									// Specialize for strings. Bug [ 1695429 ] QueryValueAtribute returns truncated std::string
							 | 
						||
| 
								 | 
							
									template<> int QueryValueAttribute( const std::string& name, std::string* outValue ) const
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										const TiXmlAttribute* node = attributeSet.Find( name );
							 | 
						||
| 
								 | 
							
										if ( !node )
							 | 
						||
| 
								 | 
							
											return TIXML_NO_ATTRIBUTE;
							 | 
						||
| 
								 | 
							
										*outValue = node->ValueStr();
							 | 
						||
| 
								 | 
							
										return TIXML_SUCCESS;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Sets an attribute of name to a given value. The attribute
							 | 
						||
| 
								 | 
							
										will be created if it does not exist, or changed if it does.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void SetAttribute( const char* name, const char * _value );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									const std::string* Attribute( const std::string& name ) const;
							 | 
						||
| 
								 | 
							
									const std::string* Attribute( const std::string& name, int* i ) const;
							 | 
						||
| 
								 | 
							
									const std::string* Attribute( const std::string& name, double* d ) const;
							 | 
						||
| 
								 | 
							
									int QueryIntAttribute( const std::string& name, int* _value ) const;
							 | 
						||
| 
								 | 
							
									int QueryDoubleAttribute( const std::string& name, double* _value ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// STL std::string form.
							 | 
						||
| 
								 | 
							
									void SetAttribute( const std::string& name, const std::string& _value );
							 | 
						||
| 
								 | 
							
									///< STL std::string form.
							 | 
						||
| 
								 | 
							
									void SetAttribute( const std::string& name, int _value );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Sets an attribute of name to a given value. The attribute
							 | 
						||
| 
								 | 
							
										will be created if it does not exist, or changed if it does.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void SetAttribute( const char * name, int value );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Sets an attribute of name to a given value. The attribute
							 | 
						||
| 
								 | 
							
										will be created if it does not exist, or changed if it does.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void SetDoubleAttribute( const char * name, double value );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Deletes an attribute with the given name.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void RemoveAttribute( const char * name );
							 | 
						||
| 
								 | 
							
								    #ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									void RemoveAttribute( const std::string& name )	{	RemoveAttribute (name.c_str ());	}	///< STL std::string form.
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const TiXmlAttribute* FirstAttribute() const	{ return attributeSet.First(); }		///< Access the first attribute in this element.
							 | 
						||
| 
								 | 
							
									TiXmlAttribute* FirstAttribute() 				{ return attributeSet.First(); }
							 | 
						||
| 
								 | 
							
									const TiXmlAttribute* LastAttribute()	const 	{ return attributeSet.Last(); }		///< Access the last attribute in this element.
							 | 
						||
| 
								 | 
							
									TiXmlAttribute* LastAttribute()					{ return attributeSet.Last(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Convenience function for easy access to the text inside an element. Although easy
							 | 
						||
| 
								 | 
							
										and concise, GetText() is limited compared to getting the TiXmlText child
							 | 
						||
| 
								 | 
							
										and accessing it directly.
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
										If the first child of 'this' is a TiXmlText, the GetText()
							 | 
						||
| 
								 | 
							
										returns the character string of the Text node, else null is returned.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										This is a convenient method for getting the text of simple contained text:
							 | 
						||
| 
								 | 
							
										@verbatim
							 | 
						||
| 
								 | 
							
										<foo>This is text</foo>
							 | 
						||
| 
								 | 
							
										const char* str = fooElement->GetText();
							 | 
						||
| 
								 | 
							
										@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										'str' will be a pointer to "This is text". 
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										Note that this function can be misleading. If the element foo was created from
							 | 
						||
| 
								 | 
							
										this XML:
							 | 
						||
| 
								 | 
							
										@verbatim
							 | 
						||
| 
								 | 
							
										<foo><b>This is text</b></foo> 
							 | 
						||
| 
								 | 
							
										@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										then the value of str would be null. The first child node isn't a text node, it is
							 | 
						||
| 
								 | 
							
										another element. From this XML:
							 | 
						||
| 
								 | 
							
										@verbatim
							 | 
						||
| 
								 | 
							
										<foo>This is <b>text</b></foo> 
							 | 
						||
| 
								 | 
							
										@endverbatim
							 | 
						||
| 
								 | 
							
										GetText() will return "This is ".
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										WARNING: GetText() accesses a child node - don't become confused with the 
							 | 
						||
| 
								 | 
							
												 similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are 
							 | 
						||
| 
								 | 
							
												 safe type casts on the referenced node.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const char* GetText() const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Creates a new Element and returns it - the returned element is a copy.
							 | 
						||
| 
								 | 
							
									virtual TiXmlNode* Clone() const;
							 | 
						||
| 
								 | 
							
									// Print the Element to a FILE stream.
							 | 
						||
| 
								 | 
							
									virtual void Print( FILE* cfile, int depth ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*	Attribtue parsing starts: next char past '<'
							 | 
						||
| 
								 | 
							
														 returns: next char past '>'
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const TiXmlElement*     ToElement()     const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlElement*           ToElement()	          { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Walk the XML tree visiting this node and all of its children. 
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual bool Accept( TiXmlVisitor* visitor ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void CopyTo( TiXmlElement* target ) const;
							 | 
						||
| 
								 | 
							
									void ClearThis();	// like clear, but initializes 'this' object as well
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Used to be public [internal use]
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
									/*	[internal use]
							 | 
						||
| 
								 | 
							
										Reads the "value" of the element -- another element, or text.
							 | 
						||
| 
								 | 
							
										This should terminate with the current end tag.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlAttributeSet attributeSet;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**	An XML comment.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlComment : public TiXmlNode
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									/// Constructs an empty comment.
							 | 
						||
| 
								 | 
							
									TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {}
							 | 
						||
| 
								 | 
							
									/// Construct a comment from text.
							 | 
						||
| 
								 | 
							
									TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::COMMENT ) {
							 | 
						||
| 
								 | 
							
										SetValue( _value );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									TiXmlComment( const TiXmlComment& );
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlComment& base );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual ~TiXmlComment()	{}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Returns a copy of this Comment.
							 | 
						||
| 
								 | 
							
									virtual TiXmlNode* Clone() const;
							 | 
						||
| 
								 | 
							
									// Write this Comment to a FILE stream.
							 | 
						||
| 
								 | 
							
									virtual void Print( FILE* cfile, int depth ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*	Attribtue parsing starts: at the ! of the !--
							 | 
						||
| 
								 | 
							
														 returns: next char past '>'
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const TiXmlComment*  ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlComment*  ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Walk the XML tree visiting this node and all of its children. 
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual bool Accept( TiXmlVisitor* visitor ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
									void CopyTo( TiXmlComment* target ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// used to be public
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								//	virtual void StreamOut( TIXML_OSTREAM * out ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** XML text. A text node can have 2 ways to output the next. "normal" output 
							 | 
						||
| 
								 | 
							
									and CDATA. It will default to the mode it was parsed from the XML file and
							 | 
						||
| 
								 | 
							
									you generally want to leave it alone, but you can change the output mode with 
							 | 
						||
| 
								 | 
							
									SetCDATA() and query it with CDATA().
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlText : public TiXmlNode
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									friend class TiXmlElement;
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									/** Constructor for text element. By default, it is treated as 
							 | 
						||
| 
								 | 
							
										normal, encoded text. If you want it be output as a CDATA text
							 | 
						||
| 
								 | 
							
										element, set the parameter _cdata to 'true'
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TEXT)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										SetValue( initValue );
							 | 
						||
| 
								 | 
							
										cdata = false;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									virtual ~TiXmlText() {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/// Constructor.
							 | 
						||
| 
								 | 
							
									TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										SetValue( initValue );
							 | 
						||
| 
								 | 
							
										cdata = false;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT )	{ copy.CopyTo( this ); }
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlText& base )							 	{ base.CopyTo( this ); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Write this text object to a FILE stream.
							 | 
						||
| 
								 | 
							
									virtual void Print( FILE* cfile, int depth ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Queries whether this represents text using a CDATA section.
							 | 
						||
| 
								 | 
							
									bool CDATA() const				{ return cdata; }
							 | 
						||
| 
								 | 
							
									/// Turns on or off a CDATA representation of text.
							 | 
						||
| 
								 | 
							
									void SetCDATA( bool _cdata )	{ cdata = _cdata; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlText*       ToText()       { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Walk the XML tree visiting this node and all of its children. 
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual bool Accept( TiXmlVisitor* content ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected :
							 | 
						||
| 
								 | 
							
									///  [internal use] Creates a new Element and returns it.
							 | 
						||
| 
								 | 
							
									virtual TiXmlNode* Clone() const;
							 | 
						||
| 
								 | 
							
									void CopyTo( TiXmlText* target ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bool Blank() const;	// returns true if all white space and new lines
							 | 
						||
| 
								 | 
							
									// [internal use]
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
									bool cdata;			// true if this should be input and output as a CDATA style text element
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** In correct XML the declaration is the first entry in the file.
							 | 
						||
| 
								 | 
							
									@verbatim
							 | 
						||
| 
								 | 
							
										<?xml version="1.0" standalone="yes"?>
							 | 
						||
| 
								 | 
							
									@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TinyXml will happily read or write files without a declaration,
							 | 
						||
| 
								 | 
							
									however. There are 3 possible attributes to the declaration:
							 | 
						||
| 
								 | 
							
									version, encoding, and standalone.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Note: In this version of the code, the attributes are
							 | 
						||
| 
								 | 
							
									handled as special cases, not generic attributes, simply
							 | 
						||
| 
								 | 
							
									because there can only be at most 3 and they are always the same.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlDeclaration : public TiXmlNode
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									/// Construct an empty declaration.
							 | 
						||
| 
								 | 
							
									TiXmlDeclaration()   : TiXmlNode( TiXmlNode::DECLARATION ) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/// Constructor.
							 | 
						||
| 
								 | 
							
									TiXmlDeclaration(	const std::string& _version,
							 | 
						||
| 
								 | 
							
														const std::string& _encoding,
							 | 
						||
| 
								 | 
							
														const std::string& _standalone );
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Construct.
							 | 
						||
| 
								 | 
							
									TiXmlDeclaration(	const char* _version,
							 | 
						||
| 
								 | 
							
														const char* _encoding,
							 | 
						||
| 
								 | 
							
														const char* _standalone );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlDeclaration( const TiXmlDeclaration& copy );
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlDeclaration& copy );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual ~TiXmlDeclaration()	{}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Version. Will return an empty string if none was found.
							 | 
						||
| 
								 | 
							
									const char *Version() const			{ return version.c_str (); }
							 | 
						||
| 
								 | 
							
									/// Encoding. Will return an empty string if none was found.
							 | 
						||
| 
								 | 
							
									const char *Encoding() const		{ return encoding.c_str (); }
							 | 
						||
| 
								 | 
							
									/// Is this a standalone document?
							 | 
						||
| 
								 | 
							
									const char *Standalone() const		{ return standalone.c_str (); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Creates a copy of this Declaration and returns it.
							 | 
						||
| 
								 | 
							
									virtual TiXmlNode* Clone() const;
							 | 
						||
| 
								 | 
							
									// Print this declaration to a FILE stream.
							 | 
						||
| 
								 | 
							
									virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const;
							 | 
						||
| 
								 | 
							
									virtual void Print( FILE* cfile, int depth ) const {
							 | 
						||
| 
								 | 
							
										Print( cfile, depth, 0 );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlDeclaration*       ToDeclaration()       { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Walk the XML tree visiting this node and all of its children. 
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual bool Accept( TiXmlVisitor* visitor ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
									void CopyTo( TiXmlDeclaration* target ) const;
							 | 
						||
| 
								 | 
							
									// used to be public
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TIXML_STRING version;
							 | 
						||
| 
								 | 
							
									TIXML_STRING encoding;
							 | 
						||
| 
								 | 
							
									TIXML_STRING standalone;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Any tag that tinyXml doesn't recognize is saved as an
							 | 
						||
| 
								 | 
							
									unknown. It is a tag of text, but should not be modified.
							 | 
						||
| 
								 | 
							
									It will be written back to the XML, unchanged, when the file
							 | 
						||
| 
								 | 
							
									is saved.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									DTD tags get thrown into TiXmlUnknowns.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlUnknown : public TiXmlNode
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN )	{}
							 | 
						||
| 
								 | 
							
									virtual ~TiXmlUnknown() {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN )		{ copy.CopyTo( this ); }
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlUnknown& copy )										{ copy.CopyTo( this ); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Creates a copy of this Unknown and returns it.
							 | 
						||
| 
								 | 
							
									virtual TiXmlNode* Clone() const;
							 | 
						||
| 
								 | 
							
									// Print this Unknown to a FILE stream.
							 | 
						||
| 
								 | 
							
									virtual void Print( FILE* cfile, int depth ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const TiXmlUnknown*     ToUnknown()     const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlUnknown*           ToUnknown()	    { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Walk the XML tree visiting this node and all of its children. 
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual bool Accept( TiXmlVisitor* content ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
									void CopyTo( TiXmlUnknown* target ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Always the top level node. A document binds together all the
							 | 
						||
| 
								 | 
							
									XML pieces. It can be saved, loaded, and printed to the screen.
							 | 
						||
| 
								 | 
							
									The 'value' of a document node is the xml file name.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlDocument : public TiXmlNode
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									/// Create an empty document, that has no name.
							 | 
						||
| 
								 | 
							
									TiXmlDocument();
							 | 
						||
| 
								 | 
							
									/// Create a document with a name. The name of the document is also the filename of the xml.
							 | 
						||
| 
								 | 
							
									TiXmlDocument( const char * documentName );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/// Constructor.
							 | 
						||
| 
								 | 
							
									TiXmlDocument( const std::string& documentName );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlDocument( const TiXmlDocument& copy );
							 | 
						||
| 
								 | 
							
									void operator=( const TiXmlDocument& copy );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual ~TiXmlDocument() {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Load a file using the current document value.
							 | 
						||
| 
								 | 
							
										Returns true if successful. Will delete any existing
							 | 
						||
| 
								 | 
							
										document data before loading.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
							 | 
						||
| 
								 | 
							
									/// Save a file using the current document value. Returns true if successful.
							 | 
						||
| 
								 | 
							
									bool SaveFile() const;
							 | 
						||
| 
								 | 
							
									/// Load a file using the given filename. Returns true if successful.
							 | 
						||
| 
								 | 
							
									bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
							 | 
						||
| 
								 | 
							
									/// Save a file using the given filename. Returns true if successful.
							 | 
						||
| 
								 | 
							
									bool SaveFile( const char * filename ) const;
							 | 
						||
| 
								 | 
							
									/** Load a file using the given FILE*. Returns true if successful. Note that this method
							 | 
						||
| 
								 | 
							
										doesn't stream - the entire object pointed at by the FILE*
							 | 
						||
| 
								 | 
							
										will be interpreted as an XML file. TinyXML doesn't stream in XML from the current
							 | 
						||
| 
								 | 
							
										file location. Streaming may be added in the future.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
							 | 
						||
| 
								 | 
							
									/// Save a file using the given FILE*. Returns true if successful.
							 | 
						||
| 
								 | 
							
									bool SaveFile( FILE* ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )			///< STL std::string version.
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
								//		StringToBuffer f( filename );
							 | 
						||
| 
								 | 
							
								//		return ( f.buffer && LoadFile( f.buffer, encoding ));
							 | 
						||
| 
								 | 
							
										return LoadFile( filename.c_str(), encoding );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									bool SaveFile( const std::string& filename ) const		///< STL std::string version.
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
								//		StringToBuffer f( filename );
							 | 
						||
| 
								 | 
							
								//		return ( f.buffer && SaveFile( f.buffer ));
							 | 
						||
| 
								 | 
							
										return SaveFile( filename.c_str() );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Parse the given null terminated block of xml data. Passing in an encoding to this
							 | 
						||
| 
								 | 
							
										method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml
							 | 
						||
| 
								 | 
							
										to use that encoding, regardless of what TinyXml might otherwise try to detect.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Get the root element -- the only top level element -- of the document.
							 | 
						||
| 
								 | 
							
										In well formed XML, there should only be one. TinyXml is tolerant of
							 | 
						||
| 
								 | 
							
										multiple elements at the document level.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									const TiXmlElement* RootElement() const		{ return FirstChildElement(); }
							 | 
						||
| 
								 | 
							
									TiXmlElement* RootElement()					{ return FirstChildElement(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** If an error occurs, Error will be set to true. Also,
							 | 
						||
| 
								 | 
							
										- The ErrorId() will contain the integer identifier of the error (not generally useful)
							 | 
						||
| 
								 | 
							
										- The ErrorDesc() method will return the name of the error. (very useful)
							 | 
						||
| 
								 | 
							
										- The ErrorRow() and ErrorCol() will return the location of the error (if known)
							 | 
						||
| 
								 | 
							
									*/	
							 | 
						||
| 
								 | 
							
									bool Error() const						{ return error; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Contains a textual (english) description of the error if one occurs.
							 | 
						||
| 
								 | 
							
									const char * ErrorDesc() const	{ return errorDesc.c_str (); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Generally, you probably want the error string ( ErrorDesc() ). But if you
							 | 
						||
| 
								 | 
							
										prefer the ErrorId, this function will fetch it.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									int ErrorId()	const				{ return errorId; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Returns the location (if known) of the error. The first column is column 1, 
							 | 
						||
| 
								 | 
							
										and the first row is row 1. A value of 0 means the row and column wasn't applicable
							 | 
						||
| 
								 | 
							
										(memory errors, for example, have no row/column) or the parser lost the error. (An
							 | 
						||
| 
								 | 
							
										error in the error reporting, in that case.)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										@sa SetTabSize, Row, Column
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									int ErrorRow() const	{ return errorLocation.row+1; }
							 | 
						||
| 
								 | 
							
									int ErrorCol() const	{ return errorLocation.col+1; }	///< The column where the error occured. See ErrorRow()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol())
							 | 
						||
| 
								 | 
							
										to report the correct values for row and column. It does not change the output
							 | 
						||
| 
								 | 
							
										or input in any way.
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										By calling this method, with a tab size
							 | 
						||
| 
								 | 
							
										greater than 0, the row and column of each node and attribute is stored
							 | 
						||
| 
								 | 
							
										when the file is loaded. Very useful for tracking the DOM back in to
							 | 
						||
| 
								 | 
							
										the source file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The tab size is required for calculating the location of nodes. If not
							 | 
						||
| 
								 | 
							
										set, the default of 4 is used. The tabsize is set per document. Setting
							 | 
						||
| 
								 | 
							
										the tabsize to 0 disables row/column tracking.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Note that row and column tracking is not supported when using operator>>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										The tab size needs to be enabled before the parse or load. Correct usage:
							 | 
						||
| 
								 | 
							
										@verbatim
							 | 
						||
| 
								 | 
							
										TiXmlDocument doc;
							 | 
						||
| 
								 | 
							
										doc.SetTabSize( 8 );
							 | 
						||
| 
								 | 
							
										doc.Load( "myfile.xml" );
							 | 
						||
| 
								 | 
							
										@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										@sa Row, Column
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void SetTabSize( int _tabsize )		{ tabsize = _tabsize; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									int TabSize() const	{ return tabsize; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** If you have handled the error, it can be reset with this call. The error
							 | 
						||
| 
								 | 
							
										state is automatically cleared if you Parse a new XML block.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void ClearError()						{	error = false; 
							 | 
						||
| 
								 | 
							
																				errorId = 0; 
							 | 
						||
| 
								 | 
							
																				errorDesc = ""; 
							 | 
						||
| 
								 | 
							
																				errorLocation.row = errorLocation.col = 0; 
							 | 
						||
| 
								 | 
							
																				//errorLocation.last = 0; 
							 | 
						||
| 
								 | 
							
																			}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Write the document to standard out using formatted printing ("pretty print"). */
							 | 
						||
| 
								 | 
							
									void Print() const						{ Print( stdout, 0 ); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* Write the document to a string using formatted printing ("pretty print"). This
							 | 
						||
| 
								 | 
							
										will allocate a character array (new char[]) and return it as a pointer. The
							 | 
						||
| 
								 | 
							
										calling code pust call delete[] on the return char* to avoid a memory leak.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									//char* PrintToMemory() const; 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Print this Document to a FILE stream.
							 | 
						||
| 
								 | 
							
									virtual void Print( FILE* cfile, int depth = 0 ) const;
							 | 
						||
| 
								 | 
							
									// [internal use]
							 | 
						||
| 
								 | 
							
									void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual const TiXmlDocument*    ToDocument()    const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
									virtual TiXmlDocument*          ToDocument()          { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Walk the XML tree visiting this node and all of its children. 
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									virtual bool Accept( TiXmlVisitor* content ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected :
							 | 
						||
| 
								 | 
							
									// [internal use]
							 | 
						||
| 
								 | 
							
									virtual TiXmlNode* Clone() const;
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
									void CopyTo( TiXmlDocument* target ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bool error;
							 | 
						||
| 
								 | 
							
									int  errorId;
							 | 
						||
| 
								 | 
							
									TIXML_STRING errorDesc;
							 | 
						||
| 
								 | 
							
									int tabsize;
							 | 
						||
| 
								 | 
							
									TiXmlCursor errorLocation;
							 | 
						||
| 
								 | 
							
									bool useMicrosoftBOM;		// the UTF-8 BOM were found when read. Note this, and try to write.
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
									A TiXmlHandle is a class that wraps a node pointer with null checks; this is
							 | 
						||
| 
								 | 
							
									an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml
							 | 
						||
| 
								 | 
							
									DOM structure. It is a separate utility class.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Take an example:
							 | 
						||
| 
								 | 
							
									@verbatim
							 | 
						||
| 
								 | 
							
									<Document>
							 | 
						||
| 
								 | 
							
										<Element attributeA = "valueA">
							 | 
						||
| 
								 | 
							
											<Child attributeB = "value1" />
							 | 
						||
| 
								 | 
							
											<Child attributeB = "value2" />
							 | 
						||
| 
								 | 
							
										</Element>
							 | 
						||
| 
								 | 
							
									<Document>
							 | 
						||
| 
								 | 
							
									@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very 
							 | 
						||
| 
								 | 
							
									easy to write a *lot* of code that looks like:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@verbatim
							 | 
						||
| 
								 | 
							
									TiXmlElement* root = document.FirstChildElement( "Document" );
							 | 
						||
| 
								 | 
							
									if ( root )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										TiXmlElement* element = root->FirstChildElement( "Element" );
							 | 
						||
| 
								 | 
							
										if ( element )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											TiXmlElement* child = element->FirstChildElement( "Child" );
							 | 
						||
| 
								 | 
							
											if ( child )
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												TiXmlElement* child2 = child->NextSiblingElement( "Child" );
							 | 
						||
| 
								 | 
							
												if ( child2 )
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													// Finally do something useful.
							 | 
						||
| 
								 | 
							
									@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity
							 | 
						||
| 
								 | 
							
									of such code. A TiXmlHandle checks for null	pointers so it is perfectly safe 
							 | 
						||
| 
								 | 
							
									and correct to use:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@verbatim
							 | 
						||
| 
								 | 
							
									TiXmlHandle docHandle( &document );
							 | 
						||
| 
								 | 
							
									TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
							 | 
						||
| 
								 | 
							
									if ( child2 )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										// do something useful
							 | 
						||
| 
								 | 
							
									@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Which is MUCH more concise and useful.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									It is also safe to copy handles - internally they are nothing more than node pointers.
							 | 
						||
| 
								 | 
							
									@verbatim
							 | 
						||
| 
								 | 
							
									TiXmlHandle handleCopy = handle;
							 | 
						||
| 
								 | 
							
									@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									What they should not be used for is iteration:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@verbatim
							 | 
						||
| 
								 | 
							
									int i=0; 
							 | 
						||
| 
								 | 
							
									while ( true )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement();
							 | 
						||
| 
								 | 
							
										if ( !child )
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										// do something
							 | 
						||
| 
								 | 
							
										++i;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									@endverbatim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									It seems reasonable, but it is in fact two embedded while loops. The Child method is 
							 | 
						||
| 
								 | 
							
									a linear walk to find the element, so this code would iterate much more than it needs 
							 | 
						||
| 
								 | 
							
									to. Instead, prefer:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@verbatim
							 | 
						||
| 
								 | 
							
									TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for( child; child; child=child->NextSiblingElement() )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										// do something
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									@endverbatim
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlHandle
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									/// Create a handle from any node (at any depth of the tree.) This can be a null pointer.
							 | 
						||
| 
								 | 
							
									TiXmlHandle( TiXmlNode* _node )					{ this->node = _node; }
							 | 
						||
| 
								 | 
							
									/// Copy constructor
							 | 
						||
| 
								 | 
							
									TiXmlHandle( const TiXmlHandle& ref )			{ this->node = ref.node; }
							 | 
						||
| 
								 | 
							
									TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/// Return a handle to the first child node.
							 | 
						||
| 
								 | 
							
									TiXmlHandle FirstChild() const;
							 | 
						||
| 
								 | 
							
									/// Return a handle to the first child node with the given name.
							 | 
						||
| 
								 | 
							
									TiXmlHandle FirstChild( const char * value ) const;
							 | 
						||
| 
								 | 
							
									/// Return a handle to the first child element.
							 | 
						||
| 
								 | 
							
									TiXmlHandle FirstChildElement() const;
							 | 
						||
| 
								 | 
							
									/// Return a handle to the first child element with the given name.
							 | 
						||
| 
								 | 
							
									TiXmlHandle FirstChildElement( const char * value ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Return a handle to the "index" child with the given name. 
							 | 
						||
| 
								 | 
							
										The first child is 0, the second 1, etc.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlHandle Child( const char* value, int index ) const;
							 | 
						||
| 
								 | 
							
									/** Return a handle to the "index" child. 
							 | 
						||
| 
								 | 
							
										The first child is 0, the second 1, etc.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlHandle Child( int index ) const;
							 | 
						||
| 
								 | 
							
									/** Return a handle to the "index" child element with the given name. 
							 | 
						||
| 
								 | 
							
										The first child element is 0, the second 1, etc. Note that only TiXmlElements
							 | 
						||
| 
								 | 
							
										are indexed: other types are not counted.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlHandle ChildElement( const char* value, int index ) const;
							 | 
						||
| 
								 | 
							
									/** Return a handle to the "index" child element. 
							 | 
						||
| 
								 | 
							
										The first child element is 0, the second 1, etc. Note that only TiXmlElements
							 | 
						||
| 
								 | 
							
										are indexed: other types are not counted.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlHandle ChildElement( int index ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									TiXmlHandle FirstChild( const std::string& _value ) const				{ return FirstChild( _value.c_str() ); }
							 | 
						||
| 
								 | 
							
									TiXmlHandle FirstChildElement( const std::string& _value ) const		{ return FirstChildElement( _value.c_str() ); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlHandle Child( const std::string& _value, int index ) const			{ return Child( _value.c_str(), index ); }
							 | 
						||
| 
								 | 
							
									TiXmlHandle ChildElement( const std::string& _value, int index ) const	{ return ChildElement( _value.c_str(), index ); }
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Return the handle as a TiXmlNode. This may return null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlNode* ToNode() const			{ return node; } 
							 | 
						||
| 
								 | 
							
									/** Return the handle as a TiXmlElement. This may return null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlElement* ToElement() const		{ return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); }
							 | 
						||
| 
								 | 
							
									/**	Return the handle as a TiXmlText. This may return null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlText* ToText() const			{ return ( ( node && node->ToText() ) ? node->ToText() : 0 ); }
							 | 
						||
| 
								 | 
							
									/** Return the handle as a TiXmlUnknown. This may return null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlUnknown* ToUnknown() const		{ return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** @deprecated use ToNode. 
							 | 
						||
| 
								 | 
							
										Return the handle as a TiXmlNode. This may return null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlNode* Node() const			{ return ToNode(); } 
							 | 
						||
| 
								 | 
							
									/** @deprecated use ToElement. 
							 | 
						||
| 
								 | 
							
										Return the handle as a TiXmlElement. This may return null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlElement* Element() const	{ return ToElement(); }
							 | 
						||
| 
								 | 
							
									/**	@deprecated use ToText()
							 | 
						||
| 
								 | 
							
										Return the handle as a TiXmlText. This may return null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlText* Text() const			{ return ToText(); }
							 | 
						||
| 
								 | 
							
									/** @deprecated use ToUnknown()
							 | 
						||
| 
								 | 
							
										Return the handle as a TiXmlUnknown. This may return null.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									TiXmlUnknown* Unknown() const	{ return ToUnknown(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
									TiXmlNode* node;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Print to memory functionality. The TiXmlPrinter is useful when you need to:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									-# Print to memory (especially in non-STL mode)
							 | 
						||
| 
								 | 
							
									-# Control formatting (line endings, etc.)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									When constructed, the TiXmlPrinter is in its default "pretty printing" mode.
							 | 
						||
| 
								 | 
							
									Before calling Accept() you can call methods to control the printing
							 | 
						||
| 
								 | 
							
									of the XML document. After TiXmlNode::Accept() is called, the printed document can
							 | 
						||
| 
								 | 
							
									be accessed via the CStr(), Str(), and Size() methods.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									TiXmlPrinter uses the Visitor API.
							 | 
						||
| 
								 | 
							
									@verbatim
							 | 
						||
| 
								 | 
							
									TiXmlPrinter printer;
							 | 
						||
| 
								 | 
							
									printer.SetIndent( "\t" );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									doc.Accept( &printer );
							 | 
						||
| 
								 | 
							
									fprintf( stdout, "%s", printer.CStr() );
							 | 
						||
| 
								 | 
							
									@endverbatim
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								class TiXmlPrinter : public TiXmlVisitor
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ),
							 | 
						||
| 
								 | 
							
													 buffer(), indent( "    " ), lineBreak( "\n" ) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual bool VisitEnter( const TiXmlDocument& doc );
							 | 
						||
| 
								 | 
							
									virtual bool VisitExit( const TiXmlDocument& doc );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute );
							 | 
						||
| 
								 | 
							
									virtual bool VisitExit( const TiXmlElement& element );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual bool Visit( const TiXmlDeclaration& declaration );
							 | 
						||
| 
								 | 
							
									virtual bool Visit( const TiXmlText& text );
							 | 
						||
| 
								 | 
							
									virtual bool Visit( const TiXmlComment& comment );
							 | 
						||
| 
								 | 
							
									virtual bool Visit( const TiXmlUnknown& unknown );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Set the indent characters for printing. By default 4 spaces
							 | 
						||
| 
								 | 
							
										but tab (\t) is also useful, or null/empty string for no indentation.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void SetIndent( const char* _indent )			{ indent = _indent ? _indent : "" ; }
							 | 
						||
| 
								 | 
							
									/// Query the indention string.
							 | 
						||
| 
								 | 
							
									const char* Indent()							{ return indent.c_str(); }
							 | 
						||
| 
								 | 
							
									/** Set the line breaking string. By default set to newline (\n). 
							 | 
						||
| 
								 | 
							
										Some operating systems prefer other characters, or can be
							 | 
						||
| 
								 | 
							
										set to the null/empty string for no indenation.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void SetLineBreak( const char* _lineBreak )		{ lineBreak = _lineBreak ? _lineBreak : ""; }
							 | 
						||
| 
								 | 
							
									/// Query the current line breaking string.
							 | 
						||
| 
								 | 
							
									const char* LineBreak()							{ return lineBreak.c_str(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Switch over to "stream printing" which is the most dense formatting without 
							 | 
						||
| 
								 | 
							
										linebreaks. Common when the XML is needed for network transmission.
							 | 
						||
| 
								 | 
							
									*/
							 | 
						||
| 
								 | 
							
									void SetStreamPrinting()						{ indent = "";
							 | 
						||
| 
								 | 
							
																					  lineBreak = "";
							 | 
						||
| 
								 | 
							
																					}	
							 | 
						||
| 
								 | 
							
									/// Return the result.
							 | 
						||
| 
								 | 
							
									const char* CStr()								{ return buffer.c_str(); }
							 | 
						||
| 
								 | 
							
									/// Return the length of the result string.
							 | 
						||
| 
								 | 
							
									size_t Size()									{ return buffer.size(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									#ifdef TIXML_USE_STL
							 | 
						||
| 
								 | 
							
									/// Return the result.
							 | 
						||
| 
								 | 
							
									const std::string& Str()						{ return buffer; }
							 | 
						||
| 
								 | 
							
									#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
									void DoIndent()	{
							 | 
						||
| 
								 | 
							
										for( int i=0; i<depth; ++i )
							 | 
						||
| 
								 | 
							
											buffer += indent;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									void DoLineBreak() {
							 | 
						||
| 
								 | 
							
										buffer += lineBreak;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									int depth;
							 | 
						||
| 
								 | 
							
									bool simpleTextPrint;
							 | 
						||
| 
								 | 
							
									TIXML_STRING buffer;
							 | 
						||
| 
								 | 
							
									TIXML_STRING indent;
							 | 
						||
| 
								 | 
							
									TIXML_STRING lineBreak;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef _MSC_VER
							 | 
						||
| 
								 | 
							
								#pragma warning( pop )
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 |