mirror of https://github.com/AxioDL/tinyxml2.git
work on the streamer class. A little optimization to the string class. Formatting work.
This commit is contained in:
parent
5cae897775
commit
24767b05ab
25
tinyxml2.cpp
25
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" );
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 ) {
|
||||
|
|
Loading…
Reference in New Issue