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()
|
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" );
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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 ) {
|
||||||
|
|
Loading…
Reference in New Issue