00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 #ifndef TINYXML_INCLUDED
00027 #define TINYXML_INCLUDED
00028 
00029 #if defined(_SYSTEM_WIN32_) && !defined(_IC_STATIC_)
00030 # ifdef TINYXML_EXPORT
00031 #  define TINYXML_IMPORT_EXPORT __declspec(dllexport)
00032 # else
00033 #  define TINYXML_IMPORT_EXPORT __declspec(dllimport)
00034 # endif
00035 #elif defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC__ >= 5 || __GNUC_MINOR__ >= 2) && !defined(_IC_STATIC_)
00036 # define TINYXML_IMPORT_EXPORT __attribute__ ((visibility("default")))
00037 #else
00038 # define TINYXML_IMPORT_EXPORT
00039 #endif
00040 
00041 #ifdef _MSC_VER
00042 #pragma warning( push )
00043 #pragma warning( disable : 4530 )
00044 #pragma warning( disable : 4786 )
00045 #pragma warning( disable : 4251 )
00046 #endif
00047 
00048 #include <ctype.h>
00049 #include <stdio.h>
00050 #include <stdlib.h>
00051 #include <string.h>
00052 #include <assert.h>
00053 
00054 
00055 #if defined( _DEBUG ) && !defined( DEBUG )
00056 #define DEBUG
00057 #endif
00058 
00059 #ifdef TIXML_USE_STL
00060         #include <string>
00061         #include <iostream>
00062         #include <sstream>
00063         #define TIXML_STRING            std::string
00064 #else
00065         #include "tinystr.h"
00066         #define TIXML_STRING            TiXmlString
00067 #endif
00068 
00069 
00070 
00071 
00072 
00073 #define TIXML_SAFE
00074 
00075 #ifdef TIXML_SAFE
00076         #if defined(_MSC_VER) && (_MSC_VER >= 1400 )
00077                 
00078                 #define TIXML_SNPRINTF _snprintf_s
00079                 #define TIXML_SSCANF   sscanf_s
00080         #elif defined(_MSC_VER) && (_MSC_VER >= 1200 )
00081                 
00082                 
00083                 #define TIXML_SNPRINTF _snprintf
00084                 #define TIXML_SSCANF   sscanf
00085         #elif defined(__GNUC__) && (__GNUC__ >= 3 )
00086                 
00087                 
00088                 #define TIXML_SNPRINTF snprintf
00089                 #define TIXML_SSCANF   sscanf
00090         #else
00091                 #define TIXML_SNPRINTF snprintf
00092                 #define TIXML_SSCANF   sscanf
00093         #endif
00094 #endif  
00095 
00096 class TiXmlDocument;
00097 class TiXmlElement;
00098 class TiXmlComment;
00099 class TiXmlUnknown;
00100 class TiXmlAttribute;
00101 class TiXmlText;
00102 class TiXmlDeclaration;
00103 class TiXmlParsingData;
00104 
00105 const int TIXML_MAJOR_VERSION = 2;
00106 const int TIXML_MINOR_VERSION = 6;
00107 const int TIXML_PATCH_VERSION = 1;
00108 
00109 
00110 
00111 
00112 struct TINYXML_IMPORT_EXPORT TiXmlCursor
00113 {
00114         TiXmlCursor()           { Clear(); }
00115         void Clear()            { row = col = -1; }
00116 
00117         int row;        
00118         int col;        
00119 };
00120 
00121 
00141 class TINYXML_IMPORT_EXPORT TiXmlVisitor
00142 {
00143 public:
00144         virtual ~TiXmlVisitor() {}
00145 
00147         virtual bool VisitEnter( const TiXmlDocument&  )                 { return true; }
00149         virtual bool VisitExit( const TiXmlDocument&  )                  { return true; }
00150 
00152         virtual bool VisitEnter( const TiXmlElement& , const TiXmlAttribute*  )    { return true; }
00154         virtual bool VisitExit( const TiXmlElement&  )               { return true; }
00155 
00157         virtual bool Visit( const TiXmlDeclaration&  )   { return true; }
00159         virtual bool Visit( const TiXmlText&  )                                 { return true; }
00161         virtual bool Visit( const TiXmlComment&  )                   { return true; }
00163         virtual bool Visit( const TiXmlUnknown&  )                   { return true; }
00164 };
00165 
00166 
00167 enum 
00168 { 
00169         TIXML_SUCCESS,
00170         TIXML_NO_ATTRIBUTE,
00171         TIXML_WRONG_TYPE
00172 };
00173 
00174 
00175 
00176 enum TINYXML_IMPORT_EXPORT TiXmlEncoding
00177 {
00178         TIXML_ENCODING_UNKNOWN,
00179         TIXML_ENCODING_UTF8,
00180         TIXML_ENCODING_LEGACY
00181 };
00182 
00183 const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN;
00184 
00207 class TINYXML_IMPORT_EXPORT TiXmlBase
00208 {
00209         friend class TiXmlNode;
00210         friend class TiXmlElement;
00211         friend class TiXmlDocument;
00212 
00213 public:
00214         TiXmlBase()     :       userData(0)             {}
00215         virtual ~TiXmlBase()                    {}
00216 
00226         virtual void Print( FILE* cfile, int depth ) const = 0;
00227 
00234         static void SetCondenseWhiteSpace( bool condense )              { condenseWhiteSpace = condense; }
00235 
00237         static bool IsWhiteSpaceCondensed()                                             { return condenseWhiteSpace; }
00238 
00257         int Row() const                 { return location.row + 1; }
00258         int Column() const              { return location.col + 1; }    
00259 
00260         void  SetUserData( void* user )                 { userData = user; }    
00261         void* GetUserData()                                             { return userData; }    
00262         const void* GetUserData() const                 { return userData; }    
00263 
00264         
00265         
00266         static const int utf8ByteTable[256];
00267 
00268         virtual const char* Parse(      const char* p, 
00269                                                                 TiXmlParsingData* data, 
00270                                                                 TiXmlEncoding encoding  ) = 0;
00271 
00275         static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out );
00276 
00277         enum
00278         {
00279                 TIXML_NO_ERROR = 0,
00280                 TIXML_ERROR,
00281                 TIXML_ERROR_OPENING_FILE,
00282                 TIXML_ERROR_PARSING_ELEMENT,
00283                 TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,
00284                 TIXML_ERROR_READING_ELEMENT_VALUE,
00285                 TIXML_ERROR_READING_ATTRIBUTES,
00286                 TIXML_ERROR_PARSING_EMPTY,
00287                 TIXML_ERROR_READING_END_TAG,
00288                 TIXML_ERROR_PARSING_UNKNOWN,
00289                 TIXML_ERROR_PARSING_COMMENT,
00290                 TIXML_ERROR_PARSING_DECLARATION,
00291                 TIXML_ERROR_DOCUMENT_EMPTY,
00292                 TIXML_ERROR_EMBEDDED_NULL,
00293                 TIXML_ERROR_PARSING_CDATA,
00294                 TIXML_ERROR_DOCUMENT_TOP_ONLY,
00295 
00296                 TIXML_ERROR_STRING_COUNT
00297         };
00298 
00299 protected:
00300 
00301         static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding );
00302 
00303         static bool IsWhiteSpace( char c )              
00304         { 
00305                 return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); 
00306         }
00307         static bool IsWhiteSpace( int c )
00308         {
00309                 if ( c < 256 )
00310                         return IsWhiteSpace( (char) c );
00311                 return false;   
00312         }
00313 
00314         #ifdef TIXML_USE_STL
00315         static bool     StreamWhiteSpace( std::istream * in, TIXML_STRING * tag );
00316         static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag );
00317         #endif
00318 
00319         
00320 
00321 
00322 
00323         static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding );
00324 
00325         
00326 
00327 
00328         static const char* ReadText(    const char* in,                         
00329                                                                         TIXML_STRING* text,                     
00330                                                                         bool ignoreWhiteSpace,          
00331                                                                         const char* endTag,                     
00332                                                                         bool ignoreCase,                        
00333                                                                         TiXmlEncoding encoding );       
00334 
00335         
00336         static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding );
00337 
00338         
00339         
00340         static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding )
00341         {
00342                 assert( p );
00343                 if ( encoding == TIXML_ENCODING_UTF8 )
00344                 {
00345                         *length = utf8ByteTable[ *((const unsigned char*)p) ];
00346                         assert( *length >= 0 && *length < 5 );
00347                 }
00348                 else
00349                 {
00350                         *length = 1;
00351                 }
00352 
00353                 if ( *length == 1 )
00354                 {
00355                         if ( *p == '&' )
00356                                 return GetEntity( p, _value, length, encoding );
00357                         *_value = *p;
00358                         return p+1;
00359                 }
00360                 else if ( *length )
00361                 {
00362                         
00363                                                                                                 
00364                         for( int i=0; p[i] && i<*length; ++i ) {
00365                                 _value[i] = p[i];
00366                         }
00367                         return p + (*length);
00368                 }
00369                 else
00370                 {
00371                         
00372                         return 0;
00373                 }
00374         }
00375 
00376         
00377         
00378         
00379         static bool StringEqual(        const char* p,
00380                                                                 const char* endTag,
00381                                                                 bool ignoreCase,
00382                                                                 TiXmlEncoding encoding );
00383 
00384         static const char* errorString[ TIXML_ERROR_STRING_COUNT ];
00385 
00386         TiXmlCursor location;
00387 
00389         void*                   userData;
00390         
00391         
00392         
00393         static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding );
00394         static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding );
00395         static int ToLower( int v, TiXmlEncoding encoding )
00396         {
00397                 if ( encoding == TIXML_ENCODING_UTF8 )
00398                 {
00399                         if ( v < 128 ) return tolower( v );
00400                         return v;
00401                 }
00402                 else
00403                 {
00404                         return tolower( v );
00405                 }
00406         }
00407         static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length );
00408 
00409 private:
00410         TiXmlBase( const TiXmlBase& );                          
00411         void operator=( const TiXmlBase& base );        
00412 
00413         struct Entity
00414         {
00415                 const char*     str;
00416                 unsigned int    strLength;
00417                 char                chr;
00418         };
00419         enum
00420         {
00421                 NUM_ENTITY = 5,
00422                 MAX_ENTITY_LENGTH = 6
00423 
00424         };
00425         static Entity entity[ NUM_ENTITY ];
00426         static bool condenseWhiteSpace;
00427 };
00428 
00429 
00436 class TINYXML_IMPORT_EXPORT TiXmlNode : public TiXmlBase
00437 {
00438         friend class TiXmlDocument;
00439         friend class TiXmlElement;
00440 
00441 public:
00442         #ifdef TIXML_USE_STL    
00443 
00447             TINYXML_IMPORT_EXPORT friend std::istream& operator >> (std::istream& in, TiXmlNode& base);
00448 
00465             TINYXML_IMPORT_EXPORT friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base);
00466 
00468                 TINYXML_IMPORT_EXPORT friend std::string& operator<< (std::string& out, const TiXmlNode& base );
00469 
00470         #endif
00471 
00475         enum NodeType
00476         {
00477                 TINYXML_DOCUMENT,
00478                 TINYXML_ELEMENT,
00479                 TINYXML_COMMENT,
00480                 TINYXML_UNKNOWN,
00481                 TINYXML_TEXT,
00482                 TINYXML_DECLARATION,
00483                 TINYXML_TYPECOUNT
00484         };
00485 
00486         virtual ~TiXmlNode();
00487 
00500         const char *Value() const { return value.c_str (); }
00501 
00502     #ifdef TIXML_USE_STL
00503 
00507         const std::string& ValueStr() const { return value; }
00508         #endif
00509 
00510         const TIXML_STRING& ValueTStr() const { return value; }
00511 
00521         void SetValue(const char * _value) { value = _value;}
00522 
00523     #ifdef TIXML_USE_STL
00524 
00525         void SetValue( const std::string& _value )      { value = _value; }
00526         #endif
00527 
00529         void Clear();
00530 
00532         TiXmlNode* Parent()                                                     { return parent; }
00533         const TiXmlNode* Parent() const                         { return parent; }
00534 
00535         const TiXmlNode* FirstChild()   const           { return firstChild; }  
00536         TiXmlNode* FirstChild()                                         { return firstChild; }
00537         const TiXmlNode* FirstChild( const char * value ) const;                        
00538 
00539         TiXmlNode* FirstChild( const char * _value ) {
00540                 
00541                 
00542                 return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value ));
00543         }
00544         const TiXmlNode* LastChild() const      { return lastChild; }           
00545         TiXmlNode* LastChild()  { return lastChild; }
00546         
00547         const TiXmlNode* LastChild( const char * value ) const;                 
00548         TiXmlNode* LastChild( const char * _value ) {
00549                 return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value ));
00550         }
00551 
00552     #ifdef TIXML_USE_STL
00553         const TiXmlNode* FirstChild( const std::string& _value ) const  {       return FirstChild (_value.c_str ());    }       
00554         TiXmlNode* FirstChild( const std::string& _value )                              {       return FirstChild (_value.c_str ());    }       
00555         const TiXmlNode* LastChild( const std::string& _value ) const   {       return LastChild (_value.c_str ());     }       
00556         TiXmlNode* LastChild( const std::string& _value )                               {       return LastChild (_value.c_str ());     }       
00557         #endif
00558 
00575         const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const;
00576         TiXmlNode* IterateChildren( const TiXmlNode* previous ) {
00577                 return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) );
00578         }
00579 
00581         const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const;
00582         TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) {
00583                 return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) );
00584         }
00585 
00586     #ifdef TIXML_USE_STL
00587         const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const  {       return IterateChildren (_value.c_str (), previous);     }       
00588         TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) {    return IterateChildren (_value.c_str (), previous);     }       
00589         #endif
00590 
00594         TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
00595 
00596 
00606         TiXmlNode* LinkEndChild( TiXmlNode* addThis );
00607 
00611         TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
00612 
00616         TiXmlNode* InsertAfterChild(  TiXmlNode* afterThis, const TiXmlNode& addThis );
00617 
00621         TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
00622 
00624         bool RemoveChild( TiXmlNode* removeThis );
00625 
00627         const TiXmlNode* PreviousSibling() const                        { return prev; }
00628         TiXmlNode* PreviousSibling()                                            { return prev; }
00629 
00631         const TiXmlNode* PreviousSibling( const char * ) const;
00632         TiXmlNode* PreviousSibling( const char *_prev ) {
00633                 return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) );
00634         }
00635 
00636     #ifdef TIXML_USE_STL
00637         const TiXmlNode* PreviousSibling( const std::string& _value ) const     {       return PreviousSibling (_value.c_str ());       }       
00638         TiXmlNode* PreviousSibling( const std::string& _value )                         {       return PreviousSibling (_value.c_str ());       }       
00639         const TiXmlNode* NextSibling( const std::string& _value) const          {       return NextSibling (_value.c_str ());   }       
00640         TiXmlNode* NextSibling( const std::string& _value)                                      {       return NextSibling (_value.c_str ());   }       
00641         #endif
00642 
00644         const TiXmlNode* NextSibling() const                            { return next; }
00645         TiXmlNode* NextSibling()                                                        { return next; }
00646 
00648         const TiXmlNode* NextSibling( const char * ) const;
00649         TiXmlNode* NextSibling( const char* _next ) {
00650                 return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) );
00651         }
00652 
00657         const TiXmlElement* NextSiblingElement() const;
00658         TiXmlElement* NextSiblingElement() {
00659                 return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() );
00660         }
00661 
00666         const TiXmlElement* NextSiblingElement( const char * ) const;
00667         TiXmlElement* NextSiblingElement( const char *_next ) {
00668                 return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) );
00669         }
00670 
00671     #ifdef TIXML_USE_STL
00672         const TiXmlElement* NextSiblingElement( const std::string& _value) const        {       return NextSiblingElement (_value.c_str ());    }       
00673         TiXmlElement* NextSiblingElement( const std::string& _value)                            {       return NextSiblingElement (_value.c_str ());    }       
00674         #endif
00675 
00677         const TiXmlElement* FirstChildElement() const;
00678         TiXmlElement* FirstChildElement() {
00679                 return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() );
00680         }
00681 
00683         const TiXmlElement* FirstChildElement( const char * _value ) const;
00684         TiXmlElement* FirstChildElement( const char * _value ) {
00685                 return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) );
00686         }
00687 
00688     #ifdef TIXML_USE_STL
00689         const TiXmlElement* FirstChildElement( const std::string& _value ) const        {       return FirstChildElement (_value.c_str ());     }       
00690         TiXmlElement* FirstChildElement( const std::string& _value )                            {       return FirstChildElement (_value.c_str ());     }       
00691         #endif
00692 
00697         int Type() const        { return type; }
00698 
00702         const TiXmlDocument* GetDocument() const;
00703         TiXmlDocument* GetDocument() {
00704                 return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() );
00705         }
00706 
00708         bool NoChildren() const                                         { return !firstChild; }
00709 
00710         virtual const TiXmlDocument*    ToDocument()    const { return 0; } 
00711         virtual const TiXmlElement*     ToElement()     const { return 0; } 
00712         virtual const TiXmlComment*     ToComment()     const { return 0; } 
00713         virtual const TiXmlUnknown*     ToUnknown()     const { return 0; } 
00714         virtual const TiXmlText*        ToText()        const { return 0; } 
00715         virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } 
00716 
00717         virtual TiXmlDocument*          ToDocument()    { return 0; } 
00718         virtual TiXmlElement*           ToElement()         { return 0; } 
00719         virtual TiXmlComment*           ToComment()     { return 0; } 
00720         virtual TiXmlUnknown*           ToUnknown()         { return 0; } 
00721         virtual TiXmlText*                  ToText()        { return 0; } 
00722         virtual TiXmlDeclaration*       ToDeclaration() { return 0; } 
00723 
00727         virtual TiXmlNode* Clone() const = 0;
00728 
00751         virtual bool Accept( TiXmlVisitor* visitor ) const = 0;
00752 
00753 protected:
00754         TiXmlNode( NodeType _type );
00755 
00756         
00757         
00758         void CopyTo( TiXmlNode* target ) const;
00759 
00760         #ifdef TIXML_USE_STL
00761             
00762         virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0;
00763         #endif
00764 
00765         
00766         TiXmlNode* Identify( const char* start, TiXmlEncoding encoding );
00767 
00768         TiXmlNode*              parent;
00769         NodeType                type;
00770 
00771         TiXmlNode*              firstChild;
00772         TiXmlNode*              lastChild;
00773 
00774         TIXML_STRING    value;
00775 
00776         TiXmlNode*              prev;
00777         TiXmlNode*              next;
00778 
00779 private:
00780         TiXmlNode( const TiXmlNode& );                          
00781         void operator=( const TiXmlNode& base );        
00782 };
00783 
00784 
00792 class TINYXML_IMPORT_EXPORT TiXmlAttribute : public TiXmlBase
00793 {
00794         friend class TiXmlAttributeSet;
00795 
00796 public:
00798         TiXmlAttribute() : TiXmlBase()
00799         {
00800                 document = 0;
00801                 prev = next = 0;
00802         }
00803 
00804         #ifdef TIXML_USE_STL
00805 
00806         TiXmlAttribute( const std::string& _name, const std::string& _value )
00807         {
00808                 name = _name;
00809                 value = _value;
00810                 document = 0;
00811                 prev = next = 0;
00812         }
00813         #endif
00814 
00816         TiXmlAttribute( const char * _name, const char * _value )
00817         {
00818                 name = _name;
00819                 value = _value;
00820                 document = 0;
00821                 prev = next = 0;
00822         }
00823 
00824         const char*             Name()  const           { return name.c_str(); }                
00825         const char*             Value() const           { return value.c_str(); }               
00826         #ifdef TIXML_USE_STL
00827         const std::string& ValueStr() const     { return value; }                               
00828         #endif
00829         int                             IntValue() const;                                                                       
00830         double                  DoubleValue() const;                                                            
00831 
00832         
00833         const TIXML_STRING& NameTStr() const { return name; }
00834 
00844         int QueryIntValue( int* _value ) const;
00846         int QueryDoubleValue( double* _value ) const;
00847 
00848         void SetName( const char* _name )       { name = _name; }                               
00849         void SetValue( const char* _value )     { value = _value; }                             
00850 
00851         void SetIntValue( int _value );                                                                         
00852         void SetDoubleValue( double _value );                                                           
00853 
00854     #ifdef TIXML_USE_STL
00855 
00856         void SetName( const std::string& _name )        { name = _name; }       
00858         void SetValue( const std::string& _value )      { value = _value; }
00859         #endif
00860 
00862         const TiXmlAttribute* Next() const;
00863         TiXmlAttribute* Next() {
00864                 return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); 
00865         }
00866 
00868         const TiXmlAttribute* Previous() const;
00869         TiXmlAttribute* Previous() {
00870                 return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); 
00871         }
00872 
00873         bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; }
00874         bool operator<( const TiXmlAttribute& rhs )      const { return name < rhs.name; }
00875         bool operator>( const TiXmlAttribute& rhs )  const { return name > rhs.name; }
00876 
00877         
00878 
00879 
00880         virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
00881 
00882         
00883         virtual void Print( FILE* cfile, int depth ) const {
00884                 Print( cfile, depth, 0 );
00885         }
00886         void Print( FILE* cfile, int depth, TIXML_STRING* str ) const;
00887 
00888         
00889         
00890         void SetDocument( TiXmlDocument* doc )  { document = doc; }
00891 
00892 private:
00893         TiXmlAttribute( const TiXmlAttribute& );                                
00894         void operator=( const TiXmlAttribute& base );   
00895 
00896         TiXmlDocument*  document;       
00897         TIXML_STRING name;
00898         TIXML_STRING value;
00899         TiXmlAttribute* prev;
00900         TiXmlAttribute* next;
00901 };
00902 
00903 
00904 
00905 
00906 
00907 
00908 
00909 
00910 
00911 
00912 
00913 
00914 
00915 
00916 class TINYXML_IMPORT_EXPORT TiXmlAttributeSet
00917 {
00918 public:
00919         TiXmlAttributeSet();
00920         ~TiXmlAttributeSet();
00921 
00922         void Add( TiXmlAttribute* attribute );
00923         void Remove( TiXmlAttribute* attribute );
00924 
00925         const TiXmlAttribute* First()   const   { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
00926         TiXmlAttribute* First()                                 { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
00927         const TiXmlAttribute* Last() const              { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
00928         TiXmlAttribute* Last()                                  { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
00929 
00930         TiXmlAttribute* Find( const char* _name ) const;
00931         TiXmlAttribute* FindOrCreate( const char* _name );
00932 
00933 #       ifdef TIXML_USE_STL
00934         TiXmlAttribute* Find( const std::string& _name ) const;
00935         TiXmlAttribute* FindOrCreate( const std::string& _name );
00936 #       endif
00937 
00938 
00939 private:
00940         
00941         
00942         TiXmlAttributeSet( const TiXmlAttributeSet& );  
00943         void operator=( const TiXmlAttributeSet& );     
00944 
00945         TiXmlAttribute sentinel;
00946 };
00947 
00948 
00953 class TINYXML_IMPORT_EXPORT TiXmlElement : public TiXmlNode
00954 {
00955 public:
00957         TiXmlElement (const char * in_value);
00958 
00959         #ifdef TIXML_USE_STL
00960 
00961         TiXmlElement( const std::string& _value );
00962         #endif
00963 
00964         TiXmlElement( const TiXmlElement& );
00965 
00966         TiXmlElement& operator=( const TiXmlElement& base );
00967 
00968         virtual ~TiXmlElement();
00969 
00973         const char* Attribute( const char* name ) const;
00974 
00981         const char* Attribute( const char* name, int* i ) const;
00982 
00989         const char* Attribute( const char* name, double* d ) const;
00990 
00998         int QueryIntAttribute( const char* name, int* _value ) const;
01000         int QueryDoubleAttribute( const char* name, double* _value ) const;
01002         int QueryFloatAttribute( const char* name, float* _value ) const {
01003                 double d;
01004                 int result = QueryDoubleAttribute( name, &d );
01005                 if ( result == TIXML_SUCCESS ) {
01006                         *_value = (float)d;
01007                 }
01008                 return result;
01009         }
01010 
01011     #ifdef TIXML_USE_STL
01012 
01013         int QueryStringAttribute( const char* name, std::string* _value ) const {
01014                 const char* cstr = Attribute( name );
01015                 if ( cstr ) {
01016                         *_value = std::string( cstr );
01017                         return TIXML_SUCCESS;
01018                 }
01019                 return TIXML_NO_ATTRIBUTE;
01020         }
01021 
01030         template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const
01031         {
01032                 const TiXmlAttribute* node = attributeSet.Find( name );
01033                 if ( !node )
01034                         return TIXML_NO_ATTRIBUTE;
01035 
01036                 std::stringstream sstream( node->ValueStr() );
01037                 sstream >> *outValue;
01038                 if ( !sstream.fail() )
01039                         return TIXML_SUCCESS;
01040                 return TIXML_WRONG_TYPE;
01041         }
01042 
01043         int QueryValueAttribute( const std::string& name, std::string* outValue ) const
01044         {
01045                 const TiXmlAttribute* node = attributeSet.Find( name );
01046                 if ( !node )
01047                         return TIXML_NO_ATTRIBUTE;
01048                 *outValue = node->ValueStr();
01049                 return TIXML_SUCCESS;
01050         }
01051         #endif
01052 
01056         void SetAttribute( const char* name, const char * _value );
01057 
01058     #ifdef TIXML_USE_STL
01059         const std::string* Attribute( const std::string& name ) const;
01060         const std::string* Attribute( const std::string& name, int* i ) const;
01061         const std::string* Attribute( const std::string& name, double* d ) const;
01062         int QueryIntAttribute( const std::string& name, int* _value ) const;
01063         int QueryDoubleAttribute( const std::string& name, double* _value ) const;
01064 
01066         void SetAttribute( const std::string& name, const std::string& _value );
01068         void SetAttribute( const std::string& name, int _value );
01070         void SetDoubleAttribute( const std::string& name, double value );
01071         #endif
01072 
01076         void SetAttribute( const char * name, int value );
01077 
01081         void SetDoubleAttribute( const char * name, double value );
01082 
01085         void RemoveAttribute( const char * name );
01086     #ifdef TIXML_USE_STL
01087         void RemoveAttribute( const std::string& name ) {       RemoveAttribute (name.c_str ());        }       
01088         #endif
01089 
01090         const TiXmlAttribute* FirstAttribute() const    { return attributeSet.First(); }                
01091         TiXmlAttribute* FirstAttribute()                                { return attributeSet.First(); }
01092         const TiXmlAttribute* LastAttribute()   const   { return attributeSet.Last(); }         
01093         TiXmlAttribute* LastAttribute()                                 { return attributeSet.Last(); }
01094 
01127         const char* GetText() const;
01128 
01130         virtual TiXmlNode* Clone() const;
01131         
01132         virtual void Print( FILE* cfile, int depth ) const;
01133 
01134         
01135 
01136 
01137         virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01138 
01139         virtual const TiXmlElement*     ToElement()     const { return this; } 
01140         virtual TiXmlElement*           ToElement()               { return this; } 
01141 
01144         virtual bool Accept( TiXmlVisitor* visitor ) const;
01145 
01146 protected:
01147 
01148         void CopyTo( TiXmlElement* target ) const;
01149         void ClearThis();       
01150 
01151         
01152         #ifdef TIXML_USE_STL
01153         virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01154         #endif
01155         
01156 
01157 
01158 
01159         const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding );
01160 
01161 private:
01162         TiXmlAttributeSet attributeSet;
01163 };
01164 
01165 
01168 class TINYXML_IMPORT_EXPORT TiXmlComment : public TiXmlNode
01169 {
01170 public:
01172         TiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {}
01174         TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {
01175                 SetValue( _value );
01176         }
01177         TiXmlComment( const TiXmlComment& );
01178         TiXmlComment& operator=( const TiXmlComment& base );
01179 
01180         virtual ~TiXmlComment() {}
01181 
01183         virtual TiXmlNode* Clone() const;
01184         
01185         virtual void Print( FILE* cfile, int depth ) const;
01186 
01187         
01188 
01189 
01190         virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01191 
01192         virtual const TiXmlComment*  ToComment() const { return this; } 
01193         virtual TiXmlComment*  ToComment() { return this; } 
01194 
01197         virtual bool Accept( TiXmlVisitor* visitor ) const;
01198 
01199 protected:
01200         void CopyTo( TiXmlComment* target ) const;
01201 
01202         
01203         #ifdef TIXML_USE_STL
01204         virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01205         #endif
01206 
01207 
01208 private:
01209 
01210 };
01211 
01212 
01218 class TINYXML_IMPORT_EXPORT TiXmlText : public TiXmlNode
01219 {
01220         friend class TiXmlElement;
01221 public:
01226         TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)
01227         {
01228                 SetValue( initValue );
01229                 cdata = false;
01230         }
01231         virtual ~TiXmlText() {}
01232 
01233         #ifdef TIXML_USE_STL
01234 
01235         TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT)
01236         {
01237                 SetValue( initValue );
01238                 cdata = false;
01239         }
01240         #endif
01241 
01242         TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT )       { copy.CopyTo( this ); }
01243         TiXmlText& operator=( const TiXmlText& base )                                                           { base.CopyTo( this ); return *this; }
01244 
01245         
01246         virtual void Print( FILE* cfile, int depth ) const;
01247 
01249         bool CDATA() const                              { return cdata; }
01251         void SetCDATA( bool _cdata )    { cdata = _cdata; }
01252 
01253         virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01254 
01255         virtual const TiXmlText* ToText() const { return this; } 
01256         virtual TiXmlText*       ToText()       { return this; } 
01257 
01260         virtual bool Accept( TiXmlVisitor* content ) const;
01261 
01262 protected :
01264         virtual TiXmlNode* Clone() const;
01265         void CopyTo( TiXmlText* target ) const;
01266 
01267         bool Blank() const;     
01268         
01269         #ifdef TIXML_USE_STL
01270         virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01271         #endif
01272 
01273 private:
01274         bool cdata;                     
01275 };
01276 
01277 
01291 class TINYXML_IMPORT_EXPORT TiXmlDeclaration : public TiXmlNode
01292 {
01293 public:
01295         TiXmlDeclaration()   : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {}
01296 
01297 #ifdef TIXML_USE_STL
01298 
01299         TiXmlDeclaration(       const std::string& _version,
01300                                                 const std::string& _encoding,
01301                                                 const std::string& _standalone );
01302 #endif
01303 
01305         TiXmlDeclaration(       const char* _version,
01306                                                 const char* _encoding,
01307                                                 const char* _standalone );
01308 
01309         TiXmlDeclaration( const TiXmlDeclaration& copy );
01310         TiXmlDeclaration& operator=( const TiXmlDeclaration& copy );
01311 
01312         virtual ~TiXmlDeclaration()     {}
01313 
01315         const char *Version() const                     { return version.c_str (); }
01317         const char *Encoding() const            { return encoding.c_str (); }
01319         const char *Standalone() const          { return standalone.c_str (); }
01320 
01322         virtual TiXmlNode* Clone() const;
01323         
01324         virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const;
01325         virtual void Print( FILE* cfile, int depth ) const {
01326                 Print( cfile, depth, 0 );
01327         }
01328 
01329         virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01330 
01331         virtual const TiXmlDeclaration* ToDeclaration() const { return this; } 
01332         virtual TiXmlDeclaration*       ToDeclaration()       { return this; } 
01333 
01336         virtual bool Accept( TiXmlVisitor* visitor ) const;
01337 
01338 protected:
01339         void CopyTo( TiXmlDeclaration* target ) const;
01340         
01341         #ifdef TIXML_USE_STL
01342         virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01343         #endif
01344 
01345 private:
01346 
01347         TIXML_STRING version;
01348         TIXML_STRING encoding;
01349         TIXML_STRING standalone;
01350 };
01351 
01352 
01360 class TINYXML_IMPORT_EXPORT TiXmlUnknown : public TiXmlNode
01361 {
01362 public:
01363         TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN )        {}
01364         virtual ~TiXmlUnknown() {}
01365 
01366         TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN )              { copy.CopyTo( this ); }
01367         TiXmlUnknown& operator=( const TiXmlUnknown& copy )                                                                             { copy.CopyTo( this ); return *this; }
01368 
01370         virtual TiXmlNode* Clone() const;
01371         
01372         virtual void Print( FILE* cfile, int depth ) const;
01373 
01374         virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
01375 
01376         virtual const TiXmlUnknown*     ToUnknown()     const { return this; } 
01377         virtual TiXmlUnknown*           ToUnknown()         { return this; } 
01378 
01381         virtual bool Accept( TiXmlVisitor* content ) const;
01382 
01383 protected:
01384         void CopyTo( TiXmlUnknown* target ) const;
01385 
01386         #ifdef TIXML_USE_STL
01387         virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01388         #endif
01389 
01390 private:
01391 
01392 };
01393 
01394 
01399 class TINYXML_IMPORT_EXPORT TiXmlDocument : public TiXmlNode
01400 {
01401 public:
01403         TiXmlDocument();
01405         TiXmlDocument( const char * documentName );
01406 
01407         #ifdef TIXML_USE_STL
01408 
01409         TiXmlDocument( const std::string& documentName );
01410         #endif
01411 
01412         TiXmlDocument( const TiXmlDocument& copy );
01413         TiXmlDocument& operator=( const TiXmlDocument& copy );
01414 
01415         virtual ~TiXmlDocument() {}
01416 
01421         bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01423         bool SaveFile() const;
01425         bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01427         bool SaveFile( const char * filename ) const;
01433         bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01435         bool SaveFile( FILE* ) const;
01436 
01437         #ifdef TIXML_USE_STL
01438         bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )                   
01439         {
01440                 return LoadFile( filename.c_str(), encoding );
01441         }
01442         bool SaveFile( const std::string& filename ) const              
01443         {
01444                 return SaveFile( filename.c_str() );
01445         }
01446         #endif
01447 
01452         virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
01453 
01458         const TiXmlElement* RootElement() const         { return FirstChildElement(); }
01459         TiXmlElement* RootElement()                                     { return FirstChildElement(); }
01460 
01466         bool Error() const                                              { return error; }
01467 
01469         const char * ErrorDesc() const  { return errorDesc.c_str (); }
01470 
01474         int ErrorId()   const                           { return errorId; }
01475 
01483         int ErrorRow() const    { return errorLocation.row+1; }
01484         int ErrorCol() const    { return errorLocation.col+1; } 
01485 
01510         void SetTabSize( int _tabsize )         { tabsize = _tabsize; }
01511 
01512         int TabSize() const     { return tabsize; }
01513 
01517         void ClearError()                                               {       error = false; 
01518                                                                                                 errorId = 0; 
01519                                                                                                 errorDesc = ""; 
01520                                                                                                 errorLocation.row = errorLocation.col = 0; 
01521                                                                                                 
01522                                                                                         }
01523 
01525         void Print() const                                              { Print( stdout, 0 ); }
01526 
01527         
01528 
01529 
01530 
01531         
01532 
01534         virtual void Print( FILE* cfile, int depth = 0 ) const;
01535         
01536         void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding );
01537 
01538         virtual const TiXmlDocument*    ToDocument()    const { return this; } 
01539         virtual TiXmlDocument*          ToDocument()          { return this; } 
01540 
01543         virtual bool Accept( TiXmlVisitor* content ) const;
01544 
01545 protected :
01546         
01547         virtual TiXmlNode* Clone() const;
01548         #ifdef TIXML_USE_STL
01549         virtual void StreamIn( std::istream * in, TIXML_STRING * tag );
01550         #endif
01551 
01552 private:
01553         void CopyTo( TiXmlDocument* target ) const;
01554 
01555         bool error;
01556         int  errorId;
01557         TIXML_STRING errorDesc;
01558         int tabsize;
01559         TiXmlCursor errorLocation;
01560         bool useMicrosoftBOM;           
01561 };
01562 
01563 
01644 class TINYXML_IMPORT_EXPORT TiXmlHandle
01645 {
01646 public:
01648         TiXmlHandle( TiXmlNode* _node )                                 { this->node = _node; }
01650         TiXmlHandle( const TiXmlHandle& ref )                   { this->node = ref.node; }
01651         TiXmlHandle operator=( const TiXmlHandle& ref ) { if (&ref != this) this->node = ref.node; return *this; }
01652 
01654         TiXmlHandle FirstChild() const;
01656         TiXmlHandle FirstChild( const char * value ) const;
01658         TiXmlHandle FirstChildElement() const;
01660         TiXmlHandle FirstChildElement( const char * value ) const;
01661 
01665         TiXmlHandle Child( const char* value, int index ) const;
01669         TiXmlHandle Child( int index ) const;
01674         TiXmlHandle ChildElement( const char* value, int index ) const;
01679         TiXmlHandle ChildElement( int index ) const;
01680 
01681         #ifdef TIXML_USE_STL
01682         TiXmlHandle FirstChild( const std::string& _value ) const                               { return FirstChild( _value.c_str() ); }
01683         TiXmlHandle FirstChildElement( const std::string& _value ) const                { return FirstChildElement( _value.c_str() ); }
01684 
01685         TiXmlHandle Child( const std::string& _value, int index ) const                 { return Child( _value.c_str(), index ); }
01686         TiXmlHandle ChildElement( const std::string& _value, int index ) const  { return ChildElement( _value.c_str(), index ); }
01687         #endif
01688 
01691         TiXmlNode* ToNode() const                       { return node; } 
01694         TiXmlElement* ToElement() const         { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); }
01697         TiXmlText* ToText() const                       { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); }
01700         TiXmlUnknown* ToUnknown() const         { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); }
01701 
01705         TiXmlNode* Node() const                 { return ToNode(); } 
01709         TiXmlElement* Element() const   { return ToElement(); }
01713         TiXmlText* Text() const                 { return ToText(); }
01717         TiXmlUnknown* Unknown() const   { return ToUnknown(); }
01718 
01719 private:
01720         TiXmlNode* node;
01721 };
01722 
01723 
01743 class TINYXML_IMPORT_EXPORT TiXmlPrinter : public TiXmlVisitor
01744 {
01745 public:
01746         TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ),
01747                                          buffer(), indent( "    " ), lineBreak( "\n" ) {}
01748 
01749         virtual bool VisitEnter( const TiXmlDocument& doc );
01750         virtual bool VisitExit( const TiXmlDocument& doc );
01751 
01752         virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute );
01753         virtual bool VisitExit( const TiXmlElement& element );
01754 
01755         virtual bool Visit( const TiXmlDeclaration& declaration );
01756         virtual bool Visit( const TiXmlText& text );
01757         virtual bool Visit( const TiXmlComment& comment );
01758         virtual bool Visit( const TiXmlUnknown& unknown );
01759 
01763         void SetIndent( const char* _indent )                   { indent = _indent ? _indent : "" ; }
01765         const char* Indent()                                                    { return indent.c_str(); }
01770         void SetLineBreak( const char* _lineBreak )             { lineBreak = _lineBreak ? _lineBreak : ""; }
01772         const char* LineBreak()                                                 { return lineBreak.c_str(); }
01773 
01777         void SetStreamPrinting()                                                { indent = "";
01778                                                                                                           lineBreak = "";
01779                                                                                                         }       
01781         const char* CStr()                                                              { return buffer.c_str(); }
01783         size_t Size()                                                                   { return buffer.size(); }
01784 
01785         #ifdef TIXML_USE_STL
01786 
01787         const std::string& Str()                                                { return buffer; }
01788         #endif
01789 
01790 private:
01791         void DoIndent() {
01792                 for( int i=0; i<depth; ++i )
01793                         buffer += indent;
01794         }
01795         void DoLineBreak() {
01796                 buffer += lineBreak;
01797         }
01798 
01799         int depth;
01800         bool simpleTextPrint;
01801         TIXML_STRING buffer;
01802         TIXML_STRING indent;
01803         TIXML_STRING lineBreak;
01804 };
01805 
01806 
01807 #ifdef _MSC_VER
01808 #pragma warning( pop )
01809 #endif
01810 
01811 #endif
01812