#ifndef TINYXML2_INCLUDED #define TINYXML2_INCLUDED #include #include #include #if defined( _DEBUG ) || defined( DEBUG ) || defined (__DEBUG__) #ifndef DEBUG #define DEBUG #endif #endif #if defined(DEBUG) #if defined(_MSC_VER) #define TIXMLASSERT( x ) if ( !(x)) { _asm { int 3 } } //if ( !(x)) WinDebugBreak() #elif defined (ANDROID_NDK) #include #define TIXMLASSERT( x ) if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); } #else #include #define TIXMLASSERT assert #endif #else #define TIXMLASSERT( x ) {} #endif namespace tinyxml2 { class XMLDocument; class XMLElement; class XMLAttribute; class XMLComment; class XMLNode; // internal - move to separate namespace struct CharBuffer { size_t length; char mem[1]; static CharBuffer* Construct( const char* in ); static void Free( CharBuffer* ); }; // FIXME: refactor to be the basis for all string handling. class StrPair { public: enum { NEEDS_FLUSH = 0x01, NEEDS_ENTITY_PROCESSING = 0x02, NEEDS_NEWLINE_NORMALIZATION = 0x04 }; StrPair() : flags( 0 ), start( 0 ), end( 0 ) {} void Init( const char* start, char* end, int flags ) { this->start = start; this->end = end; this->flags = flags | NEEDS_FLUSH; } const char* GetStr(); private: // After parsing, if *end != 0, it can be set to zero. int flags; const char* start; char* end; }; class XMLBase { public: XMLBase() {} virtual ~XMLBase() {} protected: static const char* SkipWhiteSpace( const char* p ) { while( isspace( *p ) ) { ++p; } return p; } static char* SkipWhiteSpace( char* p ) { while( isspace( *p ) ) { ++p; } return p; } inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) { int n = 0; if ( p == q ) { return true; } while( *p && *q && *p == *q && n