|
|
@@ -368,6 +368,19 @@ const char* StrPair::GetStr()
|
|
|
|
|
|
// --------- XMLUtil ----------- //
|
|
|
|
|
|
+const char* XMLUtil::writeBoolTrue = "true";
|
|
|
+const char* XMLUtil::writeBoolFalse = "false";
|
|
|
+
|
|
|
+void XMLUtil::SetBoolSerialization(const char* writeTrue, const char* writeFalse)
|
|
|
+{
|
|
|
+ static const char* defTrue = "true";
|
|
|
+ static const char* defFalse = "false";
|
|
|
+
|
|
|
+ writeBoolTrue = (writeTrue) ? writeTrue : defTrue;
|
|
|
+ writeBoolFalse = (writeFalse) ? writeFalse : defFalse;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
const char* XMLUtil::ReadBOM( const char* p, bool* bom )
|
|
|
{
|
|
|
TIXMLASSERT( p );
|
|
|
@@ -545,7 +558,7 @@ void XMLUtil::ToStr( unsigned v, char* buffer, int bufferSize )
|
|
|
|
|
|
void XMLUtil::ToStr( bool v, char* buffer, int bufferSize )
|
|
|
{
|
|
|
- TIXML_SNPRINTF( buffer, bufferSize, "%s", v ? "true" : "false" );
|
|
|
+ TIXML_SNPRINTF( buffer, bufferSize, "%s", v ? writeBoolTrue : writeBoolFalse);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
@@ -665,46 +678,34 @@ char* XMLDocument::Identify( char* p, XMLNode** node )
|
|
|
TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLDeclaration ) ); // use same memory pool
|
|
|
XMLNode* returnNode = 0;
|
|
|
if ( XMLUtil::StringEqual( p, xmlHeader, xmlHeaderLen ) ) {
|
|
|
- TIXMLASSERT( sizeof( XMLDeclaration ) == _commentPool.ItemSize() );
|
|
|
- returnNode = new (_commentPool.Alloc()) XMLDeclaration( this );
|
|
|
+ returnNode = CreateUnlinkedNode<XMLDeclaration>( _commentPool );
|
|
|
returnNode->_parseLineNum = _parseCurLineNum;
|
|
|
- returnNode->_memPool = &_commentPool;
|
|
|
p += xmlHeaderLen;
|
|
|
}
|
|
|
else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) {
|
|
|
- TIXMLASSERT( sizeof( XMLComment ) == _commentPool.ItemSize() );
|
|
|
- returnNode = new (_commentPool.Alloc()) XMLComment( this );
|
|
|
+ returnNode = CreateUnlinkedNode<XMLComment>( _commentPool );
|
|
|
returnNode->_parseLineNum = _parseCurLineNum;
|
|
|
- returnNode->_memPool = &_commentPool;
|
|
|
p += commentHeaderLen;
|
|
|
}
|
|
|
else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) {
|
|
|
- TIXMLASSERT( sizeof( XMLText ) == _textPool.ItemSize() );
|
|
|
- XMLText* text = new (_textPool.Alloc()) XMLText( this );
|
|
|
+ XMLText* text = CreateUnlinkedNode<XMLText>( _textPool );
|
|
|
returnNode = text;
|
|
|
returnNode->_parseLineNum = _parseCurLineNum;
|
|
|
- returnNode->_memPool = &_textPool;
|
|
|
p += cdataHeaderLen;
|
|
|
text->SetCData( true );
|
|
|
}
|
|
|
else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) {
|
|
|
- TIXMLASSERT( sizeof( XMLUnknown ) == _commentPool.ItemSize() );
|
|
|
- returnNode = new (_commentPool.Alloc()) XMLUnknown( this );
|
|
|
+ returnNode = CreateUnlinkedNode<XMLUnknown>( _commentPool );
|
|
|
returnNode->_parseLineNum = _parseCurLineNum;
|
|
|
- returnNode->_memPool = &_commentPool;
|
|
|
p += dtdHeaderLen;
|
|
|
}
|
|
|
else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) {
|
|
|
- TIXMLASSERT( sizeof( XMLElement ) == _elementPool.ItemSize() );
|
|
|
- returnNode = new (_elementPool.Alloc()) XMLElement( this );
|
|
|
+ returnNode = CreateUnlinkedNode<XMLElement>( _elementPool );
|
|
|
returnNode->_parseLineNum = _parseCurLineNum;
|
|
|
- returnNode->_memPool = &_elementPool;
|
|
|
p += elementHeaderLen;
|
|
|
}
|
|
|
else {
|
|
|
- TIXMLASSERT( sizeof( XMLText ) == _textPool.ItemSize() );
|
|
|
- returnNode = new (_textPool.Alloc()) XMLText( this );
|
|
|
- returnNode->_memPool = &_textPool;
|
|
|
+ returnNode = CreateUnlinkedNode<XMLText>( _textPool );
|
|
|
returnNode->_parseLineNum = _parseCurLineNum; // Report line of first non-whitespace character
|
|
|
p = start; // Back it up, all the text counts.
|
|
|
_parseCurLineNum = startLine;
|
|
|
@@ -966,7 +967,7 @@ const XMLElement* XMLNode::PreviousSiblingElement( const char* name ) const
|
|
|
}
|
|
|
|
|
|
|
|
|
-char* XMLNode::ParseDeep( char* p, StrPair* parentEnd, int* curLineNumPtr )
|
|
|
+char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr )
|
|
|
{
|
|
|
// This is a recursive method, but thinking about it "at the current level"
|
|
|
// it is a pretty simple flat list:
|
|
|
@@ -1031,8 +1032,8 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEnd, int* curLineNumPtr )
|
|
|
if ( ele ) {
|
|
|
// We read the end tag. Return it to the parent.
|
|
|
if ( ele->ClosingType() == XMLElement::CLOSING ) {
|
|
|
- if ( parentEnd ) {
|
|
|
- ele->_value.TransferTo( parentEnd );
|
|
|
+ if ( parentEndTag ) {
|
|
|
+ ele->_value.TransferTo( parentEndTag );
|
|
|
}
|
|
|
node->_memPool->SetTracked(); // created and then immediately deleted.
|
|
|
DeleteNode( node );
|
|
|
@@ -1144,6 +1145,7 @@ XMLNode* XMLText::ShallowClone( XMLDocument* doc ) const
|
|
|
|
|
|
bool XMLText::ShallowEqual( const XMLNode* compare ) const
|
|
|
{
|
|
|
+ TIXMLASSERT( compare );
|
|
|
const XMLText* text = compare->ToText();
|
|
|
return ( text && XMLUtil::StringEqual( text->Value(), Value() ) );
|
|
|
}
|
|
|
@@ -1459,7 +1461,7 @@ void XMLAttribute::SetAttribute( float v )
|
|
|
|
|
|
// --------- XMLElement ---------- //
|
|
|
XMLElement::XMLElement( XMLDocument* doc ) : XMLNode( doc ),
|
|
|
- _closingType( 0 ),
|
|
|
+ _closingType( OPEN ),
|
|
|
_rootAttribute( 0 )
|
|
|
{
|
|
|
}
|
|
|
@@ -1849,6 +1851,7 @@ XMLAttribute* XMLElement::CreateAttribute()
|
|
|
{
|
|
|
TIXMLASSERT( sizeof( XMLAttribute ) == _document->_attributePool.ItemSize() );
|
|
|
XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute();
|
|
|
+ TIXMLASSERT( attrib );
|
|
|
attrib->_memPool = &_document->_attributePool;
|
|
|
attrib->_memPool->SetTracked();
|
|
|
return attrib;
|
|
|
@@ -1858,7 +1861,7 @@ XMLAttribute* XMLElement::CreateAttribute()
|
|
|
// <ele></ele>
|
|
|
// <ele>foo<b>bar</b></ele>
|
|
|
//
|
|
|
-char* XMLElement::ParseDeep( char* p, StrPair* strPair, int* curLineNumPtr )
|
|
|
+char* XMLElement::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr )
|
|
|
{
|
|
|
// Read the element name.
|
|
|
p = XMLUtil::SkipWhiteSpace( p, curLineNumPtr );
|
|
|
@@ -1877,11 +1880,11 @@ char* XMLElement::ParseDeep( char* p, StrPair* strPair, int* curLineNumPtr )
|
|
|
}
|
|
|
|
|
|
p = ParseAttributes( p, curLineNumPtr );
|
|
|
- if ( !p || !*p || _closingType ) {
|
|
|
+ if ( !p || !*p || _closingType != OPEN ) {
|
|
|
return p;
|
|
|
}
|
|
|
|
|
|
- p = XMLNode::ParseDeep( p, strPair, curLineNumPtr );
|
|
|
+ p = XMLNode::ParseDeep( p, parentEndTag, curLineNumPtr );
|
|
|
return p;
|
|
|
}
|
|
|
|
|
|
@@ -1967,12 +1970,12 @@ const char* XMLDocument::_errorNames[XML_ERROR_COUNT] = {
|
|
|
};
|
|
|
|
|
|
|
|
|
-XMLDocument::XMLDocument( bool processEntities, Whitespace whitespace ) :
|
|
|
+XMLDocument::XMLDocument( bool processEntities, Whitespace whitespaceMode ) :
|
|
|
XMLNode( 0 ),
|
|
|
_writeBOM( false ),
|
|
|
_processEntities( processEntities ),
|
|
|
_errorID(XML_SUCCESS),
|
|
|
- _whitespace( whitespace ),
|
|
|
+ _whitespaceMode( whitespaceMode ),
|
|
|
_errorLineNum( 0 ),
|
|
|
_charBuffer( 0 ),
|
|
|
_parseCurLineNum( 0 )
|
|
|
@@ -2031,9 +2034,7 @@ void XMLDocument::DeepCopy(XMLDocument* target)
|
|
|
|
|
|
XMLElement* XMLDocument::NewElement( const char* name )
|
|
|
{
|
|
|
- TIXMLASSERT( sizeof( XMLElement ) == _elementPool.ItemSize() );
|
|
|
- XMLElement* ele = new (_elementPool.Alloc()) XMLElement( this );
|
|
|
- ele->_memPool = &_elementPool;
|
|
|
+ XMLElement* ele = CreateUnlinkedNode<XMLElement>( _elementPool );
|
|
|
ele->SetName( name );
|
|
|
return ele;
|
|
|
}
|
|
|
@@ -2041,9 +2042,7 @@ XMLElement* XMLDocument::NewElement( const char* name )
|
|
|
|
|
|
XMLComment* XMLDocument::NewComment( const char* str )
|
|
|
{
|
|
|
- TIXMLASSERT( sizeof( XMLComment ) == _commentPool.ItemSize() );
|
|
|
- XMLComment* comment = new (_commentPool.Alloc()) XMLComment( this );
|
|
|
- comment->_memPool = &_commentPool;
|
|
|
+ XMLComment* comment = CreateUnlinkedNode<XMLComment>( _commentPool );
|
|
|
comment->SetValue( str );
|
|
|
return comment;
|
|
|
}
|
|
|
@@ -2051,9 +2050,7 @@ XMLComment* XMLDocument::NewComment( const char* str )
|
|
|
|
|
|
XMLText* XMLDocument::NewText( const char* str )
|
|
|
{
|
|
|
- TIXMLASSERT( sizeof( XMLText ) == _textPool.ItemSize() );
|
|
|
- XMLText* text = new (_textPool.Alloc()) XMLText( this );
|
|
|
- text->_memPool = &_textPool;
|
|
|
+ XMLText* text = CreateUnlinkedNode<XMLText>( _textPool );
|
|
|
text->SetValue( str );
|
|
|
return text;
|
|
|
}
|
|
|
@@ -2061,9 +2058,7 @@ XMLText* XMLDocument::NewText( const char* str )
|
|
|
|
|
|
XMLDeclaration* XMLDocument::NewDeclaration( const char* str )
|
|
|
{
|
|
|
- TIXMLASSERT( sizeof( XMLDeclaration ) == _commentPool.ItemSize() );
|
|
|
- XMLDeclaration* dec = new (_commentPool.Alloc()) XMLDeclaration( this );
|
|
|
- dec->_memPool = &_commentPool;
|
|
|
+ XMLDeclaration* dec = CreateUnlinkedNode<XMLDeclaration>( _commentPool );
|
|
|
dec->SetValue( str ? str : "xml version=\"1.0\" encoding=\"UTF-8\"" );
|
|
|
return dec;
|
|
|
}
|
|
|
@@ -2071,9 +2066,7 @@ XMLDeclaration* XMLDocument::NewDeclaration( const char* str )
|
|
|
|
|
|
XMLUnknown* XMLDocument::NewUnknown( const char* str )
|
|
|
{
|
|
|
- TIXMLASSERT( sizeof( XMLUnknown ) == _commentPool.ItemSize() );
|
|
|
- XMLUnknown* unk = new (_commentPool.Alloc()) XMLUnknown( this );
|
|
|
- unk->_memPool = &_commentPool;
|
|
|
+ XMLUnknown* unk = CreateUnlinkedNode<XMLUnknown>( _commentPool );
|
|
|
unk->SetValue( str );
|
|
|
return unk;
|
|
|
}
|