diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index fb367fc..598102b 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -1728,9 +1728,8 @@ XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name )
}
}
if ( !attrib ) {
- TIXMLASSERT( sizeof( XMLAttribute ) == _document->_attributePool.ItemSize() );
- attrib = new (_document->_attributePool.Alloc() ) XMLAttribute();
- attrib->_memPool = &_document->_attributePool;
+ attrib = CreateAttribute();
+ TIXMLASSERT( attrib );
if ( last ) {
last->_next = attrib;
}
@@ -1738,7 +1737,6 @@ XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name )
_rootAttribute = attrib;
}
attrib->SetName( name );
- attrib->_memPool->SetTracked(); // always created and linked.
}
return attrib;
}
@@ -1778,11 +1776,9 @@ char* XMLElement::ParseAttributes( char* p, int& curLineNum )
// attribute.
if (XMLUtil::IsNameStartChar( *p ) ) {
- TIXMLASSERT( sizeof( XMLAttribute ) == _document->_attributePool.ItemSize() );
- XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute();
+ XMLAttribute* attrib = CreateAttribute();
+ TIXMLASSERT( attrib );
attrib->_parseLineNum = _document->_parseCurLineNum;
- attrib->_memPool = &_document->_attributePool;
- attrib->_memPool->SetTracked();
int attrLineNum = attrib->_parseLineNum;
@@ -1833,6 +1829,15 @@ void XMLElement::DeleteAttribute( XMLAttribute* attribute )
pool->Free( attribute );
}
+XMLAttribute* XMLElement::CreateAttribute()
+{
+ TIXMLASSERT( sizeof( XMLAttribute ) == _document->_attributePool.ItemSize() );
+ XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute();
+ attrib->_memPool = &_document->_attributePool;
+ attrib->_memPool->SetTracked();
+ return attrib;
+}
+
//
//
// foobar
@@ -1972,10 +1977,7 @@ void XMLDocument::Clear()
#ifdef DEBUG
const bool hadError = Error();
#endif
- _errorID = XML_SUCCESS;
- _errorStr1.Reset();
- _errorStr2.Reset();
- _errorLineNum = 0;
+ ClearError();
delete [] _charBuffer;
_charBuffer = 0;
@@ -2180,7 +2182,7 @@ XMLError XMLDocument::SaveFile( FILE* fp, bool compact )
{
// Clear any error from the last save, otherwise it will get reported
// for *this* call.
- SetError(XML_SUCCESS, 0, 0, 0);
+ ClearError();
XMLPrinter stream( fp, compact );
Print( &stream );
return _errorID;
diff --git a/tinyxml2.h b/tinyxml2.h
index b15da9e..e176ec0 100755
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -1574,6 +1574,7 @@ private:
//void LinkAttribute( XMLAttribute* attrib );
char* ParseAttributes( char* p, int& curLineNum );
static void DeleteAttribute( XMLAttribute* attribute );
+ XMLAttribute* CreateAttribute();
enum { BUF_SIZE = 200 };
int _closingType;
@@ -1751,6 +1752,10 @@ public:
void SetError( XMLError error, const char* str1, const char* str2, int lineNum );
+ void ClearError() {
+ SetError(XML_SUCCESS, 0, 0, 0);
+ }
+
/// Return true if there was an error parsing the document.
bool Error() const {
return _errorID != XML_SUCCESS;