From d0a38c3a206fe6efba605ff60e82683e64eccf89 Mon Sep 17 00:00:00 2001 From: "Lee Thomason (grinliz)" Date: Mon, 29 Apr 2013 09:15:37 -0700 Subject: [PATCH] fix BOM preservation bugs. add new tests --- tinyxml2.cpp | 4 +++- xmltest.cpp | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 3b38584..510de38 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -1663,6 +1663,7 @@ XMLError XMLDocument::SaveFile( FILE* fp, bool compact ) XMLError XMLDocument::Parse( const char* p, size_t len ) { + const char* start = p; Clear(); if ( !p || !*p ) { @@ -1683,7 +1684,8 @@ XMLError XMLDocument::Parse( const char* p, size_t len ) return _errorID; } - ParseDeep( _charBuffer, 0 ); + int delta = p - start; // skip initial whitespace, BOM, etc. + ParseDeep( _charBuffer+delta, 0 ); return _errorID; } diff --git a/xmltest.cpp b/xmltest.cpp index 231328e..c8e1b0b 100644 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -25,7 +25,7 @@ int gPass = 0; int gFail = 0; -bool XMLTest (const char* testString, const char* expected, const char* found, bool echo=true ) +bool XMLTest (const char* testString, const char* expected, const char* found, bool echo=true, bool extraNL=false ) { bool pass = !strcmp( expected, found ); if ( pass ) @@ -33,10 +33,19 @@ bool XMLTest (const char* testString, const char* expected, const char* found, b else printf ("[fail]"); - if ( !echo ) + if ( !echo ) { printf (" %s\n", testString); - else - printf (" %s [%s][%s]\n", testString, expected, found); + } + else { + if ( extraNL ) { + printf( " %s\n", testString ); + printf( "%s\n", expected ); + printf( "%s\n", found ); + } + else { + printf (" %s [%s][%s]\n", testString, expected, found); + } + } if ( pass ) ++gPass; @@ -1164,6 +1173,28 @@ int main( int argc, const char ** argv ) XMLTest( "Loading an empty file", XML_ERROR_EMPTY_DOCUMENT, error ); } + { + // BOM preservation + static const char* xml_bom_preservation = "\xef\xbb\xbf\n"; + { + XMLDocument doc; + XMLTest( "BOM preservation (parse)", XML_NO_ERROR, doc.Parse( xml_bom_preservation ), false ); + XMLPrinter printer; + doc.Print( &printer ); + + XMLTest( "BOM preservation (compare)", xml_bom_preservation, printer.CStr(), false, true ); + doc.SaveFile( "resources/bomtest.xml" ); + } + { + XMLDocument doc; + doc.LoadFile( "resources/bomtest.xml" ); + XMLTest( "BOM preservation (load)", true, doc.HasBOM(), false ); + + XMLPrinter printer; + doc.Print( &printer ); + XMLTest( "BOM preservation (compare)", xml_bom_preservation, printer.CStr(), false, true ); + } + } // ----------- Performance tracking -------------- {