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()
{
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" );

View File

@ -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:

View File

@ -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 ) {