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#include <ctype.h>
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <sstream>
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <iostream>
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "tinyxml.h"
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunFILE* TiXmlFOpen( const char* filename, const char* mode );
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlBase::condenseWhiteSpace = true;
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Microsoft compiler security
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunFILE* TiXmlFOpen( const char* filename, const char* mode )
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		FILE* fp = 0;
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		errno_t err = fopen_s( &fp, filename, mode );
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( !err && fp )
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return fp;
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#else
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return fopen( filename, mode );
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString )
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int i=0;
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	while( i<(int)str.length() )
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		unsigned char c = (unsigned char) str[i];
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if (    c == '&'
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		     && i < ( (int)str.length() - 2 )
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			 && str[i+1] == '#'
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			 && str[i+2] == 'x' )
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// Hexadecimal character reference.
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// Pass through unchanged.
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// &#xA9;	-- copyright symbol, for example.
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			//
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// The -1 is a bug fix from Rob Laveaux. It keeps
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// an overflow from happening if there is no ';'.
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// There are actually 2 ways to exit this loop -
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// while fails (error case) and break (semicolon found).
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// However, there is no mechanism (currently) for
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// this function to return an error.
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			while ( i<(int)str.length()-1 )
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			{
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				outString->append( str.c_str() + i, 1 );
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				++i;
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				if ( str[i] == ';' )
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun					break;
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			}
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else if ( c == '&' )
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			outString->append( entity[0].str, entity[0].strLength );
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			++i;
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else if ( c == '<' )
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			outString->append( entity[1].str, entity[1].strLength );
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			++i;
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else if ( c == '>' )
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			outString->append( entity[2].str, entity[2].strLength );
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			++i;
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else if ( c == '\"' )
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			outString->append( entity[3].str, entity[3].strLength );
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			++i;
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else if ( c == '\'' )
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			outString->append( entity[4].str, entity[4].strLength );
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			++i;
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else if ( c < 32 )
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// Easy pass at non-alpha/numeric/symbol
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// Below 32 is symbolic.
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			char buf[ 32 ];
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			#if defined(TIXML_SNPRINTF)
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) );
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			#else
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) );
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			#endif
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			//*ME:	warning C4267: convert 'size_t' to 'int'
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			//*ME:	Int-Cast to make compiler happy ...
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			outString->append( buf, (int)strlen( buf ) );
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			++i;
12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else
12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			//char realc = (char) c;
12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			//outString->append( &realc, 1 );
12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			*outString += (char) c;	// somewhat more efficient function call.
13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			++i;
13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase()
13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	parent = 0;
13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	type = _type;
14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	firstChild = 0;
14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	lastChild = 0;
14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	prev = 0;
14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	next = 0;
14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode::~TiXmlNode()
14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node = firstChild;
15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* temp = 0;
15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	while ( node )
15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		temp = node;
15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		node = node->next;
15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		delete temp;
15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlNode::CopyTo( TiXmlNode* target ) const
16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->SetValue (value.c_str() );
16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->userData = userData;
16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->location = location;
16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlNode::Clear()
17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node = firstChild;
17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* temp = 0;
17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	while ( node )
17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		temp = node;
17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		node = node->next;
17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		delete temp;
17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	firstChild = 0;
18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	lastChild = 0;
18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )
18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( node->parent == 0 || node->parent == this );
18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() );
19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node->Type() == TiXmlNode::TINYXML_DOCUMENT )
19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		delete node;
19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( GetDocument() )
19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->parent = this;
20030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->prev = lastChild;
20230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->next = 0;
20330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( lastChild )
20530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		lastChild->next = node;
20630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
20730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		firstChild = node;			// it was an empty list.
20830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	lastChild = node;
21030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return node;
21130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
21230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
21330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
21430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis )
21530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
21630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )
21730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
21830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( GetDocument() )
21930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
22030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
22130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
22230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node = addThis.Clone();
22330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !node )
22430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
22530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
22630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return LinkEndChild( node );
22730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
22830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
22930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
23030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis )
23130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
23230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !beforeThis || beforeThis->parent != this ) {
23330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
23430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
23530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )
23630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
23730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( GetDocument() )
23830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
23930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
24030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
24130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
24230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node = addThis.Clone();
24330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !node )
24430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
24530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->parent = this;
24630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
24730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->next = beforeThis;
24830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->prev = beforeThis->prev;
24930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( beforeThis->prev )
25030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
25130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		beforeThis->prev->next = node;
25230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
25330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
25430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
25530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( firstChild == beforeThis );
25630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		firstChild = node;
25730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
25830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	beforeThis->prev = node;
25930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return node;
26030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
26130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
26230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
26330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis )
26430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
26530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !afterThis || afterThis->parent != this ) {
26630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
26730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
26830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )
26930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
27030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( GetDocument() )
27130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
27230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
27330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
27430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
27530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node = addThis.Clone();
27630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !node )
27730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
27830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->parent = this;
27930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
28030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->prev = afterThis;
28130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->next = afterThis->next;
28230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( afterThis->next )
28330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
28430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		afterThis->next->prev = node;
28530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
28630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
28730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
28830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( lastChild == afterThis );
28930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		lastChild = node;
29030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
29130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	afterThis->next = node;
29230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return node;
29330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
29430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
29530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
29630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis )
29730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
29830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !replaceThis )
29930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
30030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
30130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( replaceThis->parent != this )
30230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
30330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
30430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( withThis.ToDocument() ) {
30530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// A document can never be a child.	Thanks to Noam.
30630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlDocument* document = GetDocument();
30730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( document )
30830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			document->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
30930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
31030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
31130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
31230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node = withThis.Clone();
31330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !node )
31430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
31530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
31630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->next = replaceThis->next;
31730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->prev = replaceThis->prev;
31830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
31930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( replaceThis->next )
32030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		replaceThis->next->prev = node;
32130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
32230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		lastChild = node;
32330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
32430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( replaceThis->prev )
32530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		replaceThis->prev->next = node;
32630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
32730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		firstChild = node;
32830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
32930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	delete replaceThis;
33030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	node->parent = this;
33130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return node;
33230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
33330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
33430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
33530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlNode::RemoveChild( TiXmlNode* removeThis )
33630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
33730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !removeThis ) {
33830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return false;
33930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
34030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
34130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( removeThis->parent != this )
34230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
34330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( 0 );
34430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return false;
34530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
34630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
34730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( removeThis->next )
34830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		removeThis->next->prev = removeThis->prev;
34930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
35030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		lastChild = removeThis->prev;
35130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
35230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( removeThis->prev )
35330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		removeThis->prev->next = removeThis->next;
35430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
35530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		firstChild = removeThis->next;
35630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
35730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	delete removeThis;
35830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return true;
35930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
36030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
36130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const
36230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
36330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* node;
36430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( node = firstChild; node; node = node->next )
36530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
36630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( strcmp( node->Value(), _value ) == 0 )
36730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node;
36830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
36930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
37030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
37130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
37230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
37330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlNode* TiXmlNode::LastChild( const char * _value ) const
37430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
37530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* node;
37630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( node = lastChild; node; node = node->prev )
37730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
37830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( strcmp( node->Value(), _value ) == 0 )
37930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node;
38030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
38130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
38230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
38330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
38430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
38530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const
38630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
38730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !previous )
38830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
38930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return FirstChild();
39030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
39130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
39230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
39330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( previous->parent == this );
39430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return previous->NextSibling();
39530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
39630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
39730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
39830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
39930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const
40030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
40130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !previous )
40230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
40330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return FirstChild( val );
40430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
40530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
40630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
40730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( previous->parent == this );
40830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return previous->NextSibling( val );
40930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
41030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
41130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
41230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
41330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const
41430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
41530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* node;
41630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( node = next; node; node = node->next )
41730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
41830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( strcmp( node->Value(), _value ) == 0 )
41930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node;
42030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
42130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
42230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
42330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
42430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
42530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const
42630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
42730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* node;
42830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( node = prev; node; node = node->prev )
42930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
43030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( strcmp( node->Value(), _value ) == 0 )
43130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node;
43230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
43330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
43430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
43530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
43630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
43730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::RemoveAttribute( const char * name )
43830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
43930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
44030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING str( name );
44130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* node = attributeSet.Find( str );
44230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#else
44330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* node = attributeSet.Find( name );
44430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
44530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
44630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
44730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attributeSet.Remove( node );
44830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		delete node;
44930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
45030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
45130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
45230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlElement* TiXmlNode::FirstChildElement() const
45330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
45430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* node;
45530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
45630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for (	node = FirstChild();
45730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node;
45830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node = node->NextSibling() )
45930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
46030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( node->ToElement() )
46130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node->ToElement();
46230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
46330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
46430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
46530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
46630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
46730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const
46830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
46930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* node;
47030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
47130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for (	node = FirstChild( _value );
47230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node;
47330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node = node->NextSibling( _value ) )
47430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
47530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( node->ToElement() )
47630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node->ToElement();
47730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
47830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
47930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
48030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
48130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
48230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlElement* TiXmlNode::NextSiblingElement() const
48330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
48430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* node;
48530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
48630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for (	node = NextSibling();
48730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node;
48830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node = node->NextSibling() )
48930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
49030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( node->ToElement() )
49130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node->ToElement();
49230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
49330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
49430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
49530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
49630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
49730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const
49830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
49930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* node;
50030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
50130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for (	node = NextSibling( _value );
50230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node;
50330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node = node->NextSibling( _value ) )
50430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
50530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( node->ToElement() )
50630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node->ToElement();
50730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
50830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
50930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
51030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
51130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
51230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlDocument* TiXmlNode::GetDocument() const
51330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
51430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* node;
51530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
51630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for( node = this; node; node = node->parent )
51730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
51830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( node->ToDocument() )
51930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node->ToDocument();
52030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
52130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
52230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
52330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
52430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
52530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlElement::TiXmlElement (const char * _value)
52630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	: TiXmlNode( TiXmlNode::TINYXML_ELEMENT )
52730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
52830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	firstChild = lastChild = 0;
52930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	value = _value;
53030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
53130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
53230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
53330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
53430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlElement::TiXmlElement( const std::string& _value )
53530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	: TiXmlNode( TiXmlNode::TINYXML_ELEMENT )
53630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
53730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	firstChild = lastChild = 0;
53830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	value = _value;
53930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
54030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
54130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
54230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
54330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlElement::TiXmlElement( const TiXmlElement& copy)
54430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	: TiXmlNode( TiXmlNode::TINYXML_ELEMENT )
54530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
54630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	firstChild = lastChild = 0;
54730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	copy.CopyTo( this );
54830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
54930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
55030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
55130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlElement& TiXmlElement::operator=( const TiXmlElement& base )
55230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
55330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	ClearThis();
55430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	base.CopyTo( this );
55530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return *this;
55630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
55730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
55830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
55930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlElement::~TiXmlElement()
56030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
56130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	ClearThis();
56230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
56330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
56430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
56530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::ClearThis()
56630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
56730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Clear();
56830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	while( attributeSet.First() )
56930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
57030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlAttribute* node = attributeSet.First();
57130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attributeSet.Remove( node );
57230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		delete node;
57330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
57430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
57530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
57630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
57730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst char* TiXmlElement::Attribute( const char* name ) const
57830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
57930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* node = attributeSet.Find( name );
58030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
58130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return node->Value();
58230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
58330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
58430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
58530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
58630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
58730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst std::string* TiXmlElement::Attribute( const std::string& name ) const
58830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
58930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib = attributeSet.Find( name );
59030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib )
59130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return &attrib->ValueStr();
59230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
59330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
59430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
59530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
59630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
59730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst char* TiXmlElement::Attribute( const char* name, int* i ) const
59830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
59930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib = attributeSet.Find( name );
60030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* result = 0;
60130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
60230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
60330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		result = attrib->Value();
60430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( i ) {
60530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			attrib->QueryIntValue( i );
60630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
60730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
60830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return result;
60930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
61030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
61130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
61230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
61330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const
61430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
61530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib = attributeSet.Find( name );
61630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const std::string* result = 0;
61730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
61830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
61930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		result = &attrib->ValueStr();
62030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( i ) {
62130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			attrib->QueryIntValue( i );
62230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
62330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
62430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return result;
62530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
62630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
62730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
62830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
62930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst char* TiXmlElement::Attribute( const char* name, double* d ) const
63030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
63130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib = attributeSet.Find( name );
63230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* result = 0;
63330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
63430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
63530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		result = attrib->Value();
63630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( d ) {
63730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			attrib->QueryDoubleValue( d );
63830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
63930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
64030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return result;
64130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
64230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
64330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
64430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
64530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const
64630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
64730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib = attributeSet.Find( name );
64830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const std::string* result = 0;
64930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
65030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
65130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		result = &attrib->ValueStr();
65230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( d ) {
65330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			attrib->QueryDoubleValue( d );
65430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
65530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
65630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return result;
65730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
65830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
65930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
66030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
66130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const
66230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
66330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib = attributeSet.Find( name );
66430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !attrib )
66530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_NO_ATTRIBUTE;
66630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return attrib->QueryIntValue( ival );
66730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
66830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
66930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
67030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint TiXmlElement::QueryUnsignedAttribute( const char* name, unsigned* value ) const
67130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
67230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* node = attributeSet.Find( name );
67330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !node )
67430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_NO_ATTRIBUTE;
67530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
67630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int ival = 0;
67730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int result = node->QueryIntValue( &ival );
67830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*value = (unsigned)ival;
67930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return result;
68030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
68130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
68230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
68330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint TiXmlElement::QueryBoolAttribute( const char* name, bool* bval ) const
68430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
68530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* node = attributeSet.Find( name );
68630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !node )
68730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_NO_ATTRIBUTE;
68830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
68930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int result = TIXML_WRONG_TYPE;
69030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if (    StringEqual( node->Value(), "true", true, TIXML_ENCODING_UNKNOWN )
69130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		 || StringEqual( node->Value(), "yes", true, TIXML_ENCODING_UNKNOWN )
69230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		 || StringEqual( node->Value(), "1", true, TIXML_ENCODING_UNKNOWN ) )
69330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
69430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		*bval = true;
69530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		result = TIXML_SUCCESS;
69630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
69730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else if (    StringEqual( node->Value(), "false", true, TIXML_ENCODING_UNKNOWN )
69830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			  || StringEqual( node->Value(), "no", true, TIXML_ENCODING_UNKNOWN )
69930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			  || StringEqual( node->Value(), "0", true, TIXML_ENCODING_UNKNOWN ) )
70030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
70130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		*bval = false;
70230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		result = TIXML_SUCCESS;
70330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
70430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return result;
70530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
70630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
70730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
70830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
70930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
71030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const
71130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
71230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib = attributeSet.Find( name );
71330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !attrib )
71430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_NO_ATTRIBUTE;
71530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return attrib->QueryIntValue( ival );
71630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
71730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
71830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
71930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
72030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const
72130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
72230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib = attributeSet.Find( name );
72330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !attrib )
72430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_NO_ATTRIBUTE;
72530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return attrib->QueryDoubleValue( dval );
72630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
72730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
72830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
72930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
73030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const
73130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
73230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib = attributeSet.Find( name );
73330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !attrib )
73430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_NO_ATTRIBUTE;
73530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return attrib->QueryDoubleValue( dval );
73630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
73730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
73830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
73930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
74030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::SetAttribute( const char * name, int val )
74130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
74230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* attrib = attributeSet.FindOrCreate( name );
74330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
74430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->SetIntValue( val );
74530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
74630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
74730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
74830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
74930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
75030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::SetAttribute( const std::string& name, int val )
75130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
75230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* attrib = attributeSet.FindOrCreate( name );
75330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
75430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->SetIntValue( val );
75530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
75630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
75730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
75830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
75930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
76030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::SetDoubleAttribute( const char * name, double val )
76130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
76230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* attrib = attributeSet.FindOrCreate( name );
76330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
76430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->SetDoubleValue( val );
76530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
76630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
76730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
76830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
76930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
77030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::SetDoubleAttribute( const std::string& name, double val )
77130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
77230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* attrib = attributeSet.FindOrCreate( name );
77330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
77430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->SetDoubleValue( val );
77530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
77630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
77730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
77830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
77930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
78030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::SetAttribute( const char * cname, const char * cvalue )
78130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
78230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* attrib = attributeSet.FindOrCreate( cname );
78330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
78430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->SetValue( cvalue );
78530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
78630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
78730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
78830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
78930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
79030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::SetAttribute( const std::string& _name, const std::string& _value )
79130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
79230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* attrib = attributeSet.FindOrCreate( _name );
79330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( attrib ) {
79430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->SetValue( _value );
79530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
79630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
79730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
79830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
79930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
80030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::Print( FILE* cfile, int depth ) const
80130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
80230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	int i;
80330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( cfile );
80430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( i=0; i<depth; i++ ) {
80530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, "    " );
80630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
80730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
80830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	fprintf( cfile, "<%s", value.c_str() );
80930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
81030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attrib;
81130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() )
81230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
81330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, " " );
81430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->Print( cfile, depth );
81530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
81630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
81730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// There are 3 different formatting approaches:
81830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// 1) An element without children is printed as a <foo /> node
81930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// 2) An element with only a text child is printed as <foo> text </foo>
82030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// 3) An element with children is printed on multiple lines.
82130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node;
82230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !firstChild )
82330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
82430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, " />" );
82530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
82630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else if ( firstChild == lastChild && firstChild->ToText() )
82730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
82830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, ">" );
82930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		firstChild->Print( cfile, depth + 1 );
83030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, "</%s>", value.c_str() );
83130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
83230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
83330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
83430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, ">" );
83530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
83630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for ( node = firstChild; node; node=node->NextSibling() )
83730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
83830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			if ( !node->ToText() )
83930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			{
84030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				fprintf( cfile, "\n" );
84130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			}
84230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node->Print( cfile, depth+1 );
84330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
84430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, "\n" );
84530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for( i=0; i<depth; ++i ) {
84630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			fprintf( cfile, "    " );
84730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
84830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, "</%s>", value.c_str() );
84930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
85030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
85130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
85230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
85330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlElement::CopyTo( TiXmlElement* target ) const
85430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
85530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// superclass:
85630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode::CopyTo( target );
85730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
85830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Element class:
85930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Clone the attributes, then clone the children.
86030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlAttribute* attribute = 0;
86130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for(	attribute = attributeSet.First();
86230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	attribute;
86330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	attribute = attribute->Next() )
86430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
86530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		target->SetAttribute( attribute->Name(), attribute->Value() );
86630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
86730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
86830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node = 0;
86930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( node = firstChild; node; node = node->NextSibling() )
87030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
87130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		target->LinkEndChild( node->Clone() );
87230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
87330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
87430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
87530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlElement::Accept( TiXmlVisitor* visitor ) const
87630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
87730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( visitor->VisitEnter( *this, attributeSet.First() ) )
87830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
87930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() )
88030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
88130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			if ( !node->Accept( visitor ) )
88230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				break;
88330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
88430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
88530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return visitor->VisitExit( *this );
88630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
88730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
88830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
88930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlElement::Clone() const
89030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
89130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlElement* clone = new TiXmlElement( Value() );
89230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !clone )
89330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
89430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
89530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	CopyTo( clone );
89630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return clone;
89730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
89830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
89930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
90030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst char* TiXmlElement::GetText() const
90130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
90230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const TiXmlNode* child = this->FirstChild();
90330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( child ) {
90430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const TiXmlText* childText = child->ToText();
90530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( childText ) {
90630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return childText->Value();
90730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
90830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
90930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
91030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
91130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
91230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
91330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
91430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
91530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	tabsize = 4;
91630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	useMicrosoftBOM = false;
91730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	ClearError();
91830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
91930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
92030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
92130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
92230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	tabsize = 4;
92330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	useMicrosoftBOM = false;
92430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	value = documentName;
92530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	ClearError();
92630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
92730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
92830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
92930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
93030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
93130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
93230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	tabsize = 4;
93330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	useMicrosoftBOM = false;
93430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    value = documentName;
93530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	ClearError();
93630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
93730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
93830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
93930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
94030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
94130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
94230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	copy.CopyTo( this );
94330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
94430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
94530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
94630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlDocument& TiXmlDocument::operator=( const TiXmlDocument& copy )
94730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
94830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Clear();
94930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	copy.CopyTo( this );
95030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return *this;
95130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
95230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
95330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
95430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlDocument::LoadFile( TiXmlEncoding encoding )
95530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
95630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return LoadFile( Value(), encoding );
95730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
95830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
95930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
96030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlDocument::SaveFile() const
96130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
96230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return SaveFile( Value() );
96330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
96430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
96530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding )
96630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
96730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING filename( _filename );
96830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	value = filename;
96930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
97030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// reading in binary mode so that tinyxml can normalize the EOL
97130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	FILE* file = TiXmlFOpen( value.c_str (), "rb" );
97230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
97330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( file )
97430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
97530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		bool result = LoadFile( file, encoding );
97630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fclose( file );
97730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return result;
97830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
97930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
98030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
98130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
98230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return false;
98330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
98430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
98530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
98630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding )
98730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
98830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !file )
98930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
99030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
99130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return false;
99230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
99330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
99430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Delete the existing data:
99530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Clear();
99630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	location.Clear();
99730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
99830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Get the file size, so we can pre-allocate the string. HUGE speed impact.
99930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	long length = 0;
100030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	fseek( file, 0, SEEK_END );
100130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	length = ftell( file );
100230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	fseek( file, 0, SEEK_SET );
100330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
100430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Strange case, but good to handle up front.
100530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( length <= 0 )
100630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
100730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );
100830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return false;
100930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
101030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
101130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Subtle bug here. TinyXml did use fgets. But from the XML spec:
101230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// 2.11 End-of-Line Handling
101330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// <snip>
101430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// <quote>
101530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// ...the XML processor MUST behave as if it normalized all line breaks in external
101630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// parsed entities (including the document entity) on input, before parsing, by translating
101730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// both the two-character sequence #xD #xA and any #xD that is not followed by #xA to
101830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// a single #xA character.
101930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// </quote>
102030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	//
102130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// It is not clear fgets does that, and certainly isn't clear it works cross platform.
102230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Generally, you expect fgets to translate from the convention of the OS to the c/unix
102330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// convention, and not work generally.
102430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
102530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/*
102630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	while( fgets( buf, sizeof(buf), file ) )
102730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
102830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		data += buf;
102930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
103030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
103130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
103230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	char* buf = new char[ length+1 ];
103330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buf[0] = 0;
103430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
103530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( fread( buf, length, 1, file ) != 1 ) {
103630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		delete [] buf;
103730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
103830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return false;
103930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
104030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
104130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Process the buffer in place to normalize new lines. (See comment above.)
104230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Copies from the 'p' to 'q' pointer, where p can advance faster if
104330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// a newline-carriage return is hit.
104430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	//
104530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Wikipedia:
104630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Systems based on ASCII or a compatible character set use either LF  (Line feed, '\n', 0x0A, 10 in decimal) or
104730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// CR (Carriage return, '\r', 0x0D, 13 in decimal) individually, or CR followed by LF (CR+LF, 0x0D 0x0A)...
104830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	//		* LF:    Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others
104930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    //		* CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS
105030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    //		* CR:    Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9
105130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
105230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char* p = buf;	// the read head
105330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	char* q = buf;			// the write head
105430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char CR = 0x0d;
105530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char LF = 0x0a;
105630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
105730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buf[length] = 0;
105830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	while( *p ) {
105930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( p < (buf+length) );
106030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( q <= (buf+length) );
106130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( q <= p );
106230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
106330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( *p == CR ) {
106430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			*q++ = LF;
106530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			p++;
106630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			if ( *p == LF ) {		// check for CR+LF (and skip LF)
106730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				p++;
106830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			}
106930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
107030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else {
107130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			*q++ = *p++;
107230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
107330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
107430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( q <= (buf+length) );
107530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*q = 0;
107630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
107730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Parse( buf, 0, encoding );
107830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
107930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	delete [] buf;
108030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return !Error();
108130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
108230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
108330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
108430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlDocument::SaveFile( const char * filename ) const
108530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
108630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// The old c stuff lives on...
108730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	FILE* fp = TiXmlFOpen( filename, "w" );
108830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( fp )
108930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
109030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		bool result = SaveFile( fp );
109130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fclose( fp );
109230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return result;
109330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
109430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return false;
109530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
109630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
109730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
109830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlDocument::SaveFile( FILE* fp ) const
109930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
110030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( useMicrosoftBOM )
110130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
110230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const unsigned char TIXML_UTF_LEAD_0 = 0xefU;
110330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const unsigned char TIXML_UTF_LEAD_1 = 0xbbU;
110430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		const unsigned char TIXML_UTF_LEAD_2 = 0xbfU;
110530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
110630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fputc( TIXML_UTF_LEAD_0, fp );
110730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fputc( TIXML_UTF_LEAD_1, fp );
110830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fputc( TIXML_UTF_LEAD_2, fp );
110930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
111030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Print( fp, 0 );
111130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return (ferror(fp) == 0);
111230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
111330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
111430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
111530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlDocument::CopyTo( TiXmlDocument* target ) const
111630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
111730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode::CopyTo( target );
111830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
111930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->error = error;
112030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->errorId = errorId;
112130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->errorDesc = errorDesc;
112230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->tabsize = tabsize;
112330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->errorLocation = errorLocation;
112430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->useMicrosoftBOM = useMicrosoftBOM;
112530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
112630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode* node = 0;
112730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( node = firstChild; node; node = node->NextSibling() )
112830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
112930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		target->LinkEndChild( node->Clone() );
113030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
113130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
113230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
113330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
113430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlDocument::Clone() const
113530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
113630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDocument* clone = new TiXmlDocument();
113730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !clone )
113830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
113930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
114030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	CopyTo( clone );
114130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return clone;
114230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
114330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
114430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
114530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlDocument::Print( FILE* cfile, int depth ) const
114630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
114730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( cfile );
114830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() )
114930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
115030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		node->Print( cfile, depth );
115130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, "\n" );
115230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
115330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
115430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
115530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
115630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const
115730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
115830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( visitor->VisitEnter( *this ) )
115930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
116030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() )
116130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
116230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			if ( !node->Accept( visitor ) )
116330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				break;
116430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
116530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
116630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return visitor->VisitExit( *this );
116730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
116830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
116930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
117030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlAttribute* TiXmlAttribute::Next() const
117130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
117230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// We are using knowledge of the sentinel. The sentinel
117330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// have a value or name.
117430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( next->value.empty() && next->name.empty() )
117530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
117630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return next;
117730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
117830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
117930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
118030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlAttribute* TiXmlAttribute::Next()
118130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
118230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// We are using knowledge of the sentinel. The sentinel
118330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// have a value or name.
118430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( next->value.empty() && next->name.empty() )
118530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
118630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return next;
118730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
118830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
118930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
119030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst TiXmlAttribute* TiXmlAttribute::Previous() const
119130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
119230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// We are using knowledge of the sentinel. The sentinel
119330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// have a value or name.
119430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( prev->value.empty() && prev->name.empty() )
119530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
119630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return prev;
119730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
119830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
119930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
120030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlAttribute* TiXmlAttribute::Previous()
120130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
120230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// We are using knowledge of the sentinel. The sentinel
120330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// have a value or name.
120430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( prev->value.empty() && prev->name.empty() )
120530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
120630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return prev;
120730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
120830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
120930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
121030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const
121130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
121230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING n, v;
121330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
121430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	EncodeString( name, &n );
121530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	EncodeString( value, &v );
121630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
121730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if (value.find ('\"') == TIXML_STRING::npos) {
121830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( cfile ) {
121930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() );
122030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
122130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( str ) {
122230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			(*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\"";
122330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
122430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
122530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else {
122630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( cfile ) {
122730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() );
122830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
122930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( str ) {
123030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			(*str) += n; (*str) += "='"; (*str) += v; (*str) += "'";
123130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
123230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
123330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
123430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
123530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
123630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint TiXmlAttribute::QueryIntValue( int* ival ) const
123730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
123830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 )
123930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_SUCCESS;
124030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TIXML_WRONG_TYPE;
124130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
124230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
124330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint TiXmlAttribute::QueryDoubleValue( double* dval ) const
124430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
124530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 )
124630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return TIXML_SUCCESS;
124730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TIXML_WRONG_TYPE;
124830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
124930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
125030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlAttribute::SetIntValue( int _value )
125130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
125230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	char buf [64];
125330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#if defined(TIXML_SNPRINTF)
125430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value);
125530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#else
125630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		sprintf (buf, "%d", _value);
125730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
125830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	SetValue (buf);
125930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
126030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
126130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlAttribute::SetDoubleValue( double _value )
126230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
126330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	char buf [256];
126430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#if defined(TIXML_SNPRINTF)
126530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_SNPRINTF( buf, sizeof(buf), "%g", _value);
126630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#else
126730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		sprintf (buf, "%g", _value);
126830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
126930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	SetValue (buf);
127030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
127130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
127230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint TiXmlAttribute::IntValue() const
127330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
127430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return atoi (value.c_str ());
127530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
127630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
127730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurundouble  TiXmlAttribute::DoubleValue() const
127830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
127930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return atof (value.c_str ());
128030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
128130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
128230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
128330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT )
128430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
128530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	copy.CopyTo( this );
128630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
128730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
128830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
128930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlComment& TiXmlComment::operator=( const TiXmlComment& base )
129030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
129130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Clear();
129230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	base.CopyTo( this );
129330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return *this;
129430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
129530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
129630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
129730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlComment::Print( FILE* cfile, int depth ) const
129830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
129930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( cfile );
130030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( int i=0; i<depth; i++ )
130130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
130230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile,  "    " );
130330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
130430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	fprintf( cfile, "<!--%s-->", value.c_str() );
130530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
130630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
130730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
130830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlComment::CopyTo( TiXmlComment* target ) const
130930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
131030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode::CopyTo( target );
131130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
131230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
131330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
131430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlComment::Accept( TiXmlVisitor* visitor ) const
131530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
131630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return visitor->Visit( *this );
131730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
131830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
131930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
132030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlComment::Clone() const
132130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
132230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlComment* clone = new TiXmlComment();
132330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
132430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !clone )
132530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
132630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
132730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	CopyTo( clone );
132830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return clone;
132930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
133030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
133130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
133230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlText::Print( FILE* cfile, int depth ) const
133330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
133430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( cfile );
133530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( cdata )
133630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
133730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		int i;
133830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, "\n" );
133930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for ( i=0; i<depth; i++ ) {
134030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			fprintf( cfile, "    " );
134130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
134230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, "<![CDATA[%s]]>\n", value.c_str() );	// unformatted output
134330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
134430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
134530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
134630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_STRING buffer;
134730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		EncodeString( value, &buffer );
134830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, "%s", buffer.c_str() );
134930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
135030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
135130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
135230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
135330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlText::CopyTo( TiXmlText* target ) const
135430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
135530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode::CopyTo( target );
135630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->cdata = cdata;
135730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
135830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
135930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
136030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlText::Accept( TiXmlVisitor* visitor ) const
136130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
136230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return visitor->Visit( *this );
136330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
136430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
136530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
136630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlText::Clone() const
136730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
136830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlText* clone = 0;
136930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	clone = new TiXmlText( "" );
137030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
137130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !clone )
137230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
137330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
137430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	CopyTo( clone );
137530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return clone;
137630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
137730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
137830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
137930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlDeclaration::TiXmlDeclaration( const char * _version,
138030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun									const char * _encoding,
138130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun									const char * _standalone )
138230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	: TiXmlNode( TiXmlNode::TINYXML_DECLARATION )
138330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
138430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	version = _version;
138530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	encoding = _encoding;
138630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	standalone = _standalone;
138730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
138830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
138930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
139030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
139130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlDeclaration::TiXmlDeclaration(	const std::string& _version,
139230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun									const std::string& _encoding,
139330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun									const std::string& _standalone )
139430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	: TiXmlNode( TiXmlNode::TINYXML_DECLARATION )
139530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
139630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	version = _version;
139730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	encoding = _encoding;
139830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	standalone = _standalone;
139930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
140030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
140130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
140230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
140330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy )
140430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	: TiXmlNode( TiXmlNode::TINYXML_DECLARATION )
140530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
140630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	copy.CopyTo( this );
140730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
140830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
140930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
141030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlDeclaration& TiXmlDeclaration::operator=( const TiXmlDeclaration& copy )
141130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
141230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Clear();
141330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	copy.CopyTo( this );
141430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return *this;
141530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
141630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
141730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
141830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const
141930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
142030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( cfile ) fprintf( cfile, "<?xml " );
142130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( str )	 (*str) += "<?xml ";
142230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
142330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !version.empty() ) {
142430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( cfile ) fprintf (cfile, "version=\"%s\" ", version.c_str ());
142530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( str ) { (*str) += "version=\""; (*str) += version; (*str) += "\" "; }
142630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
142730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !encoding.empty() ) {
142830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( cfile ) fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ());
142930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( str ) { (*str) += "encoding=\""; (*str) += encoding; (*str) += "\" "; }
143030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
143130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !standalone.empty() ) {
143230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( cfile ) fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ());
143330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( str ) { (*str) += "standalone=\""; (*str) += standalone; (*str) += "\" "; }
143430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
143530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( cfile ) fprintf( cfile, "?>" );
143630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( str )	 (*str) += "?>";
143730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
143830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
143930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
144030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const
144130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
144230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode::CopyTo( target );
144330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
144430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->version = version;
144530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->encoding = encoding;
144630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	target->standalone = standalone;
144730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
144830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
144930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
145030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const
145130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
145230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return visitor->Visit( *this );
145330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
145430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
145530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
145630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlDeclaration::Clone() const
145730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
145830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlDeclaration* clone = new TiXmlDeclaration();
145930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
146030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !clone )
146130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
146230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
146330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	CopyTo( clone );
146430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return clone;
146530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
146630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
146730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
146830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlUnknown::Print( FILE* cfile, int depth ) const
146930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
147030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for ( int i=0; i<depth; i++ )
147130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		fprintf( cfile, "    " );
147230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	fprintf( cfile, "<%s>", value.c_str() );
147330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
147430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
147530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
147630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const
147730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
147830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlNode::CopyTo( target );
147930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
148030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
148130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
148230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const
148330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
148430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return visitor->Visit( *this );
148530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
148630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
148730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
148830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlNode* TiXmlUnknown::Clone() const
148930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
149030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlUnknown* clone = new TiXmlUnknown();
149130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
149230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !clone )
149330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return 0;
149430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
149530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	CopyTo( clone );
149630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return clone;
149730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
149830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
149930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
150030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlAttributeSet::TiXmlAttributeSet()
150130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
150230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	sentinel.next = &sentinel;
150330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	sentinel.prev = &sentinel;
150430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
150530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
150630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
150730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlAttributeSet::~TiXmlAttributeSet()
150830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
150930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( sentinel.next == &sentinel );
151030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( sentinel.prev == &sentinel );
151130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
151230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
151330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
151430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlAttributeSet::Add( TiXmlAttribute* addMe )
151530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
151630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    #ifdef TIXML_USE_STL
151730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( !Find( TIXML_STRING( addMe->Name() ) ) );	// Shouldn't be multiply adding to the set.
151830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#else
151930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( !Find( addMe->Name() ) );	// Shouldn't be multiply adding to the set.
152030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#endif
152130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
152230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	addMe->next = &sentinel;
152330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	addMe->prev = sentinel.prev;
152430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
152530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	sentinel.prev->next = addMe;
152630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	sentinel.prev      = addMe;
152730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
152830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
152930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe )
153030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
153130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* node;
153230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
153330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for( node = sentinel.next; node != &sentinel; node = node->next )
153430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
153530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( node == removeMe )
153630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
153730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node->prev->next = node->next;
153830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node->next->prev = node->prev;
153930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node->next = 0;
154030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			node->prev = 0;
154130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return;
154230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
154330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
154430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	assert( 0 );		// we tried to remove a non-linked attribute.
154530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
154630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
154730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
154830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
154930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const
155030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
155130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next )
155230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
155330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( node->name == name )
155430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node;
155530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
155630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
155730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
155830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
155930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const std::string& _name )
156030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
156130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* attrib = Find( _name );
156230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !attrib ) {
156330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib = new TiXmlAttribute();
156430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Add( attrib );
156530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->SetName( _name );
156630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
156730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return attrib;
156830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
156930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
157030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
157130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
157230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const
157330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
157430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next )
157530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
157630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( strcmp( node->name.c_str(), name ) == 0 )
157730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return node;
157830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
157930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return 0;
158030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
158130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
158230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
158330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const char* _name )
158430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
158530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlAttribute* attrib = Find( _name );
158630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !attrib ) {
158730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib = new TiXmlAttribute();
158830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Add( attrib );
158930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->SetName( _name );
159030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
159130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return attrib;
159230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
159330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
159430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
159530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
159630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstd::istream& operator>> (std::istream & in, TiXmlNode & base)
159730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
159830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_STRING tag;
159930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	tag.reserve( 8 * 1000 );
160030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	base.StreamIn( &in, &tag );
160130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
160230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING );
160330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return in;
160430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
160530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
160630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
160730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
160830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef TIXML_USE_STL
160930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstd::ostream& operator<< (std::ostream & out, const TiXmlNode & base)
161030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
161130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlPrinter printer;
161230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	printer.SetStreamPrinting();
161330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	base.Accept( &printer );
161430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	out << printer.Str();
161530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
161630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return out;
161730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
161830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
161930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
162030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstd::string& operator<< (std::string& out, const TiXmlNode& base )
162130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
162230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlPrinter printer;
162330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	printer.SetStreamPrinting();
162430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	base.Accept( &printer );
162530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	out.append( printer.Str() );
162630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
162730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return out;
162830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
162930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
163030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
163130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
163230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlHandle TiXmlHandle::FirstChild() const
163330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
163430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
163530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
163630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlNode* child = node->FirstChild();
163730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( child )
163830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TiXmlHandle( child );
163930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
164030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TiXmlHandle( 0 );
164130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
164230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
164330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
164430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlHandle TiXmlHandle::FirstChild( const char * value ) const
164530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
164630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
164730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
164830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlNode* child = node->FirstChild( value );
164930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( child )
165030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TiXmlHandle( child );
165130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
165230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TiXmlHandle( 0 );
165330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
165430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
165530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
165630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlHandle TiXmlHandle::FirstChildElement() const
165730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
165830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
165930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
166030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlElement* child = node->FirstChildElement();
166130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( child )
166230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TiXmlHandle( child );
166330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
166430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TiXmlHandle( 0 );
166530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
166630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
166730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
166830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const
166930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
167030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
167130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
167230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlElement* child = node->FirstChildElement( value );
167330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( child )
167430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TiXmlHandle( child );
167530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
167630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TiXmlHandle( 0 );
167730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
167830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
167930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
168030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlHandle TiXmlHandle::Child( int count ) const
168130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
168230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
168330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
168430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		int i;
168530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlNode* child = node->FirstChild();
168630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for (	i=0;
168730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				child && i<count;
168830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				child = child->NextSibling(), ++i )
168930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
169030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// nothing
169130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
169230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( child )
169330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TiXmlHandle( child );
169430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
169530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TiXmlHandle( 0 );
169630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
169730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
169830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
169930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlHandle TiXmlHandle::Child( const char* value, int count ) const
170030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
170130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
170230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
170330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		int i;
170430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlNode* child = node->FirstChild( value );
170530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for (	i=0;
170630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				child && i<count;
170730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				child = child->NextSibling( value ), ++i )
170830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
170930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// nothing
171030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
171130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( child )
171230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TiXmlHandle( child );
171330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
171430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TiXmlHandle( 0 );
171530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
171630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
171730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
171830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlHandle TiXmlHandle::ChildElement( int count ) const
171930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
172030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
172130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
172230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		int i;
172330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlElement* child = node->FirstChildElement();
172430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for (	i=0;
172530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				child && i<count;
172630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				child = child->NextSiblingElement(), ++i )
172730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
172830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// nothing
172930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
173030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( child )
173130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TiXmlHandle( child );
173230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
173330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TiXmlHandle( 0 );
173430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
173530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
173630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
173730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const
173830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
173930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( node )
174030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
174130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		int i;
174230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlElement* child = node->FirstChildElement( value );
174330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for (	i=0;
174430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				child && i<count;
174530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun				child = child->NextSiblingElement( value ), ++i )
174630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
174730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// nothing
174830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
174930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( child )
175030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			return TiXmlHandle( child );
175130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
175230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return TiXmlHandle( 0 );
175330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
175430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
175530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
175630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlPrinter::VisitEnter( const TiXmlDocument& )
175730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
175830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return true;
175930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
176030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
176130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlPrinter::VisitExit( const TiXmlDocument& )
176230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
176330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return true;
176430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
176530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
176630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute )
176730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
176830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	DoIndent();
176930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buffer += "<";
177030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buffer += element.Value();
177130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
177230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() )
177330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
177430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += " ";
177530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		attrib->Print( 0, 0, &buffer );
177630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
177730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
177830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !element.FirstChild() )
177930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
178030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += " />";
178130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		DoLineBreak();
178230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
178330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
178430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
178530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += ">";
178630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if (    element.FirstChild()->ToText()
178730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			  && element.LastChild() == element.FirstChild()
178830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			  && element.FirstChild()->ToText()->CDATA() == false )
178930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
179030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			simpleTextPrint = true;
179130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// no DoLineBreak()!
179230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
179330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else
179430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
179530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			DoLineBreak();
179630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
179730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
179830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	++depth;
179930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return true;
180030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
180130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
180230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
180330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlPrinter::VisitExit( const TiXmlElement& element )
180430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
180530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	--depth;
180630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( !element.FirstChild() )
180730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
180830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		// nothing.
180930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
181030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
181130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
181230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if ( simpleTextPrint )
181330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
181430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			simpleTextPrint = false;
181530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
181630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else
181730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
181830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			DoIndent();
181930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
182030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += "</";
182130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += element.Value();
182230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += ">";
182330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		DoLineBreak();
182430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
182530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return true;
182630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
182730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
182830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
182930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlPrinter::Visit( const TiXmlText& text )
183030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
183130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	if ( text.CDATA() )
183230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
183330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		DoIndent();
183430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += "<![CDATA[";
183530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += text.Value();
183630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += "]]>";
183730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		DoLineBreak();
183830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
183930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else if ( simpleTextPrint )
184030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
184130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_STRING str;
184230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlBase::EncodeString( text.ValueTStr(), &str );
184330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += str;
184430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
184530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	else
184630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
184730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		DoIndent();
184830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TIXML_STRING str;
184930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		TiXmlBase::EncodeString( text.ValueTStr(), &str );
185030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		buffer += str;
185130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		DoLineBreak();
185230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
185330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return true;
185430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
185530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
185630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
185730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration )
185830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
185930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	DoIndent();
186030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	declaration.Print( 0, 0, &buffer );
186130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	DoLineBreak();
186230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return true;
186330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
186430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
186530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
186630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlPrinter::Visit( const TiXmlComment& comment )
186730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
186830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	DoIndent();
186930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buffer += "<!--";
187030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buffer += comment.Value();
187130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buffer += "-->";
187230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	DoLineBreak();
187330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return true;
187430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
187530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
187630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
187730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool TiXmlPrinter::Visit( const TiXmlUnknown& unknown )
187830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
187930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	DoIndent();
188030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buffer += "<";
188130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buffer += unknown.Value();
188230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	buffer += ">";
188330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	DoLineBreak();
188430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return true;
188530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
188630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1887