work on the streamer class. A little optimization to the string class. Formatting work.
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 69a6289..3bf058e 100644
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -548,14 +548,22 @@
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 @@
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 @@
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 @@
{
--depth;
const char* name = stack.Pop();
+ int wasPositive = text.NumPositive();
text.Pop();
if ( elementJustOpened ) {
@@ -638,7 +651,9 @@
}
}
else {
- PrintSpace( depth );
+ if ( wasPositive == 0 ) {
+ PrintSpace( depth );
+ }
fprintf( fp, "</%s>", name );
if ( text.NumPositive() == 0 ) {
fprintf( fp, "\n" );
diff --git a/tinyxml2.h b/tinyxml2.h
index ddf285f..7356dc5 100644
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -256,11 +256,12 @@
};
+// 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 @@
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:
diff --git a/xmltest.cpp b/xmltest.cpp
index 6376d91..7b12475 100644
--- a/xmltest.cpp
+++ b/xmltest.cpp
@@ -40,6 +40,7 @@
//"<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 ) {