diff --git a/tinyxml2.cpp b/tinyxml2.cpp index cefd22d..e007294 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -645,6 +645,9 @@ XMLNode::~XMLNode() const char* XMLNode::Value() const { + // Catch an edge case: XMLDocuments don't have a a Value. Carefully return nullptr. + if ( this->ToDocument() ) + return 0; return _value.GetStr(); } diff --git a/tinyxml2.h b/tinyxml2.h index d0620cc..70a9851 100755 --- a/tinyxml2.h +++ b/tinyxml2.h @@ -122,9 +122,9 @@ inline int TIXML_SNPRINTF( char* buffer, size_t size, const char* format, ... ) /* Versioning, past 1.0.14: http://semver.org/ */ -static const int TIXML2_MAJOR_VERSION = 3; -static const int TIXML2_MINOR_VERSION = 0; -static const int TIXML2_PATCH_VERSION = 0; +static const int TIXML2_MAJOR_VERSION = 3; +static const int TIXML2_MINOR_VERSION = 0; +static const int TIXML2_PATCH_VERSION = 0; namespace tinyxml2 { @@ -708,7 +708,7 @@ public: /** The meaning of 'value' changes for the specific type. @verbatim - Document: empty + Document: empty (NULL is returned, not an empty string) Element: name of the element Comment: the comment text Unknown: the tag contents diff --git a/xmltest.cpp b/xmltest.cpp index f3fa7b2..5e0eb3a 100644 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -30,7 +30,13 @@ int gFail = 0; bool XMLTest (const char* testString, const char* expected, const char* found, bool echo=true, bool extraNL=false ) { - bool pass = !strcmp( expected, found ); + bool pass; + if ( !expected && !found ) + pass = true; + else if ( !expected || !found ) + pass = false; + else + pass = !strcmp( expected, found ); if ( pass ) printf ("[pass]"); else @@ -1462,24 +1468,37 @@ int main( int argc, const char ** argv ) { // Check that declarations are parsed only as the FirstChild - const char* xml0 = "" - " " - ""; - const char* xml1 = "" - " " - ""; - const char* xml2 = "" - ""; - XMLDocument doc; - doc.Parse(xml0); - XMLTest("Test that the code changes do not affect normal parsing", doc.Error(), false); - doc.Parse(xml1); - XMLTest("Test that the second declaration throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION); - doc.Parse(xml2); - XMLTest("Test that declaration after a child throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION); + const char* xml0 = "" + " " + ""; + const char* xml1 = "" + " " + ""; + const char* xml2 = "" + ""; + XMLDocument doc; + doc.Parse(xml0); + XMLTest("Test that the code changes do not affect normal parsing", doc.Error(), false); + doc.Parse(xml1); + XMLTest("Test that the second declaration throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION); + doc.Parse(xml2); + XMLTest("Test that declaration after a child throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION); } - // ----------- Performance tracking -------------- + { + // No matter - before or after successfully parsing a text - + // calling XMLDocument::Value() causes an assert in debug. + const char* validXml = "" + "" + ""; + XMLDocument* doc = new XMLDocument(); + XMLTest( "XMLDocument::Value() returns null?", NULL, doc->Value() ); + doc->Parse( validXml ); + XMLTest( "XMLDocument::Value() returns null?", NULL, doc->Value() ); + delete doc; + } + + // ----------- Performance tracking -------------- { #if defined( _MSC_VER ) __int64 start, end, freq;