فهرست منبع

work on the streamer class. A little optimization to the string class. Formatting work.

Lee Thomason 14 سال پیش
والد
کامیت
24767b05ab
3فایلهای تغییر یافته به همراه24 افزوده شده و 7 حذف شده
  1. 20 5
      tinyxml2.cpp
  2. 3 2
      tinyxml2.h
  3. 1 0
      xmltest.cpp

+ 20 - 5
tinyxml2.cpp

@@ -548,14 +548,22 @@ void XMLDocument::SetError( int error, const char* str1, const char* str2 )
 
 StringStack::StringStack()
 {
-	mem = new char[INIT];
-	*mem = 0;
+	*pool = 0;
+	mem = pool;
 	inUse = 1;	// always has a null
 	allocated = INIT;
 	nPositive = 0;
 }
 
 
+StringStack::~StringStack()
+{
+	if ( mem != pool ) {
+		delete [] mem;
+	}
+}
+
+
 void StringStack::Push( const char* str ) {
 	int needed = strlen( str ) + 1;
 	if ( needed > 1 )
@@ -567,7 +575,9 @@ void StringStack::Push( const char* str ) {
 
 		char* newMem = new char[more];
 		memcpy( newMem, mem, inUse );
-		delete [] mem;
+		if ( mem != pool ) {
+			delete [] mem;
+		}
 		mem = newMem;
 	}
 	strcpy( mem+inUse, str );
@@ -608,10 +618,12 @@ void XMLStreamer::OpenElement( const char* name, bool textParent )
 	if ( elementJustOpened ) {
 		SealElement();
 	}
+	if ( text.NumPositive() == 0 ) {
+		PrintSpace( depth );
+	}
 	stack.Push( name );
 	text.Push( textParent ? "T" : "" );
 
-	PrintSpace( depth );
 	fprintf( fp, "<%s", name );
 	elementJustOpened = true;
 	++depth;
@@ -629,6 +641,7 @@ void XMLStreamer::CloseElement()
 {
 	--depth;
 	const char* name = stack.Pop();
+	int wasPositive = text.NumPositive();
 	text.Pop();
 
 	if ( elementJustOpened ) {
@@ -638,7 +651,9 @@ void XMLStreamer::CloseElement()
 		}
 	}
 	else {
-		PrintSpace( depth );
+		if ( wasPositive == 0 ) {
+			PrintSpace( depth );
+		}
 		fprintf( fp, "</%s>", name );
 		if ( text.NumPositive() == 0 ) {
 			fprintf( fp, "\n" );

+ 3 - 2
tinyxml2.h

@@ -256,11 +256,12 @@ private:
 };
 
 
+// FIXME: break out into string pointer stack
 class StringStack
 {
 public:
 	StringStack();
-	~StringStack() { delete[] mem; }
+	~StringStack();
 
 	void Push( const char* str );
 	const char* Pop();
@@ -272,12 +273,12 @@ private:
 		INIT=10		// fixme, super small for testing
 	};
 	char* mem;
+	char pool[INIT];
 	int inUse;			// includes null
 	int allocated;		// bytes allocated
 	int nPositive;		// number of strings with len > 0
 };
 
-
 class XMLStreamer
 {
 public:

+ 1 - 0
xmltest.cpp

@@ -40,6 +40,7 @@ int main( int argc, const char* argv )
 										//"<element>Text inside element.</element>",
 										//"<element><b></b></element>",
 										"<element>Text inside and <b>bolded</b> in the element.</element>",
+										"<outer><element>Text inside and <b>bolded</b> in the element.</element></outer>",
 										0
 		};
 		for( int i=0; test[i]; ++i ) {