130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunwww.sourceforge.net/projects/tinyxml
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunOriginal code by Lee Thomason (www.grinninglizard.com)
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunThis software is provided 'as-is', without any express or implied
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunwarranty. In no event will the authors be held liable for any
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurundamages arising from the use of this software.
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunPermission is granted to anyone to use this software for any
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpurpose, including commercial applications, and to alter it and
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunredistribute it freely, subject to the following restrictions:
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun1. The origin of this software must not be misrepresented; you must
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnot claim that you wrote the original software. If you use this
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunsoftware in a product, an acknowledgment in the product documentation
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunwould be appreciated but is not required.
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun2. Altered source versions must be plainly marked as such, and
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunmust not be misrepresented as being the original software.
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun3. This notice may not be removed or altered from any source
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurundistribution.
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef TINYXML_INCLUDED
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define TINYXML_INCLUDED
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef _MSC_VER
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#pragma warning( push )
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#pragma warning( disable : 4530 )
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#pragma warning( disable : 4786 )
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <ctype.h>
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdio.h>
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdlib.h>
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <string.h>
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <assert.h>
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Help out windows:
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined( _DEBUG ) && !defined( DEBUG )
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define DEBUG
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#include <string>
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 	#include <iostream>
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#include <sstream>
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#define TIXML_STRING		std::string
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#include "tinystr.h"
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#define TIXML_STRING		TiXmlString
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Deprecated library function hell. Compilers want to use the
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// new safe versions. This probably doesn't fully address the problem,
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// but it gets closer. There are too many compilers for me to fully
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// test. If you get compilation troubles, undefine TIXML_SAFE
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define TIXML_SAFE
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_SAFE
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// Microsoft visual studio, version 2005 and higher.
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		#define TIXML_SNPRINTF _snprintf_s
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		#define TIXML_SSCANF   sscanf_s
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#elif defined(_MSC_VER) && (_MSC_VER >= 1200 )
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// Microsoft visual studio, version 6 and higher.
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		//#pragma message( "Using _sn* functions." )
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		#define TIXML_SNPRINTF _snprintf
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		#define TIXML_SSCANF   sscanf
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#elif defined(__GNUC__) && (__GNUC__ >= 3 )
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// GCC version 3 and higher.s
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		//#warning( "Using sn* functions." )
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		#define TIXML_SNPRINTF snprintf
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		#define TIXML_SSCANF   sscanf
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#else
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		#define TIXML_SNPRINTF snprintf
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		#define TIXML_SSCANF   sscanf
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlDocument;
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlElement;
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlComment;
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlUnknown;
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlAttribute;
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlText;
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlDeclaration;
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlParsingData;
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst int TIXML_MAJOR_VERSION = 2;
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst int TIXML_MINOR_VERSION = 6;
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst int TIXML_PATCH_VERSION = 2;
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*	Internal structure for tracking location of items
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	in the XML file.
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct TiXmlCursor
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlCursor()		{ Clear(); }
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void Clear()		{ row = col = -1; }
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int row;	// 0 based.
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int col;	// 0 based.
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/**
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Implements the interface to the "Visitor pattern" (see the Accept() method.)
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	If you call the Accept() method, it requires being passed a TiXmlVisitor
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	class to handle callbacks. For nodes that contain other nodes (Document, Element)
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	are simply called with Visit().
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	If you return 'true' from a Visit method, recursive parsing will continue. If you return
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	false, <b>no children of this node or its sibilings</b> will be Visited.
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	All flavors of Visit methods have a default implementation that returns 'true' (continue
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	visiting). You need to only override methods that are interesting to you.
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting.
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	You should never change the document from a callback.
12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@sa TiXmlNode::Accept()
12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlVisitor
12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual ~TiXmlVisitor() {}
13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Visit a document.
13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool VisitEnter( const TiXmlDocument& /*doc*/ )			{ return true; }
13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Visit a document.
13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool VisitExit( const TiXmlDocument& /*doc*/ )			{ return true; }
13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Visit an element.
13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ )	{ return true; }
14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Visit an element.
14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool VisitExit( const TiXmlElement& /*element*/ )		{ return true; }
14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Visit a declaration
14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Visit( const TiXmlDeclaration& /*declaration*/ )	{ return true; }
14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Visit a text node
14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Visit( const TiXmlText& /*text*/ )					{ return true; }
14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Visit a comment node
14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Visit( const TiXmlComment& /*comment*/ )			{ return true; }
14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Visit an unknown node
15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Visit( const TiXmlUnknown& /*unknown*/ )			{ return true; }
15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Only used by Attribute::Query functions
15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunenum
15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_SUCCESS,
15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_NO_ATTRIBUTE,
15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_WRONG_TYPE
15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Used by the parsing routines.
16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunenum TiXmlEncoding
16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_ENCODING_UNKNOWN,
16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_ENCODING_UTF8,
16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_ENCODING_LEGACY
16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN;
17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** TiXmlBase is a base class for every class in TinyXml.
17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	It does little except to establish that TinyXml classes
17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	can be printed and provide some utility functions.
17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	In XML, the document and elements can contain
17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	other elements and other types of nodes.
17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@verbatim
18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	A Document can contain:	Element	(container or leaf)
18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun							Comment (leaf)
18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun							Unknown (leaf)
18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun							Declaration( leaf )
18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	An Element can contain:	Element (container or leaf)
18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun							Text	(leaf)
18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun							Attributes (not on tree)
18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun							Comment (leaf)
18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun							Unknown (leaf)
19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	A Decleration contains: Attributes (not on tree)
19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@endverbatim
19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlBase
19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	friend class TiXmlNode;
19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	friend class TiXmlElement;
19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	friend class TiXmlDocument;
19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
20130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlBase()	:	userData(0)		{}
20230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual ~TiXmlBase()			{}
20330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/**	All TinyXml classes can print themselves to a filestream
20530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		or the string class (TiXmlString in non-STL mode, std::string
20630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		in STL mode.) Either or both cfile and str can be null.
20730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		This is a formatted print, and will insert
20930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		tabs and newlines.
21030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
21130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		(For an unformatted stream, use the << operator.)
21230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
21330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void Print( FILE* cfile, int depth ) const = 0;
21430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
21530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/**	The world does not agree on whether white space should be kept or
21630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		not. In order to make everyone happy, these global, static functions
21730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		are provided to set whether or not TinyXml will condense all white space
21830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		into a single space or not. The default is to condense. Note changing this
21930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		value is not thread safe.
22030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
22130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static void SetCondenseWhiteSpace( bool condense )		{ condenseWhiteSpace = condense; }
22230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
22330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Return the current white space setting.
22430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static bool IsWhiteSpaceCondensed()						{ return condenseWhiteSpace; }
22530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
22630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return the position, in the original source file, of this node or attribute.
22730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The row and column are 1-based. (That is the first row and first column is
22830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		1,1). If the returns values are 0 or less, then the parser does not have
22930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		a row and column value.
23030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
23130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Generally, the row and column value will be set when the TiXmlDocument::Load(),
23230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set
23330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		when the DOM was created from operator>>.
23430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
23530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The values reflect the initial load. Once the DOM is modified programmatically
23630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		(by adding or changing nodes and attributes) the new values will NOT update to
23730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		reflect changes in the document.
23830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
23930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		There is a minor performance cost to computing the row and column. Computation
24030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value.
24130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
24230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@sa TiXmlDocument::SetTabSize()
24330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
24430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int Row() const			{ return location.row + 1; }
24530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int Column() const		{ return location.col + 1; }	///< See Row()
24630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
24730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void  SetUserData( void* user )			{ userData = user; }	///< Set a pointer to arbitrary user data.
24830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void* GetUserData()						{ return userData; }	///< Get a pointer to arbitrary user data.
24930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const void* GetUserData() const 		{ return userData; }	///< Get a pointer to arbitrary user data.
25030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
25130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Table that returs, for a given lead byte, the total number of bytes
25230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// in the UTF-8 sequence.
25330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static const int utf8ByteTable[256];
25430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
25530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const char* Parse(	const char* p,
25630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun								TiXmlParsingData* data,
25730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun								TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0;
25830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
25930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Expands entities in a string. Note this should not contian the tag's '<', '>', etc,
26030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		or they will be transformed into entities!
26130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
26230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out );
26330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
26430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	enum
26530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
26630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_NO_ERROR = 0,
26730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR,
26830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_OPENING_FILE,
26930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_PARSING_ELEMENT,
27030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,
27130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_READING_ELEMENT_VALUE,
27230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_READING_ATTRIBUTES,
27330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_PARSING_EMPTY,
27430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_READING_END_TAG,
27530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_PARSING_UNKNOWN,
27630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_PARSING_COMMENT,
27730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_PARSING_DECLARATION,
27830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_DOCUMENT_EMPTY,
27930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_EMBEDDED_NULL,
28030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_PARSING_CDATA,
28130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_DOCUMENT_TOP_ONLY,
28230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
28330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_ERROR_STRING_COUNT
28430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	};
28530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
28630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected:
28730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
28830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding );
28930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
29030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	inline static bool IsWhiteSpace( char c )
29130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
29230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' );
29330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
29430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	inline static bool IsWhiteSpace( int c )
29530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
29630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( c < 256 )
29730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return IsWhiteSpace( (char) c );
29830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return false;	// Again, only truly correct for English/Latin...but usually works.
29930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
30030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
30130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
30230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static bool	StreamWhiteSpace( std::istream * in, TIXML_STRING * tag );
30330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag );
30430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
30530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
30630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/*	Reads an XML name into the string provided. Returns
30730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		a pointer just past the last character of the name,
30830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		or 0 if the function has an error.
30930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
31030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding );
31130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
31230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/*	Reads text. Returns a pointer past the given end tag.
31330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Wickedly complex options, but it keeps the (sensitive) code in one place.
31430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
31530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static const char* ReadText(	const char* in,				// where to start
31630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun									TIXML_STRING* text,			// the string read
31730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun									bool ignoreWhiteSpace,		// whether to keep the white space
31830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun									const char* endTag,			// what ends this text
31930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun									bool ignoreCase,			// whether to ignore case in the end tag
32030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun									TiXmlEncoding encoding );	// the current encoding
32130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
32230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// If an entity has been found, transform it into a character.
32330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding );
32430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
32530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Get a character, while interpreting entities.
32630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// The length can be from 0 to 4 bytes.
32730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding )
32830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
32930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( p );
33030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( encoding == TIXML_ENCODING_UTF8 )
33130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
33230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			*length = utf8ByteTable[ *((const unsigned char*)p) ];
33330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			assert( *length >= 0 && *length < 5 );
33430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
33530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else
33630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
33730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			*length = 1;
33830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
33930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
34030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( *length == 1 )
34130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
34230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			if ( *p == '&' )
34330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				return GetEntity( p, _value, length, encoding );
34430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			*_value = *p;
34530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return p+1;
34630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
34730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else if ( *length )
34830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
34930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			//strncpy( _value, p, *length );	// lots of compilers don't like this function (unsafe),
35030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun												// and the null terminator isn't needed
35130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			for( int i=0; p[i] && i<*length; ++i ) {
35230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				_value[i] = p[i];
35330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			}
35430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return p + (*length);
35530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
35630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else
35730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
35830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// Not valid text.
35930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return 0;
36030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
36130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
36230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
36330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Return true if the next characters in the stream are any of the endTag sequences.
36430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Ignore case only works for english, and should only be relied on when comparing
36530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// to English words: StringEqual( p, "version", true ) is fine.
36630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static bool StringEqual(	const char* p,
36730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun								const char* endTag,
36830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun								bool ignoreCase,
36930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun								TiXmlEncoding encoding );
37030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
37130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static const char* errorString[ TIXML_ERROR_STRING_COUNT ];
37230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
37330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlCursor location;
37430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
37530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    /// Field containing a generic user pointer
37630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void*			userData;
37730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
37830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// None of these methods are reliable for any language except English.
37930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Good for approximation, not great for accuracy.
38030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding );
38130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding );
38230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	inline static int ToLower( int v, TiXmlEncoding encoding )
38330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
38430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( encoding == TIXML_ENCODING_UTF8 )
38530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
38630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			if ( v < 128 ) return tolower( v );
38730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return v;
38830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
38930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else
39030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
39130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return tolower( v );
39230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
39330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
39430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length );
39530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
39630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
39730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlBase( const TiXmlBase& );				// not implemented.
39830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void operator=( const TiXmlBase& base );	// not allowed.
39930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
40030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	struct Entity
40130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
40230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const char*     str;
40330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		unsigned int	strLength;
40430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		char		    chr;
40530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	};
40630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	enum
40730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
40830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		NUM_ENTITY = 5,
40930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		MAX_ENTITY_LENGTH = 6
41030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
41130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	};
41230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static Entity entity[ NUM_ENTITY ];
41330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static bool condenseWhiteSpace;
41430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
41530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
41630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
41730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** The parent class for everything in the Document Object Model.
41830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	(Except for attributes).
41930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Nodes have siblings, a parent, and children. A node can be
42030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	in a document, or stand on its own. The type of a TiXmlNode
42130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	can be queried, and it can be cast to its more defined type.
42230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
42330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlNode : public TiXmlBase
42430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
42530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	friend class TiXmlDocument;
42630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	friend class TiXmlElement;
42730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
42830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
42930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
43030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
43130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	    /** An input stream operator, for every class. Tolerant of newlines and
43230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    formatting, but doesn't expect them.
43330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	    */
43430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	    friend std::istream& operator >> (std::istream& in, TiXmlNode& base);
43530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
43630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	    /** An output stream operator, for every class. Note that this outputs
43730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    without any newlines or formatting, as opposed to Print(), which
43830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    includes tabs and new lines.
43930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
44030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    The operator<< and operator>> are not completely symmetric. Writing
44130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    a node to a stream is very well defined. You'll get a nice stream
44230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    of output, without any extra whitespace or newlines.
44330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
44430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    But reading is not as well defined. (As it always is.) If you create
44530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    a TiXmlElement (for example) and read that from an input stream,
44630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    the text needs to define an element or junk will result. This is
44730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    true of all input streams, but it's worth keeping in mind.
44830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
44930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		    A TiXmlDocument will read nodes until it reads a root element, and
45030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			all the children of that root element.
45130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	    */
45230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	    friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base);
45330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
45430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		/// Appends the XML node or attribute to a std::string.
45530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		friend std::string& operator<< (std::string& out, const TiXmlNode& base );
45630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
45730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
45830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
45930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** The types of XML nodes supported by TinyXml. (All the
46030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			unsupported types are picked up by UNKNOWN.)
46130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
46230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	enum NodeType
46330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
46430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TINYXML_DOCUMENT,
46530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TINYXML_ELEMENT,
46630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TINYXML_COMMENT,
46730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TINYXML_UNKNOWN,
46830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TINYXML_TEXT,
46930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TINYXML_DECLARATION,
47030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TINYXML_TYPECOUNT
47130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	};
47230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
47330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual ~TiXmlNode();
47430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
47530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** The meaning of 'value' changes for the specific type of
47630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlNode.
47730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@verbatim
47830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Document:	filename of the xml file
47930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Element:	name of the element
48030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Comment:	the comment text
48130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Unknown:	the tag contents
48230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Text:		the text string
48330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@endverbatim
48430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
48530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The subclasses will wrap this function.
48630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
48730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char *Value() const { return value.c_str (); }
48830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
48930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
49030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return Value() as a std::string. If you only use STL,
49130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	    this is more efficient than calling Value().
49230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Only available in STL mode.
49330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
49430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const std::string& ValueStr() const { return value; }
49530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
49630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
49730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TIXML_STRING& ValueTStr() const { return value; }
49830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
49930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Changes the value of the node. Defined as:
50030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@verbatim
50130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Document:	filename of the xml file
50230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Element:	name of the element
50330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Comment:	the comment text
50430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Unknown:	the tag contents
50530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Text:		the text string
50630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@endverbatim
50730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
50830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetValue(const char * _value) { value = _value;}
50930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
51030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
51130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// STL std::string form.
51230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetValue( const std::string& _value )	{ value = _value; }
51330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
51430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
51530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Delete all the children of this node. Does not affect 'this'.
51630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void Clear();
51730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
51830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// One step up the DOM.
51930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* Parent()							{ return parent; }
52030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* Parent() const				{ return parent; }
52130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
52230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* FirstChild()	const		{ return firstChild; }	///< The first child of this node. Will be null if there are no children.
52330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* FirstChild()						{ return firstChild; }
52430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* FirstChild( const char * value ) const;			///< The first child of this node with the matching 'value'. Will be null if none found.
52530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// The first child of this node with the matching 'value'. Will be null if none found.
52630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* FirstChild( const char * _value ) {
52730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe)
52830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// call the method, cast the return back to non-const.
52930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value ));
53030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
53130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* LastChild() const	{ return lastChild; }		/// The last child of this node. Will be null if there are no children.
53230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* LastChild()	{ return lastChild; }
53330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
53430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* LastChild( const char * value ) const;			/// The last child of this node matching 'value'. Will be null if there are no children.
53530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* LastChild( const char * _value ) {
53630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value ));
53730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
53830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
53930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
54030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* FirstChild( const std::string& _value ) const	{	return FirstChild (_value.c_str ());	}	///< STL std::string form.
54130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* FirstChild( const std::string& _value )				{	return FirstChild (_value.c_str ());	}	///< STL std::string form.
54230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* LastChild( const std::string& _value ) const	{	return LastChild (_value.c_str ());	}	///< STL std::string form.
54330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* LastChild( const std::string& _value )				{	return LastChild (_value.c_str ());	}	///< STL std::string form.
54430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
54530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
54630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** An alternate way to walk the children of a node.
54730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		One way to iterate over nodes is:
54830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@verbatim
54930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			for( child = parent->FirstChild(); child; child = child->NextSibling() )
55030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@endverbatim
55130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
55230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		IterateChildren does the same thing with the syntax:
55330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@verbatim
55430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			child = 0;
55530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			while( child = parent->IterateChildren( child ) )
55630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@endverbatim
55730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
55830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		IterateChildren takes the previous child as input and finds
55930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		the next one. If the previous child is null, it returns the
56030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		first. IterateChildren will return null when done.
56130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
56230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const;
56330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* IterateChildren( const TiXmlNode* previous ) {
56430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) );
56530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
56630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
56730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// This flavor of IterateChildren searches for children with a particular 'value'
56830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const;
56930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) {
57030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) );
57130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
57230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
57330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
57430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const	{	return IterateChildren (_value.c_str (), previous);	}	///< STL std::string form.
57530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) {	return IterateChildren (_value.c_str (), previous);	}	///< STL std::string form.
57630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
57730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
57830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Add a new node related to this. Adds a child past the LastChild.
57930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Returns a pointer to the new object or NULL if an error occured.
58030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
58130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
58230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
58330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
58430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Add a new node related to this. Adds a child past the LastChild.
58530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
58630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		NOTE: the node to be added is passed by pointer, and will be
58730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		henceforth owned (and deleted) by tinyXml. This method is efficient
58830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		and avoids an extra copy, but should be used with care as it
58930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		uses a different memory model than the other insert functions.
59030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
59130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@sa InsertEndChild
59230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
59330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* LinkEndChild( TiXmlNode* addThis );
59430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
59530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Add a new node related to this. Adds a child before the specified child.
59630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Returns a pointer to the new object or NULL if an error occured.
59730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
59830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
59930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
60030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Add a new node related to this. Adds a child after the specified child.
60130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Returns a pointer to the new object or NULL if an error occured.
60230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
60330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* InsertAfterChild(  TiXmlNode* afterThis, const TiXmlNode& addThis );
60430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
60530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Replace a child of this node.
60630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Returns a pointer to the new object or NULL if an error occured.
60730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
60830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
60930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
61030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Delete a child of this node.
61130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool RemoveChild( TiXmlNode* removeThis );
61230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
61330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Navigate to a sibling node.
61430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* PreviousSibling() const			{ return prev; }
61530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* PreviousSibling()						{ return prev; }
61630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
61730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Navigate to a sibling node.
61830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* PreviousSibling( const char * ) const;
61930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* PreviousSibling( const char *_prev ) {
62030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) );
62130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
62230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
62330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
62430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* PreviousSibling( const std::string& _value ) const	{	return PreviousSibling (_value.c_str ());	}	///< STL std::string form.
62530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* PreviousSibling( const std::string& _value ) 			{	return PreviousSibling (_value.c_str ());	}	///< STL std::string form.
62630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* NextSibling( const std::string& _value) const		{	return NextSibling (_value.c_str ());	}	///< STL std::string form.
62730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* NextSibling( const std::string& _value) 					{	return NextSibling (_value.c_str ());	}	///< STL std::string form.
62830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
62930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
63030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Navigate to a sibling node.
63130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* NextSibling() const				{ return next; }
63230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* NextSibling()							{ return next; }
63330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
63430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Navigate to a sibling node with the given 'value'.
63530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* NextSibling( const char * ) const;
63630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* NextSibling( const char* _next ) {
63730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) );
63830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
63930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
64030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Convenience function to get through elements.
64130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Calls NextSibling and ToElement. Will skip all non-Element
64230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		nodes. Returns 0 if there is not another element.
64330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
64430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlElement* NextSiblingElement() const;
64530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* NextSiblingElement() {
64630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() );
64730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
64830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
64930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Convenience function to get through elements.
65030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Calls NextSibling and ToElement. Will skip all non-Element
65130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		nodes. Returns 0 if there is not another element.
65230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
65330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlElement* NextSiblingElement( const char * ) const;
65430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* NextSiblingElement( const char *_next ) {
65530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) );
65630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
65730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
65830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
65930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlElement* NextSiblingElement( const std::string& _value) const	{	return NextSiblingElement (_value.c_str ());	}	///< STL std::string form.
66030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* NextSiblingElement( const std::string& _value)				{	return NextSiblingElement (_value.c_str ());	}	///< STL std::string form.
66130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
66230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
66330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Convenience function to get through elements.
66430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlElement* FirstChildElement()	const;
66530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* FirstChildElement() {
66630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() );
66730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
66830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
66930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Convenience function to get through elements.
67030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlElement* FirstChildElement( const char * _value ) const;
67130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* FirstChildElement( const char * _value ) {
67230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) );
67330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
67430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
67530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
67630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlElement* FirstChildElement( const std::string& _value ) const	{	return FirstChildElement (_value.c_str ());	}	///< STL std::string form.
67730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* FirstChildElement( const std::string& _value )				{	return FirstChildElement (_value.c_str ());	}	///< STL std::string form.
67830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
67930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
68030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Query the type (as an enumerated value, above) of this node.
68130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT,
68230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun								TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION.
68330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
68430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int Type() const	{ return type; }
68530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
68630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return a pointer to the Document this node lives in.
68730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Returns null if not in a document.
68830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
68930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlDocument* GetDocument() const;
69030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDocument* GetDocument() {
69130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() );
69230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
69330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
69430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Returns true if this node has no children.
69530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool NoChildren() const						{ return !firstChild; }
69630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
69730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlDocument*    ToDocument()    const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
69830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlElement*     ToElement()     const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
69930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlComment*     ToComment()     const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
70030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlUnknown*     ToUnknown()     const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
70130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlText*        ToText()        const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
70230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
70330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
70430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlDocument*          ToDocument()    { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
70530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlElement*           ToElement()	    { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
70630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlComment*           ToComment()     { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
70730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlUnknown*           ToUnknown()	    { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
70830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlText*	            ToText()        { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
70930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlDeclaration*       ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type.
71030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
71130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Create an exact duplicate of this node and return it. The memory must be deleted
71230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		by the caller.
71330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
71430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlNode* Clone() const = 0;
71530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
71630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the
71730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		XML tree will be conditionally visited and the host will be called back
71830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		via the TiXmlVisitor interface.
71930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
72030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse
72130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		the XML for the callbacks, so the performance of TinyXML is unchanged by using this
72230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		interface versus any other.)
72330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
72430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The interface has been based on ideas from:
72530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
72630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		- http://www.saxproject.org/
72730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		- http://c2.com/cgi/wiki?HierarchicalVisitorPattern
72830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
72930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Which are both good references for "visiting".
73030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
73130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		An example of using Accept():
73230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@verbatim
73330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlPrinter printer;
73430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		tinyxmlDoc.Accept( &printer );
73530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const char* xmlcstr = printer.CStr();
73630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@endverbatim
73730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
73830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Accept( TiXmlVisitor* visitor ) const = 0;
73930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
74030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected:
74130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode( NodeType _type );
74230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
74330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Copy to the allocated object. Shared functionality between Clone, Copy constructor,
74430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// and the assignment operator.
74530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void CopyTo( TiXmlNode* target ) const;
74630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
74730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
74830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	    // The real work of the input operator.
74930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0;
75030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
75130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
75230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Figure out what is at *p, and parse it. Returns null if it is not an xml node.
75330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* Identify( const char* start, TiXmlEncoding encoding );
75430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
75530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode*		parent;
75630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	NodeType		type;
75730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
75830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode*		firstChild;
75930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode*		lastChild;
76030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
76130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING	value;
76230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
76330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode*		prev;
76430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode*		next;
76530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
76630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
76730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode( const TiXmlNode& );				// not implemented.
76830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void operator=( const TiXmlNode& base );	// not allowed.
76930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
77030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
77130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
77230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** An attribute is a name-value pair. Elements have an arbitrary
77330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	number of attributes, each with a unique name.
77430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
77530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@note The attributes are not TiXmlNodes, since they are not
77630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		  part of the tinyXML document object model. There are other
77730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		  suggested ways to look at this problem.
77830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
77930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlAttribute : public TiXmlBase
78030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
78130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	friend class TiXmlAttributeSet;
78230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
78330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
78430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Construct an empty attribute.
78530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute() : TiXmlBase()
78630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
78730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		document = 0;
78830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		prev = next = 0;
78930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
79030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
79130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
79230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// std::string constructor.
79330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute( const std::string& _name, const std::string& _value )
79430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
79530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		name = _name;
79630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		value = _value;
79730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		document = 0;
79830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		prev = next = 0;
79930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
80030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
80130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
80230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Construct an attribute with a name and value.
80330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute( const char * _name, const char * _value )
80430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
80530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		name = _name;
80630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		value = _value;
80730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		document = 0;
80830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		prev = next = 0;
80930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
81030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
81130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char*		Name()  const		{ return name.c_str(); }		///< Return the name of this attribute.
81230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char*		Value() const		{ return value.c_str(); }		///< Return the value of this attribute.
81330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
81430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const std::string& ValueStr() const	{ return value; }				///< Return the value of this attribute.
81530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
81630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int				IntValue() const;									///< Return the value of this attribute, converted to an integer.
81730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	double			DoubleValue() const;								///< Return the value of this attribute, converted to a double.
81830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
81930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Get the tinyxml string representation
82030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TIXML_STRING& NameTStr() const { return name; }
82130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
82230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** QueryIntValue examines the value string. It is an alternative to the
82330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		IntValue() method with richer error checking.
82430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		If the value is an integer, it is stored in 'value' and
82530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		the call returns TIXML_SUCCESS. If it is not
82630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		an integer, it returns TIXML_WRONG_TYPE.
82730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
82830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		A specialized but useful call. Note that for success it returns 0,
82930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		which is the opposite of almost all other TinyXml calls.
83030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
83130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryIntValue( int* _value ) const;
83230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// QueryDoubleValue examines the value string. See QueryIntValue().
83330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryDoubleValue( double* _value ) const;
83430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
83530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetName( const char* _name )	{ name = _name; }				///< Set the name of this attribute.
83630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetValue( const char* _value )	{ value = _value; }				///< Set the value.
83730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
83830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetIntValue( int _value );										///< Set the value from an integer.
83930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetDoubleValue( double _value );								///< Set the value from a double.
84030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
84130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
84230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// STL std::string form.
84330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetName( const std::string& _name )	{ name = _name; }
84430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// STL std::string form.
84530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetValue( const std::string& _value )	{ value = _value; }
84630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
84730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
84830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Get the next sibling attribute in the DOM. Returns null at end.
84930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* Next() const;
85030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* Next() {
85130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() );
85230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
85330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
85430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Get the previous sibling attribute in the DOM. Returns null at beginning.
85530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* Previous() const;
85630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* Previous() {
85730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() );
85830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
85930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
86030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; }
86130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool operator<( const TiXmlAttribute& rhs )	 const { return name < rhs.name; }
86230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool operator>( const TiXmlAttribute& rhs )  const { return name > rhs.name; }
86330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
86430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/*	Attribute parsing starts: first letter of the name
86530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun						 returns: the next char after the value end quote
86630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
86730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
86830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
86930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Prints this Attribute to a FILE stream.
87030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void Print( FILE* cfile, int depth ) const {
87130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Print( cfile, depth, 0 );
87230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
87330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void Print( FILE* cfile, int depth, TIXML_STRING* str ) const;
87430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
87530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// [internal use]
87630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Set the document pointer so the attribute can report errors.
87730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetDocument( TiXmlDocument* doc )	{ document = doc; }
87830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
87930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
88030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute( const TiXmlAttribute& );				// not implemented.
88130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void operator=( const TiXmlAttribute& base );	// not allowed.
88230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
88330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDocument*	document;	// A pointer back to a document, for error reporting.
88430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING name;
88530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING value;
88630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute*	prev;
88730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute*	next;
88830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
88930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
89030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
89130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*	A class used to manage a group of attributes.
89230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	It is only used internally, both by the ELEMENT and the DECLARATION.
89330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
89430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	The set can be changed transparent to the Element and Declaration
89530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	classes that use it, but NOT transparent to the Attribute
89630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	which has to implement a next() and previous() method. Which makes
89730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	it a bit problematic and prevents the use of STL.
89830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
89930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	This version is implemented with circular lists because:
90030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		- I like circular lists
90130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		- it demonstrates some independence from the (typical) doubly linked list.
90230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
90330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlAttributeSet
90430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
90530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
90630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttributeSet();
90730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	~TiXmlAttributeSet();
90830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
90930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void Add( TiXmlAttribute* attribute );
91030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void Remove( TiXmlAttribute* attribute );
91130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
91230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* First()	const	{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
91330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* First()					{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
91430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* Last() const		{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
91530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* Last()					{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
91630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
91730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute*	Find( const char* _name ) const;
91830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* FindOrCreate( const char* _name );
91930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
92030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#	ifdef TIXML_USE_STL
92130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute*	Find( const std::string& _name ) const;
92230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* FindOrCreate( const std::string& _name );
92330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#	endif
92430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
92530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
92630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
92730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	//*ME:	Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element),
92830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	//*ME:	this class must be also use a hidden/disabled copy-constructor !!!
92930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttributeSet( const TiXmlAttributeSet& );	// not allowed
93030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void operator=( const TiXmlAttributeSet& );	// not allowed (as TiXmlAttribute)
93130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
93230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute sentinel;
93330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
93430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
93530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
93630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** The element is a container class. It has a value, the element name,
93730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	and can contain other elements, text, comments, and unknowns.
93830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Elements also contain an arbitrary number of attributes.
93930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
94030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlElement : public TiXmlNode
94130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
94230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
94330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Construct an element.
94430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement (const char * in_value);
94530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
94630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
94730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// std::string constructor.
94830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement( const std::string& _value );
94930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
95030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
95130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement( const TiXmlElement& );
95230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
95330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement& operator=( const TiXmlElement& base );
95430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
95530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual ~TiXmlElement();
95630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
95730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Given an attribute name, Attribute() returns the value
95830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for the attribute of that name, or null if none exists.
95930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
96030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* Attribute( const char* name ) const;
96130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
96230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Given an attribute name, Attribute() returns the value
96330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for the attribute of that name, or null if none exists.
96430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		If the attribute exists and can be converted to an integer,
96530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		the integer value will be put in the return 'i', if 'i'
96630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		is non-null.
96730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
96830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* Attribute( const char* name, int* i ) const;
96930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
97030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Given an attribute name, Attribute() returns the value
97130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for the attribute of that name, or null if none exists.
97230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		If the attribute exists and can be converted to an double,
97330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		the double value will be put in the return 'd', if 'd'
97430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		is non-null.
97530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
97630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* Attribute( const char* name, double* d ) const;
97730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
97830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** QueryIntAttribute examines the attribute - it is an alternative to the
97930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Attribute() method with richer error checking.
98030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		If the attribute is an integer, it is stored in 'value' and
98130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		the call returns TIXML_SUCCESS. If it is not
98230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		an integer, it returns TIXML_WRONG_TYPE. If the attribute
98330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		does not exist, then TIXML_NO_ATTRIBUTE is returned.
98430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
98530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryIntAttribute( const char* name, int* _value ) const;
98630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute().
98730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryUnsignedAttribute( const char* name, unsigned* _value ) const;
98830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** QueryBoolAttribute examines the attribute - see QueryIntAttribute().
98930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Note that '1', 'true', or 'yes' are considered true, while '0', 'false'
99030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		and 'no' are considered false.
99130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
99230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryBoolAttribute( const char* name, bool* _value ) const;
99330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// QueryDoubleAttribute examines the attribute - see QueryIntAttribute().
99430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryDoubleAttribute( const char* name, double* _value ) const;
99530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// QueryFloatAttribute examines the attribute - see QueryIntAttribute().
99630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryFloatAttribute( const char* name, float* _value ) const {
99730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		double d;
99830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		int result = QueryDoubleAttribute( name, &d );
99930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( result == TIXML_SUCCESS ) {
100030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			*_value = (float)d;
100130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
100230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return result;
100330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
100430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
100530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
100630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// QueryStringAttribute examines the attribute - see QueryIntAttribute().
100730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryStringAttribute( const char* name, std::string* _value ) const {
100830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const char* cstr = Attribute( name );
100930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( cstr ) {
101030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			*_value = std::string( cstr );
101130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TIXML_SUCCESS;
101230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
101330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_NO_ATTRIBUTE;
101430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
101530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
101630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Template form of the attribute query which will try to read the
101730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attribute into the specified type. Very easy, very powerful, but
101830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		be careful to make sure to call this with the correct type.
101930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
102030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		NOTE: This method doesn't work correctly for 'string' types that contain spaces.
102130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
102230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE
102330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
102430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const
102530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
102630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const TiXmlAttribute* node = attributeSet.Find( name );
102730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( !node )
102830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TIXML_NO_ATTRIBUTE;
102930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
103030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		std::stringstream sstream( node->ValueStr() );
103130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		sstream >> *outValue;
103230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( !sstream.fail() )
103330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TIXML_SUCCESS;
103430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_WRONG_TYPE;
103530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
103630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
103730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryValueAttribute( const std::string& name, std::string* outValue ) const
103830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
103930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const TiXmlAttribute* node = attributeSet.Find( name );
104030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( !node )
104130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TIXML_NO_ATTRIBUTE;
104230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		*outValue = node->ValueStr();
104330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_SUCCESS;
104430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
104530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
104630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
104730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Sets an attribute of name to a given value. The attribute
104830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		will be created if it does not exist, or changed if it does.
104930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
105030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetAttribute( const char* name, const char * _value );
105130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
105230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
105330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const std::string* Attribute( const std::string& name ) const;
105430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const std::string* Attribute( const std::string& name, int* i ) const;
105530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const std::string* Attribute( const std::string& name, double* d ) const;
105630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryIntAttribute( const std::string& name, int* _value ) const;
105730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int QueryDoubleAttribute( const std::string& name, double* _value ) const;
105830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
105930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// STL std::string form.
106030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetAttribute( const std::string& name, const std::string& _value );
106130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	///< STL std::string form.
106230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetAttribute( const std::string& name, int _value );
106330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	///< STL std::string form.
106430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetDoubleAttribute( const std::string& name, double value );
106530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
106630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
106730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Sets an attribute of name to a given value. The attribute
106830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		will be created if it does not exist, or changed if it does.
106930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
107030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetAttribute( const char * name, int value );
107130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
107230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Sets an attribute of name to a given value. The attribute
107330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		will be created if it does not exist, or changed if it does.
107430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
107530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetDoubleAttribute( const char * name, double value );
107630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
107730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Deletes an attribute with the given name.
107830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
107930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void RemoveAttribute( const char * name );
108030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
108130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void RemoveAttribute( const std::string& name )	{	RemoveAttribute (name.c_str ());	}	///< STL std::string form.
108230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
108330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
108430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* FirstAttribute() const	{ return attributeSet.First(); }		///< Access the first attribute in this element.
108530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* FirstAttribute() 				{ return attributeSet.First(); }
108630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* LastAttribute()	const 	{ return attributeSet.Last(); }		///< Access the last attribute in this element.
108730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* LastAttribute()					{ return attributeSet.Last(); }
108830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
108930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Convenience function for easy access to the text inside an element. Although easy
109030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		and concise, GetText() is limited compared to getting the TiXmlText child
109130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		and accessing it directly.
109230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
109330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		If the first child of 'this' is a TiXmlText, the GetText()
109430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		returns the character string of the Text node, else null is returned.
109530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
109630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		This is a convenient method for getting the text of simple contained text:
109730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@verbatim
109830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		<foo>This is text</foo>
109930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const char* str = fooElement->GetText();
110030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@endverbatim
110130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
110230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		'str' will be a pointer to "This is text".
110330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
110430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Note that this function can be misleading. If the element foo was created from
110530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		this XML:
110630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@verbatim
110730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		<foo><b>This is text</b></foo>
110830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@endverbatim
110930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
111030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		then the value of str would be null. The first child node isn't a text node, it is
111130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		another element. From this XML:
111230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@verbatim
111330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		<foo>This is <b>text</b></foo>
111430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@endverbatim
111530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		GetText() will return "This is ".
111630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
111730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		WARNING: GetText() accesses a child node - don't become confused with the
111830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				 similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are
111930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				 safe type casts on the referenced node.
112030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
112130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* GetText() const;
112230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
112330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Creates a new Element and returns it - the returned element is a copy.
112430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlNode* Clone() const;
112530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Print the Element to a FILE stream.
112630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void Print( FILE* cfile, int depth ) const;
112730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
112830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/*	Attribtue parsing starts: next char past '<'
112930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun						 returns: next char past '>'
113030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
113130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
113230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
113330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlElement*     ToElement()     const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
113430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlElement*           ToElement()	          { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
113530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
113630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Walk the XML tree visiting this node and all of its children.
113730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
113830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Accept( TiXmlVisitor* visitor ) const;
113930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
114030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected:
114130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
114230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void CopyTo( TiXmlElement* target ) const;
114330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void ClearThis();	// like clear, but initializes 'this' object as well
114430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
114530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Used to be public [internal use]
114630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
114730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
114830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
114930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/*	[internal use]
115030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Reads the "value" of the element -- another element, or text.
115130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		This should terminate with the current end tag.
115230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
115330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding );
115430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
115530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
115630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttributeSet attributeSet;
115730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
115830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
115930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
116030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/**	An XML comment.
116130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
116230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlComment : public TiXmlNode
116330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
116430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
116530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Constructs an empty comment.
116630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {}
116730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Construct a comment from text.
116830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {
116930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		SetValue( _value );
117030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
117130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlComment( const TiXmlComment& );
117230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlComment& operator=( const TiXmlComment& base );
117330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
117430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual ~TiXmlComment()	{}
117530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
117630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Returns a copy of this Comment.
117730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlNode* Clone() const;
117830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Write this Comment to a FILE stream.
117930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void Print( FILE* cfile, int depth ) const;
118030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
118130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/*	Attribtue parsing starts: at the ! of the !--
118230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun						 returns: next char past '>'
118330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
118430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
118530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
118630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlComment*  ToComment() const	{ return this; } ///< Cast to a more defined type. Will return null not of the requested type.
118730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual		  TiXmlComment*  ToComment()		{ return this; } ///< Cast to a more defined type. Will return null not of the requested type.
118830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
118930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Walk the XML tree visiting this node and all of its children.
119030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
119130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Accept( TiXmlVisitor* visitor ) const;
119230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
119330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected:
119430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void CopyTo( TiXmlComment* target ) const;
119530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
119630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// used to be public
119730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
119830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
119930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
120030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//	virtual void StreamOut( TIXML_OSTREAM * out ) const;
120130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
120230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
120330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
120430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
120530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
120630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
120730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** XML text. A text node can have 2 ways to output the next. "normal" output
120830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	and CDATA. It will default to the mode it was parsed from the XML file and
120930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	you generally want to leave it alone, but you can change the output mode with
121030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	SetCDATA() and query it with CDATA().
121130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
121230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlText : public TiXmlNode
121330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
121430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	friend class TiXmlElement;
121530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
121630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Constructor for text element. By default, it is treated as
121730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		normal, encoded text. If you want it be output as a CDATA text
121830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		element, set the parameter _cdata to 'true'
121930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
122030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)
122130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
122230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		SetValue( initValue );
122330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		cdata = false;
122430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
122530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual ~TiXmlText() {}
122630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
122730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
122830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Constructor.
122930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)
123030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
123130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		SetValue( initValue );
123230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		cdata = false;
123330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
123430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
123530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
123630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT )	{ copy.CopyTo( this ); }
123730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlText& operator=( const TiXmlText& base )							 	{ base.CopyTo( this ); return *this; }
123830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
123930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Write this text object to a FILE stream.
124030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void Print( FILE* cfile, int depth ) const;
124130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
124230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Queries whether this represents text using a CDATA section.
124330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool CDATA() const				{ return cdata; }
124430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Turns on or off a CDATA representation of text.
124530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetCDATA( bool _cdata )	{ cdata = _cdata; }
124630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
124730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
124830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
124930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
125030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlText*       ToText()       { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
125130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
125230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Walk the XML tree visiting this node and all of its children.
125330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
125430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Accept( TiXmlVisitor* content ) const;
125530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
125630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected :
125730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	///  [internal use] Creates a new Element and returns it.
125830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlNode* Clone() const;
125930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void CopyTo( TiXmlText* target ) const;
126030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
126130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool Blank() const;	// returns true if all white space and new lines
126230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// [internal use]
126330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
126430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
126530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
126630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
126730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
126830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool cdata;			// true if this should be input and output as a CDATA style text element
126930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
127030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
127130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
127230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** In correct XML the declaration is the first entry in the file.
127330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@verbatim
127430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		<?xml version="1.0" standalone="yes"?>
127530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@endverbatim
127630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
127730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TinyXml will happily read or write files without a declaration,
127830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	however. There are 3 possible attributes to the declaration:
127930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	version, encoding, and standalone.
128030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
128130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Note: In this version of the code, the attributes are
128230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	handled as special cases, not generic attributes, simply
128330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	because there can only be at most 3 and they are always the same.
128430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
128530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlDeclaration : public TiXmlNode
128630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
128730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
128830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Construct an empty declaration.
128930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDeclaration()   : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {}
129030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
129130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
129230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Constructor.
129330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDeclaration(	const std::string& _version,
129430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun						const std::string& _encoding,
129530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun						const std::string& _standalone );
129630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
129730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
129830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Construct.
129930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDeclaration(	const char* _version,
130030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun						const char* _encoding,
130130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun						const char* _standalone );
130230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
130330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDeclaration( const TiXmlDeclaration& copy );
130430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDeclaration& operator=( const TiXmlDeclaration& copy );
130530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
130630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual ~TiXmlDeclaration()	{}
130730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
130830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Version. Will return an empty string if none was found.
130930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char *Version() const			{ return version.c_str (); }
131030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Encoding. Will return an empty string if none was found.
131130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char *Encoding() const		{ return encoding.c_str (); }
131230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Is this a standalone document?
131330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char *Standalone() const		{ return standalone.c_str (); }
131430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
131530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Creates a copy of this Declaration and returns it.
131630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlNode* Clone() const;
131730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Print this declaration to a FILE stream.
131830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const;
131930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void Print( FILE* cfile, int depth ) const {
132030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Print( cfile, depth, 0 );
132130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
132230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
132330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
132430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
132530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
132630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlDeclaration*       ToDeclaration()       { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
132730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
132830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Walk the XML tree visiting this node and all of its children.
132930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
133030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Accept( TiXmlVisitor* visitor ) const;
133130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
133230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected:
133330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void CopyTo( TiXmlDeclaration* target ) const;
133430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// used to be public
133530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
133630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
133730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
133830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
133930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
134030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
134130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING version;
134230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING encoding;
134330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING standalone;
134430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
134530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
134630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
134730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** Any tag that tinyXml doesn't recognize is saved as an
134830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	unknown. It is a tag of text, but should not be modified.
134930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	It will be written back to the XML, unchanged, when the file
135030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	is saved.
135130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
135230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	DTD tags get thrown into TiXmlUnknowns.
135330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
135430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlUnknown : public TiXmlNode
135530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
135630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
135730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN )	{}
135830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual ~TiXmlUnknown() {}
135930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
136030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN )		{ copy.CopyTo( this ); }
136130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlUnknown& operator=( const TiXmlUnknown& copy )										{ copy.CopyTo( this ); return *this; }
136230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
136330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Creates a copy of this Unknown and returns it.
136430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlNode* Clone() const;
136530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Print this Unknown to a FILE stream.
136630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void Print( FILE* cfile, int depth ) const;
136730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
136830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
136930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
137030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlUnknown*     ToUnknown()     const	{ return this; } ///< Cast to a more defined type. Will return null not of the requested type.
137130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlUnknown*           ToUnknown()				{ return this; } ///< Cast to a more defined type. Will return null not of the requested type.
137230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
137330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Walk the XML tree visiting this node and all of its children.
137430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
137530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Accept( TiXmlVisitor* content ) const;
137630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
137730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected:
137830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void CopyTo( TiXmlUnknown* target ) const;
137930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
138030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
138130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
138230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
138330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
138430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
138530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
138630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
138730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
138830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
138930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** Always the top level node. A document binds together all the
139030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	XML pieces. It can be saved, loaded, and printed to the screen.
139130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	The 'value' of a document node is the xml file name.
139230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
139330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlDocument : public TiXmlNode
139430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
139530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
139630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Create an empty document, that has no name.
139730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDocument();
139830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Create a document with a name. The name of the document is also the filename of the xml.
139930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDocument( const char * documentName );
140030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
140130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
140230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Constructor.
140330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDocument( const std::string& documentName );
140430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
140530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
140630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDocument( const TiXmlDocument& copy );
140730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDocument& operator=( const TiXmlDocument& copy );
140830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
140930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual ~TiXmlDocument() {}
141030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
141130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Load a file using the current document value.
141230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Returns true if successful. Will delete any existing
141330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		document data before loading.
141430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
141530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
141630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Save a file using the current document value. Returns true if successful.
141730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool SaveFile() const;
141830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Load a file using the given filename. Returns true if successful.
141930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
142030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Save a file using the given filename. Returns true if successful.
142130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool SaveFile( const char * filename ) const;
142230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Load a file using the given FILE*. Returns true if successful. Note that this method
142330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		doesn't stream - the entire object pointed at by the FILE*
142430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		will be interpreted as an XML file. TinyXML doesn't stream in XML from the current
142530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		file location. Streaming may be added in the future.
142630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
142730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
142830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Save a file using the given FILE*. Returns true if successful.
142930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool SaveFile( FILE* ) const;
143030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
143130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
143230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )			///< STL std::string version.
143330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
143430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return LoadFile( filename.c_str(), encoding );
143530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
143630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool SaveFile( const std::string& filename ) const		///< STL std::string version.
143730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
143830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return SaveFile( filename.c_str() );
143930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
144030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
144130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
144230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Parse the given null terminated block of xml data. Passing in an encoding to this
144330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml
144430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		to use that encoding, regardless of what TinyXml might otherwise try to detect.
144530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
144630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
144730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
144830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Get the root element -- the only top level element -- of the document.
144930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		In well formed XML, there should only be one. TinyXml is tolerant of
145030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		multiple elements at the document level.
145130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
145230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlElement* RootElement() const		{ return FirstChildElement(); }
145330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* RootElement()					{ return FirstChildElement(); }
145430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
145530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** If an error occurs, Error will be set to true. Also,
145630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		- The ErrorId() will contain the integer identifier of the error (not generally useful)
145730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		- The ErrorDesc() method will return the name of the error. (very useful)
145830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		- The ErrorRow() and ErrorCol() will return the location of the error (if known)
145930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
146030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool Error() const						{ return error; }
146130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
146230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Contains a textual (english) description of the error if one occurs.
146330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char * ErrorDesc() const	{ return errorDesc.c_str (); }
146430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
146530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Generally, you probably want the error string ( ErrorDesc() ). But if you
146630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		prefer the ErrorId, this function will fetch it.
146730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
146830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int ErrorId()	const				{ return errorId; }
146930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
147030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Returns the location (if known) of the error. The first column is column 1,
147130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		and the first row is row 1. A value of 0 means the row and column wasn't applicable
147230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		(memory errors, for example, have no row/column) or the parser lost the error. (An
147330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		error in the error reporting, in that case.)
147430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
147530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@sa SetTabSize, Row, Column
147630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
147730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int ErrorRow() const	{ return errorLocation.row+1; }
147830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int ErrorCol() const	{ return errorLocation.col+1; }	///< The column where the error occured. See ErrorRow()
147930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
148030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol())
148130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		to report the correct values for row and column. It does not change the output
148230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		or input in any way.
148330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
148430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		By calling this method, with a tab size
148530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		greater than 0, the row and column of each node and attribute is stored
148630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		when the file is loaded. Very useful for tracking the DOM back in to
148730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		the source file.
148830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
148930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The tab size is required for calculating the location of nodes. If not
149030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		set, the default of 4 is used. The tabsize is set per document. Setting
149130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		the tabsize to 0 disables row/column tracking.
149230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
149330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Note that row and column tracking is not supported when using operator>>.
149430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
149530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The tab size needs to be enabled before the parse or load. Correct usage:
149630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@verbatim
149730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlDocument doc;
149830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		doc.SetTabSize( 8 );
149930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		doc.Load( "myfile.xml" );
150030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@endverbatim
150130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
150230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		@sa Row, Column
150330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
150430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetTabSize( int _tabsize )		{ tabsize = _tabsize; }
150530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
150630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int TabSize() const	{ return tabsize; }
150730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
150830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** If you have handled the error, it can be reset with this call. The error
150930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		state is automatically cleared if you Parse a new XML block.
151030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
151130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void ClearError()						{	error = false;
151230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun												errorId = 0;
151330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun												errorDesc = "";
151430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun												errorLocation.row = errorLocation.col = 0;
151530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun												//errorLocation.last = 0;
151630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun											}
151730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
151830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Write the document to standard out using formatted printing ("pretty print"). */
151930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void Print() const						{ Print( stdout, 0 ); }
152030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
152130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/* Write the document to a string using formatted printing ("pretty print"). This
152230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		will allocate a character array (new char[]) and return it as a pointer. The
152330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		calling code pust call delete[] on the return char* to avoid a memory leak.
152430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
152530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	//char* PrintToMemory() const;
152630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
152730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Print this Document to a FILE stream.
152830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void Print( FILE* cfile, int depth = 0 ) const;
152930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// [internal use]
153030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding );
153130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
153230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual const TiXmlDocument*    ToDocument()    const { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
153330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlDocument*          ToDocument()          { return this; } ///< Cast to a more defined type. Will return null not of the requested type.
153430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
153530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Walk the XML tree visiting this node and all of its children.
153630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
153730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Accept( TiXmlVisitor* content ) const;
153830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
153930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprotected :
154030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// [internal use]
154130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual TiXmlNode* Clone() const;
154230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
154330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
154430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
154530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
154630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
154730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void CopyTo( TiXmlDocument* target ) const;
154830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
154930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool error;
155030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int  errorId;
155130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING errorDesc;
155230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int tabsize;
155330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlCursor errorLocation;
155430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool useMicrosoftBOM;		// the UTF-8 BOM were found when read. Note this, and try to write.
155530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
155630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
155730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
155830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/**
155930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	A TiXmlHandle is a class that wraps a node pointer with null checks; this is
156030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml
156130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	DOM structure. It is a separate utility class.
156230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
156330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Take an example:
156430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@verbatim
156530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	<Document>
156630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		<Element attributeA = "valueA">
156730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			<Child attributeB = "value1" />
156830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			<Child attributeB = "value2" />
156930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		</Element>
157030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	<Document>
157130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@endverbatim
157230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
157330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very
157430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	easy to write a *lot* of code that looks like:
157530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
157630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@verbatim
157730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* root = document.FirstChildElement( "Document" );
157830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( root )
157930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
158030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlElement* element = root->FirstChildElement( "Element" );
158130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( element )
158230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
158330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			TiXmlElement* child = element->FirstChildElement( "Child" );
158430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			if ( child )
158530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			{
158630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				TiXmlElement* child2 = child->NextSiblingElement( "Child" );
158730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				if ( child2 )
158830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				{
158930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun					// Finally do something useful.
159030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@endverbatim
159130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
159230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity
159330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	of such code. A TiXmlHandle checks for null	pointers so it is perfectly safe
159430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	and correct to use:
159530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
159630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@verbatim
159730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle docHandle( &document );
159830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
159930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( child2 )
160030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
160130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// do something useful
160230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@endverbatim
160330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
160430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Which is MUCH more concise and useful.
160530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
160630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	It is also safe to copy handles - internally they are nothing more than node pointers.
160730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@verbatim
160830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle handleCopy = handle;
160930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@endverbatim
161030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
161130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	What they should not be used for is iteration:
161230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
161330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@verbatim
161430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int i=0;
161530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	while ( true )
161630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
161730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement();
161830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( !child )
161930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			break;
162030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// do something
162130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		++i;
162230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
162330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@endverbatim
162430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
162530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	It seems reasonable, but it is in fact two embedded while loops. The Child method is
162630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	a linear walk to find the element, so this code would iterate much more than it needs
162730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	to. Instead, prefer:
162830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
162930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@verbatim
163030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement();
163130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
163230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for( child; child; child=child->NextSiblingElement() )
163330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
163430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// do something
163530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
163630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@endverbatim
163730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
163830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlHandle
163930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
164030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
164130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Create a handle from any node (at any depth of the tree.) This can be a null pointer.
164230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle( TiXmlNode* _node )					{ this->node = _node; }
164330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Copy constructor
164430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle( const TiXmlHandle& ref )			{ this->node = ref.node; }
164530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; }
164630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
164730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Return a handle to the first child node.
164830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle FirstChild() const;
164930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Return a handle to the first child node with the given name.
165030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle FirstChild( const char * value ) const;
165130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Return a handle to the first child element.
165230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle FirstChildElement() const;
165330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Return a handle to the first child element with the given name.
165430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle FirstChildElement( const char * value ) const;
165530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
165630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return a handle to the "index" child with the given name.
165730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The first child is 0, the second 1, etc.
165830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
165930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle Child( const char* value, int index ) const;
166030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return a handle to the "index" child.
166130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The first child is 0, the second 1, etc.
166230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
166330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle Child( int index ) const;
166430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return a handle to the "index" child element with the given name.
166530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The first child element is 0, the second 1, etc. Note that only TiXmlElements
166630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		are indexed: other types are not counted.
166730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
166830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle ChildElement( const char* value, int index ) const;
166930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return a handle to the "index" child element.
167030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		The first child element is 0, the second 1, etc. Note that only TiXmlElements
167130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		are indexed: other types are not counted.
167230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
167330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle ChildElement( int index ) const;
167430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
167530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
167630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle FirstChild( const std::string& _value ) const				{ return FirstChild( _value.c_str() ); }
167730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle FirstChildElement( const std::string& _value ) const		{ return FirstChildElement( _value.c_str() ); }
167830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
167930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle Child( const std::string& _value, int index ) const			{ return Child( _value.c_str(), index ); }
168030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlHandle ChildElement( const std::string& _value, int index ) const	{ return ChildElement( _value.c_str(), index ); }
168130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
168230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
168330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return the handle as a TiXmlNode. This may return null.
168430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
168530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* ToNode() const			{ return node; }
168630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return the handle as a TiXmlElement. This may return null.
168730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
168830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* ToElement() const		{ return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); }
168930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/**	Return the handle as a TiXmlText. This may return null.
169030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
169130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlText* ToText() const			{ return ( ( node && node->ToText() ) ? node->ToText() : 0 ); }
169230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Return the handle as a TiXmlUnknown. This may return null.
169330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
169430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlUnknown* ToUnknown() const		{ return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); }
169530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
169630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** @deprecated use ToNode.
169730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Return the handle as a TiXmlNode. This may return null.
169830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
169930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* Node() const			{ return ToNode(); }
170030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** @deprecated use ToElement.
170130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Return the handle as a TiXmlElement. This may return null.
170230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
170330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* Element() const	{ return ToElement(); }
170430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/**	@deprecated use ToText()
170530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Return the handle as a TiXmlText. This may return null.
170630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
170730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlText* Text() const			{ return ToText(); }
170830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** @deprecated use ToUnknown()
170930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Return the handle as a TiXmlUnknown. This may return null.
171030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
171130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlUnknown* Unknown() const	{ return ToUnknown(); }
171230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
171330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
171430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node;
171530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
171630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
171730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
171830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/** Print to memory functionality. The TiXmlPrinter is useful when you need to:
171930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
172030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	-# Print to memory (especially in non-STL mode)
172130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	-# Control formatting (line endings, etc.)
172230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
172330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	When constructed, the TiXmlPrinter is in its default "pretty printing" mode.
172430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Before calling Accept() you can call methods to control the printing
172530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	of the XML document. After TiXmlNode::Accept() is called, the printed document can
172630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	be accessed via the CStr(), Str(), and Size() methods.
172730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
172830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlPrinter uses the Visitor API.
172930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@verbatim
173030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlPrinter printer;
173130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	printer.SetIndent( "\t" );
173230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
173330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	doc.Accept( &printer );
173430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	fprintf( stdout, "%s", printer.CStr() );
173530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	@endverbatim
173630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
173730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlPrinter : public TiXmlVisitor
173830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
173930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic:
174030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ),
174130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun					 buffer(), indent( "    " ), lineBreak( "\n" ) {}
174230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
174330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool VisitEnter( const TiXmlDocument& doc );
174430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool VisitExit( const TiXmlDocument& doc );
174530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
174630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute );
174730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool VisitExit( const TiXmlElement& element );
174830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
174930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Visit( const TiXmlDeclaration& declaration );
175030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Visit( const TiXmlText& text );
175130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Visit( const TiXmlComment& comment );
175230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	virtual bool Visit( const TiXmlUnknown& unknown );
175330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
175430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Set the indent characters for printing. By default 4 spaces
175530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		but tab (\t) is also useful, or null/empty string for no indentation.
175630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
175730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetIndent( const char* _indent )			{ indent = _indent ? _indent : "" ; }
175830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Query the indention string.
175930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* Indent()							{ return indent.c_str(); }
176030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Set the line breaking string. By default set to newline (\n).
176130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Some operating systems prefer other characters, or can be
176230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		set to the null/empty string for no indenation.
176330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
176430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetLineBreak( const char* _lineBreak )		{ lineBreak = _lineBreak ? _lineBreak : ""; }
176530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Query the current line breaking string.
176630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* LineBreak()							{ return lineBreak.c_str(); }
176730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
176830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/** Switch over to "stream printing" which is the most dense formatting without
176930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		linebreaks. Common when the XML is needed for network transmission.
177030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
177130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void SetStreamPrinting()						{ indent = "";
177230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun													  lineBreak = "";
177330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun													}
177430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Return the result.
177530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* CStr()								{ return buffer.c_str(); }
177630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Return the length of the result string.
177730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	size_t Size()									{ return buffer.size(); }
177830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
177930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#ifdef TIXML_USE_STL
178030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/// Return the result.
178130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const std::string& Str()						{ return buffer; }
178230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
178330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
178430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunprivate:
178530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void DoIndent()	{
178630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for( int i=0; i<depth; ++i )
178730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			buffer += indent;
178830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
178930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void DoLineBreak() {
179030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += lineBreak;
179130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
179230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
179330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int depth;
179430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool simpleTextPrint;
179530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING buffer;
179630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING indent;
179730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING lineBreak;
179830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
179930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
180030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
180130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef _MSC_VER
180230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#pragma warning( pop )
180330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
180430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
180530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
1806