added entity input support.
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 3bf058e..a8a7be3 100644
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -14,6 +14,22 @@
static const char SINGLE_QUOTE = '\'';
static const char DOUBLE_QUOTE = '\"';
+struct Entity {
+ const char* pattern;
+ int length;
+ char value;
+};
+
+static const int NUM_ENTITIES = 5;
+static const Entity entities[NUM_ENTITIES] =
+{
+ { "quot", 4, '\"' },
+ { "amp", 3, '&' },
+ { "apos", 4, '\'' },
+ { "lt", 2, '<' },
+ { "gt", 2, '>' }
+};
+
// --------- CharBuffer ----------- //
/*static*/ CharBuffer* CharBuffer::Construct( const char* in )
@@ -37,13 +53,14 @@
{
if ( flags & NEEDS_FLUSH ) {
*end = 0;
+ flags ^= NEEDS_FLUSH;
- if ( flags & ( NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION ) ) {
+ if ( flags ) {
char* p = start;
char* q = start;
while( p < end ) {
- if ( *p == CR ) {
+ if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR ) {
// CR-LF pair becomes LF
// CR alone becomes LF
// LF-CR becomes LF
@@ -55,7 +72,7 @@
}
*q = LF;
}
- else if ( *p == LF ) {
+ else if ( (flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF ) {
if ( *(p+1) == CR ) {
p += 2;
}
@@ -64,12 +81,32 @@
}
*q = LF;
}
+ else if ( (flags & NEEDS_ENTITY_PROCESSING) && *p == '&' ) {
+ int i=0;
+ for( i=0; i<NUM_ENTITIES; ++i ) {
+ if ( strncmp( p+1, entities[i].pattern, entities[i].length ) == 0
+ && *(p+entities[i].length+1) == ';' )
+ {
+ // Found an entity convert;
+ *q = entities[i].value;
+ ++q;
+ p += entities[i].length + 2;
+ break;
+ }
+ }
+ if ( i == NUM_ENTITIES ) {
+ // fixme: treat as error?
+ ++p;
+ ++q;
+ }
+ }
else {
*q = *p;
++p;
++q;
}
}
+ *q = 0;
}
flags = 0;
}
@@ -276,15 +313,6 @@
return 0;
}
-/*
-void XMLNode::PrintSpace( FILE* fp, int depth )
-{
- for( int i=0; i<depth; ++i ) {
- fprintf( fp, " " );
- }
-}
-*/
-
// --------- XMLText ---------- //
char* XMLText::ParseDeep( char* p )
{
@@ -480,28 +508,6 @@
node->Print( streamer );
}
streamer->CloseElement();
-
-/* if ( firstChild ) {
- fprintf( cfile, ">", Name() );
- if ( !IsTextParent() ) {
- fprintf( cfile, "\n" );
- }
-
- for( XMLNode* node=firstChild; node; node=node->next ) {
- node->Print( cfile, depth+1 );
- }
-
- fprintf( cfile, "</%s>", Name() );
- if ( !IsTextParent() ) {
- fprintf( cfile, "\n" );
- }
- }
- else {
- fprintf( cfile, "/>" );
- if ( !IsTextParent() ) {
- fprintf( cfile, "\n" );
- }
- }*/
}