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

This commit is contained in:
Lee Thomason 2012-01-25 17:16:23 -08:00
parent 5cae897775
commit 24767b05ab
3 changed files with 24 additions and 7 deletions

View File

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

View File

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

View File

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