Alexander Steiger / tinyxml
Committer:
steiger
Date:
Sun Nov 21 00:49:17 2010 +0000
Revision:
0:7c97dcef700c

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
steiger 0:7c97dcef700c 1 /*
steiger 0:7c97dcef700c 2 www.sourceforge.net/projects/tinyxml
steiger 0:7c97dcef700c 3 Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)
steiger 0:7c97dcef700c 4
steiger 0:7c97dcef700c 5 This software is provided 'as-is', without any express or implied
steiger 0:7c97dcef700c 6 warranty. In no event will the authors be held liable for any
steiger 0:7c97dcef700c 7 damages arising from the use of this software.
steiger 0:7c97dcef700c 8
steiger 0:7c97dcef700c 9 Permission is granted to anyone to use this software for any
steiger 0:7c97dcef700c 10 purpose, including commercial applications, and to alter it and
steiger 0:7c97dcef700c 11 redistribute it freely, subject to the following restrictions:
steiger 0:7c97dcef700c 12
steiger 0:7c97dcef700c 13 1. The origin of this software must not be misrepresented; you must
steiger 0:7c97dcef700c 14 not claim that you wrote the original software. If you use this
steiger 0:7c97dcef700c 15 software in a product, an acknowledgment in the product documentation
steiger 0:7c97dcef700c 16 would be appreciated but is not required.
steiger 0:7c97dcef700c 17
steiger 0:7c97dcef700c 18 2. Altered source versions must be plainly marked as such, and
steiger 0:7c97dcef700c 19 must not be misrepresented as being the original software.
steiger 0:7c97dcef700c 20
steiger 0:7c97dcef700c 21 3. This notice may not be removed or altered from any source
steiger 0:7c97dcef700c 22 distribution.
steiger 0:7c97dcef700c 23 */
steiger 0:7c97dcef700c 24
steiger 0:7c97dcef700c 25 #include <ctype.h>
steiger 0:7c97dcef700c 26
steiger 0:7c97dcef700c 27 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 28 #include <sstream>
steiger 0:7c97dcef700c 29 #include <iostream>
steiger 0:7c97dcef700c 30 #endif
steiger 0:7c97dcef700c 31
steiger 0:7c97dcef700c 32 #include "tinyxml.h"
steiger 0:7c97dcef700c 33
steiger 0:7c97dcef700c 34 FILE* TiXmlFOpen( const char* filename, const char* mode );
steiger 0:7c97dcef700c 35
steiger 0:7c97dcef700c 36 bool TiXmlBase::condenseWhiteSpace = true;
steiger 0:7c97dcef700c 37
steiger 0:7c97dcef700c 38 // Microsoft compiler security
steiger 0:7c97dcef700c 39 FILE* TiXmlFOpen( const char* filename, const char* mode )
steiger 0:7c97dcef700c 40 {
steiger 0:7c97dcef700c 41 #if defined(_MSC_VER) && (_MSC_VER >= 1400 )
steiger 0:7c97dcef700c 42 FILE* fp = 0;
steiger 0:7c97dcef700c 43 errno_t err = fopen_s( &fp, filename, mode );
steiger 0:7c97dcef700c 44 if ( !err && fp )
steiger 0:7c97dcef700c 45 return fp;
steiger 0:7c97dcef700c 46 return 0;
steiger 0:7c97dcef700c 47 #else
steiger 0:7c97dcef700c 48 return fopen( filename, mode );
steiger 0:7c97dcef700c 49 #endif
steiger 0:7c97dcef700c 50 }
steiger 0:7c97dcef700c 51
steiger 0:7c97dcef700c 52 void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString )
steiger 0:7c97dcef700c 53 {
steiger 0:7c97dcef700c 54 int i=0;
steiger 0:7c97dcef700c 55
steiger 0:7c97dcef700c 56 while( i<(int)str.length() )
steiger 0:7c97dcef700c 57 {
steiger 0:7c97dcef700c 58 unsigned char c = (unsigned char) str[i];
steiger 0:7c97dcef700c 59
steiger 0:7c97dcef700c 60 if ( c == '&'
steiger 0:7c97dcef700c 61 && i < ( (int)str.length() - 2 )
steiger 0:7c97dcef700c 62 && str[i+1] == '#'
steiger 0:7c97dcef700c 63 && str[i+2] == 'x' )
steiger 0:7c97dcef700c 64 {
steiger 0:7c97dcef700c 65 // Hexadecimal character reference.
steiger 0:7c97dcef700c 66 // Pass through unchanged.
steiger 0:7c97dcef700c 67 // &#xA9; -- copyright symbol, for example.
steiger 0:7c97dcef700c 68 //
steiger 0:7c97dcef700c 69 // The -1 is a bug fix from Rob Laveaux. It keeps
steiger 0:7c97dcef700c 70 // an overflow from happening if there is no ';'.
steiger 0:7c97dcef700c 71 // There are actually 2 ways to exit this loop -
steiger 0:7c97dcef700c 72 // while fails (error case) and break (semicolon found).
steiger 0:7c97dcef700c 73 // However, there is no mechanism (currently) for
steiger 0:7c97dcef700c 74 // this function to return an error.
steiger 0:7c97dcef700c 75 while ( i<(int)str.length()-1 )
steiger 0:7c97dcef700c 76 {
steiger 0:7c97dcef700c 77 outString->append( str.c_str() + i, 1 );
steiger 0:7c97dcef700c 78 ++i;
steiger 0:7c97dcef700c 79 if ( str[i] == ';' )
steiger 0:7c97dcef700c 80 break;
steiger 0:7c97dcef700c 81 }
steiger 0:7c97dcef700c 82 }
steiger 0:7c97dcef700c 83 else if ( c == '&' )
steiger 0:7c97dcef700c 84 {
steiger 0:7c97dcef700c 85 outString->append( entity[0].str, entity[0].strLength );
steiger 0:7c97dcef700c 86 ++i;
steiger 0:7c97dcef700c 87 }
steiger 0:7c97dcef700c 88 else if ( c == '<' )
steiger 0:7c97dcef700c 89 {
steiger 0:7c97dcef700c 90 outString->append( entity[1].str, entity[1].strLength );
steiger 0:7c97dcef700c 91 ++i;
steiger 0:7c97dcef700c 92 }
steiger 0:7c97dcef700c 93 else if ( c == '>' )
steiger 0:7c97dcef700c 94 {
steiger 0:7c97dcef700c 95 outString->append( entity[2].str, entity[2].strLength );
steiger 0:7c97dcef700c 96 ++i;
steiger 0:7c97dcef700c 97 }
steiger 0:7c97dcef700c 98 else if ( c == '\"' )
steiger 0:7c97dcef700c 99 {
steiger 0:7c97dcef700c 100 outString->append( entity[3].str, entity[3].strLength );
steiger 0:7c97dcef700c 101 ++i;
steiger 0:7c97dcef700c 102 }
steiger 0:7c97dcef700c 103 else if ( c == '\'' )
steiger 0:7c97dcef700c 104 {
steiger 0:7c97dcef700c 105 outString->append( entity[4].str, entity[4].strLength );
steiger 0:7c97dcef700c 106 ++i;
steiger 0:7c97dcef700c 107 }
steiger 0:7c97dcef700c 108 else if ( c < 32 )
steiger 0:7c97dcef700c 109 {
steiger 0:7c97dcef700c 110 // Easy pass at non-alpha/numeric/symbol
steiger 0:7c97dcef700c 111 // Below 32 is symbolic.
steiger 0:7c97dcef700c 112 char buf[ 32 ];
steiger 0:7c97dcef700c 113
steiger 0:7c97dcef700c 114 #if defined(TIXML_SNPRINTF)
steiger 0:7c97dcef700c 115 TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) );
steiger 0:7c97dcef700c 116 #else
steiger 0:7c97dcef700c 117 sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) );
steiger 0:7c97dcef700c 118 #endif
steiger 0:7c97dcef700c 119
steiger 0:7c97dcef700c 120 //*ME: warning C4267: convert 'size_t' to 'int'
steiger 0:7c97dcef700c 121 //*ME: Int-Cast to make compiler happy ...
steiger 0:7c97dcef700c 122 outString->append( buf, (int)strlen( buf ) );
steiger 0:7c97dcef700c 123 ++i;
steiger 0:7c97dcef700c 124 }
steiger 0:7c97dcef700c 125 else
steiger 0:7c97dcef700c 126 {
steiger 0:7c97dcef700c 127 //char realc = (char) c;
steiger 0:7c97dcef700c 128 //outString->append( &realc, 1 );
steiger 0:7c97dcef700c 129 *outString += (char) c; // somewhat more efficient function call.
steiger 0:7c97dcef700c 130 ++i;
steiger 0:7c97dcef700c 131 }
steiger 0:7c97dcef700c 132 }
steiger 0:7c97dcef700c 133 }
steiger 0:7c97dcef700c 134
steiger 0:7c97dcef700c 135
steiger 0:7c97dcef700c 136 TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase()
steiger 0:7c97dcef700c 137 {
steiger 0:7c97dcef700c 138 parent = 0;
steiger 0:7c97dcef700c 139 type = _type;
steiger 0:7c97dcef700c 140 firstChild = 0;
steiger 0:7c97dcef700c 141 lastChild = 0;
steiger 0:7c97dcef700c 142 prev = 0;
steiger 0:7c97dcef700c 143 next = 0;
steiger 0:7c97dcef700c 144 }
steiger 0:7c97dcef700c 145
steiger 0:7c97dcef700c 146
steiger 0:7c97dcef700c 147 TiXmlNode::~TiXmlNode()
steiger 0:7c97dcef700c 148 {
steiger 0:7c97dcef700c 149 TiXmlNode* node = firstChild;
steiger 0:7c97dcef700c 150 TiXmlNode* temp = 0;
steiger 0:7c97dcef700c 151
steiger 0:7c97dcef700c 152 while ( node )
steiger 0:7c97dcef700c 153 {
steiger 0:7c97dcef700c 154 temp = node;
steiger 0:7c97dcef700c 155 node = node->next;
steiger 0:7c97dcef700c 156 delete temp;
steiger 0:7c97dcef700c 157 }
steiger 0:7c97dcef700c 158 }
steiger 0:7c97dcef700c 159
steiger 0:7c97dcef700c 160
steiger 0:7c97dcef700c 161 void TiXmlNode::CopyTo( TiXmlNode* target ) const
steiger 0:7c97dcef700c 162 {
steiger 0:7c97dcef700c 163 target->SetValue (value.c_str() );
steiger 0:7c97dcef700c 164 target->userData = userData;
steiger 0:7c97dcef700c 165 target->location = location;
steiger 0:7c97dcef700c 166 }
steiger 0:7c97dcef700c 167
steiger 0:7c97dcef700c 168
steiger 0:7c97dcef700c 169 void TiXmlNode::Clear()
steiger 0:7c97dcef700c 170 {
steiger 0:7c97dcef700c 171 TiXmlNode* node = firstChild;
steiger 0:7c97dcef700c 172 TiXmlNode* temp = 0;
steiger 0:7c97dcef700c 173
steiger 0:7c97dcef700c 174 while ( node )
steiger 0:7c97dcef700c 175 {
steiger 0:7c97dcef700c 176 temp = node;
steiger 0:7c97dcef700c 177 node = node->next;
steiger 0:7c97dcef700c 178 delete temp;
steiger 0:7c97dcef700c 179 }
steiger 0:7c97dcef700c 180
steiger 0:7c97dcef700c 181 firstChild = 0;
steiger 0:7c97dcef700c 182 lastChild = 0;
steiger 0:7c97dcef700c 183 }
steiger 0:7c97dcef700c 184
steiger 0:7c97dcef700c 185
steiger 0:7c97dcef700c 186 TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )
steiger 0:7c97dcef700c 187 {
steiger 0:7c97dcef700c 188 assert( node->parent == 0 || node->parent == this );
steiger 0:7c97dcef700c 189 assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() );
steiger 0:7c97dcef700c 190
steiger 0:7c97dcef700c 191 if ( node->Type() == TiXmlNode::TINYXML_DOCUMENT )
steiger 0:7c97dcef700c 192 {
steiger 0:7c97dcef700c 193 delete node;
steiger 0:7c97dcef700c 194 if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
steiger 0:7c97dcef700c 195 return 0;
steiger 0:7c97dcef700c 196 }
steiger 0:7c97dcef700c 197
steiger 0:7c97dcef700c 198 node->parent = this;
steiger 0:7c97dcef700c 199
steiger 0:7c97dcef700c 200 node->prev = lastChild;
steiger 0:7c97dcef700c 201 node->next = 0;
steiger 0:7c97dcef700c 202
steiger 0:7c97dcef700c 203 if ( lastChild )
steiger 0:7c97dcef700c 204 lastChild->next = node;
steiger 0:7c97dcef700c 205 else
steiger 0:7c97dcef700c 206 firstChild = node; // it was an empty list.
steiger 0:7c97dcef700c 207
steiger 0:7c97dcef700c 208 lastChild = node;
steiger 0:7c97dcef700c 209 return node;
steiger 0:7c97dcef700c 210 }
steiger 0:7c97dcef700c 211
steiger 0:7c97dcef700c 212
steiger 0:7c97dcef700c 213 TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis )
steiger 0:7c97dcef700c 214 {
steiger 0:7c97dcef700c 215 if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )
steiger 0:7c97dcef700c 216 {
steiger 0:7c97dcef700c 217 if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
steiger 0:7c97dcef700c 218 return 0;
steiger 0:7c97dcef700c 219 }
steiger 0:7c97dcef700c 220 TiXmlNode* node = addThis.Clone();
steiger 0:7c97dcef700c 221 if ( !node )
steiger 0:7c97dcef700c 222 return 0;
steiger 0:7c97dcef700c 223
steiger 0:7c97dcef700c 224 return LinkEndChild( node );
steiger 0:7c97dcef700c 225 }
steiger 0:7c97dcef700c 226
steiger 0:7c97dcef700c 227
steiger 0:7c97dcef700c 228 TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis )
steiger 0:7c97dcef700c 229 {
steiger 0:7c97dcef700c 230 if ( !beforeThis || beforeThis->parent != this ) {
steiger 0:7c97dcef700c 231 return 0;
steiger 0:7c97dcef700c 232 }
steiger 0:7c97dcef700c 233 if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )
steiger 0:7c97dcef700c 234 {
steiger 0:7c97dcef700c 235 if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
steiger 0:7c97dcef700c 236 return 0;
steiger 0:7c97dcef700c 237 }
steiger 0:7c97dcef700c 238
steiger 0:7c97dcef700c 239 TiXmlNode* node = addThis.Clone();
steiger 0:7c97dcef700c 240 if ( !node )
steiger 0:7c97dcef700c 241 return 0;
steiger 0:7c97dcef700c 242 node->parent = this;
steiger 0:7c97dcef700c 243
steiger 0:7c97dcef700c 244 node->next = beforeThis;
steiger 0:7c97dcef700c 245 node->prev = beforeThis->prev;
steiger 0:7c97dcef700c 246 if ( beforeThis->prev )
steiger 0:7c97dcef700c 247 {
steiger 0:7c97dcef700c 248 beforeThis->prev->next = node;
steiger 0:7c97dcef700c 249 }
steiger 0:7c97dcef700c 250 else
steiger 0:7c97dcef700c 251 {
steiger 0:7c97dcef700c 252 assert( firstChild == beforeThis );
steiger 0:7c97dcef700c 253 firstChild = node;
steiger 0:7c97dcef700c 254 }
steiger 0:7c97dcef700c 255 beforeThis->prev = node;
steiger 0:7c97dcef700c 256 return node;
steiger 0:7c97dcef700c 257 }
steiger 0:7c97dcef700c 258
steiger 0:7c97dcef700c 259
steiger 0:7c97dcef700c 260 TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis )
steiger 0:7c97dcef700c 261 {
steiger 0:7c97dcef700c 262 if ( !afterThis || afterThis->parent != this ) {
steiger 0:7c97dcef700c 263 return 0;
steiger 0:7c97dcef700c 264 }
steiger 0:7c97dcef700c 265 if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT )
steiger 0:7c97dcef700c 266 {
steiger 0:7c97dcef700c 267 if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
steiger 0:7c97dcef700c 268 return 0;
steiger 0:7c97dcef700c 269 }
steiger 0:7c97dcef700c 270
steiger 0:7c97dcef700c 271 TiXmlNode* node = addThis.Clone();
steiger 0:7c97dcef700c 272 if ( !node )
steiger 0:7c97dcef700c 273 return 0;
steiger 0:7c97dcef700c 274 node->parent = this;
steiger 0:7c97dcef700c 275
steiger 0:7c97dcef700c 276 node->prev = afterThis;
steiger 0:7c97dcef700c 277 node->next = afterThis->next;
steiger 0:7c97dcef700c 278 if ( afterThis->next )
steiger 0:7c97dcef700c 279 {
steiger 0:7c97dcef700c 280 afterThis->next->prev = node;
steiger 0:7c97dcef700c 281 }
steiger 0:7c97dcef700c 282 else
steiger 0:7c97dcef700c 283 {
steiger 0:7c97dcef700c 284 assert( lastChild == afterThis );
steiger 0:7c97dcef700c 285 lastChild = node;
steiger 0:7c97dcef700c 286 }
steiger 0:7c97dcef700c 287 afterThis->next = node;
steiger 0:7c97dcef700c 288 return node;
steiger 0:7c97dcef700c 289 }
steiger 0:7c97dcef700c 290
steiger 0:7c97dcef700c 291
steiger 0:7c97dcef700c 292 TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis )
steiger 0:7c97dcef700c 293 {
steiger 0:7c97dcef700c 294 if ( !replaceThis )
steiger 0:7c97dcef700c 295 return 0;
steiger 0:7c97dcef700c 296
steiger 0:7c97dcef700c 297 if ( replaceThis->parent != this )
steiger 0:7c97dcef700c 298 return 0;
steiger 0:7c97dcef700c 299
steiger 0:7c97dcef700c 300 if ( withThis.ToDocument() ) {
steiger 0:7c97dcef700c 301 // A document can never be a child. Thanks to Noam.
steiger 0:7c97dcef700c 302 TiXmlDocument* document = GetDocument();
steiger 0:7c97dcef700c 303 if ( document )
steiger 0:7c97dcef700c 304 document->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
steiger 0:7c97dcef700c 305 return 0;
steiger 0:7c97dcef700c 306 }
steiger 0:7c97dcef700c 307
steiger 0:7c97dcef700c 308 TiXmlNode* node = withThis.Clone();
steiger 0:7c97dcef700c 309 if ( !node )
steiger 0:7c97dcef700c 310 return 0;
steiger 0:7c97dcef700c 311
steiger 0:7c97dcef700c 312 node->next = replaceThis->next;
steiger 0:7c97dcef700c 313 node->prev = replaceThis->prev;
steiger 0:7c97dcef700c 314
steiger 0:7c97dcef700c 315 if ( replaceThis->next )
steiger 0:7c97dcef700c 316 replaceThis->next->prev = node;
steiger 0:7c97dcef700c 317 else
steiger 0:7c97dcef700c 318 lastChild = node;
steiger 0:7c97dcef700c 319
steiger 0:7c97dcef700c 320 if ( replaceThis->prev )
steiger 0:7c97dcef700c 321 replaceThis->prev->next = node;
steiger 0:7c97dcef700c 322 else
steiger 0:7c97dcef700c 323 firstChild = node;
steiger 0:7c97dcef700c 324
steiger 0:7c97dcef700c 325 delete replaceThis;
steiger 0:7c97dcef700c 326 node->parent = this;
steiger 0:7c97dcef700c 327 return node;
steiger 0:7c97dcef700c 328 }
steiger 0:7c97dcef700c 329
steiger 0:7c97dcef700c 330
steiger 0:7c97dcef700c 331 bool TiXmlNode::RemoveChild( TiXmlNode* removeThis )
steiger 0:7c97dcef700c 332 {
steiger 0:7c97dcef700c 333 if ( !removeThis ) {
steiger 0:7c97dcef700c 334 return false;
steiger 0:7c97dcef700c 335 }
steiger 0:7c97dcef700c 336
steiger 0:7c97dcef700c 337 if ( removeThis->parent != this )
steiger 0:7c97dcef700c 338 {
steiger 0:7c97dcef700c 339 assert( 0 );
steiger 0:7c97dcef700c 340 return false;
steiger 0:7c97dcef700c 341 }
steiger 0:7c97dcef700c 342
steiger 0:7c97dcef700c 343 if ( removeThis->next )
steiger 0:7c97dcef700c 344 removeThis->next->prev = removeThis->prev;
steiger 0:7c97dcef700c 345 else
steiger 0:7c97dcef700c 346 lastChild = removeThis->prev;
steiger 0:7c97dcef700c 347
steiger 0:7c97dcef700c 348 if ( removeThis->prev )
steiger 0:7c97dcef700c 349 removeThis->prev->next = removeThis->next;
steiger 0:7c97dcef700c 350 else
steiger 0:7c97dcef700c 351 firstChild = removeThis->next;
steiger 0:7c97dcef700c 352
steiger 0:7c97dcef700c 353 delete removeThis;
steiger 0:7c97dcef700c 354 return true;
steiger 0:7c97dcef700c 355 }
steiger 0:7c97dcef700c 356
steiger 0:7c97dcef700c 357 const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const
steiger 0:7c97dcef700c 358 {
steiger 0:7c97dcef700c 359 const TiXmlNode* node;
steiger 0:7c97dcef700c 360 for ( node = firstChild; node; node = node->next )
steiger 0:7c97dcef700c 361 {
steiger 0:7c97dcef700c 362 if ( strcmp( node->Value(), _value ) == 0 )
steiger 0:7c97dcef700c 363 return node;
steiger 0:7c97dcef700c 364 }
steiger 0:7c97dcef700c 365 return 0;
steiger 0:7c97dcef700c 366 }
steiger 0:7c97dcef700c 367
steiger 0:7c97dcef700c 368
steiger 0:7c97dcef700c 369 const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const
steiger 0:7c97dcef700c 370 {
steiger 0:7c97dcef700c 371 const TiXmlNode* node;
steiger 0:7c97dcef700c 372 for ( node = lastChild; node; node = node->prev )
steiger 0:7c97dcef700c 373 {
steiger 0:7c97dcef700c 374 if ( strcmp( node->Value(), _value ) == 0 )
steiger 0:7c97dcef700c 375 return node;
steiger 0:7c97dcef700c 376 }
steiger 0:7c97dcef700c 377 return 0;
steiger 0:7c97dcef700c 378 }
steiger 0:7c97dcef700c 379
steiger 0:7c97dcef700c 380
steiger 0:7c97dcef700c 381 const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const
steiger 0:7c97dcef700c 382 {
steiger 0:7c97dcef700c 383 if ( !previous )
steiger 0:7c97dcef700c 384 {
steiger 0:7c97dcef700c 385 return FirstChild();
steiger 0:7c97dcef700c 386 }
steiger 0:7c97dcef700c 387 else
steiger 0:7c97dcef700c 388 {
steiger 0:7c97dcef700c 389 assert( previous->parent == this );
steiger 0:7c97dcef700c 390 return previous->NextSibling();
steiger 0:7c97dcef700c 391 }
steiger 0:7c97dcef700c 392 }
steiger 0:7c97dcef700c 393
steiger 0:7c97dcef700c 394
steiger 0:7c97dcef700c 395 const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const
steiger 0:7c97dcef700c 396 {
steiger 0:7c97dcef700c 397 if ( !previous )
steiger 0:7c97dcef700c 398 {
steiger 0:7c97dcef700c 399 return FirstChild( val );
steiger 0:7c97dcef700c 400 }
steiger 0:7c97dcef700c 401 else
steiger 0:7c97dcef700c 402 {
steiger 0:7c97dcef700c 403 assert( previous->parent == this );
steiger 0:7c97dcef700c 404 return previous->NextSibling( val );
steiger 0:7c97dcef700c 405 }
steiger 0:7c97dcef700c 406 }
steiger 0:7c97dcef700c 407
steiger 0:7c97dcef700c 408
steiger 0:7c97dcef700c 409 const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const
steiger 0:7c97dcef700c 410 {
steiger 0:7c97dcef700c 411 const TiXmlNode* node;
steiger 0:7c97dcef700c 412 for ( node = next; node; node = node->next )
steiger 0:7c97dcef700c 413 {
steiger 0:7c97dcef700c 414 if ( strcmp( node->Value(), _value ) == 0 )
steiger 0:7c97dcef700c 415 return node;
steiger 0:7c97dcef700c 416 }
steiger 0:7c97dcef700c 417 return 0;
steiger 0:7c97dcef700c 418 }
steiger 0:7c97dcef700c 419
steiger 0:7c97dcef700c 420
steiger 0:7c97dcef700c 421 const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const
steiger 0:7c97dcef700c 422 {
steiger 0:7c97dcef700c 423 const TiXmlNode* node;
steiger 0:7c97dcef700c 424 for ( node = prev; node; node = node->prev )
steiger 0:7c97dcef700c 425 {
steiger 0:7c97dcef700c 426 if ( strcmp( node->Value(), _value ) == 0 )
steiger 0:7c97dcef700c 427 return node;
steiger 0:7c97dcef700c 428 }
steiger 0:7c97dcef700c 429 return 0;
steiger 0:7c97dcef700c 430 }
steiger 0:7c97dcef700c 431
steiger 0:7c97dcef700c 432
steiger 0:7c97dcef700c 433 void TiXmlElement::RemoveAttribute( const char * name )
steiger 0:7c97dcef700c 434 {
steiger 0:7c97dcef700c 435 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 436 TIXML_STRING str( name );
steiger 0:7c97dcef700c 437 TiXmlAttribute* node = attributeSet.Find( str );
steiger 0:7c97dcef700c 438 #else
steiger 0:7c97dcef700c 439 TiXmlAttribute* node = attributeSet.Find( name );
steiger 0:7c97dcef700c 440 #endif
steiger 0:7c97dcef700c 441 if ( node )
steiger 0:7c97dcef700c 442 {
steiger 0:7c97dcef700c 443 attributeSet.Remove( node );
steiger 0:7c97dcef700c 444 delete node;
steiger 0:7c97dcef700c 445 }
steiger 0:7c97dcef700c 446 }
steiger 0:7c97dcef700c 447
steiger 0:7c97dcef700c 448 const TiXmlElement* TiXmlNode::FirstChildElement() const
steiger 0:7c97dcef700c 449 {
steiger 0:7c97dcef700c 450 const TiXmlNode* node;
steiger 0:7c97dcef700c 451
steiger 0:7c97dcef700c 452 for ( node = FirstChild();
steiger 0:7c97dcef700c 453 node;
steiger 0:7c97dcef700c 454 node = node->NextSibling() )
steiger 0:7c97dcef700c 455 {
steiger 0:7c97dcef700c 456 if ( node->ToElement() )
steiger 0:7c97dcef700c 457 return node->ToElement();
steiger 0:7c97dcef700c 458 }
steiger 0:7c97dcef700c 459 return 0;
steiger 0:7c97dcef700c 460 }
steiger 0:7c97dcef700c 461
steiger 0:7c97dcef700c 462
steiger 0:7c97dcef700c 463 const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const
steiger 0:7c97dcef700c 464 {
steiger 0:7c97dcef700c 465 const TiXmlNode* node;
steiger 0:7c97dcef700c 466
steiger 0:7c97dcef700c 467 for ( node = FirstChild( _value );
steiger 0:7c97dcef700c 468 node;
steiger 0:7c97dcef700c 469 node = node->NextSibling( _value ) )
steiger 0:7c97dcef700c 470 {
steiger 0:7c97dcef700c 471 if ( node->ToElement() )
steiger 0:7c97dcef700c 472 return node->ToElement();
steiger 0:7c97dcef700c 473 }
steiger 0:7c97dcef700c 474 return 0;
steiger 0:7c97dcef700c 475 }
steiger 0:7c97dcef700c 476
steiger 0:7c97dcef700c 477
steiger 0:7c97dcef700c 478 const TiXmlElement* TiXmlNode::NextSiblingElement() const
steiger 0:7c97dcef700c 479 {
steiger 0:7c97dcef700c 480 const TiXmlNode* node;
steiger 0:7c97dcef700c 481
steiger 0:7c97dcef700c 482 for ( node = NextSibling();
steiger 0:7c97dcef700c 483 node;
steiger 0:7c97dcef700c 484 node = node->NextSibling() )
steiger 0:7c97dcef700c 485 {
steiger 0:7c97dcef700c 486 if ( node->ToElement() )
steiger 0:7c97dcef700c 487 return node->ToElement();
steiger 0:7c97dcef700c 488 }
steiger 0:7c97dcef700c 489 return 0;
steiger 0:7c97dcef700c 490 }
steiger 0:7c97dcef700c 491
steiger 0:7c97dcef700c 492
steiger 0:7c97dcef700c 493 const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const
steiger 0:7c97dcef700c 494 {
steiger 0:7c97dcef700c 495 const TiXmlNode* node;
steiger 0:7c97dcef700c 496
steiger 0:7c97dcef700c 497 for ( node = NextSibling( _value );
steiger 0:7c97dcef700c 498 node;
steiger 0:7c97dcef700c 499 node = node->NextSibling( _value ) )
steiger 0:7c97dcef700c 500 {
steiger 0:7c97dcef700c 501 if ( node->ToElement() )
steiger 0:7c97dcef700c 502 return node->ToElement();
steiger 0:7c97dcef700c 503 }
steiger 0:7c97dcef700c 504 return 0;
steiger 0:7c97dcef700c 505 }
steiger 0:7c97dcef700c 506
steiger 0:7c97dcef700c 507
steiger 0:7c97dcef700c 508 const TiXmlDocument* TiXmlNode::GetDocument() const
steiger 0:7c97dcef700c 509 {
steiger 0:7c97dcef700c 510 const TiXmlNode* node;
steiger 0:7c97dcef700c 511
steiger 0:7c97dcef700c 512 for( node = this; node; node = node->parent )
steiger 0:7c97dcef700c 513 {
steiger 0:7c97dcef700c 514 if ( node->ToDocument() )
steiger 0:7c97dcef700c 515 return node->ToDocument();
steiger 0:7c97dcef700c 516 }
steiger 0:7c97dcef700c 517 return 0;
steiger 0:7c97dcef700c 518 }
steiger 0:7c97dcef700c 519
steiger 0:7c97dcef700c 520
steiger 0:7c97dcef700c 521 TiXmlElement::TiXmlElement (const char * _value)
steiger 0:7c97dcef700c 522 : TiXmlNode( TiXmlNode::TINYXML_ELEMENT )
steiger 0:7c97dcef700c 523 {
steiger 0:7c97dcef700c 524 firstChild = lastChild = 0;
steiger 0:7c97dcef700c 525 value = _value;
steiger 0:7c97dcef700c 526 }
steiger 0:7c97dcef700c 527
steiger 0:7c97dcef700c 528
steiger 0:7c97dcef700c 529 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 530 TiXmlElement::TiXmlElement( const std::string& _value )
steiger 0:7c97dcef700c 531 : TiXmlNode( TiXmlNode::TINYXML_ELEMENT )
steiger 0:7c97dcef700c 532 {
steiger 0:7c97dcef700c 533 firstChild = lastChild = 0;
steiger 0:7c97dcef700c 534 value = _value;
steiger 0:7c97dcef700c 535 }
steiger 0:7c97dcef700c 536 #endif
steiger 0:7c97dcef700c 537
steiger 0:7c97dcef700c 538
steiger 0:7c97dcef700c 539 TiXmlElement::TiXmlElement( const TiXmlElement& copy)
steiger 0:7c97dcef700c 540 : TiXmlNode( TiXmlNode::TINYXML_ELEMENT )
steiger 0:7c97dcef700c 541 {
steiger 0:7c97dcef700c 542 firstChild = lastChild = 0;
steiger 0:7c97dcef700c 543 copy.CopyTo( this );
steiger 0:7c97dcef700c 544 }
steiger 0:7c97dcef700c 545
steiger 0:7c97dcef700c 546
steiger 0:7c97dcef700c 547 void TiXmlElement::operator=( const TiXmlElement& base )
steiger 0:7c97dcef700c 548 {
steiger 0:7c97dcef700c 549 ClearThis();
steiger 0:7c97dcef700c 550 base.CopyTo( this );
steiger 0:7c97dcef700c 551 }
steiger 0:7c97dcef700c 552
steiger 0:7c97dcef700c 553
steiger 0:7c97dcef700c 554 TiXmlElement::~TiXmlElement()
steiger 0:7c97dcef700c 555 {
steiger 0:7c97dcef700c 556 ClearThis();
steiger 0:7c97dcef700c 557 }
steiger 0:7c97dcef700c 558
steiger 0:7c97dcef700c 559
steiger 0:7c97dcef700c 560 void TiXmlElement::ClearThis()
steiger 0:7c97dcef700c 561 {
steiger 0:7c97dcef700c 562 Clear();
steiger 0:7c97dcef700c 563 while( attributeSet.First() )
steiger 0:7c97dcef700c 564 {
steiger 0:7c97dcef700c 565 TiXmlAttribute* node = attributeSet.First();
steiger 0:7c97dcef700c 566 attributeSet.Remove( node );
steiger 0:7c97dcef700c 567 delete node;
steiger 0:7c97dcef700c 568 }
steiger 0:7c97dcef700c 569 }
steiger 0:7c97dcef700c 570
steiger 0:7c97dcef700c 571
steiger 0:7c97dcef700c 572 const char* TiXmlElement::Attribute( const char* name ) const
steiger 0:7c97dcef700c 573 {
steiger 0:7c97dcef700c 574 const TiXmlAttribute* node = attributeSet.Find( name );
steiger 0:7c97dcef700c 575 if ( node )
steiger 0:7c97dcef700c 576 return node->Value();
steiger 0:7c97dcef700c 577 return 0;
steiger 0:7c97dcef700c 578 }
steiger 0:7c97dcef700c 579
steiger 0:7c97dcef700c 580
steiger 0:7c97dcef700c 581 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 582 const std::string* TiXmlElement::Attribute( const std::string& name ) const
steiger 0:7c97dcef700c 583 {
steiger 0:7c97dcef700c 584 const TiXmlAttribute* attrib = attributeSet.Find( name );
steiger 0:7c97dcef700c 585 if ( attrib )
steiger 0:7c97dcef700c 586 return &attrib->ValueStr();
steiger 0:7c97dcef700c 587 return 0;
steiger 0:7c97dcef700c 588 }
steiger 0:7c97dcef700c 589 #endif
steiger 0:7c97dcef700c 590
steiger 0:7c97dcef700c 591
steiger 0:7c97dcef700c 592 const char* TiXmlElement::Attribute( const char* name, int* i ) const
steiger 0:7c97dcef700c 593 {
steiger 0:7c97dcef700c 594 const TiXmlAttribute* attrib = attributeSet.Find( name );
steiger 0:7c97dcef700c 595 const char* result = 0;
steiger 0:7c97dcef700c 596
steiger 0:7c97dcef700c 597 if ( attrib ) {
steiger 0:7c97dcef700c 598 result = attrib->Value();
steiger 0:7c97dcef700c 599 if ( i ) {
steiger 0:7c97dcef700c 600 attrib->QueryIntValue( i );
steiger 0:7c97dcef700c 601 }
steiger 0:7c97dcef700c 602 }
steiger 0:7c97dcef700c 603 return result;
steiger 0:7c97dcef700c 604 }
steiger 0:7c97dcef700c 605
steiger 0:7c97dcef700c 606
steiger 0:7c97dcef700c 607 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 608 const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const
steiger 0:7c97dcef700c 609 {
steiger 0:7c97dcef700c 610 const TiXmlAttribute* attrib = attributeSet.Find( name );
steiger 0:7c97dcef700c 611 const std::string* result = 0;
steiger 0:7c97dcef700c 612
steiger 0:7c97dcef700c 613 if ( attrib ) {
steiger 0:7c97dcef700c 614 result = &attrib->ValueStr();
steiger 0:7c97dcef700c 615 if ( i ) {
steiger 0:7c97dcef700c 616 attrib->QueryIntValue( i );
steiger 0:7c97dcef700c 617 }
steiger 0:7c97dcef700c 618 }
steiger 0:7c97dcef700c 619 return result;
steiger 0:7c97dcef700c 620 }
steiger 0:7c97dcef700c 621 #endif
steiger 0:7c97dcef700c 622
steiger 0:7c97dcef700c 623
steiger 0:7c97dcef700c 624 const char* TiXmlElement::Attribute( const char* name, double* d ) const
steiger 0:7c97dcef700c 625 {
steiger 0:7c97dcef700c 626 const TiXmlAttribute* attrib = attributeSet.Find( name );
steiger 0:7c97dcef700c 627 const char* result = 0;
steiger 0:7c97dcef700c 628
steiger 0:7c97dcef700c 629 if ( attrib ) {
steiger 0:7c97dcef700c 630 result = attrib->Value();
steiger 0:7c97dcef700c 631 if ( d ) {
steiger 0:7c97dcef700c 632 attrib->QueryDoubleValue( d );
steiger 0:7c97dcef700c 633 }
steiger 0:7c97dcef700c 634 }
steiger 0:7c97dcef700c 635 return result;
steiger 0:7c97dcef700c 636 }
steiger 0:7c97dcef700c 637
steiger 0:7c97dcef700c 638
steiger 0:7c97dcef700c 639 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 640 const std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const
steiger 0:7c97dcef700c 641 {
steiger 0:7c97dcef700c 642 const TiXmlAttribute* attrib = attributeSet.Find( name );
steiger 0:7c97dcef700c 643 const std::string* result = 0;
steiger 0:7c97dcef700c 644
steiger 0:7c97dcef700c 645 if ( attrib ) {
steiger 0:7c97dcef700c 646 result = &attrib->ValueStr();
steiger 0:7c97dcef700c 647 if ( d ) {
steiger 0:7c97dcef700c 648 attrib->QueryDoubleValue( d );
steiger 0:7c97dcef700c 649 }
steiger 0:7c97dcef700c 650 }
steiger 0:7c97dcef700c 651 return result;
steiger 0:7c97dcef700c 652 }
steiger 0:7c97dcef700c 653 #endif
steiger 0:7c97dcef700c 654
steiger 0:7c97dcef700c 655
steiger 0:7c97dcef700c 656 int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const
steiger 0:7c97dcef700c 657 {
steiger 0:7c97dcef700c 658 const TiXmlAttribute* attrib = attributeSet.Find( name );
steiger 0:7c97dcef700c 659 if ( !attrib )
steiger 0:7c97dcef700c 660 return TIXML_NO_ATTRIBUTE;
steiger 0:7c97dcef700c 661 return attrib->QueryIntValue( ival );
steiger 0:7c97dcef700c 662 }
steiger 0:7c97dcef700c 663
steiger 0:7c97dcef700c 664
steiger 0:7c97dcef700c 665 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 666 int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const
steiger 0:7c97dcef700c 667 {
steiger 0:7c97dcef700c 668 const TiXmlAttribute* attrib = attributeSet.Find( name );
steiger 0:7c97dcef700c 669 if ( !attrib )
steiger 0:7c97dcef700c 670 return TIXML_NO_ATTRIBUTE;
steiger 0:7c97dcef700c 671 return attrib->QueryIntValue( ival );
steiger 0:7c97dcef700c 672 }
steiger 0:7c97dcef700c 673 #endif
steiger 0:7c97dcef700c 674
steiger 0:7c97dcef700c 675
steiger 0:7c97dcef700c 676 int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const
steiger 0:7c97dcef700c 677 {
steiger 0:7c97dcef700c 678 const TiXmlAttribute* attrib = attributeSet.Find( name );
steiger 0:7c97dcef700c 679 if ( !attrib )
steiger 0:7c97dcef700c 680 return TIXML_NO_ATTRIBUTE;
steiger 0:7c97dcef700c 681 return attrib->QueryDoubleValue( dval );
steiger 0:7c97dcef700c 682 }
steiger 0:7c97dcef700c 683
steiger 0:7c97dcef700c 684
steiger 0:7c97dcef700c 685 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 686 int TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const
steiger 0:7c97dcef700c 687 {
steiger 0:7c97dcef700c 688 const TiXmlAttribute* attrib = attributeSet.Find( name );
steiger 0:7c97dcef700c 689 if ( !attrib )
steiger 0:7c97dcef700c 690 return TIXML_NO_ATTRIBUTE;
steiger 0:7c97dcef700c 691 return attrib->QueryDoubleValue( dval );
steiger 0:7c97dcef700c 692 }
steiger 0:7c97dcef700c 693 #endif
steiger 0:7c97dcef700c 694
steiger 0:7c97dcef700c 695
steiger 0:7c97dcef700c 696 void TiXmlElement::SetAttribute( const char * name, int val )
steiger 0:7c97dcef700c 697 {
steiger 0:7c97dcef700c 698 TiXmlAttribute* attrib = attributeSet.FindOrCreate( name );
steiger 0:7c97dcef700c 699 if ( attrib ) {
steiger 0:7c97dcef700c 700 attrib->SetIntValue( val );
steiger 0:7c97dcef700c 701 }
steiger 0:7c97dcef700c 702 }
steiger 0:7c97dcef700c 703
steiger 0:7c97dcef700c 704
steiger 0:7c97dcef700c 705 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 706 void TiXmlElement::SetAttribute( const std::string& name, int val )
steiger 0:7c97dcef700c 707 {
steiger 0:7c97dcef700c 708 TiXmlAttribute* attrib = attributeSet.FindOrCreate( name );
steiger 0:7c97dcef700c 709 if ( attrib ) {
steiger 0:7c97dcef700c 710 attrib->SetIntValue( val );
steiger 0:7c97dcef700c 711 }
steiger 0:7c97dcef700c 712 }
steiger 0:7c97dcef700c 713 #endif
steiger 0:7c97dcef700c 714
steiger 0:7c97dcef700c 715
steiger 0:7c97dcef700c 716 void TiXmlElement::SetDoubleAttribute( const char * name, double val )
steiger 0:7c97dcef700c 717 {
steiger 0:7c97dcef700c 718 TiXmlAttribute* attrib = attributeSet.FindOrCreate( name );
steiger 0:7c97dcef700c 719 if ( attrib ) {
steiger 0:7c97dcef700c 720 attrib->SetDoubleValue( val );
steiger 0:7c97dcef700c 721 }
steiger 0:7c97dcef700c 722 }
steiger 0:7c97dcef700c 723
steiger 0:7c97dcef700c 724
steiger 0:7c97dcef700c 725 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 726 void TiXmlElement::SetDoubleAttribute( const std::string& name, double val )
steiger 0:7c97dcef700c 727 {
steiger 0:7c97dcef700c 728 TiXmlAttribute* attrib = attributeSet.FindOrCreate( name );
steiger 0:7c97dcef700c 729 if ( attrib ) {
steiger 0:7c97dcef700c 730 attrib->SetDoubleValue( val );
steiger 0:7c97dcef700c 731 }
steiger 0:7c97dcef700c 732 }
steiger 0:7c97dcef700c 733 #endif
steiger 0:7c97dcef700c 734
steiger 0:7c97dcef700c 735
steiger 0:7c97dcef700c 736 void TiXmlElement::SetAttribute( const char * cname, const char * cvalue )
steiger 0:7c97dcef700c 737 {
steiger 0:7c97dcef700c 738 TiXmlAttribute* attrib = attributeSet.FindOrCreate( cname );
steiger 0:7c97dcef700c 739 if ( attrib ) {
steiger 0:7c97dcef700c 740 attrib->SetValue( cvalue );
steiger 0:7c97dcef700c 741 }
steiger 0:7c97dcef700c 742 }
steiger 0:7c97dcef700c 743
steiger 0:7c97dcef700c 744
steiger 0:7c97dcef700c 745 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 746 void TiXmlElement::SetAttribute( const std::string& _name, const std::string& _value )
steiger 0:7c97dcef700c 747 {
steiger 0:7c97dcef700c 748 TiXmlAttribute* attrib = attributeSet.FindOrCreate( _name );
steiger 0:7c97dcef700c 749 if ( attrib ) {
steiger 0:7c97dcef700c 750 attrib->SetValue( _value );
steiger 0:7c97dcef700c 751 }
steiger 0:7c97dcef700c 752 }
steiger 0:7c97dcef700c 753 #endif
steiger 0:7c97dcef700c 754
steiger 0:7c97dcef700c 755
steiger 0:7c97dcef700c 756 void TiXmlElement::Print( FILE* cfile, int depth ) const
steiger 0:7c97dcef700c 757 {
steiger 0:7c97dcef700c 758 int i;
steiger 0:7c97dcef700c 759 assert( cfile );
steiger 0:7c97dcef700c 760 for ( i=0; i<depth; i++ ) {
steiger 0:7c97dcef700c 761 fprintf( cfile, " " );
steiger 0:7c97dcef700c 762 }
steiger 0:7c97dcef700c 763
steiger 0:7c97dcef700c 764 fprintf( cfile, "<%s", value.c_str() );
steiger 0:7c97dcef700c 765
steiger 0:7c97dcef700c 766 const TiXmlAttribute* attrib;
steiger 0:7c97dcef700c 767 for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() )
steiger 0:7c97dcef700c 768 {
steiger 0:7c97dcef700c 769 fprintf( cfile, " " );
steiger 0:7c97dcef700c 770 attrib->Print( cfile, depth );
steiger 0:7c97dcef700c 771 }
steiger 0:7c97dcef700c 772
steiger 0:7c97dcef700c 773 // There are 3 different formatting approaches:
steiger 0:7c97dcef700c 774 // 1) An element without children is printed as a <foo /> node
steiger 0:7c97dcef700c 775 // 2) An element with only a text child is printed as <foo> text </foo>
steiger 0:7c97dcef700c 776 // 3) An element with children is printed on multiple lines.
steiger 0:7c97dcef700c 777 TiXmlNode* node;
steiger 0:7c97dcef700c 778 if ( !firstChild )
steiger 0:7c97dcef700c 779 {
steiger 0:7c97dcef700c 780 fprintf( cfile, " />" );
steiger 0:7c97dcef700c 781 }
steiger 0:7c97dcef700c 782 else if ( firstChild == lastChild && firstChild->ToText() )
steiger 0:7c97dcef700c 783 {
steiger 0:7c97dcef700c 784 fprintf( cfile, ">" );
steiger 0:7c97dcef700c 785 firstChild->Print( cfile, depth + 1 );
steiger 0:7c97dcef700c 786 fprintf( cfile, "</%s>", value.c_str() );
steiger 0:7c97dcef700c 787 }
steiger 0:7c97dcef700c 788 else
steiger 0:7c97dcef700c 789 {
steiger 0:7c97dcef700c 790 fprintf( cfile, ">" );
steiger 0:7c97dcef700c 791
steiger 0:7c97dcef700c 792 for ( node = firstChild; node; node=node->NextSibling() )
steiger 0:7c97dcef700c 793 {
steiger 0:7c97dcef700c 794 if ( !node->ToText() )
steiger 0:7c97dcef700c 795 {
steiger 0:7c97dcef700c 796 fprintf( cfile, "\n" );
steiger 0:7c97dcef700c 797 }
steiger 0:7c97dcef700c 798 node->Print( cfile, depth+1 );
steiger 0:7c97dcef700c 799 }
steiger 0:7c97dcef700c 800 fprintf( cfile, "\n" );
steiger 0:7c97dcef700c 801 for( i=0; i<depth; ++i ) {
steiger 0:7c97dcef700c 802 fprintf( cfile, " " );
steiger 0:7c97dcef700c 803 }
steiger 0:7c97dcef700c 804 fprintf( cfile, "</%s>", value.c_str() );
steiger 0:7c97dcef700c 805 }
steiger 0:7c97dcef700c 806 }
steiger 0:7c97dcef700c 807
steiger 0:7c97dcef700c 808
steiger 0:7c97dcef700c 809 void TiXmlElement::CopyTo( TiXmlElement* target ) const
steiger 0:7c97dcef700c 810 {
steiger 0:7c97dcef700c 811 // superclass:
steiger 0:7c97dcef700c 812 TiXmlNode::CopyTo( target );
steiger 0:7c97dcef700c 813
steiger 0:7c97dcef700c 814 // Element class:
steiger 0:7c97dcef700c 815 // Clone the attributes, then clone the children.
steiger 0:7c97dcef700c 816 const TiXmlAttribute* attribute = 0;
steiger 0:7c97dcef700c 817 for( attribute = attributeSet.First();
steiger 0:7c97dcef700c 818 attribute;
steiger 0:7c97dcef700c 819 attribute = attribute->Next() )
steiger 0:7c97dcef700c 820 {
steiger 0:7c97dcef700c 821 target->SetAttribute( attribute->Name(), attribute->Value() );
steiger 0:7c97dcef700c 822 }
steiger 0:7c97dcef700c 823
steiger 0:7c97dcef700c 824 TiXmlNode* node = 0;
steiger 0:7c97dcef700c 825 for ( node = firstChild; node; node = node->NextSibling() )
steiger 0:7c97dcef700c 826 {
steiger 0:7c97dcef700c 827 target->LinkEndChild( node->Clone() );
steiger 0:7c97dcef700c 828 }
steiger 0:7c97dcef700c 829 }
steiger 0:7c97dcef700c 830
steiger 0:7c97dcef700c 831 bool TiXmlElement::Accept( TiXmlVisitor* visitor ) const
steiger 0:7c97dcef700c 832 {
steiger 0:7c97dcef700c 833 if ( visitor->VisitEnter( *this, attributeSet.First() ) )
steiger 0:7c97dcef700c 834 {
steiger 0:7c97dcef700c 835 for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() )
steiger 0:7c97dcef700c 836 {
steiger 0:7c97dcef700c 837 if ( !node->Accept( visitor ) )
steiger 0:7c97dcef700c 838 break;
steiger 0:7c97dcef700c 839 }
steiger 0:7c97dcef700c 840 }
steiger 0:7c97dcef700c 841 return visitor->VisitExit( *this );
steiger 0:7c97dcef700c 842 }
steiger 0:7c97dcef700c 843
steiger 0:7c97dcef700c 844
steiger 0:7c97dcef700c 845 TiXmlNode* TiXmlElement::Clone() const
steiger 0:7c97dcef700c 846 {
steiger 0:7c97dcef700c 847 TiXmlElement* clone = new TiXmlElement( Value() );
steiger 0:7c97dcef700c 848 if ( !clone )
steiger 0:7c97dcef700c 849 return 0;
steiger 0:7c97dcef700c 850
steiger 0:7c97dcef700c 851 CopyTo( clone );
steiger 0:7c97dcef700c 852 return clone;
steiger 0:7c97dcef700c 853 }
steiger 0:7c97dcef700c 854
steiger 0:7c97dcef700c 855
steiger 0:7c97dcef700c 856 const char* TiXmlElement::GetText() const
steiger 0:7c97dcef700c 857 {
steiger 0:7c97dcef700c 858 const TiXmlNode* child = this->FirstChild();
steiger 0:7c97dcef700c 859 if ( child ) {
steiger 0:7c97dcef700c 860 const TiXmlText* childText = child->ToText();
steiger 0:7c97dcef700c 861 if ( childText ) {
steiger 0:7c97dcef700c 862 return childText->Value();
steiger 0:7c97dcef700c 863 }
steiger 0:7c97dcef700c 864 }
steiger 0:7c97dcef700c 865 return 0;
steiger 0:7c97dcef700c 866 }
steiger 0:7c97dcef700c 867
steiger 0:7c97dcef700c 868
steiger 0:7c97dcef700c 869 TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
steiger 0:7c97dcef700c 870 {
steiger 0:7c97dcef700c 871 tabsize = 4;
steiger 0:7c97dcef700c 872 useMicrosoftBOM = false;
steiger 0:7c97dcef700c 873 ClearError();
steiger 0:7c97dcef700c 874 }
steiger 0:7c97dcef700c 875
steiger 0:7c97dcef700c 876 TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
steiger 0:7c97dcef700c 877 {
steiger 0:7c97dcef700c 878 tabsize = 4;
steiger 0:7c97dcef700c 879 useMicrosoftBOM = false;
steiger 0:7c97dcef700c 880 value = documentName;
steiger 0:7c97dcef700c 881 ClearError();
steiger 0:7c97dcef700c 882 }
steiger 0:7c97dcef700c 883
steiger 0:7c97dcef700c 884
steiger 0:7c97dcef700c 885 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 886 TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
steiger 0:7c97dcef700c 887 {
steiger 0:7c97dcef700c 888 tabsize = 4;
steiger 0:7c97dcef700c 889 useMicrosoftBOM = false;
steiger 0:7c97dcef700c 890 value = documentName;
steiger 0:7c97dcef700c 891 ClearError();
steiger 0:7c97dcef700c 892 }
steiger 0:7c97dcef700c 893 #endif
steiger 0:7c97dcef700c 894
steiger 0:7c97dcef700c 895
steiger 0:7c97dcef700c 896 TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT )
steiger 0:7c97dcef700c 897 {
steiger 0:7c97dcef700c 898 copy.CopyTo( this );
steiger 0:7c97dcef700c 899 }
steiger 0:7c97dcef700c 900
steiger 0:7c97dcef700c 901
steiger 0:7c97dcef700c 902 void TiXmlDocument::operator=( const TiXmlDocument& copy )
steiger 0:7c97dcef700c 903 {
steiger 0:7c97dcef700c 904 Clear();
steiger 0:7c97dcef700c 905 copy.CopyTo( this );
steiger 0:7c97dcef700c 906 }
steiger 0:7c97dcef700c 907
steiger 0:7c97dcef700c 908
steiger 0:7c97dcef700c 909 bool TiXmlDocument::LoadFile( TiXmlEncoding encoding )
steiger 0:7c97dcef700c 910 {
steiger 0:7c97dcef700c 911 return LoadFile( Value(), encoding );
steiger 0:7c97dcef700c 912 }
steiger 0:7c97dcef700c 913
steiger 0:7c97dcef700c 914
steiger 0:7c97dcef700c 915 bool TiXmlDocument::SaveFile() const
steiger 0:7c97dcef700c 916 {
steiger 0:7c97dcef700c 917 return SaveFile( Value() );
steiger 0:7c97dcef700c 918 }
steiger 0:7c97dcef700c 919
steiger 0:7c97dcef700c 920 bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding )
steiger 0:7c97dcef700c 921 {
steiger 0:7c97dcef700c 922 TIXML_STRING filename( _filename );
steiger 0:7c97dcef700c 923 value = filename;
steiger 0:7c97dcef700c 924
steiger 0:7c97dcef700c 925 // reading in binary mode so that tinyxml can normalize the EOL
steiger 0:7c97dcef700c 926 FILE* file = TiXmlFOpen( value.c_str (), "rb" );
steiger 0:7c97dcef700c 927
steiger 0:7c97dcef700c 928 if ( file )
steiger 0:7c97dcef700c 929 {
steiger 0:7c97dcef700c 930 bool result = LoadFile( file, encoding );
steiger 0:7c97dcef700c 931 fclose( file );
steiger 0:7c97dcef700c 932 return result;
steiger 0:7c97dcef700c 933 }
steiger 0:7c97dcef700c 934 else
steiger 0:7c97dcef700c 935 {
steiger 0:7c97dcef700c 936 SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
steiger 0:7c97dcef700c 937 return false;
steiger 0:7c97dcef700c 938 }
steiger 0:7c97dcef700c 939 }
steiger 0:7c97dcef700c 940
steiger 0:7c97dcef700c 941 bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding )
steiger 0:7c97dcef700c 942 {
steiger 0:7c97dcef700c 943 if ( !file )
steiger 0:7c97dcef700c 944 {
steiger 0:7c97dcef700c 945 SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
steiger 0:7c97dcef700c 946 return false;
steiger 0:7c97dcef700c 947 }
steiger 0:7c97dcef700c 948
steiger 0:7c97dcef700c 949 // Delete the existing data:
steiger 0:7c97dcef700c 950 Clear();
steiger 0:7c97dcef700c 951 location.Clear();
steiger 0:7c97dcef700c 952
steiger 0:7c97dcef700c 953 // Get the file size, so we can pre-allocate the string. HUGE speed impact.
steiger 0:7c97dcef700c 954 long length = 0;
steiger 0:7c97dcef700c 955 fseek( file, 0, SEEK_END );
steiger 0:7c97dcef700c 956 length = ftell( file );
steiger 0:7c97dcef700c 957 fseek( file, 0, SEEK_SET );
steiger 0:7c97dcef700c 958
steiger 0:7c97dcef700c 959 // Strange case, but good to handle up front.
steiger 0:7c97dcef700c 960 if ( length <= 0 )
steiger 0:7c97dcef700c 961 {
steiger 0:7c97dcef700c 962 SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );
steiger 0:7c97dcef700c 963 return false;
steiger 0:7c97dcef700c 964 }
steiger 0:7c97dcef700c 965
steiger 0:7c97dcef700c 966 // Subtle bug here. TinyXml did use fgets. But from the XML spec:
steiger 0:7c97dcef700c 967 // 2.11 End-of-Line Handling
steiger 0:7c97dcef700c 968 // <snip>
steiger 0:7c97dcef700c 969 // <quote>
steiger 0:7c97dcef700c 970 // ...the XML processor MUST behave as if it normalized all line breaks in external
steiger 0:7c97dcef700c 971 // parsed entities (including the document entity) on input, before parsing, by translating
steiger 0:7c97dcef700c 972 // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to
steiger 0:7c97dcef700c 973 // a single #xA character.
steiger 0:7c97dcef700c 974 // </quote>
steiger 0:7c97dcef700c 975 //
steiger 0:7c97dcef700c 976 // It is not clear fgets does that, and certainly isn't clear it works cross platform.
steiger 0:7c97dcef700c 977 // Generally, you expect fgets to translate from the convention of the OS to the c/unix
steiger 0:7c97dcef700c 978 // convention, and not work generally.
steiger 0:7c97dcef700c 979
steiger 0:7c97dcef700c 980 /*
steiger 0:7c97dcef700c 981 while( fgets( buf, sizeof(buf), file ) )
steiger 0:7c97dcef700c 982 {
steiger 0:7c97dcef700c 983 data += buf;
steiger 0:7c97dcef700c 984 }
steiger 0:7c97dcef700c 985 */
steiger 0:7c97dcef700c 986
steiger 0:7c97dcef700c 987 char* buf = new char[ length+1 ];
steiger 0:7c97dcef700c 988 buf[0] = 0;
steiger 0:7c97dcef700c 989
steiger 0:7c97dcef700c 990 if ( fread( buf, length, 1, file ) != 1 ) {
steiger 0:7c97dcef700c 991 delete [] buf;
steiger 0:7c97dcef700c 992 SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
steiger 0:7c97dcef700c 993 return false;
steiger 0:7c97dcef700c 994 }
steiger 0:7c97dcef700c 995
steiger 0:7c97dcef700c 996 // Process the buffer in place to normalize new lines. (See comment above.)
steiger 0:7c97dcef700c 997 // Copies from the 'p' to 'q' pointer, where p can advance faster if
steiger 0:7c97dcef700c 998 // a newline-carriage return is hit.
steiger 0:7c97dcef700c 999 //
steiger 0:7c97dcef700c 1000 // Wikipedia:
steiger 0:7c97dcef700c 1001 // Systems based on ASCII or a compatible character set use either LF (Line feed, '\n', 0x0A, 10 in decimal) or
steiger 0:7c97dcef700c 1002 // CR (Carriage return, '\r', 0x0D, 13 in decimal) individually, or CR followed by LF (CR+LF, 0x0D 0x0A)...
steiger 0:7c97dcef700c 1003 // * LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others
steiger 0:7c97dcef700c 1004 // * 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
steiger 0:7c97dcef700c 1005 // * CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9
steiger 0:7c97dcef700c 1006
steiger 0:7c97dcef700c 1007 const char* p = buf; // the read head
steiger 0:7c97dcef700c 1008 char* q = buf; // the write head
steiger 0:7c97dcef700c 1009 const char CR = 0x0d;
steiger 0:7c97dcef700c 1010 const char LF = 0x0a;
steiger 0:7c97dcef700c 1011
steiger 0:7c97dcef700c 1012 buf[length] = 0;
steiger 0:7c97dcef700c 1013 while( *p ) {
steiger 0:7c97dcef700c 1014 assert( p < (buf+length) );
steiger 0:7c97dcef700c 1015 assert( q <= (buf+length) );
steiger 0:7c97dcef700c 1016 assert( q <= p );
steiger 0:7c97dcef700c 1017
steiger 0:7c97dcef700c 1018 if ( *p == CR ) {
steiger 0:7c97dcef700c 1019 *q++ = LF;
steiger 0:7c97dcef700c 1020 p++;
steiger 0:7c97dcef700c 1021 if ( *p == LF ) { // check for CR+LF (and skip LF)
steiger 0:7c97dcef700c 1022 p++;
steiger 0:7c97dcef700c 1023 }
steiger 0:7c97dcef700c 1024 }
steiger 0:7c97dcef700c 1025 else {
steiger 0:7c97dcef700c 1026 *q++ = *p++;
steiger 0:7c97dcef700c 1027 }
steiger 0:7c97dcef700c 1028 }
steiger 0:7c97dcef700c 1029 assert( q <= (buf+length) );
steiger 0:7c97dcef700c 1030 *q = 0;
steiger 0:7c97dcef700c 1031
steiger 0:7c97dcef700c 1032 Parse( buf, 0, encoding );
steiger 0:7c97dcef700c 1033
steiger 0:7c97dcef700c 1034 delete [] buf;
steiger 0:7c97dcef700c 1035 return !Error();
steiger 0:7c97dcef700c 1036 }
steiger 0:7c97dcef700c 1037
steiger 0:7c97dcef700c 1038
steiger 0:7c97dcef700c 1039 bool TiXmlDocument::SaveFile( const char * filename ) const
steiger 0:7c97dcef700c 1040 {
steiger 0:7c97dcef700c 1041 // The old c stuff lives on...
steiger 0:7c97dcef700c 1042 FILE* fp = TiXmlFOpen( filename, "w" );
steiger 0:7c97dcef700c 1043 if ( fp )
steiger 0:7c97dcef700c 1044 {
steiger 0:7c97dcef700c 1045 bool result = SaveFile( fp );
steiger 0:7c97dcef700c 1046 fclose( fp );
steiger 0:7c97dcef700c 1047 return result;
steiger 0:7c97dcef700c 1048 }
steiger 0:7c97dcef700c 1049 return false;
steiger 0:7c97dcef700c 1050 }
steiger 0:7c97dcef700c 1051
steiger 0:7c97dcef700c 1052
steiger 0:7c97dcef700c 1053 bool TiXmlDocument::SaveFile( FILE* fp ) const
steiger 0:7c97dcef700c 1054 {
steiger 0:7c97dcef700c 1055 if ( useMicrosoftBOM )
steiger 0:7c97dcef700c 1056 {
steiger 0:7c97dcef700c 1057 const unsigned char TIXML_UTF_LEAD_0 = 0xefU;
steiger 0:7c97dcef700c 1058 const unsigned char TIXML_UTF_LEAD_1 = 0xbbU;
steiger 0:7c97dcef700c 1059 const unsigned char TIXML_UTF_LEAD_2 = 0xbfU;
steiger 0:7c97dcef700c 1060
steiger 0:7c97dcef700c 1061 fputc( TIXML_UTF_LEAD_0, fp );
steiger 0:7c97dcef700c 1062 fputc( TIXML_UTF_LEAD_1, fp );
steiger 0:7c97dcef700c 1063 fputc( TIXML_UTF_LEAD_2, fp );
steiger 0:7c97dcef700c 1064 }
steiger 0:7c97dcef700c 1065 Print( fp, 0 );
steiger 0:7c97dcef700c 1066 return (ferror(fp) == 0);
steiger 0:7c97dcef700c 1067 }
steiger 0:7c97dcef700c 1068
steiger 0:7c97dcef700c 1069
steiger 0:7c97dcef700c 1070 void TiXmlDocument::CopyTo( TiXmlDocument* target ) const
steiger 0:7c97dcef700c 1071 {
steiger 0:7c97dcef700c 1072 TiXmlNode::CopyTo( target );
steiger 0:7c97dcef700c 1073
steiger 0:7c97dcef700c 1074 target->error = error;
steiger 0:7c97dcef700c 1075 target->errorId = errorId;
steiger 0:7c97dcef700c 1076 target->errorDesc = errorDesc;
steiger 0:7c97dcef700c 1077 target->tabsize = tabsize;
steiger 0:7c97dcef700c 1078 target->errorLocation = errorLocation;
steiger 0:7c97dcef700c 1079 target->useMicrosoftBOM = useMicrosoftBOM;
steiger 0:7c97dcef700c 1080
steiger 0:7c97dcef700c 1081 TiXmlNode* node = 0;
steiger 0:7c97dcef700c 1082 for ( node = firstChild; node; node = node->NextSibling() )
steiger 0:7c97dcef700c 1083 {
steiger 0:7c97dcef700c 1084 target->LinkEndChild( node->Clone() );
steiger 0:7c97dcef700c 1085 }
steiger 0:7c97dcef700c 1086 }
steiger 0:7c97dcef700c 1087
steiger 0:7c97dcef700c 1088
steiger 0:7c97dcef700c 1089 TiXmlNode* TiXmlDocument::Clone() const
steiger 0:7c97dcef700c 1090 {
steiger 0:7c97dcef700c 1091 TiXmlDocument* clone = new TiXmlDocument();
steiger 0:7c97dcef700c 1092 if ( !clone )
steiger 0:7c97dcef700c 1093 return 0;
steiger 0:7c97dcef700c 1094
steiger 0:7c97dcef700c 1095 CopyTo( clone );
steiger 0:7c97dcef700c 1096 return clone;
steiger 0:7c97dcef700c 1097 }
steiger 0:7c97dcef700c 1098
steiger 0:7c97dcef700c 1099
steiger 0:7c97dcef700c 1100 void TiXmlDocument::Print( FILE* cfile, int depth ) const
steiger 0:7c97dcef700c 1101 {
steiger 0:7c97dcef700c 1102 assert( cfile );
steiger 0:7c97dcef700c 1103 for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() )
steiger 0:7c97dcef700c 1104 {
steiger 0:7c97dcef700c 1105 node->Print( cfile, depth );
steiger 0:7c97dcef700c 1106 fprintf( cfile, "\n" );
steiger 0:7c97dcef700c 1107 }
steiger 0:7c97dcef700c 1108 }
steiger 0:7c97dcef700c 1109
steiger 0:7c97dcef700c 1110
steiger 0:7c97dcef700c 1111 bool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const
steiger 0:7c97dcef700c 1112 {
steiger 0:7c97dcef700c 1113 if ( visitor->VisitEnter( *this ) )
steiger 0:7c97dcef700c 1114 {
steiger 0:7c97dcef700c 1115 for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() )
steiger 0:7c97dcef700c 1116 {
steiger 0:7c97dcef700c 1117 if ( !node->Accept( visitor ) )
steiger 0:7c97dcef700c 1118 break;
steiger 0:7c97dcef700c 1119 }
steiger 0:7c97dcef700c 1120 }
steiger 0:7c97dcef700c 1121 return visitor->VisitExit( *this );
steiger 0:7c97dcef700c 1122 }
steiger 0:7c97dcef700c 1123
steiger 0:7c97dcef700c 1124
steiger 0:7c97dcef700c 1125 const TiXmlAttribute* TiXmlAttribute::Next() const
steiger 0:7c97dcef700c 1126 {
steiger 0:7c97dcef700c 1127 // We are using knowledge of the sentinel. The sentinel
steiger 0:7c97dcef700c 1128 // have a value or name.
steiger 0:7c97dcef700c 1129 if ( next->value.empty() && next->name.empty() )
steiger 0:7c97dcef700c 1130 return 0;
steiger 0:7c97dcef700c 1131 return next;
steiger 0:7c97dcef700c 1132 }
steiger 0:7c97dcef700c 1133
steiger 0:7c97dcef700c 1134 /*
steiger 0:7c97dcef700c 1135 TiXmlAttribute* TiXmlAttribute::Next()
steiger 0:7c97dcef700c 1136 {
steiger 0:7c97dcef700c 1137 // We are using knowledge of the sentinel. The sentinel
steiger 0:7c97dcef700c 1138 // have a value or name.
steiger 0:7c97dcef700c 1139 if ( next->value.empty() && next->name.empty() )
steiger 0:7c97dcef700c 1140 return 0;
steiger 0:7c97dcef700c 1141 return next;
steiger 0:7c97dcef700c 1142 }
steiger 0:7c97dcef700c 1143 */
steiger 0:7c97dcef700c 1144
steiger 0:7c97dcef700c 1145 const TiXmlAttribute* TiXmlAttribute::Previous() const
steiger 0:7c97dcef700c 1146 {
steiger 0:7c97dcef700c 1147 // We are using knowledge of the sentinel. The sentinel
steiger 0:7c97dcef700c 1148 // have a value or name.
steiger 0:7c97dcef700c 1149 if ( prev->value.empty() && prev->name.empty() )
steiger 0:7c97dcef700c 1150 return 0;
steiger 0:7c97dcef700c 1151 return prev;
steiger 0:7c97dcef700c 1152 }
steiger 0:7c97dcef700c 1153
steiger 0:7c97dcef700c 1154 /*
steiger 0:7c97dcef700c 1155 TiXmlAttribute* TiXmlAttribute::Previous()
steiger 0:7c97dcef700c 1156 {
steiger 0:7c97dcef700c 1157 // We are using knowledge of the sentinel. The sentinel
steiger 0:7c97dcef700c 1158 // have a value or name.
steiger 0:7c97dcef700c 1159 if ( prev->value.empty() && prev->name.empty() )
steiger 0:7c97dcef700c 1160 return 0;
steiger 0:7c97dcef700c 1161 return prev;
steiger 0:7c97dcef700c 1162 }
steiger 0:7c97dcef700c 1163 */
steiger 0:7c97dcef700c 1164
steiger 0:7c97dcef700c 1165 void TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const
steiger 0:7c97dcef700c 1166 {
steiger 0:7c97dcef700c 1167 TIXML_STRING n, v;
steiger 0:7c97dcef700c 1168
steiger 0:7c97dcef700c 1169 EncodeString( name, &n );
steiger 0:7c97dcef700c 1170 EncodeString( value, &v );
steiger 0:7c97dcef700c 1171
steiger 0:7c97dcef700c 1172 if (value.find ('\"') == TIXML_STRING::npos) {
steiger 0:7c97dcef700c 1173 if ( cfile ) {
steiger 0:7c97dcef700c 1174 fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() );
steiger 0:7c97dcef700c 1175 }
steiger 0:7c97dcef700c 1176 if ( str ) {
steiger 0:7c97dcef700c 1177 (*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\"";
steiger 0:7c97dcef700c 1178 }
steiger 0:7c97dcef700c 1179 }
steiger 0:7c97dcef700c 1180 else {
steiger 0:7c97dcef700c 1181 if ( cfile ) {
steiger 0:7c97dcef700c 1182 fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() );
steiger 0:7c97dcef700c 1183 }
steiger 0:7c97dcef700c 1184 if ( str ) {
steiger 0:7c97dcef700c 1185 (*str) += n; (*str) += "='"; (*str) += v; (*str) += "'";
steiger 0:7c97dcef700c 1186 }
steiger 0:7c97dcef700c 1187 }
steiger 0:7c97dcef700c 1188 }
steiger 0:7c97dcef700c 1189
steiger 0:7c97dcef700c 1190
steiger 0:7c97dcef700c 1191 int TiXmlAttribute::QueryIntValue( int* ival ) const
steiger 0:7c97dcef700c 1192 {
steiger 0:7c97dcef700c 1193 if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 )
steiger 0:7c97dcef700c 1194 return TIXML_SUCCESS;
steiger 0:7c97dcef700c 1195 return TIXML_WRONG_TYPE;
steiger 0:7c97dcef700c 1196 }
steiger 0:7c97dcef700c 1197
steiger 0:7c97dcef700c 1198 int TiXmlAttribute::QueryDoubleValue( double* dval ) const
steiger 0:7c97dcef700c 1199 {
steiger 0:7c97dcef700c 1200 if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 )
steiger 0:7c97dcef700c 1201 return TIXML_SUCCESS;
steiger 0:7c97dcef700c 1202 return TIXML_WRONG_TYPE;
steiger 0:7c97dcef700c 1203 }
steiger 0:7c97dcef700c 1204
steiger 0:7c97dcef700c 1205 void TiXmlAttribute::SetIntValue( int _value )
steiger 0:7c97dcef700c 1206 {
steiger 0:7c97dcef700c 1207 char buf [64];
steiger 0:7c97dcef700c 1208 #if defined(TIXML_SNPRINTF)
steiger 0:7c97dcef700c 1209 TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value);
steiger 0:7c97dcef700c 1210 #else
steiger 0:7c97dcef700c 1211 sprintf (buf, "%d", _value);
steiger 0:7c97dcef700c 1212 #endif
steiger 0:7c97dcef700c 1213 SetValue (buf);
steiger 0:7c97dcef700c 1214 }
steiger 0:7c97dcef700c 1215
steiger 0:7c97dcef700c 1216 void TiXmlAttribute::SetDoubleValue( double _value )
steiger 0:7c97dcef700c 1217 {
steiger 0:7c97dcef700c 1218 char buf [256];
steiger 0:7c97dcef700c 1219 #if defined(TIXML_SNPRINTF)
steiger 0:7c97dcef700c 1220 TIXML_SNPRINTF( buf, sizeof(buf), "%g", _value);
steiger 0:7c97dcef700c 1221 #else
steiger 0:7c97dcef700c 1222 sprintf (buf, "%g", _value);
steiger 0:7c97dcef700c 1223 #endif
steiger 0:7c97dcef700c 1224 SetValue (buf);
steiger 0:7c97dcef700c 1225 }
steiger 0:7c97dcef700c 1226
steiger 0:7c97dcef700c 1227 int TiXmlAttribute::IntValue() const
steiger 0:7c97dcef700c 1228 {
steiger 0:7c97dcef700c 1229 return atoi (value.c_str ());
steiger 0:7c97dcef700c 1230 }
steiger 0:7c97dcef700c 1231
steiger 0:7c97dcef700c 1232 double TiXmlAttribute::DoubleValue() const
steiger 0:7c97dcef700c 1233 {
steiger 0:7c97dcef700c 1234 return atof (value.c_str ());
steiger 0:7c97dcef700c 1235 }
steiger 0:7c97dcef700c 1236
steiger 0:7c97dcef700c 1237
steiger 0:7c97dcef700c 1238 TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT )
steiger 0:7c97dcef700c 1239 {
steiger 0:7c97dcef700c 1240 copy.CopyTo( this );
steiger 0:7c97dcef700c 1241 }
steiger 0:7c97dcef700c 1242
steiger 0:7c97dcef700c 1243
steiger 0:7c97dcef700c 1244 void TiXmlComment::operator=( const TiXmlComment& base )
steiger 0:7c97dcef700c 1245 {
steiger 0:7c97dcef700c 1246 Clear();
steiger 0:7c97dcef700c 1247 base.CopyTo( this );
steiger 0:7c97dcef700c 1248 }
steiger 0:7c97dcef700c 1249
steiger 0:7c97dcef700c 1250
steiger 0:7c97dcef700c 1251 void TiXmlComment::Print( FILE* cfile, int depth ) const
steiger 0:7c97dcef700c 1252 {
steiger 0:7c97dcef700c 1253 assert( cfile );
steiger 0:7c97dcef700c 1254 for ( int i=0; i<depth; i++ )
steiger 0:7c97dcef700c 1255 {
steiger 0:7c97dcef700c 1256 fprintf( cfile, " " );
steiger 0:7c97dcef700c 1257 }
steiger 0:7c97dcef700c 1258 fprintf( cfile, "<!--%s-->", value.c_str() );
steiger 0:7c97dcef700c 1259 }
steiger 0:7c97dcef700c 1260
steiger 0:7c97dcef700c 1261
steiger 0:7c97dcef700c 1262 void TiXmlComment::CopyTo( TiXmlComment* target ) const
steiger 0:7c97dcef700c 1263 {
steiger 0:7c97dcef700c 1264 TiXmlNode::CopyTo( target );
steiger 0:7c97dcef700c 1265 }
steiger 0:7c97dcef700c 1266
steiger 0:7c97dcef700c 1267
steiger 0:7c97dcef700c 1268 bool TiXmlComment::Accept( TiXmlVisitor* visitor ) const
steiger 0:7c97dcef700c 1269 {
steiger 0:7c97dcef700c 1270 return visitor->Visit( *this );
steiger 0:7c97dcef700c 1271 }
steiger 0:7c97dcef700c 1272
steiger 0:7c97dcef700c 1273
steiger 0:7c97dcef700c 1274 TiXmlNode* TiXmlComment::Clone() const
steiger 0:7c97dcef700c 1275 {
steiger 0:7c97dcef700c 1276 TiXmlComment* clone = new TiXmlComment();
steiger 0:7c97dcef700c 1277
steiger 0:7c97dcef700c 1278 if ( !clone )
steiger 0:7c97dcef700c 1279 return 0;
steiger 0:7c97dcef700c 1280
steiger 0:7c97dcef700c 1281 CopyTo( clone );
steiger 0:7c97dcef700c 1282 return clone;
steiger 0:7c97dcef700c 1283 }
steiger 0:7c97dcef700c 1284
steiger 0:7c97dcef700c 1285
steiger 0:7c97dcef700c 1286 void TiXmlText::Print( FILE* cfile, int depth ) const
steiger 0:7c97dcef700c 1287 {
steiger 0:7c97dcef700c 1288 assert( cfile );
steiger 0:7c97dcef700c 1289 if ( cdata )
steiger 0:7c97dcef700c 1290 {
steiger 0:7c97dcef700c 1291 int i;
steiger 0:7c97dcef700c 1292 fprintf( cfile, "\n" );
steiger 0:7c97dcef700c 1293 for ( i=0; i<depth; i++ ) {
steiger 0:7c97dcef700c 1294 fprintf( cfile, " " );
steiger 0:7c97dcef700c 1295 }
steiger 0:7c97dcef700c 1296 fprintf( cfile, "<![CDATA[%s]]>\n", value.c_str() ); // unformatted output
steiger 0:7c97dcef700c 1297 }
steiger 0:7c97dcef700c 1298 else
steiger 0:7c97dcef700c 1299 {
steiger 0:7c97dcef700c 1300 TIXML_STRING buffer;
steiger 0:7c97dcef700c 1301 EncodeString( value, &buffer );
steiger 0:7c97dcef700c 1302 fprintf( cfile, "%s", buffer.c_str() );
steiger 0:7c97dcef700c 1303 }
steiger 0:7c97dcef700c 1304 }
steiger 0:7c97dcef700c 1305
steiger 0:7c97dcef700c 1306
steiger 0:7c97dcef700c 1307 void TiXmlText::CopyTo( TiXmlText* target ) const
steiger 0:7c97dcef700c 1308 {
steiger 0:7c97dcef700c 1309 TiXmlNode::CopyTo( target );
steiger 0:7c97dcef700c 1310 target->cdata = cdata;
steiger 0:7c97dcef700c 1311 }
steiger 0:7c97dcef700c 1312
steiger 0:7c97dcef700c 1313
steiger 0:7c97dcef700c 1314 bool TiXmlText::Accept( TiXmlVisitor* visitor ) const
steiger 0:7c97dcef700c 1315 {
steiger 0:7c97dcef700c 1316 return visitor->Visit( *this );
steiger 0:7c97dcef700c 1317 }
steiger 0:7c97dcef700c 1318
steiger 0:7c97dcef700c 1319
steiger 0:7c97dcef700c 1320 TiXmlNode* TiXmlText::Clone() const
steiger 0:7c97dcef700c 1321 {
steiger 0:7c97dcef700c 1322 TiXmlText* clone = 0;
steiger 0:7c97dcef700c 1323 clone = new TiXmlText( "" );
steiger 0:7c97dcef700c 1324
steiger 0:7c97dcef700c 1325 if ( !clone )
steiger 0:7c97dcef700c 1326 return 0;
steiger 0:7c97dcef700c 1327
steiger 0:7c97dcef700c 1328 CopyTo( clone );
steiger 0:7c97dcef700c 1329 return clone;
steiger 0:7c97dcef700c 1330 }
steiger 0:7c97dcef700c 1331
steiger 0:7c97dcef700c 1332
steiger 0:7c97dcef700c 1333 TiXmlDeclaration::TiXmlDeclaration( const char * _version,
steiger 0:7c97dcef700c 1334 const char * _encoding,
steiger 0:7c97dcef700c 1335 const char * _standalone )
steiger 0:7c97dcef700c 1336 : TiXmlNode( TiXmlNode::TINYXML_DECLARATION )
steiger 0:7c97dcef700c 1337 {
steiger 0:7c97dcef700c 1338 version = _version;
steiger 0:7c97dcef700c 1339 encoding = _encoding;
steiger 0:7c97dcef700c 1340 standalone = _standalone;
steiger 0:7c97dcef700c 1341 }
steiger 0:7c97dcef700c 1342
steiger 0:7c97dcef700c 1343
steiger 0:7c97dcef700c 1344 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 1345 TiXmlDeclaration::TiXmlDeclaration( const std::string& _version,
steiger 0:7c97dcef700c 1346 const std::string& _encoding,
steiger 0:7c97dcef700c 1347 const std::string& _standalone )
steiger 0:7c97dcef700c 1348 : TiXmlNode( TiXmlNode::TINYXML_DECLARATION )
steiger 0:7c97dcef700c 1349 {
steiger 0:7c97dcef700c 1350 version = _version;
steiger 0:7c97dcef700c 1351 encoding = _encoding;
steiger 0:7c97dcef700c 1352 standalone = _standalone;
steiger 0:7c97dcef700c 1353 }
steiger 0:7c97dcef700c 1354 #endif
steiger 0:7c97dcef700c 1355
steiger 0:7c97dcef700c 1356
steiger 0:7c97dcef700c 1357 TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy )
steiger 0:7c97dcef700c 1358 : TiXmlNode( TiXmlNode::TINYXML_DECLARATION )
steiger 0:7c97dcef700c 1359 {
steiger 0:7c97dcef700c 1360 copy.CopyTo( this );
steiger 0:7c97dcef700c 1361 }
steiger 0:7c97dcef700c 1362
steiger 0:7c97dcef700c 1363
steiger 0:7c97dcef700c 1364 void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy )
steiger 0:7c97dcef700c 1365 {
steiger 0:7c97dcef700c 1366 Clear();
steiger 0:7c97dcef700c 1367 copy.CopyTo( this );
steiger 0:7c97dcef700c 1368 }
steiger 0:7c97dcef700c 1369
steiger 0:7c97dcef700c 1370
steiger 0:7c97dcef700c 1371 void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const
steiger 0:7c97dcef700c 1372 {
steiger 0:7c97dcef700c 1373 if ( cfile ) fprintf( cfile, "<?xml " );
steiger 0:7c97dcef700c 1374 if ( str ) (*str) += "<?xml ";
steiger 0:7c97dcef700c 1375
steiger 0:7c97dcef700c 1376 if ( !version.empty() ) {
steiger 0:7c97dcef700c 1377 if ( cfile ) fprintf (cfile, "version=\"%s\" ", version.c_str ());
steiger 0:7c97dcef700c 1378 if ( str ) { (*str) += "version=\""; (*str) += version; (*str) += "\" "; }
steiger 0:7c97dcef700c 1379 }
steiger 0:7c97dcef700c 1380 if ( !encoding.empty() ) {
steiger 0:7c97dcef700c 1381 if ( cfile ) fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ());
steiger 0:7c97dcef700c 1382 if ( str ) { (*str) += "encoding=\""; (*str) += encoding; (*str) += "\" "; }
steiger 0:7c97dcef700c 1383 }
steiger 0:7c97dcef700c 1384 if ( !standalone.empty() ) {
steiger 0:7c97dcef700c 1385 if ( cfile ) fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ());
steiger 0:7c97dcef700c 1386 if ( str ) { (*str) += "standalone=\""; (*str) += standalone; (*str) += "\" "; }
steiger 0:7c97dcef700c 1387 }
steiger 0:7c97dcef700c 1388 if ( cfile ) fprintf( cfile, "?>" );
steiger 0:7c97dcef700c 1389 if ( str ) (*str) += "?>";
steiger 0:7c97dcef700c 1390 }
steiger 0:7c97dcef700c 1391
steiger 0:7c97dcef700c 1392
steiger 0:7c97dcef700c 1393 void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const
steiger 0:7c97dcef700c 1394 {
steiger 0:7c97dcef700c 1395 TiXmlNode::CopyTo( target );
steiger 0:7c97dcef700c 1396
steiger 0:7c97dcef700c 1397 target->version = version;
steiger 0:7c97dcef700c 1398 target->encoding = encoding;
steiger 0:7c97dcef700c 1399 target->standalone = standalone;
steiger 0:7c97dcef700c 1400 }
steiger 0:7c97dcef700c 1401
steiger 0:7c97dcef700c 1402
steiger 0:7c97dcef700c 1403 bool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const
steiger 0:7c97dcef700c 1404 {
steiger 0:7c97dcef700c 1405 return visitor->Visit( *this );
steiger 0:7c97dcef700c 1406 }
steiger 0:7c97dcef700c 1407
steiger 0:7c97dcef700c 1408
steiger 0:7c97dcef700c 1409 TiXmlNode* TiXmlDeclaration::Clone() const
steiger 0:7c97dcef700c 1410 {
steiger 0:7c97dcef700c 1411 TiXmlDeclaration* clone = new TiXmlDeclaration();
steiger 0:7c97dcef700c 1412
steiger 0:7c97dcef700c 1413 if ( !clone )
steiger 0:7c97dcef700c 1414 return 0;
steiger 0:7c97dcef700c 1415
steiger 0:7c97dcef700c 1416 CopyTo( clone );
steiger 0:7c97dcef700c 1417 return clone;
steiger 0:7c97dcef700c 1418 }
steiger 0:7c97dcef700c 1419
steiger 0:7c97dcef700c 1420
steiger 0:7c97dcef700c 1421 void TiXmlUnknown::Print( FILE* cfile, int depth ) const
steiger 0:7c97dcef700c 1422 {
steiger 0:7c97dcef700c 1423 for ( int i=0; i<depth; i++ )
steiger 0:7c97dcef700c 1424 fprintf( cfile, " " );
steiger 0:7c97dcef700c 1425 fprintf( cfile, "<%s>", value.c_str() );
steiger 0:7c97dcef700c 1426 }
steiger 0:7c97dcef700c 1427
steiger 0:7c97dcef700c 1428
steiger 0:7c97dcef700c 1429 void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const
steiger 0:7c97dcef700c 1430 {
steiger 0:7c97dcef700c 1431 TiXmlNode::CopyTo( target );
steiger 0:7c97dcef700c 1432 }
steiger 0:7c97dcef700c 1433
steiger 0:7c97dcef700c 1434
steiger 0:7c97dcef700c 1435 bool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const
steiger 0:7c97dcef700c 1436 {
steiger 0:7c97dcef700c 1437 return visitor->Visit( *this );
steiger 0:7c97dcef700c 1438 }
steiger 0:7c97dcef700c 1439
steiger 0:7c97dcef700c 1440
steiger 0:7c97dcef700c 1441 TiXmlNode* TiXmlUnknown::Clone() const
steiger 0:7c97dcef700c 1442 {
steiger 0:7c97dcef700c 1443 TiXmlUnknown* clone = new TiXmlUnknown();
steiger 0:7c97dcef700c 1444
steiger 0:7c97dcef700c 1445 if ( !clone )
steiger 0:7c97dcef700c 1446 return 0;
steiger 0:7c97dcef700c 1447
steiger 0:7c97dcef700c 1448 CopyTo( clone );
steiger 0:7c97dcef700c 1449 return clone;
steiger 0:7c97dcef700c 1450 }
steiger 0:7c97dcef700c 1451
steiger 0:7c97dcef700c 1452
steiger 0:7c97dcef700c 1453 TiXmlAttributeSet::TiXmlAttributeSet()
steiger 0:7c97dcef700c 1454 {
steiger 0:7c97dcef700c 1455 sentinel.next = &sentinel;
steiger 0:7c97dcef700c 1456 sentinel.prev = &sentinel;
steiger 0:7c97dcef700c 1457 }
steiger 0:7c97dcef700c 1458
steiger 0:7c97dcef700c 1459
steiger 0:7c97dcef700c 1460 TiXmlAttributeSet::~TiXmlAttributeSet()
steiger 0:7c97dcef700c 1461 {
steiger 0:7c97dcef700c 1462 assert( sentinel.next == &sentinel );
steiger 0:7c97dcef700c 1463 assert( sentinel.prev == &sentinel );
steiger 0:7c97dcef700c 1464 }
steiger 0:7c97dcef700c 1465
steiger 0:7c97dcef700c 1466
steiger 0:7c97dcef700c 1467 void TiXmlAttributeSet::Add( TiXmlAttribute* addMe )
steiger 0:7c97dcef700c 1468 {
steiger 0:7c97dcef700c 1469 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 1470 assert( !Find( TIXML_STRING( addMe->Name() ) ) ); // Shouldn't be multiply adding to the set.
steiger 0:7c97dcef700c 1471 #else
steiger 0:7c97dcef700c 1472 assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set.
steiger 0:7c97dcef700c 1473 #endif
steiger 0:7c97dcef700c 1474
steiger 0:7c97dcef700c 1475 addMe->next = &sentinel;
steiger 0:7c97dcef700c 1476 addMe->prev = sentinel.prev;
steiger 0:7c97dcef700c 1477
steiger 0:7c97dcef700c 1478 sentinel.prev->next = addMe;
steiger 0:7c97dcef700c 1479 sentinel.prev = addMe;
steiger 0:7c97dcef700c 1480 }
steiger 0:7c97dcef700c 1481
steiger 0:7c97dcef700c 1482 void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe )
steiger 0:7c97dcef700c 1483 {
steiger 0:7c97dcef700c 1484 TiXmlAttribute* node;
steiger 0:7c97dcef700c 1485
steiger 0:7c97dcef700c 1486 for( node = sentinel.next; node != &sentinel; node = node->next )
steiger 0:7c97dcef700c 1487 {
steiger 0:7c97dcef700c 1488 if ( node == removeMe )
steiger 0:7c97dcef700c 1489 {
steiger 0:7c97dcef700c 1490 node->prev->next = node->next;
steiger 0:7c97dcef700c 1491 node->next->prev = node->prev;
steiger 0:7c97dcef700c 1492 node->next = 0;
steiger 0:7c97dcef700c 1493 node->prev = 0;
steiger 0:7c97dcef700c 1494 return;
steiger 0:7c97dcef700c 1495 }
steiger 0:7c97dcef700c 1496 }
steiger 0:7c97dcef700c 1497 assert( 0 ); // we tried to remove a non-linked attribute.
steiger 0:7c97dcef700c 1498 }
steiger 0:7c97dcef700c 1499
steiger 0:7c97dcef700c 1500
steiger 0:7c97dcef700c 1501 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 1502 TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const
steiger 0:7c97dcef700c 1503 {
steiger 0:7c97dcef700c 1504 for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next )
steiger 0:7c97dcef700c 1505 {
steiger 0:7c97dcef700c 1506 if ( node->name == name )
steiger 0:7c97dcef700c 1507 return node;
steiger 0:7c97dcef700c 1508 }
steiger 0:7c97dcef700c 1509 return 0;
steiger 0:7c97dcef700c 1510 }
steiger 0:7c97dcef700c 1511
steiger 0:7c97dcef700c 1512 TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const std::string& _name )
steiger 0:7c97dcef700c 1513 {
steiger 0:7c97dcef700c 1514 TiXmlAttribute* attrib = Find( _name );
steiger 0:7c97dcef700c 1515 if ( !attrib ) {
steiger 0:7c97dcef700c 1516 attrib = new TiXmlAttribute();
steiger 0:7c97dcef700c 1517 Add( attrib );
steiger 0:7c97dcef700c 1518 attrib->SetName( _name );
steiger 0:7c97dcef700c 1519 }
steiger 0:7c97dcef700c 1520 return attrib;
steiger 0:7c97dcef700c 1521 }
steiger 0:7c97dcef700c 1522 #endif
steiger 0:7c97dcef700c 1523
steiger 0:7c97dcef700c 1524
steiger 0:7c97dcef700c 1525 TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const
steiger 0:7c97dcef700c 1526 {
steiger 0:7c97dcef700c 1527 for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next )
steiger 0:7c97dcef700c 1528 {
steiger 0:7c97dcef700c 1529 if ( strcmp( node->name.c_str(), name ) == 0 )
steiger 0:7c97dcef700c 1530 return node;
steiger 0:7c97dcef700c 1531 }
steiger 0:7c97dcef700c 1532 return 0;
steiger 0:7c97dcef700c 1533 }
steiger 0:7c97dcef700c 1534
steiger 0:7c97dcef700c 1535
steiger 0:7c97dcef700c 1536 TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const char* _name )
steiger 0:7c97dcef700c 1537 {
steiger 0:7c97dcef700c 1538 TiXmlAttribute* attrib = Find( _name );
steiger 0:7c97dcef700c 1539 if ( !attrib ) {
steiger 0:7c97dcef700c 1540 attrib = new TiXmlAttribute();
steiger 0:7c97dcef700c 1541 Add( attrib );
steiger 0:7c97dcef700c 1542 attrib->SetName( _name );
steiger 0:7c97dcef700c 1543 }
steiger 0:7c97dcef700c 1544 return attrib;
steiger 0:7c97dcef700c 1545 }
steiger 0:7c97dcef700c 1546
steiger 0:7c97dcef700c 1547
steiger 0:7c97dcef700c 1548 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 1549 std::istream& operator>> (std::istream & in, TiXmlNode & base)
steiger 0:7c97dcef700c 1550 {
steiger 0:7c97dcef700c 1551 TIXML_STRING tag;
steiger 0:7c97dcef700c 1552 tag.reserve( 8 * 1000 );
steiger 0:7c97dcef700c 1553 base.StreamIn( &in, &tag );
steiger 0:7c97dcef700c 1554
steiger 0:7c97dcef700c 1555 base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING );
steiger 0:7c97dcef700c 1556 return in;
steiger 0:7c97dcef700c 1557 }
steiger 0:7c97dcef700c 1558 #endif
steiger 0:7c97dcef700c 1559
steiger 0:7c97dcef700c 1560
steiger 0:7c97dcef700c 1561 #ifdef TIXML_USE_STL
steiger 0:7c97dcef700c 1562 std::ostream& operator<< (std::ostream & out, const TiXmlNode & base)
steiger 0:7c97dcef700c 1563 {
steiger 0:7c97dcef700c 1564 TiXmlPrinter printer;
steiger 0:7c97dcef700c 1565 printer.SetStreamPrinting();
steiger 0:7c97dcef700c 1566 base.Accept( &printer );
steiger 0:7c97dcef700c 1567 out << printer.Str();
steiger 0:7c97dcef700c 1568
steiger 0:7c97dcef700c 1569 return out;
steiger 0:7c97dcef700c 1570 }
steiger 0:7c97dcef700c 1571
steiger 0:7c97dcef700c 1572
steiger 0:7c97dcef700c 1573 std::string& operator<< (std::string& out, const TiXmlNode& base )
steiger 0:7c97dcef700c 1574 {
steiger 0:7c97dcef700c 1575 TiXmlPrinter printer;
steiger 0:7c97dcef700c 1576 printer.SetStreamPrinting();
steiger 0:7c97dcef700c 1577 base.Accept( &printer );
steiger 0:7c97dcef700c 1578 out.append( printer.Str() );
steiger 0:7c97dcef700c 1579
steiger 0:7c97dcef700c 1580 return out;
steiger 0:7c97dcef700c 1581 }
steiger 0:7c97dcef700c 1582 #endif
steiger 0:7c97dcef700c 1583
steiger 0:7c97dcef700c 1584
steiger 0:7c97dcef700c 1585 TiXmlHandle TiXmlHandle::FirstChild() const
steiger 0:7c97dcef700c 1586 {
steiger 0:7c97dcef700c 1587 if ( node )
steiger 0:7c97dcef700c 1588 {
steiger 0:7c97dcef700c 1589 TiXmlNode* child = node->FirstChild();
steiger 0:7c97dcef700c 1590 if ( child )
steiger 0:7c97dcef700c 1591 return TiXmlHandle( child );
steiger 0:7c97dcef700c 1592 }
steiger 0:7c97dcef700c 1593 return TiXmlHandle( 0 );
steiger 0:7c97dcef700c 1594 }
steiger 0:7c97dcef700c 1595
steiger 0:7c97dcef700c 1596
steiger 0:7c97dcef700c 1597 TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const
steiger 0:7c97dcef700c 1598 {
steiger 0:7c97dcef700c 1599 if ( node )
steiger 0:7c97dcef700c 1600 {
steiger 0:7c97dcef700c 1601 TiXmlNode* child = node->FirstChild( value );
steiger 0:7c97dcef700c 1602 if ( child )
steiger 0:7c97dcef700c 1603 return TiXmlHandle( child );
steiger 0:7c97dcef700c 1604 }
steiger 0:7c97dcef700c 1605 return TiXmlHandle( 0 );
steiger 0:7c97dcef700c 1606 }
steiger 0:7c97dcef700c 1607
steiger 0:7c97dcef700c 1608
steiger 0:7c97dcef700c 1609 TiXmlHandle TiXmlHandle::FirstChildElement() const
steiger 0:7c97dcef700c 1610 {
steiger 0:7c97dcef700c 1611 if ( node )
steiger 0:7c97dcef700c 1612 {
steiger 0:7c97dcef700c 1613 TiXmlElement* child = node->FirstChildElement();
steiger 0:7c97dcef700c 1614 if ( child )
steiger 0:7c97dcef700c 1615 return TiXmlHandle( child );
steiger 0:7c97dcef700c 1616 }
steiger 0:7c97dcef700c 1617 return TiXmlHandle( 0 );
steiger 0:7c97dcef700c 1618 }
steiger 0:7c97dcef700c 1619
steiger 0:7c97dcef700c 1620
steiger 0:7c97dcef700c 1621 TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const
steiger 0:7c97dcef700c 1622 {
steiger 0:7c97dcef700c 1623 if ( node )
steiger 0:7c97dcef700c 1624 {
steiger 0:7c97dcef700c 1625 TiXmlElement* child = node->FirstChildElement( value );
steiger 0:7c97dcef700c 1626 if ( child )
steiger 0:7c97dcef700c 1627 return TiXmlHandle( child );
steiger 0:7c97dcef700c 1628 }
steiger 0:7c97dcef700c 1629 return TiXmlHandle( 0 );
steiger 0:7c97dcef700c 1630 }
steiger 0:7c97dcef700c 1631
steiger 0:7c97dcef700c 1632
steiger 0:7c97dcef700c 1633 TiXmlHandle TiXmlHandle::Child( int count ) const
steiger 0:7c97dcef700c 1634 {
steiger 0:7c97dcef700c 1635 if ( node )
steiger 0:7c97dcef700c 1636 {
steiger 0:7c97dcef700c 1637 int i;
steiger 0:7c97dcef700c 1638 TiXmlNode* child = node->FirstChild();
steiger 0:7c97dcef700c 1639 for ( i=0;
steiger 0:7c97dcef700c 1640 child && i<count;
steiger 0:7c97dcef700c 1641 child = child->NextSibling(), ++i )
steiger 0:7c97dcef700c 1642 {
steiger 0:7c97dcef700c 1643 // nothing
steiger 0:7c97dcef700c 1644 }
steiger 0:7c97dcef700c 1645 if ( child )
steiger 0:7c97dcef700c 1646 return TiXmlHandle( child );
steiger 0:7c97dcef700c 1647 }
steiger 0:7c97dcef700c 1648 return TiXmlHandle( 0 );
steiger 0:7c97dcef700c 1649 }
steiger 0:7c97dcef700c 1650
steiger 0:7c97dcef700c 1651
steiger 0:7c97dcef700c 1652 TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const
steiger 0:7c97dcef700c 1653 {
steiger 0:7c97dcef700c 1654 if ( node )
steiger 0:7c97dcef700c 1655 {
steiger 0:7c97dcef700c 1656 int i;
steiger 0:7c97dcef700c 1657 TiXmlNode* child = node->FirstChild( value );
steiger 0:7c97dcef700c 1658 for ( i=0;
steiger 0:7c97dcef700c 1659 child && i<count;
steiger 0:7c97dcef700c 1660 child = child->NextSibling( value ), ++i )
steiger 0:7c97dcef700c 1661 {
steiger 0:7c97dcef700c 1662 // nothing
steiger 0:7c97dcef700c 1663 }
steiger 0:7c97dcef700c 1664 if ( child )
steiger 0:7c97dcef700c 1665 return TiXmlHandle( child );
steiger 0:7c97dcef700c 1666 }
steiger 0:7c97dcef700c 1667 return TiXmlHandle( 0 );
steiger 0:7c97dcef700c 1668 }
steiger 0:7c97dcef700c 1669
steiger 0:7c97dcef700c 1670
steiger 0:7c97dcef700c 1671 TiXmlHandle TiXmlHandle::ChildElement( int count ) const
steiger 0:7c97dcef700c 1672 {
steiger 0:7c97dcef700c 1673 if ( node )
steiger 0:7c97dcef700c 1674 {
steiger 0:7c97dcef700c 1675 int i;
steiger 0:7c97dcef700c 1676 TiXmlElement* child = node->FirstChildElement();
steiger 0:7c97dcef700c 1677 for ( i=0;
steiger 0:7c97dcef700c 1678 child && i<count;
steiger 0:7c97dcef700c 1679 child = child->NextSiblingElement(), ++i )
steiger 0:7c97dcef700c 1680 {
steiger 0:7c97dcef700c 1681 // nothing
steiger 0:7c97dcef700c 1682 }
steiger 0:7c97dcef700c 1683 if ( child )
steiger 0:7c97dcef700c 1684 return TiXmlHandle( child );
steiger 0:7c97dcef700c 1685 }
steiger 0:7c97dcef700c 1686 return TiXmlHandle( 0 );
steiger 0:7c97dcef700c 1687 }
steiger 0:7c97dcef700c 1688
steiger 0:7c97dcef700c 1689
steiger 0:7c97dcef700c 1690 TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const
steiger 0:7c97dcef700c 1691 {
steiger 0:7c97dcef700c 1692 if ( node )
steiger 0:7c97dcef700c 1693 {
steiger 0:7c97dcef700c 1694 int i;
steiger 0:7c97dcef700c 1695 TiXmlElement* child = node->FirstChildElement( value );
steiger 0:7c97dcef700c 1696 for ( i=0;
steiger 0:7c97dcef700c 1697 child && i<count;
steiger 0:7c97dcef700c 1698 child = child->NextSiblingElement( value ), ++i )
steiger 0:7c97dcef700c 1699 {
steiger 0:7c97dcef700c 1700 // nothing
steiger 0:7c97dcef700c 1701 }
steiger 0:7c97dcef700c 1702 if ( child )
steiger 0:7c97dcef700c 1703 return TiXmlHandle( child );
steiger 0:7c97dcef700c 1704 }
steiger 0:7c97dcef700c 1705 return TiXmlHandle( 0 );
steiger 0:7c97dcef700c 1706 }
steiger 0:7c97dcef700c 1707
steiger 0:7c97dcef700c 1708
steiger 0:7c97dcef700c 1709 bool TiXmlPrinter::VisitEnter( const TiXmlDocument& )
steiger 0:7c97dcef700c 1710 {
steiger 0:7c97dcef700c 1711 return true;
steiger 0:7c97dcef700c 1712 }
steiger 0:7c97dcef700c 1713
steiger 0:7c97dcef700c 1714 bool TiXmlPrinter::VisitExit( const TiXmlDocument& )
steiger 0:7c97dcef700c 1715 {
steiger 0:7c97dcef700c 1716 return true;
steiger 0:7c97dcef700c 1717 }
steiger 0:7c97dcef700c 1718
steiger 0:7c97dcef700c 1719 bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute )
steiger 0:7c97dcef700c 1720 {
steiger 0:7c97dcef700c 1721 DoIndent();
steiger 0:7c97dcef700c 1722 buffer += "<";
steiger 0:7c97dcef700c 1723 buffer += element.Value();
steiger 0:7c97dcef700c 1724
steiger 0:7c97dcef700c 1725 for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() )
steiger 0:7c97dcef700c 1726 {
steiger 0:7c97dcef700c 1727 buffer += " ";
steiger 0:7c97dcef700c 1728 attrib->Print( 0, 0, &buffer );
steiger 0:7c97dcef700c 1729 }
steiger 0:7c97dcef700c 1730
steiger 0:7c97dcef700c 1731 if ( !element.FirstChild() )
steiger 0:7c97dcef700c 1732 {
steiger 0:7c97dcef700c 1733 buffer += " />";
steiger 0:7c97dcef700c 1734 DoLineBreak();
steiger 0:7c97dcef700c 1735 }
steiger 0:7c97dcef700c 1736 else
steiger 0:7c97dcef700c 1737 {
steiger 0:7c97dcef700c 1738 buffer += ">";
steiger 0:7c97dcef700c 1739 if ( element.FirstChild()->ToText()
steiger 0:7c97dcef700c 1740 && element.LastChild() == element.FirstChild()
steiger 0:7c97dcef700c 1741 && element.FirstChild()->ToText()->CDATA() == false )
steiger 0:7c97dcef700c 1742 {
steiger 0:7c97dcef700c 1743 simpleTextPrint = true;
steiger 0:7c97dcef700c 1744 // no DoLineBreak()!
steiger 0:7c97dcef700c 1745 }
steiger 0:7c97dcef700c 1746 else
steiger 0:7c97dcef700c 1747 {
steiger 0:7c97dcef700c 1748 DoLineBreak();
steiger 0:7c97dcef700c 1749 }
steiger 0:7c97dcef700c 1750 }
steiger 0:7c97dcef700c 1751 ++depth;
steiger 0:7c97dcef700c 1752 return true;
steiger 0:7c97dcef700c 1753 }
steiger 0:7c97dcef700c 1754
steiger 0:7c97dcef700c 1755
steiger 0:7c97dcef700c 1756 bool TiXmlPrinter::VisitExit( const TiXmlElement& element )
steiger 0:7c97dcef700c 1757 {
steiger 0:7c97dcef700c 1758 --depth;
steiger 0:7c97dcef700c 1759 if ( !element.FirstChild() )
steiger 0:7c97dcef700c 1760 {
steiger 0:7c97dcef700c 1761 // nothing.
steiger 0:7c97dcef700c 1762 }
steiger 0:7c97dcef700c 1763 else
steiger 0:7c97dcef700c 1764 {
steiger 0:7c97dcef700c 1765 if ( simpleTextPrint )
steiger 0:7c97dcef700c 1766 {
steiger 0:7c97dcef700c 1767 simpleTextPrint = false;
steiger 0:7c97dcef700c 1768 }
steiger 0:7c97dcef700c 1769 else
steiger 0:7c97dcef700c 1770 {
steiger 0:7c97dcef700c 1771 DoIndent();
steiger 0:7c97dcef700c 1772 }
steiger 0:7c97dcef700c 1773 buffer += "</";
steiger 0:7c97dcef700c 1774 buffer += element.Value();
steiger 0:7c97dcef700c 1775 buffer += ">";
steiger 0:7c97dcef700c 1776 DoLineBreak();
steiger 0:7c97dcef700c 1777 }
steiger 0:7c97dcef700c 1778 return true;
steiger 0:7c97dcef700c 1779 }
steiger 0:7c97dcef700c 1780
steiger 0:7c97dcef700c 1781
steiger 0:7c97dcef700c 1782 bool TiXmlPrinter::Visit( const TiXmlText& text )
steiger 0:7c97dcef700c 1783 {
steiger 0:7c97dcef700c 1784 if ( text.CDATA() )
steiger 0:7c97dcef700c 1785 {
steiger 0:7c97dcef700c 1786 DoIndent();
steiger 0:7c97dcef700c 1787 buffer += "<![CDATA[";
steiger 0:7c97dcef700c 1788 buffer += text.Value();
steiger 0:7c97dcef700c 1789 buffer += "]]>";
steiger 0:7c97dcef700c 1790 DoLineBreak();
steiger 0:7c97dcef700c 1791 }
steiger 0:7c97dcef700c 1792 else if ( simpleTextPrint )
steiger 0:7c97dcef700c 1793 {
steiger 0:7c97dcef700c 1794 TIXML_STRING str;
steiger 0:7c97dcef700c 1795 TiXmlBase::EncodeString( text.ValueTStr(), &str );
steiger 0:7c97dcef700c 1796 buffer += str;
steiger 0:7c97dcef700c 1797 }
steiger 0:7c97dcef700c 1798 else
steiger 0:7c97dcef700c 1799 {
steiger 0:7c97dcef700c 1800 DoIndent();
steiger 0:7c97dcef700c 1801 TIXML_STRING str;
steiger 0:7c97dcef700c 1802 TiXmlBase::EncodeString( text.ValueTStr(), &str );
steiger 0:7c97dcef700c 1803 buffer += str;
steiger 0:7c97dcef700c 1804 DoLineBreak();
steiger 0:7c97dcef700c 1805 }
steiger 0:7c97dcef700c 1806 return true;
steiger 0:7c97dcef700c 1807 }
steiger 0:7c97dcef700c 1808
steiger 0:7c97dcef700c 1809
steiger 0:7c97dcef700c 1810 bool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration )
steiger 0:7c97dcef700c 1811 {
steiger 0:7c97dcef700c 1812 DoIndent();
steiger 0:7c97dcef700c 1813 declaration.Print( 0, 0, &buffer );
steiger 0:7c97dcef700c 1814 DoLineBreak();
steiger 0:7c97dcef700c 1815 return true;
steiger 0:7c97dcef700c 1816 }
steiger 0:7c97dcef700c 1817
steiger 0:7c97dcef700c 1818
steiger 0:7c97dcef700c 1819 bool TiXmlPrinter::Visit( const TiXmlComment& comment )
steiger 0:7c97dcef700c 1820 {
steiger 0:7c97dcef700c 1821 DoIndent();
steiger 0:7c97dcef700c 1822 buffer += "<!--";
steiger 0:7c97dcef700c 1823 buffer += comment.Value();
steiger 0:7c97dcef700c 1824 buffer += "-->";
steiger 0:7c97dcef700c 1825 DoLineBreak();
steiger 0:7c97dcef700c 1826 return true;
steiger 0:7c97dcef700c 1827 }
steiger 0:7c97dcef700c 1828
steiger 0:7c97dcef700c 1829
steiger 0:7c97dcef700c 1830 bool TiXmlPrinter::Visit( const TiXmlUnknown& unknown )
steiger 0:7c97dcef700c 1831 {
steiger 0:7c97dcef700c 1832 DoIndent();
steiger 0:7c97dcef700c 1833 buffer += "<";
steiger 0:7c97dcef700c 1834 buffer += unknown.Value();
steiger 0:7c97dcef700c 1835 buffer += ">";
steiger 0:7c97dcef700c 1836 DoLineBreak();
steiger 0:7c97dcef700c 1837 return true;
steiger 0:7c97dcef700c 1838 }
steiger 0:7c97dcef700c 1839