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 );
}