print to memory support
This commit is contained in:
82
tinyxml2.h
82
tinyxml2.h
@@ -13,13 +13,16 @@
|
||||
X hide copy constructor
|
||||
X hide = operator
|
||||
X UTF8 support: isAlpha, etc.
|
||||
- string buffer for sets. (Grr.)
|
||||
X string buffer for sets. (Grr.)
|
||||
- MS BOM
|
||||
- print to memory buffer
|
||||
- tests from xml1
|
||||
- xml1 tests especially UTF-8
|
||||
- perf test: xml1
|
||||
- perf test: xenowar
|
||||
- test: load(char*)
|
||||
- test: load(FILE*)
|
||||
|
||||
*/
|
||||
|
||||
#include <limits.h>
|
||||
@@ -64,7 +67,7 @@
|
||||
#define TIXML_SNPRINTF _snprintf
|
||||
#define TIXML_SSCANF sscanf
|
||||
#elif defined(__GNUC__) && (__GNUC__ >= 3 )
|
||||
// GCC version 3 and higher.s
|
||||
// GCC version 3 and higher
|
||||
//#warning( "Using sn* functions." )
|
||||
#define TIXML_SNPRINTF snprintf
|
||||
#define TIXML_SSCANF sscanf
|
||||
@@ -87,6 +90,12 @@ class XMLUnknown;
|
||||
|
||||
class XMLStreamer;
|
||||
|
||||
/*
|
||||
A class that wraps strings. Normally stores the start and end
|
||||
pointers into the XML file itself, and will apply normalization
|
||||
and entity transalion if actually read. Can also store (and memory
|
||||
manage) a traditional char[]
|
||||
*/
|
||||
class StrPair
|
||||
{
|
||||
public:
|
||||
@@ -132,6 +141,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
A dynamic array of Plain Old Data. Doesn't support constructors, etc.
|
||||
Has a small initial memory pool, so that low or no usage will not
|
||||
cause a call to new/delete
|
||||
*/
|
||||
template <class T, int INIT>
|
||||
class DynArray
|
||||
{
|
||||
@@ -170,12 +184,13 @@ public:
|
||||
size -= count;
|
||||
}
|
||||
|
||||
bool Empty() const { return size == 0; }
|
||||
T& operator[](int i) { TIXMLASSERT( i>= 0 && i < size ); return mem[i]; }
|
||||
const T& operator[](int i) const { TIXMLASSERT( i>= 0 && i < size ); return mem[i]; }
|
||||
int Size() const { return size; }
|
||||
const T* Mem() const { return mem; }
|
||||
T* Mem() { return mem; }
|
||||
bool Empty() const { return size == 0; }
|
||||
T& operator[](int i) { TIXMLASSERT( i>= 0 && i < size ); return mem[i]; }
|
||||
const T& operator[](int i) const { TIXMLASSERT( i>= 0 && i < size ); return mem[i]; }
|
||||
int Size() const { return size; }
|
||||
int Capacity() const { return allocated; }
|
||||
const T* Mem() const { return mem; }
|
||||
T* Mem() { return mem; }
|
||||
|
||||
|
||||
private:
|
||||
@@ -197,6 +212,10 @@ private:
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Parent virtual class a a pool for fast allocation
|
||||
and deallocation of objects.
|
||||
*/
|
||||
class MemPool
|
||||
{
|
||||
public:
|
||||
@@ -209,6 +228,9 @@ public:
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Template child class to create pools of the correct type.
|
||||
*/
|
||||
template< int SIZE >
|
||||
class MemPoolT : public MemPool
|
||||
{
|
||||
@@ -321,13 +343,16 @@ public:
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Utility functionality.
|
||||
*/
|
||||
class XMLUtil
|
||||
{
|
||||
public:
|
||||
// Anything in the high order range of UTF-8 is assumed to not be whitespace. This isn't
|
||||
// correct, but simple, and usually works.
|
||||
static const char* SkipWhiteSpace( const char* p ) { while( IsUTF8Continuation(*p) || isspace( *p ) ) { ++p; } return p; }
|
||||
static char* SkipWhiteSpace( char* p ) { while( IsUTF8Continuation(*p) || isspace( *p ) ) { ++p; } return p; }
|
||||
static const char* SkipWhiteSpace( const char* p ) { while( !IsUTF8Continuation(*p) && isspace( *p ) ) { ++p; } return p; }
|
||||
static char* SkipWhiteSpace( char* p ) { while( !IsUTF8Continuation(*p) && isspace( *p ) ) { ++p; } return p; }
|
||||
|
||||
inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) {
|
||||
int n = 0;
|
||||
@@ -418,11 +443,17 @@ public:
|
||||
*/
|
||||
XMLNode* InsertAfterChild( XMLNode* afterThis, XMLNode* addThis );
|
||||
|
||||
/**
|
||||
Tests: All (used by destructor)
|
||||
*/
|
||||
void ClearChildren();
|
||||
|
||||
/**
|
||||
Tests: Progammatic DOM
|
||||
*/
|
||||
void DeleteChild( XMLNode* node );
|
||||
|
||||
virtual bool Accept( XMLVisitor* visitor ) const = 0;
|
||||
//virtual void Print( XMLStreamer* streamer );
|
||||
|
||||
virtual char* ParseDeep( char* );
|
||||
virtual bool IsClosingElement() const { return false; }
|
||||
@@ -549,6 +580,12 @@ public:
|
||||
const char* Value() const { return value.GetStr(); }
|
||||
const XMLAttribute* Next() const { return next; }
|
||||
|
||||
int IntAttribute( const char* name ) const { int i=0; QueryIntAttribute( &i ); return i; }
|
||||
unsigned UnsignedAttribute( const char* name ) const{ unsigned i=0; QueryUnsignedAttribute( &i ); return i; }
|
||||
bool BoolAttribute( const char* name ) const { bool b=false; QueryBoolAttribute( &b ); return b; }
|
||||
double DoubleAttribute( const char* name ) const { double d=0; QueryDoubleAttribute( &d ); return d; }
|
||||
float FloatAttribute( const char* name ) const { float f=0; QueryFloatAttribute( &f ); return f; }
|
||||
|
||||
int QueryIntAttribute( int* value ) const;
|
||||
int QueryUnsignedAttribute( unsigned int* value ) const;
|
||||
int QueryBoolAttribute( bool* value ) const;
|
||||
@@ -612,7 +649,10 @@ public:
|
||||
void SetAttribute( const char* name, bool value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); }
|
||||
void SetAttribute( const char* name, double value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); }
|
||||
|
||||
void RemoveAttribute( const char* name );
|
||||
/**
|
||||
Tests: Programmatic DOM
|
||||
*/
|
||||
void DeleteAttribute( const char* name );
|
||||
|
||||
const XMLAttribute* FirstAttribute() const { return rootAttribute; }
|
||||
const XMLAttribute* FindAttribute( const char* name ) const;
|
||||
@@ -657,18 +697,23 @@ public:
|
||||
virtual bool Accept( XMLVisitor* visitor ) const;
|
||||
|
||||
/**
|
||||
Testing: Programmatic DOM
|
||||
Tests: Programmatic DOM
|
||||
*/
|
||||
XMLElement* NewElement( const char* name );
|
||||
/**
|
||||
Testing: Programmatic DOM
|
||||
Tests: Programmatic DOM
|
||||
*/
|
||||
XMLComment* NewComment( const char* comment );
|
||||
/**
|
||||
Testing: Programmatic DOM
|
||||
Tests: Programmatic DOM
|
||||
*/
|
||||
XMLText* NewText( const char* text );
|
||||
|
||||
/**
|
||||
Tests: Programmatic DOM
|
||||
*/
|
||||
void DeleteNode( XMLNode* node ) { node->parent->DeleteChild( node ); }
|
||||
|
||||
enum {
|
||||
NO_ERROR = 0,
|
||||
ERROR_ELEMENT_MISMATCH,
|
||||
@@ -705,7 +750,7 @@ private:
|
||||
class XMLStreamer : public XMLVisitor
|
||||
{
|
||||
public:
|
||||
XMLStreamer( FILE* file );
|
||||
XMLStreamer( FILE* file=0 );
|
||||
~XMLStreamer() {}
|
||||
|
||||
void OpenElement( const char* name );
|
||||
@@ -724,11 +769,13 @@ public:
|
||||
virtual bool Visit( const XMLText& text );
|
||||
virtual bool Visit( const XMLComment& comment );
|
||||
|
||||
const char* CStr() const { return buffer.Mem(); }
|
||||
|
||||
private:
|
||||
void SealElement();
|
||||
void PrintSpace( int depth );
|
||||
void PrintString( const char* ); // prints out, after detecting entities.
|
||||
void Print( const char* format, ... );
|
||||
|
||||
FILE* fp;
|
||||
int depth;
|
||||
@@ -741,6 +788,7 @@ private:
|
||||
bool entityFlag[ENTITY_RANGE];
|
||||
|
||||
DynArray< const char*, 10 > stack;
|
||||
DynArray< char, 20 > buffer, accumulator;
|
||||
};
|
||||
|
||||
|
||||
@@ -748,4 +796,4 @@ private:
|
||||
|
||||
|
||||
|
||||
#endif // TINYXML2_INCLUDED
|
||||
#endif // TINYXML2_INCLUDED
|
||||
|
||||
Reference in New Issue
Block a user