removed the char allocator. Started cleaning up the document code.
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index a2d0878..f868c91 100644
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -23,14 +23,15 @@
 static const int NUM_ENTITIES = 5;

 static const Entity entities[NUM_ENTITIES] = 

 {

-	{ "quot", 4,	'\"' },

+	{ "quot", 4,	DOUBLE_QUOTE },

 	{ "amp", 3,		'&'  },

-	{ "apos", 4,	'\'' },

+	{ "apos", 4,	SINGLE_QUOTE },

 	{ "lt",	2, 		'<'	 },

 	{ "gt",	2,		'>'	 }

 };

 

 

+#if 0

 // --------- CharBuffer ----------- //

 /*static*/ CharBuffer* CharBuffer::Construct( const char* in )

 {

@@ -47,6 +48,7 @@
 {

 	free( cb );

 }

+#endif

 

 

 const char* StrPair::GetStr()

@@ -115,7 +117,8 @@
 

 

 // --------- XMLBase ----------- //

-char* XMLBase::ParseText( char* p, StrPair* pair, const char* endTag )

+// fixme: should take in the entity/newline flags as param

+char* XMLBase::ParseText( char* p, StrPair* pair, const char* endTag, int strFlags )

 {

 	TIXMLASSERT( endTag && *endTag );

 

@@ -126,7 +129,7 @@
 	// Inner loop of text parsing.

 	while ( *p ) {

 		if ( *p == endChar && strncmp( p, endTag, length ) == 0 ) {

-			pair->Set( start, p, StrPair::NEEDS_ENTITY_PROCESSING | StrPair::NEEDS_NEWLINE_NORMALIZATION );

+			pair->Set( start, p, strFlags );

 			return p + length;

 		}

 		++p;

@@ -233,12 +236,18 @@
 

 XMLNode::~XMLNode()

 {

-	//printf( "~XMLNode %x\n", this );

+	ClearChildren();

+}

+

+

+void XMLNode::ClearChildren()

+{

 	while( firstChild ) {

 		XMLNode* node = firstChild;

 		Unlink( node );

 		delete node;

 	}

+	firstChild = lastChild = 0;

 }

 

 

@@ -316,7 +325,7 @@
 // --------- XMLText ---------- //

 char* XMLText::ParseDeep( char* p )

 {

-	p = ParseText( p, &value, "<" );

+	p = ParseText( p, &value, "<", StrPair::TEXT_ELEMENT );

 	// consumes the end tag.

 	if ( p && *p ) {

 		return p-1;

@@ -356,19 +365,19 @@
 char* XMLComment::ParseDeep( char* p )

 {

 	// Comment parses as text.

-	return ParseText( p, &value, "-->" );

+	return ParseText( p, &value, "-->", StrPair::COMMENT );

 }

 

 

 // --------- XMLAttribute ---------- //

 char* XMLAttribute::ParseDeep( char* p )

 {

-	p = ParseText( p, &name, "=" );

+	p = ParseText( p, &name, "=", StrPair::ATTRIBUTE_NAME );

 	if ( !p || !*p ) return 0;

 

 	char endTag[2] = { *p, 0 };

 	++p;

-	p = ParseText( p, &value, endTag );

+	p = ParseText( p, &value, endTag, StrPair::ATTRIBUTE_VALUE );

 	if ( value.Empty() ) return 0;

 	return p;

 }

@@ -513,24 +522,45 @@
 

 // --------- XMLDocument ----------- //

 XMLDocument::XMLDocument() :

-	XMLNode( this ),

+	XMLNode( 0 ),

 	charBuffer( 0 )

 {

+	document = this;	// avoid warning about 'this' in initializer list

 }

 

 

 XMLDocument::~XMLDocument()

 {

+	delete [] charBuffer;

 }

 

 

+void XMLDocument::InitDocument()

+{

+	errorID = NO_ERROR;

+	errorStr1 = 0;

+	errorStr2 = 0;

+

+	delete [] charBuffer;

+	charBuffer = 0;

+

+}

+

 

 bool XMLDocument::Parse( const char* p )

 {

-	charBuffer = CharBuffer::Construct( p );

+	ClearChildren();

+	InitDocument();

+

+	if ( !p || !*p ) {

+		return true;	// correctly parse an empty string?

+	}

+	size_t len = strlen( p );

+	charBuffer = new char[ len+1 ];

+	memcpy( charBuffer, p, len+1 );

 	XMLNode* node = 0;

 	

-	char* q = ParseDeep( charBuffer->mem );

+	char* q = ParseDeep( charBuffer );

 	return true;

 }

 

@@ -548,7 +578,10 @@
 

 void XMLDocument::SetError( int error, const char* str1, const char* str2 )

 {

-	printf( "ERROR: id=%d '%s' '%s'\n", error, str1, str2 );

+	errorID = error;

+	printf( "ERROR: id=%d '%s' '%s'\n", error, str1, str2 );	// fixme: remove

+	errorStr1 = str1;

+	errorStr2 = str2;

 }

 

 

@@ -682,8 +715,9 @@
 void XMLStreamer::PushAttribute( const char* name, const char* value )

 {

 	TIXMLASSERT( elementJustOpened );

-	// fixme: supports entities?

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

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

+	PrintString( value );

+	fprintf( fp, "\"" );

 }