In PrintString, move the optimization under the if ( _processEntities ) block and retain the strlen Write in the new else block. Added a test case.
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 89b7913..33cf19f 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -2523,14 +2523,16 @@
             ++q;

             TIXMLASSERT( p <= q );

         }

+        // Flush the remaining string. This will be the entire

+        // string if an entity wasn't found.

+        if ( p < q ) {

+            const size_t delta = q - p;

+            const int toPrint = ( INT_MAX < delta ) ? INT_MAX : (int)delta;

+            Write( p, toPrint );

+        }

     }

-    // Flush the remaining string. This will be the entire

-    // string if an entity wasn't found.

-    TIXMLASSERT( p <= q );

-    if ( !_processEntities || ( p < q ) ) {

-        const size_t delta = q - p;

-        const int toPrint = ( INT_MAX < delta ) ? INT_MAX : (int)delta;

-        Write( p, toPrint );

+    else {

+        Write( p );

     }

 }

 

diff --git a/xmltest.cpp b/xmltest.cpp
index 7160fe9..26443aa 100644
--- a/xmltest.cpp
+++ b/xmltest.cpp
@@ -1996,6 +1996,17 @@
 	}

 

 	{

+		const char* html("<!DOCTYPE html><html><body><p>test</p><p><br/></p></body></html>");

+		XMLDocument doc(false);

+		doc.Parse(html);

+

+		XMLPrinter printer(0, true);

+		doc.Print(&printer);

+

+		XMLTest(html, html, printer.CStr());

+	}

+

+	{

 		// Evil memory leaks. 

 		// If an XMLElement (etc) is allocated via NewElement() (etc.)

 		// and NOT added to the XMLDocument, what happens?