Switched to Artistic Style auto-formatting to allow integration of patches from other coding styles.
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
old mode 100644
new mode 100755
index 143d30a..72d421d
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -24,10 +24,10 @@
#include "tinyxml2.h"
#include <new> // yes, this one new style header, is in the Android SDK.
-#ifdef ANDROID_NDK
- #include <stddef.h>
+# ifdef ANDROID_NDK
+# include <stddef.h>
#else
- #include <cstddef>
+# include <cstddef>
#endif
using namespace tinyxml2;
@@ -49,220 +49,218 @@
#define DELETE_NODE( node ) { \
- if ( node ) { \
- MemPool* pool = node->memPool; \
- node->~XMLNode(); \
- pool->Free( node ); \
- } \
-}
+ if ( node ) { \
+ MemPool* pool = node->memPool; \
+ node->~XMLNode(); \
+ pool->Free( node ); \
+ } \
+ }
#define DELETE_ATTRIBUTE( attrib ) { \
- if ( attrib ) { \
- MemPool* pool = attrib->memPool; \
- attrib->~XMLAttribute(); \
- pool->Free( attrib ); \
- } \
-}
+ if ( attrib ) { \
+ MemPool* pool = attrib->memPool; \
+ attrib->~XMLAttribute(); \
+ pool->Free( attrib ); \
+ } \
+ }
struct Entity {
- const char* pattern;
- int length;
- char value;
+ const char* pattern;
+ int length;
+ char value;
};
static const int NUM_ENTITIES = 5;
-static const Entity entities[NUM_ENTITIES] =
-{
- { "quot", 4, DOUBLE_QUOTE },
- { "amp", 3, '&' },
- { "apos", 4, SINGLE_QUOTE },
- { "lt", 2, '<' },
- { "gt", 2, '>' }
+static const Entity entities[NUM_ENTITIES] = {
+ { "quot", 4, DOUBLE_QUOTE },
+ { "amp", 3, '&' },
+ { "apos", 4, SINGLE_QUOTE },
+ { "lt", 2, '<' },
+ { "gt", 2, '>' }
};
StrPair::~StrPair()
{
- Reset();
+ Reset();
}
void StrPair::Reset()
{
- if ( flags & NEEDS_DELETE ) {
- delete [] start;
- }
- flags = 0;
- start = 0;
- end = 0;
+ if ( flags & NEEDS_DELETE ) {
+ delete [] start;
+ }
+ flags = 0;
+ start = 0;
+ end = 0;
}
void StrPair::SetStr( const char* str, int flags )
{
- Reset();
- size_t len = strlen( str );
- start = new char[ len+1 ];
- memcpy( start, str, len+1 );
- end = start + len;
- this->flags = flags | NEEDS_DELETE;
+ Reset();
+ size_t len = strlen( str );
+ start = new char[ len+1 ];
+ memcpy( start, str, len+1 );
+ end = start + len;
+ this->flags = flags | NEEDS_DELETE;
}
char* StrPair::ParseText( char* p, const char* endTag, int strFlags )
{
- TIXMLASSERT( endTag && *endTag );
+ TIXMLASSERT( endTag && *endTag );
- char* start = p; // fixme: hides a member
- char endChar = *endTag;
- size_t length = strlen( endTag );
+ char* start = p; // fixme: hides a member
+ char endChar = *endTag;
+ size_t length = strlen( endTag );
- // Inner loop of text parsing.
- while ( *p ) {
- if ( *p == endChar && strncmp( p, endTag, length ) == 0 ) {
- Set( start, p, strFlags );
- return p + length;
- }
- ++p;
- }
- return 0;
+ // Inner loop of text parsing.
+ while ( *p ) {
+ if ( *p == endChar && strncmp( p, endTag, length ) == 0 ) {
+ Set( start, p, strFlags );
+ return p + length;
+ }
+ ++p;
+ }
+ return 0;
}
char* StrPair::ParseName( char* p )
{
- char* start = p;
+ char* start = p;
- if ( !start || !(*start) ) {
- return 0;
- }
+ if ( !start || !(*start) ) {
+ return 0;
+ }
- while( *p && (
- XMLUtil::IsAlphaNum( (unsigned char) *p )
- || *p == '_'
- || *p == ':'
- || (*p == '-' && p>start ) // can be in a name, but not lead it.
- || (*p == '.' && p>start ) )) // can be in a name, but not lead it.
- {
- ++p;
- }
+ while( *p && (
+ XMLUtil::IsAlphaNum( (unsigned char) *p )
+ || *p == '_'
+ || *p == ':'
+ || (*p == '-' && p>start ) // can be in a name, but not lead it.
+ || (*p == '.' && p>start ) )) { // can be in a name, but not lead it.
+ ++p;
+ }
- if ( p > start ) {
- Set( start, p, 0 );
- return p;
- }
- return 0;
+ if ( p > start ) {
+ Set( start, p, 0 );
+ return p;
+ }
+ return 0;
}
void StrPair::CollapseWhitespace()
{
- // Trim leading space.
- start = XMLUtil::SkipWhiteSpace( start );
+ // Trim leading space.
+ start = XMLUtil::SkipWhiteSpace( start );
- if ( start && *start ) {
- char* p = start; // the read pointer
- char* q = start; // the write pointer
+ if ( start && *start ) {
+ char* p = start; // the read pointer
+ char* q = start; // the write pointer
- while( *p ) {
- if ( XMLUtil::IsWhiteSpace( *p )) {
- p = XMLUtil::SkipWhiteSpace( p );
- if ( *p == 0 )
- break; // don't write to q; this trims the trailing space.
- *q = ' ';
- ++q;
- }
- *q = *p;
- ++q;
- ++p;
- }
- *q = 0;
- }
+ while( *p ) {
+ if ( XMLUtil::IsWhiteSpace( *p )) {
+ p = XMLUtil::SkipWhiteSpace( p );
+ if ( *p == 0 ) {
+ break; // don't write to q; this trims the trailing space.
+ }
+ *q = ' ';
+ ++q;
+ }
+ *q = *p;
+ ++q;
+ ++p;
+ }
+ *q = 0;
+ }
}
const char* StrPair::GetStr()
{
- if ( flags & NEEDS_FLUSH ) {
- *end = 0;
- flags ^= NEEDS_FLUSH;
+ if ( flags & NEEDS_FLUSH ) {
+ *end = 0;
+ flags ^= NEEDS_FLUSH;
- if ( flags ) {
- char* p = start; // the read pointer
- char* q = start; // the write pointer
+ if ( flags ) {
+ char* p = start; // the read pointer
+ char* q = start; // the write pointer
- while( p < end ) {
- if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR ) {
- // CR-LF pair becomes LF
- // CR alone becomes LF
- // LF-CR becomes LF
- if ( *(p+1) == LF ) {
- p += 2;
- }
- else {
- ++p;
- }
- *q++ = LF;
- }
- else if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF ) {
- if ( *(p+1) == CR ) {
- p += 2;
- }
- else {
- ++p;
- }
- *q++ = LF;
- }
- else if ( (flags & NEEDS_ENTITY_PROCESSING) && *p == '&' ) {
- // Entities handled by tinyXML2:
- // - special entities in the entity table [in/out]
- // - numeric character reference [in]
- // 中 or 中
+ while( p < end ) {
+ if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR ) {
+ // CR-LF pair becomes LF
+ // CR alone becomes LF
+ // LF-CR becomes LF
+ if ( *(p+1) == LF ) {
+ p += 2;
+ }
+ else {
+ ++p;
+ }
+ *q++ = LF;
+ }
+ else if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF ) {
+ if ( *(p+1) == CR ) {
+ p += 2;
+ }
+ else {
+ ++p;
+ }
+ *q++ = LF;
+ }
+ else if ( (flags & NEEDS_ENTITY_PROCESSING) && *p == '&' ) {
+ // Entities handled by tinyXML2:
+ // - special entities in the entity table [in/out]
+ // - numeric character reference [in]
+ // 中 or 中
- if ( *(p+1) == '#' ) {
- char buf[10] = { 0 };
- int len;
- p = const_cast<char*>( XMLUtil::GetCharacterRef( p, buf, &len ) );
- for( int i=0; i<len; ++i ) {
- *q++ = buf[i];
- }
- TIXMLASSERT( q <= p );
- }
- else {
- int i=0;
- for(; i<NUM_ENTITIES; ++i ) {
- if ( strncmp( p+1, entities[i].pattern, entities[i].length ) == 0
- && *(p+entities[i].length+1) == ';' )
- {
- // Found an entity convert;
- *q = entities[i].value;
- ++q;
- p += entities[i].length + 2;
- break;
- }
- }
- if ( i == NUM_ENTITIES ) {
- // fixme: treat as error?
- ++p;
- ++q;
- }
- }
- }
- else {
- *q = *p;
- ++p;
- ++q;
- }
- }
- *q = 0;
- }
- // The loop below has plenty going on, and this
- // is a less useful mode. Break it out.
- if ( flags & COLLAPSE_WHITESPACE ) {
- CollapseWhitespace();
- }
- flags = (flags & NEEDS_DELETE);
- }
- return start;
+ if ( *(p+1) == '#' ) {
+ char buf[10] = { 0 };
+ int len;
+ p = const_cast<char*>( XMLUtil::GetCharacterRef( p, buf, &len ) );
+ for( int i=0; i<len; ++i ) {
+ *q++ = buf[i];
+ }
+ TIXMLASSERT( q <= p );
+ }
+ else {
+ int i=0;
+ for(; i<NUM_ENTITIES; ++i ) {
+ if ( strncmp( p+1, entities[i].pattern, entities[i].length ) == 0
+ && *(p+entities[i].length+1) == ';' ) {
+ // Found an entity convert;
+ *q = entities[i].value;
+ ++q;
+ p += entities[i].length + 2;
+ break;
+ }
+ }
+ if ( i == NUM_ENTITIES ) {
+ // fixme: treat as error?
+ ++p;
+ ++q;
+ }
+ }
+ }
+ else {
+ *q = *p;
+ ++p;
+ ++q;
+ }
+ }
+ *q = 0;
+ }
+ // The loop below has plenty going on, and this
+ // is a less useful mode. Break it out.
+ if ( flags & COLLAPSE_WHITESPACE ) {
+ CollapseWhitespace();
+ }
+ flags = (flags & NEEDS_DELETE);
+ }
+ return start;
}
@@ -272,429 +270,447 @@
const char* XMLUtil::ReadBOM( const char* p, bool* bom )
{
- *bom = false;
- const unsigned char* pu = reinterpret_cast<const unsigned char*>(p);
- // Check for BOM:
- if ( *(pu+0) == TIXML_UTF_LEAD_0
- && *(pu+1) == TIXML_UTF_LEAD_1
- && *(pu+2) == TIXML_UTF_LEAD_2 )
- {
- *bom = true;
- p += 3;
- }
- return p;
+ *bom = false;
+ const unsigned char* pu = reinterpret_cast<const unsigned char*>(p);
+ // Check for BOM:
+ if ( *(pu+0) == TIXML_UTF_LEAD_0
+ && *(pu+1) == TIXML_UTF_LEAD_1
+ && *(pu+2) == TIXML_UTF_LEAD_2 ) {
+ *bom = true;
+ p += 3;
+ }
+ return p;
}
void XMLUtil::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length )
{
- const unsigned long BYTE_MASK = 0xBF;
- const unsigned long BYTE_MARK = 0x80;
- const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
+ const unsigned long BYTE_MASK = 0xBF;
+ const unsigned long BYTE_MARK = 0x80;
+ const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
- if (input < 0x80)
- *length = 1;
- else if ( input < 0x800 )
- *length = 2;
- else if ( input < 0x10000 )
- *length = 3;
- else if ( input < 0x200000 )
- *length = 4;
- else
- { *length = 0; return; } // This code won't covert this correctly anyway.
+ if (input < 0x80) {
+ *length = 1;
+ }
+ else if ( input < 0x800 ) {
+ *length = 2;
+ }
+ else if ( input < 0x10000 ) {
+ *length = 3;
+ }
+ else if ( input < 0x200000 ) {
+ *length = 4;
+ }
+ else {
+ *length = 0; // This code won't covert this correctly anyway.
+ return;
+ }
- output += *length;
+ output += *length;
- // Scary scary fall throughs.
- switch (*length)
- {
- case 4:
- --output;
- *output = (char)((input | BYTE_MARK) & BYTE_MASK);
- input >>= 6;
- case 3:
- --output;
- *output = (char)((input | BYTE_MARK) & BYTE_MASK);
- input >>= 6;
- case 2:
- --output;
- *output = (char)((input | BYTE_MARK) & BYTE_MASK);
- input >>= 6;
- case 1:
- --output;
- *output = (char)(input | FIRST_BYTE_MARK[*length]);
- }
+ // Scary scary fall throughs.
+ switch (*length) {
+ case 4:
+ --output;
+ *output = (char)((input | BYTE_MARK) & BYTE_MASK);
+ input >>= 6;
+ case 3:
+ --output;
+ *output = (char)((input | BYTE_MARK) & BYTE_MASK);
+ input >>= 6;
+ case 2:
+ --output;
+ *output = (char)((input | BYTE_MARK) & BYTE_MASK);
+ input >>= 6;
+ case 1:
+ --output;
+ *output = (char)(input | FIRST_BYTE_MARK[*length]);
+ }
}
const char* XMLUtil::GetCharacterRef( const char* p, char* value, int* length )
{
- // Presume an entity, and pull it out.
- *length = 0;
+ // Presume an entity, and pull it out.
+ *length = 0;
- if ( *(p+1) == '#' && *(p+2) )
- {
- unsigned long ucs = 0;
- ptrdiff_t delta = 0;
- unsigned mult = 1;
+ if ( *(p+1) == '#' && *(p+2) ) {
+ unsigned long ucs = 0;
+ ptrdiff_t delta = 0;
+ unsigned mult = 1;
- if ( *(p+2) == 'x' )
- {
- // Hexadecimal.
- if ( !*(p+3) ) return 0;
+ if ( *(p+2) == 'x' ) {
+ // Hexadecimal.
+ if ( !*(p+3) ) {
+ return 0;
+ }
- const char* q = p+3;
- q = strchr( q, ';' );
+ const char* q = p+3;
+ q = strchr( q, ';' );
- if ( !q || !*q ) return 0;
+ if ( !q || !*q ) {
+ return 0;
+ }
- delta = q-p;
- --q;
+ delta = q-p;
+ --q;
- while ( *q != 'x' )
- {
- if ( *q >= '0' && *q <= '9' )
- ucs += mult * (*q - '0');
- else if ( *q >= 'a' && *q <= 'f' )
- ucs += mult * (*q - 'a' + 10);
- else if ( *q >= 'A' && *q <= 'F' )
- ucs += mult * (*q - 'A' + 10 );
- else
- return 0;
- mult *= 16;
- --q;
- }
- }
- else
- {
- // Decimal.
- if ( !*(p+2) ) return 0;
+ while ( *q != 'x' ) {
+ if ( *q >= '0' && *q <= '9' ) {
+ ucs += mult * (*q - '0');
+ }
+ else if ( *q >= 'a' && *q <= 'f' ) {
+ ucs += mult * (*q - 'a' + 10);
+ }
+ else if ( *q >= 'A' && *q <= 'F' ) {
+ ucs += mult * (*q - 'A' + 10 );
+ }
+ else {
+ return 0;
+ }
+ mult *= 16;
+ --q;
+ }
+ }
+ else {
+ // Decimal.
+ if ( !*(p+2) ) {
+ return 0;
+ }
- const char* q = p+2;
- q = strchr( q, ';' );
+ const char* q = p+2;
+ q = strchr( q, ';' );
- if ( !q || !*q ) return 0;
+ if ( !q || !*q ) {
+ return 0;
+ }
- delta = q-p;
- --q;
+ delta = q-p;
+ --q;
- while ( *q != '#' )
- {
- if ( *q >= '0' && *q <= '9' )
- ucs += mult * (*q - '0');
- else
- return 0;
- mult *= 10;
- --q;
- }
- }
- // convert the UCS to UTF-8
- ConvertUTF32ToUTF8( ucs, value, length );
- return p + delta + 1;
- }
- return p+1;
+ while ( *q != '#' ) {
+ if ( *q >= '0' && *q <= '9' ) {
+ ucs += mult * (*q - '0');
+ }
+ else {
+ return 0;
+ }
+ mult *= 10;
+ --q;
+ }
+ }
+ // convert the UCS to UTF-8
+ ConvertUTF32ToUTF8( ucs, value, length );
+ return p + delta + 1;
+ }
+ return p+1;
}
void XMLUtil::ToStr( int v, char* buffer, int bufferSize )
{
- TIXML_SNPRINTF( buffer, bufferSize, "%d", v );
+ TIXML_SNPRINTF( buffer, bufferSize, "%d", v );
}
void XMLUtil::ToStr( unsigned v, char* buffer, int bufferSize )
{
- TIXML_SNPRINTF( buffer, bufferSize, "%u", v );
+ TIXML_SNPRINTF( buffer, bufferSize, "%u", v );
}
void XMLUtil::ToStr( bool v, char* buffer, int bufferSize )
{
- TIXML_SNPRINTF( buffer, bufferSize, "%d", v ? 1 : 0 );
+ TIXML_SNPRINTF( buffer, bufferSize, "%d", v ? 1 : 0 );
}
void XMLUtil::ToStr( float v, char* buffer, int bufferSize )
{
- TIXML_SNPRINTF( buffer, bufferSize, "%g", v );
+ TIXML_SNPRINTF( buffer, bufferSize, "%g", v );
}
void XMLUtil::ToStr( double v, char* buffer, int bufferSize )
{
- TIXML_SNPRINTF( buffer, bufferSize, "%g", v );
+ TIXML_SNPRINTF( buffer, bufferSize, "%g", v );
}
bool XMLUtil::ToInt( const char* str, int* value )
{
- if ( TIXML_SSCANF( str, "%d", value ) == 1 )
- return true;
- return false;
+ if ( TIXML_SSCANF( str, "%d", value ) == 1 ) {
+ return true;
+ }
+ return false;
}
bool XMLUtil::ToUnsigned( const char* str, unsigned *value )
{
- if ( TIXML_SSCANF( str, "%u", value ) == 1 )
- return true;
- return false;
+ if ( TIXML_SSCANF( str, "%u", value ) == 1 ) {
+ return true;
+ }
+ return false;
}
bool XMLUtil::ToBool( const char* str, bool* value )
{
- int ival = 0;
- if ( ToInt( str, &ival )) {
- *value = (ival==0) ? false : true;
- return true;
- }
- if ( StringEqual( str, "true" ) ) {
- *value = true;
- return true;
- }
- else if ( StringEqual( str, "false" ) ) {
- *value = false;
- return true;
- }
- return false;
+ int ival = 0;
+ if ( ToInt( str, &ival )) {
+ *value = (ival==0) ? false : true;
+ return true;
+ }
+ if ( StringEqual( str, "true" ) ) {
+ *value = true;
+ return true;
+ }
+ else if ( StringEqual( str, "false" ) ) {
+ *value = false;
+ return true;
+ }
+ return false;
}
bool XMLUtil::ToFloat( const char* str, float* value )
{
- if ( TIXML_SSCANF( str, "%f", value ) == 1 ) {
- return true;
- }
- return false;
+ if ( TIXML_SSCANF( str, "%f", value ) == 1 ) {
+ return true;
+ }
+ return false;
}
bool XMLUtil::ToDouble( const char* str, double* value )
{
- if ( TIXML_SSCANF( str, "%lf", value ) == 1 ) {
- return true;
- }
- return false;
+ if ( TIXML_SSCANF( str, "%lf", value ) == 1 ) {
+ return true;
+ }
+ return false;
}
char* XMLDocument::Identify( char* p, XMLNode** node )
{
- XMLNode* returnNode = 0;
- char* start = p;
- p = XMLUtil::SkipWhiteSpace( p );
- if( !p || !*p )
- {
- return p;
- }
+ XMLNode* returnNode = 0;
+ char* start = p;
+ p = XMLUtil::SkipWhiteSpace( p );
+ if( !p || !*p ) {
+ return p;
+ }
- // What is this thing?
- // - Elements start with a letter or underscore, but xml is reserved.
- // - Comments: <!--
- // - Decleration: <?
- // - Everthing else is unknown to tinyxml.
- //
+ // What is this thing?
+ // - Elements start with a letter or underscore, but xml is reserved.
+ // - Comments: <!--
+ // - Decleration: <?
+ // - Everthing else is unknown to tinyxml.
+ //
- static const char* xmlHeader = { "<?" };
- static const char* commentHeader = { "<!--" };
- static const char* dtdHeader = { "<!" };
- static const char* cdataHeader = { "<![CDATA[" };
- static const char* elementHeader = { "<" }; // and a header for everything else; check last.
+ static const char* xmlHeader = { "<?" };
+ static const char* commentHeader = { "<!--" };
+ static const char* dtdHeader = { "<!" };
+ static const char* cdataHeader = { "<![CDATA[" };
+ static const char* elementHeader = { "<" }; // and a header for everything else; check last.
- static const int xmlHeaderLen = 2;
- static const int commentHeaderLen = 4;
- static const int dtdHeaderLen = 2;
- static const int cdataHeaderLen = 9;
- static const int elementHeaderLen = 1;
+ static const int xmlHeaderLen = 2;
+ static const int commentHeaderLen = 4;
+ static const int dtdHeaderLen = 2;
+ static const int cdataHeaderLen = 9;
+ static const int elementHeaderLen = 1;
#if defined(_MSC_VER)
#pragma warning ( push )
#pragma warning ( disable : 4127 )
#endif
- TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLUnknown ) ); // use same memory pool
- TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLDeclaration ) ); // use same memory pool
+ TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLUnknown ) ); // use same memory pool
+ TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLDeclaration ) ); // use same memory pool
#if defined(_MSC_VER)
#pragma warning (pop)
#endif
- if ( XMLUtil::StringEqual( p, xmlHeader, xmlHeaderLen ) ) {
- returnNode = new (commentPool.Alloc()) XMLDeclaration( this );
- returnNode->memPool = &commentPool;
- p += xmlHeaderLen;
- }
- else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) {
- returnNode = new (commentPool.Alloc()) XMLComment( this );
- returnNode->memPool = &commentPool;
- p += commentHeaderLen;
- }
- else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) {
- XMLText* text = new (textPool.Alloc()) XMLText( this );
- returnNode = text;
- returnNode->memPool = &textPool;
- p += cdataHeaderLen;
- text->SetCData( true );
- }
- else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) {
- returnNode = new (commentPool.Alloc()) XMLUnknown( this );
- returnNode->memPool = &commentPool;
- p += dtdHeaderLen;
- }
- else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) {
- returnNode = new (elementPool.Alloc()) XMLElement( this );
- returnNode->memPool = &elementPool;
- p += elementHeaderLen;
- }
- else {
- returnNode = new (textPool.Alloc()) XMLText( this );
- returnNode->memPool = &textPool;
- p = start; // Back it up, all the text counts.
- }
+ if ( XMLUtil::StringEqual( p, xmlHeader, xmlHeaderLen ) ) {
+ returnNode = new (commentPool.Alloc()) XMLDeclaration( this );
+ returnNode->memPool = &commentPool;
+ p += xmlHeaderLen;
+ }
+ else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) {
+ returnNode = new (commentPool.Alloc()) XMLComment( this );
+ returnNode->memPool = &commentPool;
+ p += commentHeaderLen;
+ }
+ else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) {
+ XMLText* text = new (textPool.Alloc()) XMLText( this );
+ returnNode = text;
+ returnNode->memPool = &textPool;
+ p += cdataHeaderLen;
+ text->SetCData( true );
+ }
+ else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) {
+ returnNode = new (commentPool.Alloc()) XMLUnknown( this );
+ returnNode->memPool = &commentPool;
+ p += dtdHeaderLen;
+ }
+ else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) {
+ returnNode = new (elementPool.Alloc()) XMLElement( this );
+ returnNode->memPool = &elementPool;
+ p += elementHeaderLen;
+ }
+ else {
+ returnNode = new (textPool.Alloc()) XMLText( this );
+ returnNode->memPool = &textPool;
+ p = start; // Back it up, all the text counts.
+ }
- *node = returnNode;
- return p;
+ *node = returnNode;
+ return p;
}
bool XMLDocument::Accept( XMLVisitor* visitor ) const
{
- if ( visitor->VisitEnter( *this ) )
- {
- for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() )
- {
- if ( !node->Accept( visitor ) )
- break;
- }
- }
- return visitor->VisitExit( *this );
+ if ( visitor->VisitEnter( *this ) ) {
+ for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) {
+ if ( !node->Accept( visitor ) ) {
+ break;
+ }
+ }
+ }
+ return visitor->VisitExit( *this );
}
// --------- XMLNode ----------- //
XMLNode::XMLNode( XMLDocument* doc ) :
- document( doc ),
- parent( 0 ),
- firstChild( 0 ), lastChild( 0 ),
- prev( 0 ), next( 0 )
+ document( doc ),
+ parent( 0 ),
+ firstChild( 0 ), lastChild( 0 ),
+ prev( 0 ), next( 0 )
{
}
XMLNode::~XMLNode()
{
- DeleteChildren();
- if ( parent ) {
- parent->Unlink( this );
- }
+ DeleteChildren();
+ if ( parent ) {
+ parent->Unlink( this );
+ }
}
void XMLNode::SetValue( const char* str, bool staticMem )
{
- if ( staticMem )
- value.SetInternedStr( str );
- else
- value.SetStr( str );
+ if ( staticMem ) {
+ value.SetInternedStr( str );
+ }
+ else {
+ value.SetStr( str );
+ }
}
void XMLNode::DeleteChildren()
{
- while( firstChild ) {
- XMLNode* node = firstChild;
- Unlink( node );
+ while( firstChild ) {
+ XMLNode* node = firstChild;
+ Unlink( node );
- DELETE_NODE( node );
- }
- firstChild = lastChild = 0;
+ DELETE_NODE( node );
+ }
+ firstChild = lastChild = 0;
}
void XMLNode::Unlink( XMLNode* child )
{
- TIXMLASSERT( child->parent == this );
- if ( child == firstChild )
- firstChild = firstChild->next;
- if ( child == lastChild )
- lastChild = lastChild->prev;
+ TIXMLASSERT( child->parent == this );
+ if ( child == firstChild ) {
+ firstChild = firstChild->next;
+ }
+ if ( child == lastChild ) {
+ lastChild = lastChild->prev;
+ }
- if ( child->prev ) {
- child->prev->next = child->next;
- }
- if ( child->next ) {
- child->next->prev = child->prev;
- }
- child->parent = 0;
+ if ( child->prev ) {
+ child->prev->next = child->next;
+ }
+ if ( child->next ) {
+ child->next->prev = child->prev;
+ }
+ child->parent = 0;
}
void XMLNode::DeleteChild( XMLNode* node )
{
- TIXMLASSERT( node->parent == this );
- DELETE_NODE( node );
+ TIXMLASSERT( node->parent == this );
+ DELETE_NODE( node );
}
XMLNode* XMLNode::InsertEndChild( XMLNode* addThis )
{
- if ( lastChild ) {
- TIXMLASSERT( firstChild );
- TIXMLASSERT( lastChild->next == 0 );
- lastChild->next = addThis;
- addThis->prev = lastChild;
- lastChild = addThis;
+ if ( lastChild ) {
+ TIXMLASSERT( firstChild );
+ TIXMLASSERT( lastChild->next == 0 );
+ lastChild->next = addThis;
+ addThis->prev = lastChild;
+ lastChild = addThis;
- addThis->next = 0;
- }
- else {
- TIXMLASSERT( firstChild == 0 );
- firstChild = lastChild = addThis;
+ addThis->next = 0;
+ }
+ else {
+ TIXMLASSERT( firstChild == 0 );
+ firstChild = lastChild = addThis;
- addThis->prev = 0;
- addThis->next = 0;
- }
- addThis->parent = this;
- return addThis;
+ addThis->prev = 0;
+ addThis->next = 0;
+ }
+ addThis->parent = this;
+ return addThis;
}
XMLNode* XMLNode::InsertFirstChild( XMLNode* addThis )
{
- if ( firstChild ) {
- TIXMLASSERT( lastChild );
- TIXMLASSERT( firstChild->prev == 0 );
+ if ( firstChild ) {
+ TIXMLASSERT( lastChild );
+ TIXMLASSERT( firstChild->prev == 0 );
- firstChild->prev = addThis;
- addThis->next = firstChild;
- firstChild = addThis;
+ firstChild->prev = addThis;
+ addThis->next = firstChild;
+ firstChild = addThis;
- addThis->prev = 0;
- }
- else {
- TIXMLASSERT( lastChild == 0 );
- firstChild = lastChild = addThis;
+ addThis->prev = 0;
+ }
+ else {
+ TIXMLASSERT( lastChild == 0 );
+ firstChild = lastChild = addThis;
- addThis->prev = 0;
- addThis->next = 0;
- }
- addThis->parent = this;
- return addThis;
+ addThis->prev = 0;
+ addThis->next = 0;
+ }
+ addThis->parent = this;
+ return addThis;
}
XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis )
{
- TIXMLASSERT( afterThis->parent == this );
- if ( afterThis->parent != this )
- return 0;
+ TIXMLASSERT( afterThis->parent == this );
+ if ( afterThis->parent != this ) {
+ return 0;
+ }
- if ( afterThis->next == 0 ) {
- // The last node or the only node.
- return InsertEndChild( addThis );
- }
- addThis->prev = afterThis;
- addThis->next = afterThis->next;
- afterThis->next->prev = addThis;
- afterThis->next = addThis;
- addThis->parent = this;
- return addThis;
+ if ( afterThis->next == 0 ) {
+ // The last node or the only node.
+ return InsertEndChild( addThis );
+ }
+ addThis->prev = afterThis;
+ addThis->next = afterThis->next;
+ afterThis->next->prev = addThis;
+ afterThis->next = addThis;
+ addThis->parent = this;
+ return addThis;
}
@@ -702,183 +718,182 @@
const XMLElement* XMLNode::FirstChildElement( const char* value ) const
{
- for( XMLNode* node=firstChild; node; node=node->next ) {
- XMLElement* element = node->ToElement();
- if ( element ) {
- if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) {
- return element;
- }
- }
- }
- return 0;
+ for( XMLNode* node=firstChild; node; node=node->next ) {
+ XMLElement* element = node->ToElement();
+ if ( element ) {
+ if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) {
+ return element;
+ }
+ }
+ }
+ return 0;
}
const XMLElement* XMLNode::LastChildElement( const char* value ) const
{
- for( XMLNode* node=lastChild; node; node=node->prev ) {
- XMLElement* element = node->ToElement();
- if ( element ) {
- if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) {
- return element;
- }
- }
- }
- return 0;
+ for( XMLNode* node=lastChild; node; node=node->prev ) {
+ XMLElement* element = node->ToElement();
+ if ( element ) {
+ if ( !value || XMLUtil::StringEqual( element->Name(), value ) ) {
+ return element;
+ }
+ }
+ }
+ return 0;
}
const XMLElement* XMLNode::NextSiblingElement( const char* value ) const
{
- for( XMLNode* element=this->next; element; element = element->next ) {
- if ( element->ToElement()
- && (!value || XMLUtil::StringEqual( value, element->Value() )))
- {
- return element->ToElement();
- }
- }
- return 0;
+ for( XMLNode* element=this->next; element; element = element->next ) {
+ if ( element->ToElement()
+ && (!value || XMLUtil::StringEqual( value, element->Value() ))) {
+ return element->ToElement();
+ }
+ }
+ return 0;
}
const XMLElement* XMLNode::PreviousSiblingElement( const char* value ) const
{
- for( XMLNode* element=this->prev; element; element = element->prev ) {
- if ( element->ToElement()
- && (!value || XMLUtil::StringEqual( value, element->Value() )))
- {
- return element->ToElement();
- }
- }
- return 0;
+ for( XMLNode* element=this->prev; element; element = element->prev ) {
+ if ( element->ToElement()
+ && (!value || XMLUtil::StringEqual( value, element->Value() ))) {
+ return element->ToElement();
+ }
+ }
+ return 0;
}
char* XMLNode::ParseDeep( char* p, StrPair* parentEnd )
{
- // This is a recursive method, but thinking about it "at the current level"
- // it is a pretty simple flat list:
- // <foo/>
- // <!-- comment -->
- //
- // With a special case:
- // <foo>
- // </foo>
- // <!-- comment -->
- //
- // Where the closing element (/foo) *must* be the next thing after the opening
- // element, and the names must match. BUT the tricky bit is that the closing
- // element will be read by the child.
- //
- // 'endTag' is the end tag for this node, it is returned by a call to a child.
- // 'parentEnd' is the end tag for the parent, which is filled in and returned.
+ // This is a recursive method, but thinking about it "at the current level"
+ // it is a pretty simple flat list:
+ // <foo/>
+ // <!-- comment -->
+ //
+ // With a special case:
+ // <foo>
+ // </foo>
+ // <!-- comment -->
+ //
+ // Where the closing element (/foo) *must* be the next thing after the opening
+ // element, and the names must match. BUT the tricky bit is that the closing
+ // element will be read by the child.
+ //
+ // 'endTag' is the end tag for this node, it is returned by a call to a child.
+ // 'parentEnd' is the end tag for the parent, which is filled in and returned.
- while( p && *p ) {
- XMLNode* node = 0;
+ while( p && *p ) {
+ XMLNode* node = 0;
- p = document->Identify( p, &node );
- if ( p == 0 || node == 0 ) {
- break;
- }
+ p = document->Identify( p, &node );
+ if ( p == 0 || node == 0 ) {
+ break;
+ }
- StrPair endTag;
- p = node->ParseDeep( p, &endTag );
- if ( !p ) {
- DELETE_NODE( node );
- node = 0;
- if ( !document->Error() ) {
- document->SetError( XML_ERROR_PARSING, 0, 0 );
- }
- break;
- }
+ StrPair endTag;
+ p = node->ParseDeep( p, &endTag );
+ if ( !p ) {
+ DELETE_NODE( node );
+ node = 0;
+ if ( !document->Error() ) {
+ document->SetError( XML_ERROR_PARSING, 0, 0 );
+ }
+ break;
+ }
- // We read the end tag. Return it to the parent.
- if ( node->ToElement() && node->ToElement()->ClosingType() == XMLElement::CLOSING ) {
- if ( parentEnd ) {
- *parentEnd = static_cast<XMLElement*>(node)->value;
- }
- DELETE_NODE( node );
- return p;
- }
+ // We read the end tag. Return it to the parent.
+ if ( node->ToElement() && node->ToElement()->ClosingType() == XMLElement::CLOSING ) {
+ if ( parentEnd ) {
+ *parentEnd = static_cast<XMLElement*>(node)->value;
+ }
+ DELETE_NODE( node );
+ return p;
+ }
- // Handle an end tag returned to this level.
- // And handle a bunch of annoying errors.
- XMLElement* ele = node->ToElement();
- if ( ele ) {
- if ( endTag.Empty() && ele->ClosingType() == XMLElement::OPEN ) {
- document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
- p = 0;
- }
- else if ( !endTag.Empty() && ele->ClosingType() != XMLElement::OPEN ) {
- document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
- p = 0;
- }
- else if ( !endTag.Empty() ) {
- if ( !XMLUtil::StringEqual( endTag.GetStr(), node->Value() )) {
- document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
- p = 0;
- }
- }
- }
- if ( p == 0 ) {
- DELETE_NODE( node );
- node = 0;
- }
- if ( node ) {
- this->InsertEndChild( node );
- }
- }
- return 0;
+ // Handle an end tag returned to this level.
+ // And handle a bunch of annoying errors.
+ XMLElement* ele = node->ToElement();
+ if ( ele ) {
+ if ( endTag.Empty() && ele->ClosingType() == XMLElement::OPEN ) {
+ document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
+ p = 0;
+ }
+ else if ( !endTag.Empty() && ele->ClosingType() != XMLElement::OPEN ) {
+ document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
+ p = 0;
+ }
+ else if ( !endTag.Empty() ) {
+ if ( !XMLUtil::StringEqual( endTag.GetStr(), node->Value() )) {
+ document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 );
+ p = 0;
+ }
+ }
+ }
+ if ( p == 0 ) {
+ DELETE_NODE( node );
+ node = 0;
+ }
+ if ( node ) {
+ this->InsertEndChild( node );
+ }
+ }
+ return 0;
}
// --------- XMLText ---------- //
char* XMLText::ParseDeep( char* p, StrPair* )
{
- const char* start = p;
- if ( this->CData() ) {
- p = value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
- if ( !p ) {
- document->SetError( XML_ERROR_PARSING_CDATA, start, 0 );
- }
- return p;
- }
- else {
- int flags = document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES;
- if ( document->WhitespaceMode() == COLLAPSE_WHITESPACE )
- flags |= StrPair::COLLAPSE_WHITESPACE;
+ const char* start = p;
+ if ( this->CData() ) {
+ p = value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
+ if ( !p ) {
+ document->SetError( XML_ERROR_PARSING_CDATA, start, 0 );
+ }
+ return p;
+ }
+ else {
+ int flags = document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES;
+ if ( document->WhitespaceMode() == COLLAPSE_WHITESPACE ) {
+ flags |= StrPair::COLLAPSE_WHITESPACE;
+ }
- p = value.ParseText( p, "<", flags );
- if ( !p ) {
- document->SetError( XML_ERROR_PARSING_TEXT, start, 0 );
- }
- if ( p && *p ) {
- return p-1;
- }
- }
- return 0;
+ p = value.ParseText( p, "<", flags );
+ if ( !p ) {
+ document->SetError( XML_ERROR_PARSING_TEXT, start, 0 );
+ }
+ if ( p && *p ) {
+ return p-1;
+ }
+ }
+ return 0;
}
XMLNode* XMLText::ShallowClone( XMLDocument* doc ) const
{
- if ( !doc ) {
- doc = document;
- }
- XMLText* text = doc->NewText( Value() ); // fixme: this will always allocate memory. Intern?
- text->SetCData( this->CData() );
- return text;
+ if ( !doc ) {
+ doc = document;
+ }
+ XMLText* text = doc->NewText( Value() ); // fixme: this will always allocate memory. Intern?
+ text->SetCData( this->CData() );
+ return text;
}
bool XMLText::ShallowEqual( const XMLNode* compare ) const
{
- return ( compare->ToText() && XMLUtil::StringEqual( compare->ToText()->Value(), Value() ));
+ return ( compare->ToText() && XMLUtil::StringEqual( compare->ToText()->Value(), Value() ));
}
bool XMLText::Accept( XMLVisitor* visitor ) const
{
- return visitor->Visit( *this );
+ return visitor->Visit( *this );
}
@@ -891,41 +906,41 @@
XMLComment::~XMLComment()
{
- //printf( "~XMLComment\n" );
+ //printf( "~XMLComment\n" );
}
char* XMLComment::ParseDeep( char* p, StrPair* )
{
- // Comment parses as text.
- const char* start = p;
- p = value.ParseText( p, "-->", StrPair::COMMENT );
- if ( p == 0 ) {
- document->SetError( XML_ERROR_PARSING_COMMENT, start, 0 );
- }
- return p;
+ // Comment parses as text.
+ const char* start = p;
+ p = value.ParseText( p, "-->", StrPair::COMMENT );
+ if ( p == 0 ) {
+ document->SetError( XML_ERROR_PARSING_COMMENT, start, 0 );
+ }
+ return p;
}
XMLNode* XMLComment::ShallowClone( XMLDocument* doc ) const
{
- if ( !doc ) {
- doc = document;
- }
- XMLComment* comment = doc->NewComment( Value() ); // fixme: this will always allocate memory. Intern?
- return comment;
+ if ( !doc ) {
+ doc = document;
+ }
+ XMLComment* comment = doc->NewComment( Value() ); // fixme: this will always allocate memory. Intern?
+ return comment;
}
bool XMLComment::ShallowEqual( const XMLNode* compare ) const
{
- return ( compare->ToComment() && XMLUtil::StringEqual( compare->ToComment()->Value(), Value() ));
+ return ( compare->ToComment() && XMLUtil::StringEqual( compare->ToComment()->Value(), Value() ));
}
bool XMLComment::Accept( XMLVisitor* visitor ) const
{
- return visitor->Visit( *this );
+ return visitor->Visit( *this );
}
@@ -938,42 +953,42 @@
XMLDeclaration::~XMLDeclaration()
{
- //printf( "~XMLDeclaration\n" );
+ //printf( "~XMLDeclaration\n" );
}
char* XMLDeclaration::ParseDeep( char* p, StrPair* )
{
- // Declaration parses as text.
- const char* start = p;
- p = value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
- if ( p == 0 ) {
- document->SetError( XML_ERROR_PARSING_DECLARATION, start, 0 );
- }
- return p;
+ // Declaration parses as text.
+ const char* start = p;
+ p = value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
+ if ( p == 0 ) {
+ document->SetError( XML_ERROR_PARSING_DECLARATION, start, 0 );
+ }
+ return p;
}
XMLNode* XMLDeclaration::ShallowClone( XMLDocument* doc ) const
{
- if ( !doc ) {
- doc = document;
- }
- XMLDeclaration* dec = doc->NewDeclaration( Value() ); // fixme: this will always allocate memory. Intern?
- return dec;
+ if ( !doc ) {
+ doc = document;
+ }
+ XMLDeclaration* dec = doc->NewDeclaration( Value() ); // fixme: this will always allocate memory. Intern?
+ return dec;
}
bool XMLDeclaration::ShallowEqual( const XMLNode* compare ) const
{
- return ( compare->ToDeclaration() && XMLUtil::StringEqual( compare->ToDeclaration()->Value(), Value() ));
+ return ( compare->ToDeclaration() && XMLUtil::StringEqual( compare->ToDeclaration()->Value(), Value() ));
}
bool XMLDeclaration::Accept( XMLVisitor* visitor ) const
{
- return visitor->Visit( *this );
+ return visitor->Visit( *this );
}
// --------- XMLUnknown ---------- //
@@ -990,377 +1005,390 @@
char* XMLUnknown::ParseDeep( char* p, StrPair* )
{
- // Unknown parses as text.
- const char* start = p;
+ // Unknown parses as text.
+ const char* start = p;
- p = value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION );
- if ( !p ) {
- document->SetError( XML_ERROR_PARSING_UNKNOWN, start, 0 );
- }
- return p;
+ p = value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION );
+ if ( !p ) {
+ document->SetError( XML_ERROR_PARSING_UNKNOWN, start, 0 );
+ }
+ return p;
}
XMLNode* XMLUnknown::ShallowClone( XMLDocument* doc ) const
{
- if ( !doc ) {
- doc = document;
- }
- XMLUnknown* text = doc->NewUnknown( Value() ); // fixme: this will always allocate memory. Intern?
- return text;
+ if ( !doc ) {
+ doc = document;
+ }
+ XMLUnknown* text = doc->NewUnknown( Value() ); // fixme: this will always allocate memory. Intern?
+ return text;
}
bool XMLUnknown::ShallowEqual( const XMLNode* compare ) const
{
- return ( compare->ToUnknown() && XMLUtil::StringEqual( compare->ToUnknown()->Value(), Value() ));
+ return ( compare->ToUnknown() && XMLUtil::StringEqual( compare->ToUnknown()->Value(), Value() ));
}
bool XMLUnknown::Accept( XMLVisitor* visitor ) const
{
- return visitor->Visit( *this );
+ return visitor->Visit( *this );
}
// --------- XMLAttribute ---------- //
char* XMLAttribute::ParseDeep( char* p, bool processEntities )
{
- // Parse using the name rules: bug fix, was using ParseText before
- p = name.ParseName( p );
- if ( !p || !*p ) return 0;
+ // Parse using the name rules: bug fix, was using ParseText before
+ p = name.ParseName( p );
+ if ( !p || !*p ) {
+ return 0;
+ }
- // Skip white space before =
- p = XMLUtil::SkipWhiteSpace( p );
- if ( !p || *p != '=' ) return 0;
+ // Skip white space before =
+ p = XMLUtil::SkipWhiteSpace( p );
+ if ( !p || *p != '=' ) {
+ return 0;
+ }
- ++p; // move up to opening quote
- p = XMLUtil::SkipWhiteSpace( p );
- if ( *p != '\"' && *p != '\'' ) return 0;
+ ++p; // move up to opening quote
+ p = XMLUtil::SkipWhiteSpace( p );
+ if ( *p != '\"' && *p != '\'' ) {
+ return 0;
+ }
- char endTag[2] = { *p, 0 };
- ++p; // move past opening quote
+ char endTag[2] = { *p, 0 };
+ ++p; // move past opening quote
- p = value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES );
- return p;
+ p = value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES );
+ return p;
}
void XMLAttribute::SetName( const char* n )
{
- name.SetStr( n );
+ name.SetStr( n );
}
int XMLAttribute::QueryIntValue( int* value ) const
{
- if ( XMLUtil::ToInt( Value(), value ))
- return XML_NO_ERROR;
- return XML_WRONG_ATTRIBUTE_TYPE;
+ if ( XMLUtil::ToInt( Value(), value )) {
+ return XML_NO_ERROR;
+ }
+ return XML_WRONG_ATTRIBUTE_TYPE;
}
int XMLAttribute::QueryUnsignedValue( unsigned int* value ) const
{
- if ( XMLUtil::ToUnsigned( Value(), value ))
- return XML_NO_ERROR;
- return XML_WRONG_ATTRIBUTE_TYPE;
+ if ( XMLUtil::ToUnsigned( Value(), value )) {
+ return XML_NO_ERROR;
+ }
+ return XML_WRONG_ATTRIBUTE_TYPE;
}
int XMLAttribute::QueryBoolValue( bool* value ) const
{
- if ( XMLUtil::ToBool( Value(), value )) {
- return XML_NO_ERROR;
- }
- return XML_WRONG_ATTRIBUTE_TYPE;
+ if ( XMLUtil::ToBool( Value(), value )) {
+ return XML_NO_ERROR;
+ }
+ return XML_WRONG_ATTRIBUTE_TYPE;
}
int XMLAttribute::QueryFloatValue( float* value ) const
{
- if ( XMLUtil::ToFloat( Value(), value ))
- return XML_NO_ERROR;
- return XML_WRONG_ATTRIBUTE_TYPE;
+ if ( XMLUtil::ToFloat( Value(), value )) {
+ return XML_NO_ERROR;
+ }
+ return XML_WRONG_ATTRIBUTE_TYPE;
}
int XMLAttribute::QueryDoubleValue( double* value ) const
{
- if ( XMLUtil::ToDouble( Value(), value ))
- return XML_NO_ERROR;
- return XML_WRONG_ATTRIBUTE_TYPE;
+ if ( XMLUtil::ToDouble( Value(), value )) {
+ return XML_NO_ERROR;
+ }
+ return XML_WRONG_ATTRIBUTE_TYPE;
}
void XMLAttribute::SetAttribute( const char* v )
{
- value.SetStr( v );
+ value.SetStr( v );
}
void XMLAttribute::SetAttribute( int v )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( v, buf, BUF_SIZE );
- value.SetStr( buf );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( v, buf, BUF_SIZE );
+ value.SetStr( buf );
}
void XMLAttribute::SetAttribute( unsigned v )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( v, buf, BUF_SIZE );
- value.SetStr( buf );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( v, buf, BUF_SIZE );
+ value.SetStr( buf );
}
void XMLAttribute::SetAttribute( bool v )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( v, buf, BUF_SIZE );
- value.SetStr( buf );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( v, buf, BUF_SIZE );
+ value.SetStr( buf );
}
void XMLAttribute::SetAttribute( double v )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( v, buf, BUF_SIZE );
- value.SetStr( buf );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( v, buf, BUF_SIZE );
+ value.SetStr( buf );
}
void XMLAttribute::SetAttribute( float v )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( v, buf, BUF_SIZE );
- value.SetStr( buf );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( v, buf, BUF_SIZE );
+ value.SetStr( buf );
}
// --------- XMLElement ---------- //
XMLElement::XMLElement( XMLDocument* doc ) : XMLNode( doc ),
- closingType( 0 ),
- rootAttribute( 0 )
+ closingType( 0 ),
+ rootAttribute( 0 )
{
}
XMLElement::~XMLElement()
{
- while( rootAttribute ) {
- XMLAttribute* next = rootAttribute->next;
- DELETE_ATTRIBUTE( rootAttribute );
- rootAttribute = next;
- }
+ while( rootAttribute ) {
+ XMLAttribute* next = rootAttribute->next;
+ DELETE_ATTRIBUTE( rootAttribute );
+ rootAttribute = next;
+ }
}
XMLAttribute* XMLElement::FindAttribute( const char* name )
{
- XMLAttribute* a = 0;
- for( a=rootAttribute; a; a = a->next ) {
- if ( XMLUtil::StringEqual( a->Name(), name ) )
- return a;
- }
- return 0;
+ XMLAttribute* a = 0;
+ for( a=rootAttribute; a; a = a->next ) {
+ if ( XMLUtil::StringEqual( a->Name(), name ) ) {
+ return a;
+ }
+ }
+ return 0;
}
const XMLAttribute* XMLElement::FindAttribute( const char* name ) const
{
- XMLAttribute* a = 0;
- for( a=rootAttribute; a; a = a->next ) {
- if ( XMLUtil::StringEqual( a->Name(), name ) )
- return a;
- }
- return 0;
+ XMLAttribute* a = 0;
+ for( a=rootAttribute; a; a = a->next ) {
+ if ( XMLUtil::StringEqual( a->Name(), name ) ) {
+ return a;
+ }
+ }
+ return 0;
}
const char* XMLElement::Attribute( const char* name, const char* value ) const
{
- const XMLAttribute* a = FindAttribute( name );
- if ( !a )
- return 0;
- if ( !value || XMLUtil::StringEqual( a->Value(), value ))
- return a->Value();
- return 0;
+ const XMLAttribute* a = FindAttribute( name );
+ if ( !a ) {
+ return 0;
+ }
+ if ( !value || XMLUtil::StringEqual( a->Value(), value )) {
+ return a->Value();
+ }
+ return 0;
}
const char* XMLElement::GetText() const
{
- if ( FirstChild() && FirstChild()->ToText() ) {
- return FirstChild()->ToText()->Value();
- }
- return 0;
+ if ( FirstChild() && FirstChild()->ToText() ) {
+ return FirstChild()->ToText()->Value();
+ }
+ return 0;
}
int XMLElement::QueryIntText( int* _value ) const
{
- if ( FirstChild() && FirstChild()->ToText() ) {
- const char* t = FirstChild()->ToText()->Value();
- if ( XMLUtil::ToInt( t, _value ) ) {
- return XML_SUCCESS;
- }
- return XML_CAN_NOT_CONVERT_TEXT;
- }
- return XML_NO_TEXT_NODE;
+ if ( FirstChild() && FirstChild()->ToText() ) {
+ const char* t = FirstChild()->ToText()->Value();
+ if ( XMLUtil::ToInt( t, _value ) ) {
+ return XML_SUCCESS;
+ }
+ return XML_CAN_NOT_CONVERT_TEXT;
+ }
+ return XML_NO_TEXT_NODE;
}
int XMLElement::QueryUnsignedText( unsigned* _value ) const
{
- if ( FirstChild() && FirstChild()->ToText() ) {
- const char* t = FirstChild()->ToText()->Value();
- if ( XMLUtil::ToUnsigned( t, _value ) ) {
- return XML_SUCCESS;
- }
- return XML_CAN_NOT_CONVERT_TEXT;
- }
- return XML_NO_TEXT_NODE;
+ if ( FirstChild() && FirstChild()->ToText() ) {
+ const char* t = FirstChild()->ToText()->Value();
+ if ( XMLUtil::ToUnsigned( t, _value ) ) {
+ return XML_SUCCESS;
+ }
+ return XML_CAN_NOT_CONVERT_TEXT;
+ }
+ return XML_NO_TEXT_NODE;
}
int XMLElement::QueryBoolText( bool* _value ) const
{
- if ( FirstChild() && FirstChild()->ToText() ) {
- const char* t = FirstChild()->ToText()->Value();
- if ( XMLUtil::ToBool( t, _value ) ) {
- return XML_SUCCESS;
- }
- return XML_CAN_NOT_CONVERT_TEXT;
- }
- return XML_NO_TEXT_NODE;
+ if ( FirstChild() && FirstChild()->ToText() ) {
+ const char* t = FirstChild()->ToText()->Value();
+ if ( XMLUtil::ToBool( t, _value ) ) {
+ return XML_SUCCESS;
+ }
+ return XML_CAN_NOT_CONVERT_TEXT;
+ }
+ return XML_NO_TEXT_NODE;
}
int XMLElement::QueryDoubleText( double* _value ) const
{
- if ( FirstChild() && FirstChild()->ToText() ) {
- const char* t = FirstChild()->ToText()->Value();
- if ( XMLUtil::ToDouble( t, _value ) ) {
- return XML_SUCCESS;
- }
- return XML_CAN_NOT_CONVERT_TEXT;
- }
- return XML_NO_TEXT_NODE;
+ if ( FirstChild() && FirstChild()->ToText() ) {
+ const char* t = FirstChild()->ToText()->Value();
+ if ( XMLUtil::ToDouble( t, _value ) ) {
+ return XML_SUCCESS;
+ }
+ return XML_CAN_NOT_CONVERT_TEXT;
+ }
+ return XML_NO_TEXT_NODE;
}
int XMLElement::QueryFloatText( float* _value ) const
{
- if ( FirstChild() && FirstChild()->ToText() ) {
- const char* t = FirstChild()->ToText()->Value();
- if ( XMLUtil::ToFloat( t, _value ) ) {
- return XML_SUCCESS;
- }
- return XML_CAN_NOT_CONVERT_TEXT;
- }
- return XML_NO_TEXT_NODE;
+ if ( FirstChild() && FirstChild()->ToText() ) {
+ const char* t = FirstChild()->ToText()->Value();
+ if ( XMLUtil::ToFloat( t, _value ) ) {
+ return XML_SUCCESS;
+ }
+ return XML_CAN_NOT_CONVERT_TEXT;
+ }
+ return XML_NO_TEXT_NODE;
}
XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name )
{
- XMLAttribute* last = 0;
- XMLAttribute* attrib = 0;
- for( attrib = rootAttribute;
- attrib;
- last = attrib, attrib = attrib->next )
- {
- if ( XMLUtil::StringEqual( attrib->Name(), name ) ) {
- break;
- }
- }
- if ( !attrib ) {
- attrib = new (document->attributePool.Alloc() ) XMLAttribute();
- attrib->memPool = &document->attributePool;
- if ( last ) {
- last->next = attrib;
- }
- else {
- rootAttribute = attrib;
- }
- attrib->SetName( name );
- }
- return attrib;
+ XMLAttribute* last = 0;
+ XMLAttribute* attrib = 0;
+ for( attrib = rootAttribute;
+ attrib;
+ last = attrib, attrib = attrib->next ) {
+ if ( XMLUtil::StringEqual( attrib->Name(), name ) ) {
+ break;
+ }
+ }
+ if ( !attrib ) {
+ attrib = new (document->attributePool.Alloc() ) XMLAttribute();
+ attrib->memPool = &document->attributePool;
+ if ( last ) {
+ last->next = attrib;
+ }
+ else {
+ rootAttribute = attrib;
+ }
+ attrib->SetName( name );
+ }
+ return attrib;
}
void XMLElement::DeleteAttribute( const char* name )
{
- XMLAttribute* prev = 0;
- for( XMLAttribute* a=rootAttribute; a; a=a->next ) {
- if ( XMLUtil::StringEqual( name, a->Name() ) ) {
- if ( prev ) {
- prev->next = a->next;
- }
- else {
- rootAttribute = a->next;
- }
- DELETE_ATTRIBUTE( a );
- break;
- }
- prev = a;
- }
+ XMLAttribute* prev = 0;
+ for( XMLAttribute* a=rootAttribute; a; a=a->next ) {
+ if ( XMLUtil::StringEqual( name, a->Name() ) ) {
+ if ( prev ) {
+ prev->next = a->next;
+ }
+ else {
+ rootAttribute = a->next;
+ }
+ DELETE_ATTRIBUTE( a );
+ break;
+ }
+ prev = a;
+ }
}
char* XMLElement::ParseAttributes( char* p )
{
- const char* start = p;
- XMLAttribute* prevAttribute = 0;
+ const char* start = p;
+ XMLAttribute* prevAttribute = 0;
- // Read the attributes.
- while( p ) {
- p = XMLUtil::SkipWhiteSpace( p );
- if ( !p || !(*p) ) {
- document->SetError( XML_ERROR_PARSING_ELEMENT, start, Name() );
- return 0;
- }
+ // Read the attributes.
+ while( p ) {
+ p = XMLUtil::SkipWhiteSpace( p );
+ if ( !p || !(*p) ) {
+ document->SetError( XML_ERROR_PARSING_ELEMENT, start, Name() );
+ return 0;
+ }
- // attribute.
- if ( XMLUtil::IsAlpha( *p ) ) {
- XMLAttribute* attrib = new (document->attributePool.Alloc() ) XMLAttribute();
- attrib->memPool = &document->attributePool;
+ // attribute.
+ if ( XMLUtil::IsAlpha( *p ) ) {
+ XMLAttribute* attrib = new (document->attributePool.Alloc() ) XMLAttribute();
+ attrib->memPool = &document->attributePool;
- p = attrib->ParseDeep( p, document->ProcessEntities() );
- if ( !p || Attribute( attrib->Name() ) ) {
- DELETE_ATTRIBUTE( attrib );
- document->SetError( XML_ERROR_PARSING_ATTRIBUTE, start, p );
- return 0;
- }
- // There is a minor bug here: if the attribute in the source xml
- // document is duplicated, it will not be detected and the
- // attribute will be doubly added. However, tracking the 'prevAttribute'
- // avoids re-scanning the attribute list. Preferring performance for
- // now, may reconsider in the future.
- if ( prevAttribute ) {
- prevAttribute->next = attrib;
- }
- else {
- rootAttribute = attrib;
- }
- prevAttribute = attrib;
- }
- // end of the tag
- else if ( *p == '/' && *(p+1) == '>' ) {
- closingType = CLOSED;
- return p+2; // done; sealed element.
- }
- // end of the tag
- else if ( *p == '>' ) {
- ++p;
- break;
- }
- else {
- document->SetError( XML_ERROR_PARSING_ELEMENT, start, p );
- return 0;
- }
- }
- return p;
+ p = attrib->ParseDeep( p, document->ProcessEntities() );
+ if ( !p || Attribute( attrib->Name() ) ) {
+ DELETE_ATTRIBUTE( attrib );
+ document->SetError( XML_ERROR_PARSING_ATTRIBUTE, start, p );
+ return 0;
+ }
+ // There is a minor bug here: if the attribute in the source xml
+ // document is duplicated, it will not be detected and the
+ // attribute will be doubly added. However, tracking the 'prevAttribute'
+ // avoids re-scanning the attribute list. Preferring performance for
+ // now, may reconsider in the future.
+ if ( prevAttribute ) {
+ prevAttribute->next = attrib;
+ }
+ else {
+ rootAttribute = attrib;
+ }
+ prevAttribute = attrib;
+ }
+ // end of the tag
+ else if ( *p == '/' && *(p+1) == '>' ) {
+ closingType = CLOSED;
+ return p+2; // done; sealed element.
+ }
+ // end of the tag
+ else if ( *p == '>' ) {
+ ++p;
+ break;
+ }
+ else {
+ document->SetError( XML_ERROR_PARSING_ELEMENT, start, p );
+ return 0;
+ }
+ }
+ return p;
}
@@ -1370,346 +1398,351 @@
//
char* XMLElement::ParseDeep( char* p, StrPair* strPair )
{
- // Read the element name.
- p = XMLUtil::SkipWhiteSpace( p );
- if ( !p ) return 0;
+ // Read the element name.
+ p = XMLUtil::SkipWhiteSpace( p );
+ if ( !p ) {
+ return 0;
+ }
- // The closing element is the </element> form. It is
- // parsed just like a regular element then deleted from
- // the DOM.
- if ( *p == '/' ) {
- closingType = CLOSING;
- ++p;
- }
+ // The closing element is the </element> form. It is
+ // parsed just like a regular element then deleted from
+ // the DOM.
+ if ( *p == '/' ) {
+ closingType = CLOSING;
+ ++p;
+ }
- p = value.ParseName( p );
- if ( value.Empty() ) return 0;
+ p = value.ParseName( p );
+ if ( value.Empty() ) {
+ return 0;
+ }
- p = ParseAttributes( p );
- if ( !p || !*p || closingType )
- return p;
+ p = ParseAttributes( p );
+ if ( !p || !*p || closingType ) {
+ return p;
+ }
- p = XMLNode::ParseDeep( p, strPair );
- return p;
+ p = XMLNode::ParseDeep( p, strPair );
+ return p;
}
XMLNode* XMLElement::ShallowClone( XMLDocument* doc ) const
{
- if ( !doc ) {
- doc = document;
- }
- XMLElement* element = doc->NewElement( Value() ); // fixme: this will always allocate memory. Intern?
- for( const XMLAttribute* a=FirstAttribute(); a; a=a->Next() ) {
- element->SetAttribute( a->Name(), a->Value() ); // fixme: this will always allocate memory. Intern?
- }
- return element;
+ if ( !doc ) {
+ doc = document;
+ }
+ XMLElement* element = doc->NewElement( Value() ); // fixme: this will always allocate memory. Intern?
+ for( const XMLAttribute* a=FirstAttribute(); a; a=a->Next() ) {
+ element->SetAttribute( a->Name(), a->Value() ); // fixme: this will always allocate memory. Intern?
+ }
+ return element;
}
bool XMLElement::ShallowEqual( const XMLNode* compare ) const
{
- const XMLElement* other = compare->ToElement();
- if ( other && XMLUtil::StringEqual( other->Value(), Value() )) {
+ const XMLElement* other = compare->ToElement();
+ if ( other && XMLUtil::StringEqual( other->Value(), Value() )) {
- const XMLAttribute* a=FirstAttribute();
- const XMLAttribute* b=other->FirstAttribute();
+ const XMLAttribute* a=FirstAttribute();
+ const XMLAttribute* b=other->FirstAttribute();
- while ( a && b ) {
- if ( !XMLUtil::StringEqual( a->Value(), b->Value() ) ) {
- return false;
- }
- a = a->Next();
- b = b->Next();
- }
- if ( a || b ) {
- // different count
- return false;
- }
- return true;
- }
- return false;
+ while ( a && b ) {
+ if ( !XMLUtil::StringEqual( a->Value(), b->Value() ) ) {
+ return false;
+ }
+ a = a->Next();
+ b = b->Next();
+ }
+ if ( a || b ) {
+ // different count
+ return false;
+ }
+ return true;
+ }
+ return false;
}
bool XMLElement::Accept( XMLVisitor* visitor ) const
{
- if ( visitor->VisitEnter( *this, rootAttribute ) )
- {
- for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() )
- {
- if ( !node->Accept( visitor ) )
- break;
- }
- }
- return visitor->VisitExit( *this );
+ if ( visitor->VisitEnter( *this, rootAttribute ) ) {
+ for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) {
+ if ( !node->Accept( visitor ) ) {
+ break;
+ }
+ }
+ }
+ return visitor->VisitExit( *this );
}
// --------- XMLDocument ----------- //
XMLDocument::XMLDocument( bool _processEntities, Whitespace _whitespace ) :
- XMLNode( 0 ),
- writeBOM( false ),
- processEntities( _processEntities ),
- errorID( 0 ),
- whitespace( _whitespace ),
- errorStr1( 0 ),
- errorStr2( 0 ),
- charBuffer( 0 )
+ XMLNode( 0 ),
+ writeBOM( false ),
+ processEntities( _processEntities ),
+ errorID( 0 ),
+ whitespace( _whitespace ),
+ errorStr1( 0 ),
+ errorStr2( 0 ),
+ charBuffer( 0 )
{
- document = this; // avoid warning about 'this' in initializer list
+ document = this; // avoid warning about 'this' in initializer list
}
XMLDocument::~XMLDocument()
{
- DeleteChildren();
- delete [] charBuffer;
+ DeleteChildren();
+ delete [] charBuffer;
#if 0
- textPool.Trace( "text" );
- elementPool.Trace( "element" );
- commentPool.Trace( "comment" );
- attributePool.Trace( "attribute" );
+ textPool.Trace( "text" );
+ elementPool.Trace( "element" );
+ commentPool.Trace( "comment" );
+ attributePool.Trace( "attribute" );
#endif
- TIXMLASSERT( textPool.CurrentAllocs() == 0 );
- TIXMLASSERT( elementPool.CurrentAllocs() == 0 );
- TIXMLASSERT( commentPool.CurrentAllocs() == 0 );
- TIXMLASSERT( attributePool.CurrentAllocs() == 0 );
+ TIXMLASSERT( textPool.CurrentAllocs() == 0 );
+ TIXMLASSERT( elementPool.CurrentAllocs() == 0 );
+ TIXMLASSERT( commentPool.CurrentAllocs() == 0 );
+ TIXMLASSERT( attributePool.CurrentAllocs() == 0 );
}
void XMLDocument::InitDocument()
{
- errorID = XML_NO_ERROR;
- errorStr1 = 0;
- errorStr2 = 0;
+ errorID = XML_NO_ERROR;
+ errorStr1 = 0;
+ errorStr2 = 0;
- delete [] charBuffer;
- charBuffer = 0;
+ delete [] charBuffer;
+ charBuffer = 0;
}
XMLElement* XMLDocument::NewElement( const char* name )
{
- XMLElement* ele = new (elementPool.Alloc()) XMLElement( this );
- ele->memPool = &elementPool;
- ele->SetName( name );
- return ele;
+ XMLElement* ele = new (elementPool.Alloc()) XMLElement( this );
+ ele->memPool = &elementPool;
+ ele->SetName( name );
+ return ele;
}
XMLComment* XMLDocument::NewComment( const char* str )
{
- XMLComment* comment = new (commentPool.Alloc()) XMLComment( this );
- comment->memPool = &commentPool;
- comment->SetValue( str );
- return comment;
+ XMLComment* comment = new (commentPool.Alloc()) XMLComment( this );
+ comment->memPool = &commentPool;
+ comment->SetValue( str );
+ return comment;
}
XMLText* XMLDocument::NewText( const char* str )
{
- XMLText* text = new (textPool.Alloc()) XMLText( this );
- text->memPool = &textPool;
- text->SetValue( str );
- return text;
+ XMLText* text = new (textPool.Alloc()) XMLText( this );
+ text->memPool = &textPool;
+ text->SetValue( str );
+ return text;
}
XMLDeclaration* XMLDocument::NewDeclaration( const char* str )
{
- XMLDeclaration* dec = new (commentPool.Alloc()) XMLDeclaration( this );
- dec->memPool = &commentPool;
- dec->SetValue( str ? str : "xml version=\"1.0\" encoding=\"UTF-8\"" );
- return dec;
+ XMLDeclaration* dec = new (commentPool.Alloc()) XMLDeclaration( this );
+ dec->memPool = &commentPool;
+ dec->SetValue( str ? str : "xml version=\"1.0\" encoding=\"UTF-8\"" );
+ return dec;
}
XMLUnknown* XMLDocument::NewUnknown( const char* str )
{
- XMLUnknown* unk = new (commentPool.Alloc()) XMLUnknown( this );
- unk->memPool = &commentPool;
- unk->SetValue( str );
- return unk;
+ XMLUnknown* unk = new (commentPool.Alloc()) XMLUnknown( this );
+ unk->memPool = &commentPool;
+ unk->SetValue( str );
+ return unk;
}
int XMLDocument::LoadFile( const char* filename )
{
- DeleteChildren();
- InitDocument();
- FILE* fp = 0;
+ DeleteChildren();
+ InitDocument();
+ FILE* fp = 0;
- #if defined(_MSC_VER) && (_MSC_VER >= 1400 )
- errno_t err = fopen_s(&fp, filename, "rb" );
- if ( !fp || err) {
- #else
- fp = fopen( filename, "rb" );
- if ( !fp) {
- #endif
- SetError( XML_ERROR_FILE_NOT_FOUND, filename, 0 );
- return errorID;
- }
- LoadFile( fp );
- fclose( fp );
- return errorID;
+#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
+ errno_t err = fopen_s(&fp, filename, "rb" );
+ if ( !fp || err) {
+#else
+ fp = fopen( filename, "rb" );
+ if ( !fp) {
+#endif
+ SetError( XML_ERROR_FILE_NOT_FOUND, filename, 0 );
+ return errorID;
+ }
+ LoadFile( fp );
+ fclose( fp );
+ return errorID;
}
int XMLDocument::LoadFile( FILE* fp )
{
- DeleteChildren();
- InitDocument();
+ DeleteChildren();
+ InitDocument();
- fseek( fp, 0, SEEK_END );
- size_t size = ftell( fp );
- fseek( fp, 0, SEEK_SET );
+ fseek( fp, 0, SEEK_END );
+ size_t size = ftell( fp );
+ fseek( fp, 0, SEEK_SET );
- if ( size == 0 ) {
- return errorID;
- }
+ if ( size == 0 ) {
+ return errorID;
+ }
- charBuffer = new char[size+1];
- size_t read = fread( charBuffer, 1, size, fp );
- if ( read != size ) {
- SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 );
- return errorID;
- }
+ charBuffer = new char[size+1];
+ size_t read = fread( charBuffer, 1, size, fp );
+ if ( read != size ) {
+ SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 );
+ return errorID;
+ }
- charBuffer[size] = 0;
+ charBuffer[size] = 0;
- const char* p = charBuffer;
- p = XMLUtil::SkipWhiteSpace( p );
- p = XMLUtil::ReadBOM( p, &writeBOM );
- if ( !p || !*p ) {
- SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
- return errorID;
- }
+ const char* p = charBuffer;
+ p = XMLUtil::SkipWhiteSpace( p );
+ p = XMLUtil::ReadBOM( p, &writeBOM );
+ if ( !p || !*p ) {
+ SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
+ return errorID;
+ }
- ParseDeep( charBuffer + (p-charBuffer), 0 );
- return errorID;
+ ParseDeep( charBuffer + (p-charBuffer), 0 );
+ return errorID;
}
int XMLDocument::SaveFile( const char* filename, bool compact )
{
- FILE* fp = 0;
- #if defined(_MSC_VER) && (_MSC_VER >= 1400 )
- errno_t err = fopen_s(&fp, filename, "w" );
- if ( !fp || err) {
- #else
- fp = fopen( filename, "w" );
- if ( !fp) {
- #endif
- SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, filename, 0 );
- return errorID;
- }
- SaveFile(fp, compact);
- fclose( fp );
- return errorID;
+ FILE* fp = 0;
+#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
+ errno_t err = fopen_s(&fp, filename, "w" );
+ if ( !fp || err) {
+#else
+ fp = fopen( filename, "w" );
+ if ( !fp) {
+#endif
+ SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, filename, 0 );
+ return errorID;
+ }
+ SaveFile(fp, compact);
+ fclose( fp );
+ return errorID;
}
int XMLDocument::SaveFile( FILE* fp, bool compact )
{
- XMLPrinter stream( fp, compact );
- Print( &stream );
- return errorID;
+ XMLPrinter stream( fp, compact );
+ Print( &stream );
+ return errorID;
}
int XMLDocument::Parse( const char* p, size_t len )
{
- DeleteChildren();
- InitDocument();
+ DeleteChildren();
+ InitDocument();
- if ( !p || !*p ) {
- SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
- return errorID;
- }
- if ( len == (size_t)(-1) ) {
- len = strlen( p );
- }
- charBuffer = new char[ len+1 ];
- memcpy( charBuffer, p, len );
- charBuffer[len] = 0;
+ if ( !p || !*p ) {
+ SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
+ return errorID;
+ }
+ if ( len == (size_t)(-1) ) {
+ len = strlen( p );
+ }
+ charBuffer = new char[ len+1 ];
+ memcpy( charBuffer, p, len );
+ charBuffer[len] = 0;
- p = XMLUtil::SkipWhiteSpace( p );
- p = XMLUtil::ReadBOM( p, &writeBOM );
- if ( !p || !*p ) {
- SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
- return errorID;
- }
+ p = XMLUtil::SkipWhiteSpace( p );
+ p = XMLUtil::ReadBOM( p, &writeBOM );
+ if ( !p || !*p ) {
+ SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
+ return errorID;
+ }
- ParseDeep( charBuffer, 0 );
- return errorID;
+ ParseDeep( charBuffer, 0 );
+ return errorID;
}
void XMLDocument::Print( XMLPrinter* streamer )
{
- XMLPrinter stdStreamer( stdout );
- if ( !streamer )
- streamer = &stdStreamer;
- Accept( streamer );
+ XMLPrinter stdStreamer( stdout );
+ if ( !streamer ) {
+ streamer = &stdStreamer;
+ }
+ Accept( streamer );
}
void XMLDocument::SetError( int error, const char* str1, const char* str2 )
{
- errorID = error;
- errorStr1 = str1;
- errorStr2 = str2;
+ errorID = error;
+ errorStr1 = str1;
+ errorStr2 = str2;
}
void XMLDocument::PrintError() const
{
- if ( errorID ) {
- static const int LEN = 20;
- char buf1[LEN] = { 0 };
- char buf2[LEN] = { 0 };
+ if ( errorID ) {
+ static const int LEN = 20;
+ char buf1[LEN] = { 0 };
+ char buf2[LEN] = { 0 };
- if ( errorStr1 ) {
- TIXML_SNPRINTF( buf1, LEN, "%s", errorStr1 );
- }
- if ( errorStr2 ) {
- TIXML_SNPRINTF( buf2, LEN, "%s", errorStr2 );
- }
+ if ( errorStr1 ) {
+ TIXML_SNPRINTF( buf1, LEN, "%s", errorStr1 );
+ }
+ if ( errorStr2 ) {
+ TIXML_SNPRINTF( buf2, LEN, "%s", errorStr2 );
+ }
- printf( "XMLDocument error id=%d str1=%s str2=%s\n",
- errorID, buf1, buf2 );
- }
+ printf( "XMLDocument error id=%d str1=%s str2=%s\n",
+ errorID, buf1, buf2 );
+ }
}
XMLPrinter::XMLPrinter( FILE* file, bool compact ) :
- elementJustOpened( false ),
- firstElement( true ),
- fp( file ),
- depth( 0 ),
- textDepth( -1 ),
- processEntities( true ),
- compactMode( compact )
+ elementJustOpened( false ),
+ firstElement( true ),
+ fp( file ),
+ depth( 0 ),
+ textDepth( -1 ),
+ processEntities( true ),
+ compactMode( compact )
{
- for( int i=0; i<ENTITY_RANGE; ++i ) {
- entityFlag[i] = false;
- restrictedEntityFlag[i] = false;
- }
- for( int i=0; i<NUM_ENTITIES; ++i ) {
- TIXMLASSERT( entities[i].value < ENTITY_RANGE );
- if ( entities[i].value < ENTITY_RANGE ) {
- entityFlag[ (int)entities[i].value ] = true;
- }
- }
- restrictedEntityFlag[(int)'&'] = true;
- restrictedEntityFlag[(int)'<'] = true;
- restrictedEntityFlag[(int)'>'] = true; // not required, but consistency is nice
- buffer.Push( 0 );
+ for( int i=0; i<ENTITY_RANGE; ++i ) {
+ entityFlag[i] = false;
+ restrictedEntityFlag[i] = false;
+ }
+ for( int i=0; i<NUM_ENTITIES; ++i ) {
+ TIXMLASSERT( entities[i].value < ENTITY_RANGE );
+ if ( entities[i].value < ENTITY_RANGE ) {
+ entityFlag[ (int)entities[i].value ] = true;
+ }
+ }
+ restrictedEntityFlag[(int)'&'] = true;
+ restrictedEntityFlag[(int)'<'] = true;
+ restrictedEntityFlag[(int)'>'] = true; // not required, but consistency is nice
+ buffer.Push( 0 );
}
@@ -1718,335 +1751,337 @@
va_list va;
va_start( va, format );
- if ( fp ) {
- vfprintf( fp, format, va );
- }
- else {
- // This seems brutally complex. Haven't figured out a better
- // way on windows.
- #ifdef _MSC_VER
- int len = -1;
- int expand = 1000;
- while ( len < 0 ) {
- len = vsnprintf_s( accumulator.Mem(), accumulator.Capacity(), _TRUNCATE, format, va );
- if ( len < 0 ) {
- expand *= 3/2;
- accumulator.PushArr( expand );
- }
- }
- char* p = buffer.PushArr( len ) - 1;
- memcpy( p, accumulator.Mem(), len+1 );
- #else
- int len = vsnprintf( 0, 0, format, va );
- // Close out and re-start the va-args
- va_end( va );
- va_start( va, format );
- char* p = buffer.PushArr( len ) - 1;
- vsnprintf( p, len+1, format, va );
- #endif
- }
+ if ( fp ) {
+ vfprintf( fp, format, va );
+ }
+ else {
+ // This seems brutally complex. Haven't figured out a better
+ // way on windows.
+#ifdef _MSC_VER
+ int len = -1;
+ int expand = 1000;
+ while ( len < 0 ) {
+ len = vsnprintf_s( accumulator.Mem(), accumulator.Capacity(), _TRUNCATE, format, va );
+ if ( len < 0 ) {
+ expand *= 3/2;
+ accumulator.PushArr( expand );
+ }
+ }
+ char* p = buffer.PushArr( len ) - 1;
+ memcpy( p, accumulator.Mem(), len+1 );
+#else
+ int len = vsnprintf( 0, 0, format, va );
+ // Close out and re-start the va-args
+ va_end( va );
+ va_start( va, format );
+ char* p = buffer.PushArr( len ) - 1;
+ vsnprintf( p, len+1, format, va );
+#endif
+ }
va_end( va );
}
void XMLPrinter::PrintSpace( int depth )
{
- for( int i=0; i<depth; ++i ) {
- Print( " " );
- }
+ for( int i=0; i<depth; ++i ) {
+ Print( " " );
+ }
}
void XMLPrinter::PrintString( const char* p, bool restricted )
{
- // Look for runs of bytes between entities to print.
- const char* q = p;
- const bool* flag = restricted ? restrictedEntityFlag : entityFlag;
+ // Look for runs of bytes between entities to print.
+ const char* q = p;
+ const bool* flag = restricted ? restrictedEntityFlag : entityFlag;
- if ( processEntities ) {
- while ( *q ) {
- // Remember, char is sometimes signed. (How many times has that bitten me?)
- if ( *q > 0 && *q < ENTITY_RANGE ) {
- // Check for entities. If one is found, flush
- // the stream up until the entity, write the
- // entity, and keep looking.
- if ( flag[(unsigned)(*q)] ) {
- while ( p < q ) {
- Print( "%c", *p );
- ++p;
- }
- for( int i=0; i<NUM_ENTITIES; ++i ) {
- if ( entities[i].value == *q ) {
- Print( "&%s;", entities[i].pattern );
- break;
- }
- }
- ++p;
- }
- }
- ++q;
- }
- }
- // Flush the remaining string. This will be the entire
- // string if an entity wasn't found.
- if ( !processEntities || (q-p > 0) ) {
- Print( "%s", p );
- }
+ if ( processEntities ) {
+ while ( *q ) {
+ // Remember, char is sometimes signed. (How many times has that bitten me?)
+ if ( *q > 0 && *q < ENTITY_RANGE ) {
+ // Check for entities. If one is found, flush
+ // the stream up until the entity, write the
+ // entity, and keep looking.
+ if ( flag[(unsigned)(*q)] ) {
+ while ( p < q ) {
+ Print( "%c", *p );
+ ++p;
+ }
+ for( int i=0; i<NUM_ENTITIES; ++i ) {
+ if ( entities[i].value == *q ) {
+ Print( "&%s;", entities[i].pattern );
+ break;
+ }
+ }
+ ++p;
+ }
+ }
+ ++q;
+ }
+ }
+ // Flush the remaining string. This will be the entire
+ // string if an entity wasn't found.
+ if ( !processEntities || (q-p > 0) ) {
+ Print( "%s", p );
+ }
}
void XMLPrinter::PushHeader( bool writeBOM, bool writeDec )
{
- static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 };
- if ( writeBOM ) {
- Print( "%s", bom );
- }
- if ( writeDec ) {
- PushDeclaration( "xml version=\"1.0\"" );
- }
+ static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 };
+ if ( writeBOM ) {
+ Print( "%s", bom );
+ }
+ if ( writeDec ) {
+ PushDeclaration( "xml version=\"1.0\"" );
+ }
}
void XMLPrinter::OpenElement( const char* name )
{
- if ( elementJustOpened ) {
- SealElement();
- }
- stack.Push( name );
+ if ( elementJustOpened ) {
+ SealElement();
+ }
+ stack.Push( name );
- if ( textDepth < 0 && !firstElement && !compactMode ) {
- Print( "\n" );
- PrintSpace( depth );
- }
+ if ( textDepth < 0 && !firstElement && !compactMode ) {
+ Print( "\n" );
+ PrintSpace( depth );
+ }
- Print( "<%s", name );
- elementJustOpened = true;
- firstElement = false;
- ++depth;
+ Print( "<%s", name );
+ elementJustOpened = true;
+ firstElement = false;
+ ++depth;
}
void XMLPrinter::PushAttribute( const char* name, const char* value )
{
- TIXMLASSERT( elementJustOpened );
- Print( " %s=\"", name );
- PrintString( value, false );
- Print( "\"" );
+ TIXMLASSERT( elementJustOpened );
+ Print( " %s=\"", name );
+ PrintString( value, false );
+ Print( "\"" );
}
void XMLPrinter::PushAttribute( const char* name, int v )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( v, buf, BUF_SIZE );
- PushAttribute( name, buf );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( v, buf, BUF_SIZE );
+ PushAttribute( name, buf );
}
void XMLPrinter::PushAttribute( const char* name, unsigned v )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( v, buf, BUF_SIZE );
- PushAttribute( name, buf );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( v, buf, BUF_SIZE );
+ PushAttribute( name, buf );
}
void XMLPrinter::PushAttribute( const char* name, bool v )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( v, buf, BUF_SIZE );
- PushAttribute( name, buf );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( v, buf, BUF_SIZE );
+ PushAttribute( name, buf );
}
void XMLPrinter::PushAttribute( const char* name, double v )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( v, buf, BUF_SIZE );
- PushAttribute( name, buf );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( v, buf, BUF_SIZE );
+ PushAttribute( name, buf );
}
void XMLPrinter::CloseElement()
{
- --depth;
- const char* name = stack.Pop();
+ --depth;
+ const char* name = stack.Pop();
- if ( elementJustOpened ) {
- Print( "/>" );
- }
- else {
- if ( textDepth < 0 && !compactMode) {
- Print( "\n" );
- PrintSpace( depth );
- }
- Print( "</%s>", name );
- }
+ if ( elementJustOpened ) {
+ Print( "/>" );
+ }
+ else {
+ if ( textDepth < 0 && !compactMode) {
+ Print( "\n" );
+ PrintSpace( depth );
+ }
+ Print( "</%s>", name );
+ }
- if ( textDepth == depth )
- textDepth = -1;
- if ( depth == 0 && !compactMode)
- Print( "\n" );
- elementJustOpened = false;
+ if ( textDepth == depth ) {
+ textDepth = -1;
+ }
+ if ( depth == 0 && !compactMode) {
+ Print( "\n" );
+ }
+ elementJustOpened = false;
}
void XMLPrinter::SealElement()
{
- elementJustOpened = false;
- Print( ">" );
+ elementJustOpened = false;
+ Print( ">" );
}
void XMLPrinter::PushText( const char* text, bool cdata )
{
- textDepth = depth-1;
+ textDepth = depth-1;
- if ( elementJustOpened ) {
- SealElement();
- }
- if ( cdata ) {
- Print( "<![CDATA[" );
- Print( "%s", text );
- Print( "]]>" );
- }
- else {
- PrintString( text, true );
- }
+ if ( elementJustOpened ) {
+ SealElement();
+ }
+ if ( cdata ) {
+ Print( "<![CDATA[" );
+ Print( "%s", text );
+ Print( "]]>" );
+ }
+ else {
+ PrintString( text, true );
+ }
}
void XMLPrinter::PushText( int value )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( value, buf, BUF_SIZE );
- PushText( buf, false );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( value, buf, BUF_SIZE );
+ PushText( buf, false );
}
void XMLPrinter::PushText( unsigned value )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( value, buf, BUF_SIZE );
- PushText( buf, false );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( value, buf, BUF_SIZE );
+ PushText( buf, false );
}
void XMLPrinter::PushText( bool value )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( value, buf, BUF_SIZE );
- PushText( buf, false );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( value, buf, BUF_SIZE );
+ PushText( buf, false );
}
void XMLPrinter::PushText( float value )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( value, buf, BUF_SIZE );
- PushText( buf, false );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( value, buf, BUF_SIZE );
+ PushText( buf, false );
}
void XMLPrinter::PushText( double value )
{
- char buf[BUF_SIZE];
- XMLUtil::ToStr( value, buf, BUF_SIZE );
- PushText( buf, false );
+ char buf[BUF_SIZE];
+ XMLUtil::ToStr( value, buf, BUF_SIZE );
+ PushText( buf, false );
}
void XMLPrinter::PushComment( const char* comment )
{
- if ( elementJustOpened ) {
- SealElement();
- }
- if ( textDepth < 0 && !firstElement && !compactMode) {
- Print( "\n" );
- PrintSpace( depth );
- }
- firstElement = false;
- Print( "<!--%s-->", comment );
+ if ( elementJustOpened ) {
+ SealElement();
+ }
+ if ( textDepth < 0 && !firstElement && !compactMode) {
+ Print( "\n" );
+ PrintSpace( depth );
+ }
+ firstElement = false;
+ Print( "<!--%s-->", comment );
}
void XMLPrinter::PushDeclaration( const char* value )
{
- if ( elementJustOpened ) {
- SealElement();
- }
- if ( textDepth < 0 && !firstElement && !compactMode) {
- Print( "\n" );
- PrintSpace( depth );
- }
- firstElement = false;
- Print( "<?%s?>", value );
+ if ( elementJustOpened ) {
+ SealElement();
+ }
+ if ( textDepth < 0 && !firstElement && !compactMode) {
+ Print( "\n" );
+ PrintSpace( depth );
+ }
+ firstElement = false;
+ Print( "<?%s?>", value );
}
void XMLPrinter::PushUnknown( const char* value )
{
- if ( elementJustOpened ) {
- SealElement();
- }
- if ( textDepth < 0 && !firstElement && !compactMode) {
- Print( "\n" );
- PrintSpace( depth );
- }
- firstElement = false;
- Print( "<!%s>", value );
+ if ( elementJustOpened ) {
+ SealElement();
+ }
+ if ( textDepth < 0 && !firstElement && !compactMode) {
+ Print( "\n" );
+ PrintSpace( depth );
+ }
+ firstElement = false;
+ Print( "<!%s>", value );
}
bool XMLPrinter::VisitEnter( const XMLDocument& doc )
{
- processEntities = doc.ProcessEntities();
- if ( doc.HasBOM() ) {
- PushHeader( true, false );
- }
- return true;
+ processEntities = doc.ProcessEntities();
+ if ( doc.HasBOM() ) {
+ PushHeader( true, false );
+ }
+ return true;
}
bool XMLPrinter::VisitEnter( const XMLElement& element, const XMLAttribute* attribute )
{
- OpenElement( element.Name() );
- while ( attribute ) {
- PushAttribute( attribute->Name(), attribute->Value() );
- attribute = attribute->Next();
- }
- return true;
+ OpenElement( element.Name() );
+ while ( attribute ) {
+ PushAttribute( attribute->Name(), attribute->Value() );
+ attribute = attribute->Next();
+ }
+ return true;
}
bool XMLPrinter::VisitExit( const XMLElement& )
{
- CloseElement();
- return true;
+ CloseElement();
+ return true;
}
bool XMLPrinter::Visit( const XMLText& text )
{
- PushText( text.Value(), text.CData() );
- return true;
+ PushText( text.Value(), text.CData() );
+ return true;
}
bool XMLPrinter::Visit( const XMLComment& comment )
{
- PushComment( comment.Value() );
- return true;
+ PushComment( comment.Value() );
+ return true;
}
bool XMLPrinter::Visit( const XMLDeclaration& declaration )
{
- PushDeclaration( declaration.Value() );
- return true;
+ PushDeclaration( declaration.Value() );
+ return true;
}
bool XMLPrinter::Visit( const XMLUnknown& unknown )
{
- PushUnknown( unknown.Value() );
- return true;
+ PushUnknown( unknown.Value() );
+ return true;
}