Bridge++  Version 1.4.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
tinyxml2.h
Go to the documentation of this file.
1 /*
2 Original code by Lee Thomason (www.grinninglizard.com)
3 
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any
6 damages arising from the use of this software.
7 
8 Permission is granted to anyone to use this software for any
9 purpose, including commercial applications, and to alter it and
10 redistribute it freely, subject to the following restrictions:
11 
12 1. The origin of this software must not be misrepresented; you must
13 not claim that you wrote the original software. If you use this
14 software in a product, an acknowledgment in the product documentation
15 would be appreciated but is not required.
16 
17 2. Altered source versions must be plainly marked as such, and
18 must not be misrepresented as being the original software.
19 
20 3. This notice may not be removed or altered from any source
21 distribution.
22 */
23 
24 #ifndef TINYXML2_INCLUDED
25 #define TINYXML2_INCLUDED
26 
27 #if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__)
28 # include <ctype.h>
29 # include <limits.h>
30 # include <stdio.h>
31 # include <stdlib.h>
32 # include <string.h>
33 # include <stdarg.h>
34 #else
35 # include <cctype>
36 # include <climits>
37 # include <cstdio>
38 # include <cstdlib>
39 # include <cstring>
40 # include <cstdarg>
41 #endif
42 
43 /*
44  TODO: intern strings instead of allocation.
45 */
46 /*
47  gcc:
48  g++ -Wall -DDEBUG tinyxml2.cpp xmltest.cpp -o gccxmltest.exe
49 
50  Formatting, Artistic Style:
51  AStyle.exe --style=1tbs --indent-switches --break-closing-brackets --indent-preprocessor tinyxml2.cpp tinyxml2.h
52 */
53 
54 #if defined( _DEBUG ) || defined( DEBUG ) || defined (__DEBUG__)
55 # ifndef DEBUG
56 # define DEBUG
57 # endif
58 #endif
59 
60 #ifdef _MSC_VER
61 # pragma warning(push)
62 # pragma warning(disable: 4251)
63 #endif
64 
65 #ifdef _WIN32
66 # ifdef TINYXML2_EXPORT
67 # define TINYXML2_LIB __declspec(dllexport)
68 # elif defined(TINYXML2_IMPORT)
69 # define TINYXML2_LIB __declspec(dllimport)
70 # else
71 # define TINYXML2_LIB
72 # endif
73 #else
74 # define TINYXML2_LIB
75 #endif
76 
77 
78 #if defined(DEBUG)
79 # if defined(_MSC_VER)
80 # // "(void)0," is for suppressing C4127 warning in "assert(false)", "assert(true)" and the like
81 # define TIXMLASSERT( x ) if ( !((void)0,(x))) { __debugbreak(); } //if ( !(x)) WinDebugBreak()
82 # elif defined (ANDROID_NDK)
83 # include <android/log.h>
84 # define TIXMLASSERT( x ) if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); }
85 # else
86 # include <assert.h>
87 # define TIXMLASSERT assert
88 # endif
89 # else
90 # define TIXMLASSERT( x ) {}
91 #endif
92 
93 
94 #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE)
95 // Microsoft visual studio, version 2005 and higher.
96 /*int _snprintf_s(
97  char *buffer,
98  size_t sizeOfBuffer,
99  size_t count,
100  const char *format [,
101  argument] ...
102 );*/
103 inline int TIXML_SNPRINTF( char* buffer, size_t size, const char* format, ... )
104 {
105  va_list va;
106  va_start( va, format );
107  int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va );
108  va_end( va );
109  return result;
110 }
111 #define TIXML_SSCANF sscanf_s
112 #elif defined WINCE
113 #define TIXML_SNPRINTF _snprintf
114 #define TIXML_SSCANF sscanf
115 #else
116 // GCC version 3 and higher
117 //#warning( "Using sn* functions." )
118 #define TIXML_SNPRINTF snprintf
119 #define TIXML_SSCANF sscanf
120 #endif
121 
122 /* Versioning, past 1.0.14:
123  http://semver.org/
124 */
125 static const int TIXML2_MAJOR_VERSION = 2;
126 static const int TIXML2_MINOR_VERSION = 2;
127 static const int TIXML2_PATCH_VERSION = 0;
128 
129 namespace tinyxml2
130 {
131 class XMLDocument;
132 class XMLElement;
133 class XMLAttribute;
134 class XMLComment;
135 class XMLText;
136 class XMLDeclaration;
137 class XMLUnknown;
138 class XMLPrinter;
139 
140 /*
141  A class that wraps strings. Normally stores the start and end
142  pointers into the XML file itself, and will apply normalization
143  and entity translation if actually read. Can also store (and memory
144  manage) a traditional char[]
145 */
146 class StrPair
147 {
148 public:
149  enum {
153 
160  };
161 
162  StrPair() : _flags( 0 ), _start( 0 ), _end( 0 ) {}
163  ~StrPair();
164 
165  void Set( char* start, char* end, int flags ) {
166  Reset();
167  _start = start;
168  _end = end;
169  _flags = flags | NEEDS_FLUSH;
170  }
171 
172  const char* GetStr();
173 
174  bool Empty() const {
175  return _start == _end;
176  }
177 
178  void SetInternedStr( const char* str ) {
179  Reset();
180  _start = const_cast<char*>(str);
181  }
182 
183  void SetStr( const char* str, int flags=0 );
184 
185  char* ParseText( char* in, const char* endTag, int strFlags );
186  char* ParseName( char* in );
187 
188  void TransferTo( StrPair* other );
189 
190 private:
191  void Reset();
192  void CollapseWhitespace();
193 
194  enum {
195  NEEDS_FLUSH = 0x100,
196  NEEDS_DELETE = 0x200
197  };
198 
199  // After parsing, if *_end != 0, it can be set to zero.
200  int _flags;
201  char* _start;
202  char* _end;
203 
204  StrPair( const StrPair& other ); // not supported
205  void operator=( StrPair& other ); // not supported, use TransferTo()
206 };
207 
208 
209 /*
210  A dynamic array of Plain Old Data. Doesn't support constructors, etc.
211  Has a small initial memory pool, so that low or no usage will not
212  cause a call to new/delete
213 */
214 template <class T, int INIT>
215 class DynArray
216 {
217 public:
219  _mem = _pool;
220  _allocated = INIT;
221  _size = 0;
222  }
223 
225  if ( _mem != _pool ) {
226  delete [] _mem;
227  }
228  }
229 
230  void Clear() {
231  _size = 0;
232  }
233 
234  void Push( T t ) {
235  TIXMLASSERT( _size < INT_MAX );
236  EnsureCapacity( _size+1 );
237  _mem[_size++] = t;
238  }
239 
240  T* PushArr( int count ) {
241  TIXMLASSERT( count >= 0 );
242  TIXMLASSERT( _size <= INT_MAX - count );
243  EnsureCapacity( _size+count );
244  T* ret = &_mem[_size];
245  _size += count;
246  return ret;
247  }
248 
249  T Pop() {
250  TIXMLASSERT( _size > 0 );
251  return _mem[--_size];
252  }
253 
254  void PopArr( int count ) {
255  TIXMLASSERT( _size >= count );
256  _size -= count;
257  }
258 
259  bool Empty() const {
260  return _size == 0;
261  }
262 
263  T& operator[](int i) {
264  TIXMLASSERT( i>= 0 && i < _size );
265  return _mem[i];
266  }
267 
268  const T& operator[](int i) const {
269  TIXMLASSERT( i>= 0 && i < _size );
270  return _mem[i];
271  }
272 
273  const T& PeekTop() const {
274  TIXMLASSERT( _size > 0 );
275  return _mem[ _size - 1];
276  }
277 
278  int Size() const {
279  TIXMLASSERT( _size >= 0 );
280  return _size;
281  }
282 
283  int Capacity() const {
284  return _allocated;
285  }
286 
287  const T* Mem() const {
288  return _mem;
289  }
290 
291  T* Mem() {
292  return _mem;
293  }
294 
295 private:
296  DynArray( const DynArray& ); // not supported
297  void operator=( const DynArray& ); // not supported
298 
299  void EnsureCapacity( int cap ) {
300  TIXMLASSERT( cap > 0 );
301  if ( cap > _allocated ) {
302  TIXMLASSERT( cap <= INT_MAX / 2 );
303  int newAllocated = cap * 2;
304  T* newMem = new T[newAllocated];
305  memcpy( newMem, _mem, sizeof(T)*_size ); // warning: not using constructors, only works for PODs
306  if ( _mem != _pool ) {
307  delete [] _mem;
308  }
309  _mem = newMem;
310  _allocated = newAllocated;
311  }
312  }
313 
314  T* _mem;
315  T _pool[INIT];
316  int _allocated; // objects allocated
317  int _size; // number objects in use
318 };
319 
320 
321 /*
322  Parent virtual class of a pool for fast allocation
323  and deallocation of objects.
324 */
325 class MemPool
326 {
327 public:
328  MemPool() {}
329  virtual ~MemPool() {}
330 
331  virtual int ItemSize() const = 0;
332  virtual void* Alloc() = 0;
333  virtual void Free( void* ) = 0;
334  virtual void SetTracked() = 0;
335  virtual void Clear() = 0;
336 };
337 
338 
339 /*
340  Template child class to create pools of the correct type.
341 */
342 template< int SIZE >
343 class MemPoolT : public MemPool
344 {
345 public:
348  Clear();
349  }
350 
351  void Clear() {
352  // Delete the blocks.
353  while( !_blockPtrs.Empty()) {
354  Block* b = _blockPtrs.Pop();
355  delete b;
356  }
357  _root = 0;
358  _currentAllocs = 0;
359  _nAllocs = 0;
360  _maxAllocs = 0;
361  _nUntracked = 0;
362  }
363 
364  virtual int ItemSize() const {
365  return SIZE;
366  }
367  int CurrentAllocs() const {
368  return _currentAllocs;
369  }
370 
371  virtual void* Alloc() {
372  if ( !_root ) {
373  // Need a new block.
374  Block* block = new Block();
375  _blockPtrs.Push( block );
376 
377  for( int i=0; i<COUNT-1; ++i ) {
378  block->chunk[i].next = &block->chunk[i+1];
379  }
380  block->chunk[COUNT-1].next = 0;
381  _root = block->chunk;
382  }
383  void* result = _root;
384  _root = _root->next;
385 
386  ++_currentAllocs;
387  if ( _currentAllocs > _maxAllocs ) {
389  }
390  _nAllocs++;
391  _nUntracked++;
392  return result;
393  }
394 
395  virtual void Free( void* mem ) {
396  if ( !mem ) {
397  return;
398  }
399  --_currentAllocs;
400  Chunk* chunk = static_cast<Chunk*>( mem );
401 #ifdef DEBUG
402  memset( chunk, 0xfe, sizeof(Chunk) );
403 #endif
404  chunk->next = _root;
405  _root = chunk;
406  }
407  void Trace( const char* name ) {
408  printf( "Mempool %s watermark=%d [%dk] current=%d size=%d nAlloc=%d blocks=%d\n",
409  name, _maxAllocs, _maxAllocs*SIZE/1024, _currentAllocs, SIZE, _nAllocs, _blockPtrs.Size() );
410  }
411 
412  void SetTracked() {
413  _nUntracked--;
414  }
415 
416  int Untracked() const {
417  return _nUntracked;
418  }
419 
420  // This number is perf sensitive. 4k seems like a good tradeoff on my machine.
421  // The test file is large, 170k.
422  // Release: VS2010 gcc(no opt)
423  // 1k: 4000
424  // 2k: 4000
425  // 4k: 3900 21000
426  // 16k: 5200
427  // 32k: 4300
428  // 64k: 4000 21000
429  enum { COUNT = (4*1024)/SIZE }; // Some compilers do not accept to use COUNT in private part if COUNT is private
430 
431 private:
432  MemPoolT( const MemPoolT& ); // not supported
433  void operator=( const MemPoolT& ); // not supported
434 
435  union Chunk {
437  char mem[SIZE];
438  };
439  struct Block {
441  };
443  Chunk* _root;
444 
446  int _nAllocs;
449 };
450 
451 
452 
473 {
474 public:
475  virtual ~XMLVisitor() {}
476 
478  virtual bool VisitEnter( const XMLDocument& /*doc*/ ) {
479  return true;
480  }
482  virtual bool VisitExit( const XMLDocument& /*doc*/ ) {
483  return true;
484  }
485 
487  virtual bool VisitEnter( const XMLElement& /*element*/, const XMLAttribute* /*firstAttribute*/ ) {
488  return true;
489  }
491  virtual bool VisitExit( const XMLElement& /*element*/ ) {
492  return true;
493  }
494 
496  virtual bool Visit( const XMLDeclaration& /*declaration*/ ) {
497  return true;
498  }
500  virtual bool Visit( const XMLText& /*text*/ ) {
501  return true;
502  }
504  virtual bool Visit( const XMLComment& /*comment*/ ) {
505  return true;
506  }
508  virtual bool Visit( const XMLUnknown& /*unknown*/ ) {
509  return true;
510  }
511 };
512 
513 // WARNING: must match XMLDocument::_errorNames[]
514 enum XMLError {
536 
538 };
539 
540 
541 /*
542  Utility functionality.
543 */
544 class XMLUtil
545 {
546 public:
547  static const char* SkipWhiteSpace( const char* p ) {
548  TIXMLASSERT( p );
549  while( IsWhiteSpace(*p) ) {
550  ++p;
551  }
552  TIXMLASSERT( p );
553  return p;
554  }
555  static char* SkipWhiteSpace( char* p ) {
556  return const_cast<char*>( SkipWhiteSpace( const_cast<const char*>(p) ) );
557  }
558 
559  // Anything in the high order range of UTF-8 is assumed to not be whitespace. This isn't
560  // correct, but simple, and usually works.
561  static bool IsWhiteSpace( char p ) {
562  return !IsUTF8Continuation(p) && isspace( static_cast<unsigned char>(p) );
563  }
564 
565  inline static bool IsNameStartChar( unsigned char ch ) {
566  if ( ch >= 128 ) {
567  // This is a heuristic guess in attempt to not implement Unicode-aware isalpha()
568  return true;
569  }
570  if ( isalpha( ch ) ) {
571  return true;
572  }
573  return ch == ':' || ch == '_';
574  }
575 
576  inline static bool IsNameChar( unsigned char ch ) {
577  return IsNameStartChar( ch )
578  || isdigit( ch )
579  || ch == '.'
580  || ch == '-';
581  }
582 
583  inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) {
584  if ( p == q ) {
585  return true;
586  }
587  int n = 0;
588  while( *p && *q && *p == *q && n<nChar ) {
589  ++p;
590  ++q;
591  ++n;
592  }
593  if ( (n == nChar) || ( *p == 0 && *q == 0 ) ) {
594  return true;
595  }
596  return false;
597  }
598 
599  inline static bool IsUTF8Continuation( const char p ) {
600  return ( p & 0x80 ) != 0;
601  }
602 
603  static const char* ReadBOM( const char* p, bool* hasBOM );
604  // p is the starting location,
605  // the UTF-8 value of the entity will be placed in value, and length filled in.
606  static const char* GetCharacterRef( const char* p, char* value, int* length );
607  static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length );
608 
609  // converts primitive types to strings
610  static void ToStr( int v, char* buffer, int bufferSize );
611  static void ToStr( unsigned v, char* buffer, int bufferSize );
612  static void ToStr( bool v, char* buffer, int bufferSize );
613  static void ToStr( float v, char* buffer, int bufferSize );
614  static void ToStr( double v, char* buffer, int bufferSize );
615 
616  // converts strings to primitive types
617  static bool ToInt( const char* str, int* value );
618  static bool ToUnsigned( const char* str, unsigned* value );
619  static bool ToBool( const char* str, bool* value );
620  static bool ToFloat( const char* str, float* value );
621  static bool ToDouble( const char* str, double* value );
622 };
623 
624 
651 {
652  friend class XMLDocument;
653  friend class XMLElement;
654 public:
655 
657  const XMLDocument* GetDocument() const {
658  return _document;
659  }
662  return _document;
663  }
664 
666  virtual XMLElement* ToElement() {
667  return 0;
668  }
670  virtual XMLText* ToText() {
671  return 0;
672  }
674  virtual XMLComment* ToComment() {
675  return 0;
676  }
678  virtual XMLDocument* ToDocument() {
679  return 0;
680  }
683  return 0;
684  }
686  virtual XMLUnknown* ToUnknown() {
687  return 0;
688  }
689 
690  virtual const XMLElement* ToElement() const {
691  return 0;
692  }
693  virtual const XMLText* ToText() const {
694  return 0;
695  }
696  virtual const XMLComment* ToComment() const {
697  return 0;
698  }
699  virtual const XMLDocument* ToDocument() const {
700  return 0;
701  }
702  virtual const XMLDeclaration* ToDeclaration() const {
703  return 0;
704  }
705  virtual const XMLUnknown* ToUnknown() const {
706  return 0;
707  }
708 
718  const char* Value() const;
719 
723  void SetValue( const char* val, bool staticMem=false );
724 
726  const XMLNode* Parent() const {
727  return _parent;
728  }
729 
731  return _parent;
732  }
733 
735  bool NoChildren() const {
736  return !_firstChild;
737  }
738 
740  const XMLNode* FirstChild() const {
741  return _firstChild;
742  }
743 
745  return _firstChild;
746  }
747 
751  const XMLElement* FirstChildElement( const char* value=0 ) const;
752 
753  XMLElement* FirstChildElement( const char* value=0 ) {
754  return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->FirstChildElement( value ));
755  }
756 
758  const XMLNode* LastChild() const {
759  return _lastChild;
760  }
761 
763  return const_cast<XMLNode*>(const_cast<const XMLNode*>(this)->LastChild() );
764  }
765 
769  const XMLElement* LastChildElement( const char* value=0 ) const;
770 
771  XMLElement* LastChildElement( const char* value=0 ) {
772  return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->LastChildElement(value) );
773  }
774 
776  const XMLNode* PreviousSibling() const {
777  return _prev;
778  }
779 
781  return _prev;
782  }
783 
785  const XMLElement* PreviousSiblingElement( const char* value=0 ) const ;
786 
787  XMLElement* PreviousSiblingElement( const char* value=0 ) {
788  return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->PreviousSiblingElement( value ) );
789  }
790 
792  const XMLNode* NextSibling() const {
793  return _next;
794  }
795 
797  return _next;
798  }
799 
801  const XMLElement* NextSiblingElement( const char* value=0 ) const;
802 
803  XMLElement* NextSiblingElement( const char* value=0 ) {
804  return const_cast<XMLElement*>(const_cast<const XMLNode*>(this)->NextSiblingElement( value ) );
805  }
806 
814  XMLNode* InsertEndChild( XMLNode* addThis );
815 
816  XMLNode* LinkEndChild( XMLNode* addThis ) {
817  return InsertEndChild( addThis );
818  }
826  XMLNode* InsertFirstChild( XMLNode* addThis );
835  XMLNode* InsertAfterChild( XMLNode* afterThis, XMLNode* addThis );
836 
840  void DeleteChildren();
841 
845  void DeleteChild( XMLNode* node );
846 
856  virtual XMLNode* ShallowClone( XMLDocument* document ) const = 0;
857 
864  virtual bool ShallowEqual( const XMLNode* compare ) const = 0;
865 
888  virtual bool Accept( XMLVisitor* visitor ) const = 0;
889 
890  // internal
891  virtual char* ParseDeep( char*, StrPair* );
892 
893 protected:
894  XMLNode( XMLDocument* );
895  virtual ~XMLNode();
896 
899  mutable StrPair _value;
900 
903 
906 
907 private:
909  void Unlink( XMLNode* child );
910  static void DeleteNode( XMLNode* node );
911  void InsertChildPreamble( XMLNode* insertThis ) const;
912 
913  XMLNode( const XMLNode& ); // not supported
914  XMLNode& operator=( const XMLNode& ); // not supported
915 };
916 
917 
931 {
932  friend class XMLBase;
933  friend class XMLDocument;
934 public:
935  virtual bool Accept( XMLVisitor* visitor ) const;
936 
937  virtual XMLText* ToText() {
938  return this;
939  }
940  virtual const XMLText* ToText() const {
941  return this;
942  }
943 
945  void SetCData( bool isCData ) {
946  _isCData = isCData;
947  }
949  bool CData() const {
950  return _isCData;
951  }
952 
953  char* ParseDeep( char*, StrPair* endTag );
954  virtual XMLNode* ShallowClone( XMLDocument* document ) const;
955  virtual bool ShallowEqual( const XMLNode* compare ) const;
956 
957 protected:
958  XMLText( XMLDocument* doc ) : XMLNode( doc ), _isCData( false ) {}
959  virtual ~XMLText() {}
960 
961 private:
962  bool _isCData;
963 
964  XMLText( const XMLText& ); // not supported
965  XMLText& operator=( const XMLText& ); // not supported
966 };
967 
968 
971 {
972  friend class XMLDocument;
973 public:
974  virtual XMLComment* ToComment() {
975  return this;
976  }
977  virtual const XMLComment* ToComment() const {
978  return this;
979  }
980 
981  virtual bool Accept( XMLVisitor* visitor ) const;
982 
983  char* ParseDeep( char*, StrPair* endTag );
984  virtual XMLNode* ShallowClone( XMLDocument* document ) const;
985  virtual bool ShallowEqual( const XMLNode* compare ) const;
986 
987 protected:
988  XMLComment( XMLDocument* doc );
989  virtual ~XMLComment();
990 
991 private:
992  XMLComment( const XMLComment& ); // not supported
993  XMLComment& operator=( const XMLComment& ); // not supported
994 };
995 
996 
1009 {
1010  friend class XMLDocument;
1011 public:
1013  return this;
1014  }
1015  virtual const XMLDeclaration* ToDeclaration() const {
1016  return this;
1017  }
1018 
1019  virtual bool Accept( XMLVisitor* visitor ) const;
1020 
1021  char* ParseDeep( char*, StrPair* endTag );
1022  virtual XMLNode* ShallowClone( XMLDocument* document ) const;
1023  virtual bool ShallowEqual( const XMLNode* compare ) const;
1024 
1025 protected:
1026  XMLDeclaration( XMLDocument* doc );
1027  virtual ~XMLDeclaration();
1028 
1029 private:
1030  XMLDeclaration( const XMLDeclaration& ); // not supported
1031  XMLDeclaration& operator=( const XMLDeclaration& ); // not supported
1032 };
1033 
1034 
1043 {
1044  friend class XMLDocument;
1045 public:
1046  virtual XMLUnknown* ToUnknown() {
1047  return this;
1048  }
1049  virtual const XMLUnknown* ToUnknown() const {
1050  return this;
1051  }
1052 
1053  virtual bool Accept( XMLVisitor* visitor ) const;
1054 
1055  char* ParseDeep( char*, StrPair* endTag );
1056  virtual XMLNode* ShallowClone( XMLDocument* document ) const;
1057  virtual bool ShallowEqual( const XMLNode* compare ) const;
1058 
1059 protected:
1060  XMLUnknown( XMLDocument* doc );
1061  virtual ~XMLUnknown();
1062 
1063 private:
1064  XMLUnknown( const XMLUnknown& ); // not supported
1065  XMLUnknown& operator=( const XMLUnknown& ); // not supported
1066 };
1067 
1068 
1069 
1077 {
1078  friend class XMLElement;
1079 public:
1081  const char* Name() const;
1082 
1084  const char* Value() const;
1085 
1087  const XMLAttribute* Next() const {
1088  return _next;
1089  }
1090 
1095  int IntValue() const {
1096  int i=0;
1097  QueryIntValue( &i );
1098  return i;
1099  }
1101  unsigned UnsignedValue() const {
1102  unsigned i=0;
1103  QueryUnsignedValue( &i );
1104  return i;
1105  }
1107  bool BoolValue() const {
1108  bool b=false;
1109  QueryBoolValue( &b );
1110  return b;
1111  }
1113  double DoubleValue() const {
1114  double d=0;
1115  QueryDoubleValue( &d );
1116  return d;
1117  }
1119  float FloatValue() const {
1120  float f=0;
1121  QueryFloatValue( &f );
1122  return f;
1123  }
1124 
1129  XMLError QueryIntValue( int* value ) const;
1131  XMLError QueryUnsignedValue( unsigned int* value ) const;
1133  XMLError QueryBoolValue( bool* value ) const;
1135  XMLError QueryDoubleValue( double* value ) const;
1137  XMLError QueryFloatValue( float* value ) const;
1138 
1140  void SetAttribute( const char* value );
1142  void SetAttribute( int value );
1144  void SetAttribute( unsigned value );
1146  void SetAttribute( bool value );
1148  void SetAttribute( double value );
1150  void SetAttribute( float value );
1151 
1152 private:
1153  enum { BUF_SIZE = 200 };
1154 
1155  XMLAttribute() : _next( 0 ), _memPool( 0 ) {}
1156  virtual ~XMLAttribute() {}
1157 
1158  XMLAttribute( const XMLAttribute& ); // not supported
1159  void operator=( const XMLAttribute& ); // not supported
1160  void SetName( const char* name );
1161 
1162  char* ParseDeep( char* p, bool processEntities );
1163 
1164  mutable StrPair _name;
1165  mutable StrPair _value;
1168 };
1169 
1170 
1176 {
1177  friend class XMLBase;
1178  friend class XMLDocument;
1179 public:
1181  const char* Name() const {
1182  return Value();
1183  }
1185  void SetName( const char* str, bool staticMem=false ) {
1186  SetValue( str, staticMem );
1187  }
1188 
1189  virtual XMLElement* ToElement() {
1190  return this;
1191  }
1192  virtual const XMLElement* ToElement() const {
1193  return this;
1194  }
1195  virtual bool Accept( XMLVisitor* visitor ) const;
1196 
1220  const char* Attribute( const char* name, const char* value=0 ) const;
1221 
1227  int IntAttribute( const char* name ) const {
1228  int i=0;
1229  QueryIntAttribute( name, &i );
1230  return i;
1231  }
1233  unsigned UnsignedAttribute( const char* name ) const {
1234  unsigned i=0;
1235  QueryUnsignedAttribute( name, &i );
1236  return i;
1237  }
1239  bool BoolAttribute( const char* name ) const {
1240  bool b=false;
1241  QueryBoolAttribute( name, &b );
1242  return b;
1243  }
1245  double DoubleAttribute( const char* name ) const {
1246  double d=0;
1247  QueryDoubleAttribute( name, &d );
1248  return d;
1249  }
1251  float FloatAttribute( const char* name ) const {
1252  float f=0;
1253  QueryFloatAttribute( name, &f );
1254  return f;
1255  }
1256 
1270  XMLError QueryIntAttribute( const char* name, int* value ) const {
1271  const XMLAttribute* a = FindAttribute( name );
1272  if ( !a ) {
1273  return XML_NO_ATTRIBUTE;
1274  }
1275  return a->QueryIntValue( value );
1276  }
1278  XMLError QueryUnsignedAttribute( const char* name, unsigned int* value ) const {
1279  const XMLAttribute* a = FindAttribute( name );
1280  if ( !a ) {
1281  return XML_NO_ATTRIBUTE;
1282  }
1283  return a->QueryUnsignedValue( value );
1284  }
1286  XMLError QueryBoolAttribute( const char* name, bool* value ) const {
1287  const XMLAttribute* a = FindAttribute( name );
1288  if ( !a ) {
1289  return XML_NO_ATTRIBUTE;
1290  }
1291  return a->QueryBoolValue( value );
1292  }
1294  XMLError QueryDoubleAttribute( const char* name, double* value ) const {
1295  const XMLAttribute* a = FindAttribute( name );
1296  if ( !a ) {
1297  return XML_NO_ATTRIBUTE;
1298  }
1299  return a->QueryDoubleValue( value );
1300  }
1302  XMLError QueryFloatAttribute( const char* name, float* value ) const {
1303  const XMLAttribute* a = FindAttribute( name );
1304  if ( !a ) {
1305  return XML_NO_ATTRIBUTE;
1306  }
1307  return a->QueryFloatValue( value );
1308  }
1309 
1310 
1328  int QueryAttribute( const char* name, int* value ) const {
1329  return QueryIntAttribute( name, value );
1330  }
1331 
1332  int QueryAttribute( const char* name, unsigned int* value ) const {
1333  return QueryUnsignedAttribute( name, value );
1334  }
1335 
1336  int QueryAttribute( const char* name, bool* value ) const {
1337  return QueryBoolAttribute( name, value );
1338  }
1339 
1340  int QueryAttribute( const char* name, double* value ) const {
1341  return QueryDoubleAttribute( name, value );
1342  }
1343 
1344  int QueryAttribute( const char* name, float* value ) const {
1345  return QueryFloatAttribute( name, value );
1346  }
1347 
1349  void SetAttribute( const char* name, const char* value ) {
1350  XMLAttribute* a = FindOrCreateAttribute( name );
1351  a->SetAttribute( value );
1352  }
1354  void SetAttribute( const char* name, int value ) {
1355  XMLAttribute* a = FindOrCreateAttribute( name );
1356  a->SetAttribute( value );
1357  }
1359  void SetAttribute( const char* name, unsigned value ) {
1360  XMLAttribute* a = FindOrCreateAttribute( name );
1361  a->SetAttribute( value );
1362  }
1364  void SetAttribute( const char* name, bool value ) {
1365  XMLAttribute* a = FindOrCreateAttribute( name );
1366  a->SetAttribute( value );
1367  }
1369  void SetAttribute( const char* name, double value ) {
1370  XMLAttribute* a = FindOrCreateAttribute( name );
1371  a->SetAttribute( value );
1372  }
1374  void SetAttribute( const char* name, float value ) {
1375  XMLAttribute* a = FindOrCreateAttribute( name );
1376  a->SetAttribute( value );
1377  }
1378 
1382  void DeleteAttribute( const char* name );
1383 
1385  const XMLAttribute* FirstAttribute() const {
1386  return _rootAttribute;
1387  }
1389  const XMLAttribute* FindAttribute( const char* name ) const;
1390 
1419  const char* GetText() const;
1420 
1455  void SetText( const char* inText );
1457  void SetText( int value );
1459  void SetText( unsigned value );
1461  void SetText( bool value );
1463  void SetText( double value );
1465  void SetText( float value );
1466 
1493  XMLError QueryIntText( int* ival ) const;
1495  XMLError QueryUnsignedText( unsigned* uval ) const;
1497  XMLError QueryBoolText( bool* bval ) const;
1499  XMLError QueryDoubleText( double* dval ) const;
1501  XMLError QueryFloatText( float* fval ) const;
1502 
1503  // internal:
1504  enum {
1505  OPEN, // <foo>
1506  CLOSED, // <foo/>
1507  CLOSING // </foo>
1508  };
1509  int ClosingType() const {
1510  return _closingType;
1511  }
1512  char* ParseDeep( char* p, StrPair* endTag );
1513  virtual XMLNode* ShallowClone( XMLDocument* document ) const;
1514  virtual bool ShallowEqual( const XMLNode* compare ) const;
1515 
1516 private:
1517  XMLElement( XMLDocument* doc );
1518  virtual ~XMLElement();
1519  XMLElement( const XMLElement& ); // not supported
1520  void operator=( const XMLElement& ); // not supported
1521 
1522  XMLAttribute* FindAttribute( const char* name ) {
1523  return const_cast<XMLAttribute*>(const_cast<const XMLElement*>(this)->FindAttribute( name ));
1524  }
1525  XMLAttribute* FindOrCreateAttribute( const char* name );
1526  //void LinkAttribute( XMLAttribute* attrib );
1527  char* ParseAttributes( char* p );
1528  static void DeleteAttribute( XMLAttribute* attribute );
1529 
1530  enum { BUF_SIZE = 200 };
1532  // The attribute list is ordered; there is no 'lastAttribute'
1533  // because the list needs to be scanned for dupes before adding
1534  // a new attribute.
1536 };
1537 
1538 
1542 };
1543 
1544 
1551 {
1552  friend class XMLElement;
1553 public:
1555  XMLDocument( bool processEntities = true, Whitespace = PRESERVE_WHITESPACE );
1556  ~XMLDocument();
1557 
1559  return this;
1560  }
1561  virtual const XMLDocument* ToDocument() const {
1562  return this;
1563  }
1564 
1575  XMLError Parse( const char* xml, size_t nBytes=(size_t)(-1) );
1576 
1582  XMLError LoadFile( const char* filename );
1583 
1595  XMLError LoadFile( FILE* );
1596 
1602  XMLError SaveFile( const char* filename, bool compact = false );
1603 
1611  XMLError SaveFile( FILE* fp, bool compact = false );
1612 
1613  bool ProcessEntities() const {
1614  return _processEntities;
1615  }
1617  return _whitespace;
1618  }
1619 
1623  bool HasBOM() const {
1624  return _writeBOM;
1625  }
1628  void SetBOM( bool useBOM ) {
1629  _writeBOM = useBOM;
1630  }
1631 
1636  return FirstChildElement();
1637  }
1638  const XMLElement* RootElement() const {
1639  return FirstChildElement();
1640  }
1641 
1656  void Print( XMLPrinter* streamer=0 ) const;
1657  virtual bool Accept( XMLVisitor* visitor ) const;
1658 
1664  XMLElement* NewElement( const char* name );
1670  XMLComment* NewComment( const char* comment );
1676  XMLText* NewText( const char* text );
1688  XMLDeclaration* NewDeclaration( const char* text=0 );
1694  XMLUnknown* NewUnknown( const char* text );
1695 
1700  void DeleteNode( XMLNode* node );
1701 
1702  void SetError( XMLError error, const char* str1, const char* str2 );
1703 
1705  bool Error() const {
1706  return _errorID != XML_NO_ERROR;
1707  }
1709  XMLError ErrorID() const {
1710  return _errorID;
1711  }
1712  const char* ErrorName() const;
1713 
1715  const char* GetErrorStr1() const {
1716  return _errorStr1;
1717  }
1719  const char* GetErrorStr2() const {
1720  return _errorStr2;
1721  }
1723  void PrintError() const;
1724 
1726  void Clear();
1727 
1728  // internal
1729  char* Identify( char* p, XMLNode** node );
1730 
1731  virtual XMLNode* ShallowClone( XMLDocument* /*document*/ ) const {
1732  return 0;
1733  }
1734  virtual bool ShallowEqual( const XMLNode* /*compare*/ ) const {
1735  return false;
1736  }
1737 
1738 private:
1739  XMLDocument( const XMLDocument& ); // not supported
1740  void operator=( const XMLDocument& ); // not supported
1741 
1746  const char* _errorStr1;
1747  const char* _errorStr2;
1749 
1754 
1755  static const char* _errorNames[XML_ERROR_COUNT];
1756 
1757  void Parse();
1758 };
1759 
1760 
1817 {
1818 public:
1820  XMLHandle( XMLNode* node ) {
1821  _node = node;
1822  }
1824  XMLHandle( XMLNode& node ) {
1825  _node = &node;
1826  }
1828  XMLHandle( const XMLHandle& ref ) {
1829  _node = ref._node;
1830  }
1832  XMLHandle& operator=( const XMLHandle& ref ) {
1833  _node = ref._node;
1834  return *this;
1835  }
1836 
1839  return XMLHandle( _node ? _node->FirstChild() : 0 );
1840  }
1842  XMLHandle FirstChildElement( const char* value=0 ) {
1843  return XMLHandle( _node ? _node->FirstChildElement( value ) : 0 );
1844  }
1847  return XMLHandle( _node ? _node->LastChild() : 0 );
1848  }
1850  XMLHandle LastChildElement( const char* _value=0 ) {
1851  return XMLHandle( _node ? _node->LastChildElement( _value ) : 0 );
1852  }
1855  return XMLHandle( _node ? _node->PreviousSibling() : 0 );
1856  }
1858  XMLHandle PreviousSiblingElement( const char* _value=0 ) {
1859  return XMLHandle( _node ? _node->PreviousSiblingElement( _value ) : 0 );
1860  }
1863  return XMLHandle( _node ? _node->NextSibling() : 0 );
1864  }
1866  XMLHandle NextSiblingElement( const char* _value=0 ) {
1867  return XMLHandle( _node ? _node->NextSiblingElement( _value ) : 0 );
1868  }
1869 
1872  return _node;
1873  }
1876  return ( ( _node == 0 ) ? 0 : _node->ToElement() );
1877  }
1880  return ( ( _node == 0 ) ? 0 : _node->ToText() );
1881  }
1884  return ( ( _node == 0 ) ? 0 : _node->ToUnknown() );
1885  }
1888  return ( ( _node == 0 ) ? 0 : _node->ToDeclaration() );
1889  }
1890 
1891 private:
1893 };
1894 
1895 
1901 {
1902 public:
1903  XMLConstHandle( const XMLNode* node ) {
1904  _node = node;
1905  }
1906  XMLConstHandle( const XMLNode& node ) {
1907  _node = &node;
1908  }
1910  _node = ref._node;
1911  }
1912 
1914  _node = ref._node;
1915  return *this;
1916  }
1917 
1918  const XMLConstHandle FirstChild() const {
1919  return XMLConstHandle( _node ? _node->FirstChild() : 0 );
1920  }
1921  const XMLConstHandle FirstChildElement( const char* value=0 ) const {
1922  return XMLConstHandle( _node ? _node->FirstChildElement( value ) : 0 );
1923  }
1924  const XMLConstHandle LastChild() const {
1925  return XMLConstHandle( _node ? _node->LastChild() : 0 );
1926  }
1927  const XMLConstHandle LastChildElement( const char* _value=0 ) const {
1928  return XMLConstHandle( _node ? _node->LastChildElement( _value ) : 0 );
1929  }
1931  return XMLConstHandle( _node ? _node->PreviousSibling() : 0 );
1932  }
1933  const XMLConstHandle PreviousSiblingElement( const char* _value=0 ) const {
1934  return XMLConstHandle( _node ? _node->PreviousSiblingElement( _value ) : 0 );
1935  }
1936  const XMLConstHandle NextSibling() const {
1937  return XMLConstHandle( _node ? _node->NextSibling() : 0 );
1938  }
1939  const XMLConstHandle NextSiblingElement( const char* _value=0 ) const {
1940  return XMLConstHandle( _node ? _node->NextSiblingElement( _value ) : 0 );
1941  }
1942 
1943 
1944  const XMLNode* ToNode() const {
1945  return _node;
1946  }
1947  const XMLElement* ToElement() const {
1948  return ( ( _node == 0 ) ? 0 : _node->ToElement() );
1949  }
1950  const XMLText* ToText() const {
1951  return ( ( _node == 0 ) ? 0 : _node->ToText() );
1952  }
1953  const XMLUnknown* ToUnknown() const {
1954  return ( ( _node == 0 ) ? 0 : _node->ToUnknown() );
1955  }
1957  return ( ( _node == 0 ) ? 0 : _node->ToDeclaration() );
1958  }
1959 
1960 private:
1961  const XMLNode* _node;
1962 };
1963 
1964 
2008 {
2009 public:
2016  XMLPrinter( FILE* file=0, bool compact = false, int depth = 0 );
2017  virtual ~XMLPrinter() {}
2018 
2020  void PushHeader( bool writeBOM, bool writeDeclaration );
2024  void OpenElement( const char* name, bool compactMode=false );
2026  void PushAttribute( const char* name, const char* value );
2027  void PushAttribute( const char* name, int value );
2028  void PushAttribute( const char* name, unsigned value );
2029  void PushAttribute( const char* name, bool value );
2030  void PushAttribute( const char* name, double value );
2032  virtual void CloseElement( bool compactMode=false );
2033 
2035  void PushText( const char* text, bool cdata=false );
2037  void PushText( int value );
2039  void PushText( unsigned value );
2041  void PushText( bool value );
2043  void PushText( float value );
2045  void PushText( double value );
2046 
2048  void PushComment( const char* comment );
2049 
2050  void PushDeclaration( const char* value );
2051  void PushUnknown( const char* value );
2052 
2053  virtual bool VisitEnter( const XMLDocument& /*doc*/ );
2054  virtual bool VisitExit( const XMLDocument& /*doc*/ ) {
2055  return true;
2056  }
2057 
2058  virtual bool VisitEnter( const XMLElement& element, const XMLAttribute* attribute );
2059  virtual bool VisitExit( const XMLElement& element );
2060 
2061  virtual bool Visit( const XMLText& text );
2062  virtual bool Visit( const XMLComment& comment );
2063  virtual bool Visit( const XMLDeclaration& declaration );
2064  virtual bool Visit( const XMLUnknown& unknown );
2065 
2070  const char* CStr() const {
2071  return _buffer.Mem();
2072  }
2078  int CStrSize() const {
2079  return _buffer.Size();
2080  }
2085  void ClearBuffer() {
2086  _buffer.Clear();
2087  _buffer.Push(0);
2088  }
2089 
2090 protected:
2091  virtual bool CompactMode( const XMLElement& ) { return _compactMode; }
2092 
2096  virtual void PrintSpace( int depth );
2097  void Print( const char* format, ... );
2098 
2099  void SealElementIfJustOpened();
2102 
2103 private:
2104  void PrintString( const char*, bool restrictedEntitySet ); // prints out, after detecting entities.
2105 
2107  FILE* _fp;
2108  int _depth;
2112 
2113  enum {
2114  ENTITY_RANGE = 64,
2115  BUF_SIZE = 200
2116  };
2117  bool _entityFlag[ENTITY_RANGE];
2118  bool _restrictedEntityFlag[ENTITY_RANGE];
2119 
2121 };
2122 
2123 
2124 } // tinyxml2
2125 
2126 #if defined(_MSC_VER)
2127 # pragma warning(pop)
2128 #endif
2129 
2130 #endif // TINYXML2_INCLUDED
virtual XMLElement * ToElement()
Safely cast to an Element, or null.
Definition: tinyxml2.h:1189
double DoubleAttribute(const char *name) const
See IntAttribute()
Definition: tinyxml2.h:1245
T & operator[](int i)
Definition: tinyxml2.h:263
Whitespace _whitespace
Definition: tinyxml2.h:1745
int QueryAttribute(const char *name, int *value) const
Definition: tinyxml2.h:1328
int QueryAttribute(const char *name, bool *value) const
Definition: tinyxml2.h:1336
const XMLDeclaration * ToDeclaration() const
Definition: tinyxml2.h:1956
void CollapseWhitespace()
Definition: tinyxml2.cpp:158
const char * _errorStr1
Definition: tinyxml2.h:1746
bool BoolValue() const
Query as a boolean. See IntValue()
Definition: tinyxml2.h:1107
bool Error() const
Return true if there was an error parsing the document.
Definition: tinyxml2.h:1705
virtual ~XMLText()
Definition: tinyxml2.h:959
const XMLConstHandle FirstChild() const
Definition: tinyxml2.h:1918
const XMLConstHandle LastChild() const
Definition: tinyxml2.h:1924
XMLError QueryIntValue(int *value) const
Definition: tinyxml2.cpp:1169
const XMLText * ToText() const
Definition: tinyxml2.h:1950
virtual void Free(void *mem)
Definition: tinyxml2.h:395
static const int TIXML2_PATCH_VERSION
Definition: tinyxml2.h:127
XMLError QueryUnsignedAttribute(const char *name, unsigned int *value) const
See QueryIntAttribute()
Definition: tinyxml2.h:1278
virtual const XMLDeclaration * ToDeclaration() const
Definition: tinyxml2.h:702
T * PushArr(int count)
Definition: tinyxml2.h:240
virtual XMLDocument * ToDocument()
Safely cast to a Document, or null.
Definition: tinyxml2.h:678
XMLHandle(XMLNode *node)
Create a handle from any node (at any depth of the tree.) This can be a null pointer.
Definition: tinyxml2.h:1820
virtual const XMLComment * ToComment() const
Definition: tinyxml2.h:696
virtual void * Alloc()
Definition: tinyxml2.h:371
const XMLNode * _node
Definition: tinyxml2.h:1961
virtual ~MemPool()
Definition: tinyxml2.h:329
XMLError QueryFloatValue(float *value) const
See QueryIntValue.
Definition: tinyxml2.cpp:1196
void PopArr(int count)
Definition: tinyxml2.h:254
XMLAttribute * _rootAttribute
Definition: tinyxml2.h:1535
MemPoolT< sizeof(XMLAttribute) > _attributePool
Definition: tinyxml2.h:1751
static const char * SkipWhiteSpace(const char *p)
Definition: tinyxml2.h:547
const T & operator[](int i) const
Definition: tinyxml2.h:268
int CurrentAllocs() const
Definition: tinyxml2.h:367
void SetAttribute(const char *name, unsigned value)
Sets the named attribute to value.
Definition: tinyxml2.h:1359
virtual ~XMLAttribute()
Definition: tinyxml2.h:1156
virtual XMLComment * ToComment()
Safely cast to a Comment, or null.
Definition: tinyxml2.h:674
XMLNode * FirstChild()
Definition: tinyxml2.h:744
XMLConstHandle & operator=(const XMLConstHandle &ref)
Definition: tinyxml2.h:1913
virtual const XMLText * ToText() const
Definition: tinyxml2.h:693
virtual bool VisitEnter(const XMLElement &, const XMLAttribute *)
Visit an element.
Definition: tinyxml2.h:487
XMLNode * _lastChild
Definition: tinyxml2.h:902
virtual ~XMLVisitor()
Definition: tinyxml2.h:475
bool CData() const
Returns true if this is a CDATA text element.
Definition: tinyxml2.h:949
void Set(char *start, char *end, int flags)
Definition: tinyxml2.h:165
DynArray< Block *, 10 > _blockPtrs
Definition: tinyxml2.h:442
virtual void Free(void *)=0
int ClosingType() const
Definition: tinyxml2.h:1509
static bool IsNameChar(unsigned char ch)
Definition: tinyxml2.h:576
static bool IsWhiteSpace(char p)
Definition: tinyxml2.h:561
XMLHandle LastChildElement(const char *_value=0)
Get the last child element of this handle.
Definition: tinyxml2.h:1850
void TransferTo(StrPair *other)
Definition: tinyxml2.cpp:73
XMLNode * _next
Definition: tinyxml2.h:905
const XMLElement * RootElement() const
Definition: tinyxml2.h:1638
virtual XMLUnknown * ToUnknown()
Safely cast to an Unknown, or null.
Definition: tinyxml2.h:1046
virtual bool Visit(const XMLText &)
Visit a text node.
Definition: tinyxml2.h:500
const XMLNode * FirstChild() const
Get the first child node, or null if none exists.
Definition: tinyxml2.h:740
XMLNode * _firstChild
Definition: tinyxml2.h:901
virtual bool ShallowEqual(const XMLNode *) const
Definition: tinyxml2.h:1734
static char * SkipWhiteSpace(char *p)
Definition: tinyxml2.h:555
double DoubleValue() const
Query as a double. See IntValue()
Definition: tinyxml2.h:1113
XMLConstHandle(const XMLNode *node)
Definition: tinyxml2.h:1903
XMLNode * PreviousSibling()
Definition: tinyxml2.h:780
virtual bool VisitExit(const XMLDocument &)
Visit a document.
Definition: tinyxml2.h:482
char * ParseName(char *in)
Definition: tinyxml2.cpp:138
XMLConstHandle(const XMLNode &node)
Definition: tinyxml2.h:1906
int QueryAttribute(const char *name, double *value) const
Definition: tinyxml2.h:1340
void SetAttribute(const char *value)
Set the attribute to a string value.
Definition: tinyxml2.cpp:1214
virtual const XMLText * ToText() const
Definition: tinyxml2.h:940
int Capacity() const
Definition: tinyxml2.h:283
XMLError QueryFloatAttribute(const char *name, float *value) const
See QueryIntAttribute()
Definition: tinyxml2.h:1302
virtual const XMLUnknown * ToUnknown() const
Definition: tinyxml2.h:705
XMLNode * _parent
Definition: tinyxml2.h:898
const XMLNode * ToNode() const
Definition: tinyxml2.h:1944
const XMLConstHandle PreviousSibling() const
Definition: tinyxml2.h:1930
virtual XMLText * ToText()
Safely cast to Text, or null.
Definition: tinyxml2.h:937
MemPool * _memPool
Definition: tinyxml2.h:908
virtual bool Visit(const XMLComment &)
Visit a comment node.
Definition: tinyxml2.h:504
int IntAttribute(const char *name) const
Definition: tinyxml2.h:1227
XMLHandle LastChild()
Get the last child of this handle.
Definition: tinyxml2.h:1846
XMLNode * Parent()
Definition: tinyxml2.h:730
virtual XMLNode * ShallowClone(XMLDocument *) const
Definition: tinyxml2.h:1731
const T & PeekTop() const
Definition: tinyxml2.h:273
void SetAttribute(const char *name, const char *value)
Sets the named attribute to value.
Definition: tinyxml2.h:1349
const char * GetErrorStr2() const
Return a possibly helpful secondary diagnostic location or string.
Definition: tinyxml2.h:1719
static const int TIXML2_MINOR_VERSION
Definition: tinyxml2.h:126
const XMLUnknown * ToUnknown() const
Definition: tinyxml2.h:1953
XMLHandle & operator=(const XMLHandle &ref)
Assignment.
Definition: tinyxml2.h:1832
const XMLConstHandle NextSibling() const
Definition: tinyxml2.h:1936
void SetBOM(bool useBOM)
Definition: tinyxml2.h:1628
XMLError QueryDoubleValue(double *value) const
See QueryIntValue.
Definition: tinyxml2.cpp:1205
bool ProcessEntities() const
Definition: tinyxml2.h:1613
DynArray< char, 20 > _buffer
Definition: tinyxml2.h:2120
const XMLConstHandle NextSiblingElement(const char *_value=0) const
Definition: tinyxml2.h:1939
XMLError ErrorID() const
Return the errorID.
Definition: tinyxml2.h:1709
XMLElement * RootElement()
Definition: tinyxml2.h:1635
const XMLNode * Parent() const
Get the parent of this node on the DOM.
Definition: tinyxml2.h:726
virtual ~XMLPrinter()
Definition: tinyxml2.h:2017
XMLAttribute * _next
Definition: tinyxml2.h:1166
const XMLAttribute * Next() const
The next attribute in the list.
Definition: tinyxml2.h:1087
XMLError QueryDoubleAttribute(const char *name, double *value) const
See QueryIntAttribute()
Definition: tinyxml2.h:1294
void SetName(const char *str, bool staticMem=false)
Set the name of the element.
Definition: tinyxml2.h:1185
virtual int ItemSize() const
Definition: tinyxml2.h:364
static bool IsUTF8Continuation(const char p)
Definition: tinyxml2.h:599
void SetAttribute(const char *name, double value)
Sets the named attribute to value.
Definition: tinyxml2.h:1369
int IntValue() const
Definition: tinyxml2.h:1095
int QueryAttribute(const char *name, float *value) const
Definition: tinyxml2.h:1344
void operator=(const MemPoolT &)
static const int TIXML2_MAJOR_VERSION
Definition: tinyxml2.h:125
StrPair _value
Definition: tinyxml2.h:899
virtual void SetTracked()=0
MemPoolT< sizeof(XMLComment) > _commentPool
Definition: tinyxml2.h:1753
virtual void * Alloc()=0
XMLHandle NextSiblingElement(const char *_value=0)
Get the next sibling element of this handle.
Definition: tinyxml2.h:1866
#define TINYXML2_LIB
Definition: tinyxml2.h:74
bool BoolAttribute(const char *name) const
See IntAttribute()
Definition: tinyxml2.h:1239
const char * GetStr()
Definition: tinyxml2.cpp:187
const XMLConstHandle LastChildElement(const char *_value=0) const
Definition: tinyxml2.h:1927
virtual bool VisitExit(const XMLDocument &)
Visit a document.
Definition: tinyxml2.h:2054
void SetStr(const char *str, int flags=0)
Definition: tinyxml2.cpp:107
XMLHandle(XMLNode &node)
Create a handle from a node.
Definition: tinyxml2.h:1824
void SetCData(bool isCData)
Declare whether this should be CDATA or standard text.
Definition: tinyxml2.h:945
XMLDocument * GetDocument()
Get the XMLDocument that owns this XMLNode.
Definition: tinyxml2.h:661
const XMLDocument * GetDocument() const
Get the XMLDocument that owns this XMLNode.
Definition: tinyxml2.h:657
virtual XMLDeclaration * ToDeclaration()
Safely cast to a Declaration, or null.
Definition: tinyxml2.h:1012
virtual XMLUnknown * ToUnknown()
Safely cast to an Unknown, or null.
Definition: tinyxml2.h:686
static bool StringEqual(const char *p, const char *q, int nChar=INT_MAX)
Definition: tinyxml2.h:583
int Untracked() const
Definition: tinyxml2.h:416
const char * _errorStr2
Definition: tinyxml2.h:1747
unsigned UnsignedAttribute(const char *name) const
See IntAttribute()
Definition: tinyxml2.h:1233
virtual bool VisitExit(const XMLElement &)
Visit an element.
Definition: tinyxml2.h:491
virtual const XMLElement * ToElement() const
Definition: tinyxml2.h:1192
virtual bool Visit(const XMLUnknown &)
Visit an unknown node.
Definition: tinyxml2.h:508
XMLConstHandle(const XMLConstHandle &ref)
Definition: tinyxml2.h:1909
#define TIXML_SNPRINTF
Definition: tinyxml2.h:118
const XMLNode * PreviousSibling() const
Get the previous (left) sibling node of this node.
Definition: tinyxml2.h:776
const XMLConstHandle FirstChildElement(const char *value=0) const
Definition: tinyxml2.h:1921
virtual const XMLDeclaration * ToDeclaration() const
Definition: tinyxml2.h:1015
XMLNode * LinkEndChild(XMLNode *addThis)
Definition: tinyxml2.h:816
XMLAttribute * FindAttribute(const char *name)
Definition: tinyxml2.h:1522
void SetAttribute(const char *name, bool value)
Sets the named attribute to value.
Definition: tinyxml2.h:1364
void SetAttribute(const char *name, float value)
Sets the named attribute to value.
Definition: tinyxml2.h:1374
const char * GetErrorStr1() const
Return a possibly helpful diagnostic location or string.
Definition: tinyxml2.h:1715
#define TIXMLASSERT(x)
Definition: tinyxml2.h:90
DynArray< const char *, 10 > _stack
Definition: tinyxml2.h:2101
XMLNode * NextSibling()
Definition: tinyxml2.h:796
XMLError QueryIntAttribute(const char *name, int *value) const
Definition: tinyxml2.h:1270
XMLNode * ToNode()
Safe cast to XMLNode. This can return null.
Definition: tinyxml2.h:1871
void Trace(const char *name)
Definition: tinyxml2.h:407
XMLHandle NextSibling()
Get the next sibling of this handle.
Definition: tinyxml2.h:1862
unsigned UnsignedValue() const
Query as an unsigned integer. See IntValue()
Definition: tinyxml2.h:1101
int Size() const
Definition: tinyxml2.h:278
XMLError QueryUnsignedValue(unsigned int *value) const
See QueryIntValue.
Definition: tinyxml2.cpp:1178
XMLText(XMLDocument *doc)
Definition: tinyxml2.h:958
static bool IsNameStartChar(unsigned char ch)
Definition: tinyxml2.h:565
const XMLElement * ToElement() const
Definition: tinyxml2.h:1947
XMLDocument * _document
Definition: tinyxml2.h:897
virtual XMLText * ToText()
Safely cast to Text, or null.
Definition: tinyxml2.h:670
void SetAttribute(const char *name, int value)
Sets the named attribute to value.
Definition: tinyxml2.h:1354
XMLError QueryBoolAttribute(const char *name, bool *value) const
See QueryIntAttribute()
Definition: tinyxml2.h:1286
bool HasBOM() const
Definition: tinyxml2.h:1623
void EnsureCapacity(int cap)
Definition: tinyxml2.h:299
XMLText * ToText()
Safe cast to XMLText. This can return null.
Definition: tinyxml2.h:1879
void operator=(StrPair &other)
int QueryAttribute(const char *name, unsigned int *value) const
Definition: tinyxml2.h:1332
const XMLNode * LastChild() const
Get the last child node, or null if none exists.
Definition: tinyxml2.h:758
const T * Mem() const
Definition: tinyxml2.h:287
XMLNode * LastChild()
Definition: tinyxml2.h:762
virtual bool CompactMode(const XMLElement &)
Definition: tinyxml2.h:2091
XMLHandle PreviousSibling()
Get the previous sibling of this handle.
Definition: tinyxml2.h:1854
MemPoolT< sizeof(XMLText) > _textPool
Definition: tinyxml2.h:1752
XMLDeclaration * ToDeclaration()
Safe cast to XMLDeclaration. This can return null.
Definition: tinyxml2.h:1887
bool NoChildren() const
Returns true if this node has no children.
Definition: tinyxml2.h:735
virtual const XMLDocument * ToDocument() const
Definition: tinyxml2.h:699
int CStrSize() const
Definition: tinyxml2.h:2078
virtual void Clear()=0
MemPoolT< sizeof(XMLElement) > _elementPool
Definition: tinyxml2.h:1750
const XMLAttribute * FirstAttribute() const
Return the first attribute in the list.
Definition: tinyxml2.h:1385
XMLUnknown * ToUnknown()
Safe cast to XMLUnknown. This can return null.
Definition: tinyxml2.h:1883
const XMLConstHandle PreviousSiblingElement(const char *_value=0) const
Definition: tinyxml2.h:1933
XMLHandle FirstChild()
Get the first child of this handle.
Definition: tinyxml2.h:1838
XMLElement * FirstChildElement(const char *value=0)
Definition: tinyxml2.h:753
virtual const XMLUnknown * ToUnknown() const
Definition: tinyxml2.h:1049
XMLElement * ToElement()
Safe cast to XMLElement. This can return null.
Definition: tinyxml2.h:1875
float FloatAttribute(const char *name) const
See IntAttribute()
Definition: tinyxml2.h:1251
virtual bool Visit(const XMLDeclaration &)
Visit a declaration.
Definition: tinyxml2.h:496
bool Empty() const
Definition: tinyxml2.h:259
void operator=(const DynArray &)
void Push(T t)
Definition: tinyxml2.h:234
virtual bool VisitEnter(const XMLDocument &)
Visit a document.
Definition: tinyxml2.h:478
XMLNode * _prev
Definition: tinyxml2.h:904
XMLElement * NextSiblingElement(const char *value=0)
Definition: tinyxml2.h:803
XMLElement * LastChildElement(const char *value=0)
Definition: tinyxml2.h:771
virtual const XMLElement * ToElement() const
Definition: tinyxml2.h:690
char * ParseText(char *in, const char *endTag, int strFlags)
Definition: tinyxml2.cpp:118
XMLError QueryBoolValue(bool *value) const
See QueryIntValue.
Definition: tinyxml2.cpp:1187
virtual XMLDocument * ToDocument()
Safely cast to a Document, or null.
Definition: tinyxml2.h:1558
virtual int ItemSize() const =0
Whitespace WhitespaceMode() const
Definition: tinyxml2.h:1616
float FloatValue() const
Query as a float. See IntValue()
Definition: tinyxml2.h:1119
virtual XMLDeclaration * ToDeclaration()
Safely cast to a Declaration, or null.
Definition: tinyxml2.h:682
XMLHandle PreviousSiblingElement(const char *_value=0)
Get the previous sibling element of this handle.
Definition: tinyxml2.h:1858
virtual XMLElement * ToElement()
Safely cast to an Element, or null.
Definition: tinyxml2.h:666
virtual XMLComment * ToComment()
Safely cast to a Comment, or null.
Definition: tinyxml2.h:974
virtual const XMLComment * ToComment() const
Definition: tinyxml2.h:977
const XMLNode * NextSibling() const
Get the next (right) sibling node of this node.
Definition: tinyxml2.h:792
XMLHandle(const XMLHandle &ref)
Copy constructor.
Definition: tinyxml2.h:1828
virtual const XMLDocument * ToDocument() const
Definition: tinyxml2.h:1561
XMLElement * PreviousSiblingElement(const char *value=0)
Definition: tinyxml2.h:787
bool Empty() const
Definition: tinyxml2.h:174
const char * CStr() const
Definition: tinyxml2.h:2070
const char * Name() const
Get the name of an element (which is the Value() of the node.)
Definition: tinyxml2.h:1181
XMLHandle FirstChildElement(const char *value=0)
Get the first child element of this handle.
Definition: tinyxml2.h:1842
void SetInternedStr(const char *str)
Definition: tinyxml2.h:178