added missing node types
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index c860c07..ee0f88c 100644
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -210,24 +210,45 @@
static const int cdataHeaderLen = 9;
static const int elementHeaderLen = 1;
- if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) {
+ TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLUnknown ) ); // use same memory pool
+ TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLDeclaration ) ); // use same memory pool
+
+ if ( XMLUtil::StringEqual( p, xmlHeader, xmlHeaderLen ) ) {
+ returnNode = new (commentPool.Alloc()) XMLDeclaration( this );
+ returnNode->memPool = &commentPool;
+ p += xmlHeaderLen;
+ }
+ else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) {
returnNode = new (commentPool.Alloc()) XMLComment( this );
returnNode->memPool = &commentPool;
p += commentHeaderLen;
}
+ else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) {
+ XMLText* text = new (textPool.Alloc()) XMLText( this );
+ returnNode = text;
+ returnNode->memPool = &textPool;
+ p += cdataHeaderLen;
+ text->SetCData( true );
+ }
+ else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) {
+ returnNode = new (commentPool.Alloc()) XMLUnknown( this );
+ returnNode->memPool = &commentPool;
+ p += dtdHeaderLen;
+ }
else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) {
returnNode = new (elementPool.Alloc()) XMLElement( this );
returnNode->memPool = &elementPool;
p += elementHeaderLen;
}
- // fixme: better text detection
else if ( (*p != '<') && XMLUtil::IsAlphaNum( *p ) ) {
returnNode = new (textPool.Alloc()) XMLText( this );
returnNode->memPool = &textPool;
p = start; // Back it up, all the text counts.
}
else {
- TIXMLASSERT( 0 );
+ this->SetError( ERROR_IDENTIFYING_TAG, p, 0 );
+ p = 0;
+ returnNode = 0;
}
*node = returnNode;
@@ -393,24 +414,21 @@
// --------- XMLText ---------- //
char* XMLText::ParseDeep( char* p )
{
- p = value.ParseText( p, "<", StrPair::TEXT_ELEMENT );
- // consumes the end tag.
- if ( p && *p ) {
- return p-1;
+ if ( this->CData() ) {
+ p = value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION );
+ return p;
+ }
+ else {
+ p = value.ParseText( p, "<", StrPair::TEXT_ELEMENT );
+ // consumes the end tag.
+ if ( p && *p ) {
+ return p-1;
+ }
}
return 0;
}
-/*
-void XMLText::Print( XMLStreamer* streamer )
-{
- const char* v = value.GetStr();
- streamer->PushText( v );
-}
-*/
-
-
bool XMLText::Accept( XMLVisitor* visitor ) const
{
return visitor->Visit( *this );
@@ -430,16 +448,6 @@
}
-/*
-void XMLComment::Print( XMLStreamer* streamer )
-{
-// XMLNode::Print( fp, depth );
-// fprintf( fp, "<!--%s-->\n", value.GetStr() );
- streamer->PushComment( value.GetStr() );
-}
-*/
-
-
char* XMLComment::ParseDeep( char* p )
{
// Comment parses as text.
@@ -453,6 +461,55 @@
}
+// --------- XMLDeclaration ---------- //
+
+XMLDeclaration::XMLDeclaration( XMLDocument* doc ) : XMLNode( doc )
+{
+}
+
+
+XMLDeclaration::~XMLDeclaration()
+{
+ //printf( "~XMLDeclaration\n" );
+}
+
+
+char* XMLDeclaration::ParseDeep( char* p )
+{
+ // Declaration parses as text.
+ return value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION );
+}
+
+
+bool XMLDeclaration::Accept( XMLVisitor* visitor ) const
+{
+ return visitor->Visit( *this );
+}
+
+// --------- XMLUnknown ---------- //
+
+XMLUnknown::XMLUnknown( XMLDocument* doc ) : XMLNode( doc )
+{
+}
+
+
+XMLUnknown::~XMLUnknown()
+{
+}
+
+
+char* XMLUnknown::ParseDeep( char* p )
+{
+ // Unknown parses as text.
+ return value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION );
+}
+
+
+bool XMLUnknown::Accept( XMLVisitor* visitor ) const
+{
+ return visitor->Visit( *this );
+}
+
// --------- XMLAttribute ---------- //
char* XMLAttribute::ParseDeep( char* p )
{
@@ -862,14 +919,18 @@
}
-void XMLStreamer::PushText( const char* text )
+void XMLStreamer::PushText( const char* text, bool cdata )
{
textDepth = depth-1;
if ( elementJustOpened ) {
SealElement();
}
+ if ( cdata )
+ fprintf( fp, "<![CDATA[" );
PrintString( text );
+ if ( cdata )
+ fprintf( fp, "]]>" );
}