entity output
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 827bc36..a2d0878 100644
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -628,12 +628,39 @@
 }

 

 

-void XMLStreamer::PrintString( const char* )

+void XMLStreamer::PrintString( const char* p )

 {

+	// Look for runs of bytes between entities to print.

+	const char* q = p;

 

+	while ( *q ) {

+		if ( *q < ENTITY_RANGE ) {

+			// Check for entities. If one is found, flush

+			// the stream up until the entity, write the 

+			// entity, and keep looking.

+			if ( entityFlag[*q] ) {

+				while ( p < q ) {

+					fputc( *p, fp );

+					++p;

+				}

+				for( int i=0; i<NUM_ENTITIES; ++i ) {

+					if ( entities[i].value == *q ) {

+						fprintf( fp, "&%s;", entities[i].pattern );

+						break;

+					}

+				}

+				++p;

+			}

+		}

+		++q;

+	}

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

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

+	if ( q-p > 0 ) {

+		fprintf( fp, "%s", p );

+	}

 }

 

-

 void XMLStreamer::OpenElement( const char* name, bool textParent )

 {

 	if ( elementJustOpened ) {

@@ -645,6 +672,7 @@
 	stack.Push( name );

 	text.Push( textParent ? "T" : "" );

 

+	// fixme: can names have entities?

 	fprintf( fp, "<%s", name );

 	elementJustOpened = true;

 	++depth;

@@ -654,6 +682,7 @@
 void XMLStreamer::PushAttribute( const char* name, const char* value )

 {

 	TIXMLASSERT( elementJustOpened );

+	// fixme: supports entities?

 	fprintf( fp, " %s=\"%s\"", name, value );

 }

 

@@ -675,6 +704,7 @@
 		if ( wasPositive == 0 ) {

 			PrintSpace( depth );

 		}

+		// fixme can names have entities?

 		fprintf( fp, "</%s>", name );

 		if ( text.NumPositive() == 0 ) {

 			fprintf( fp, "\n" );

@@ -699,7 +729,7 @@
 	if ( elementJustOpened ) {

 		SealElement();

 	}

-	fprintf( fp, "%s", text );

+	PrintString( text );

 }