26 #ifndef TINYXML_INCLUDED
27 #define TINYXML_INCLUDED
30 #pragma warning( push )
31 #pragma warning( disable : 4530 )
32 #pragma warning( disable : 4786 )
42 #if defined( _DEBUG ) && !defined( DEBUG )
49 #define TIXML_STRING std::string
50 #define TIXML_ISTREAM std::istream
51 #define TIXML_OSTREAM std::ostream
54 #define TIXML_STRING TiXmlString
55 #define TIXML_OSTREAM TiXmlOutStream
63 #define TIXML_SAFE // TinyXml isn't fully buffer overrun protected, safe code. This is work in progress.
65 #if defined(_MSC_VER) && (_MSC_VER >= 1400 )
67 #define TIXML_SNPRINTF _snprintf_s
68 #define TIXML_SNSCANF _snscanf_s
69 #elif defined(_MSC_VER) && (_MSC_VER >= 1200 )
72 #define TIXML_SNPRINTF _snprintf
73 #define TIXML_SNSCANF _snscanf
74 #elif defined(__GNUC__) && (__GNUC__ >= 3 )
77 #define TIXML_SNPRINTF snprintf
78 #define TIXML_SNSCANF snscanf
82 namespace CEGUITinyXML
91 class TiXmlDeclaration;
92 class TiXmlParsingData;
94 const int TIXML_MAJOR_VERSION = 2;
95 const int TIXML_MINOR_VERSION = 4;
96 const int TIXML_PATCH_VERSION = 3;
104 void Clear() { row = col = -1; }
123 TIXML_ENCODING_UNKNOWN,
125 TIXML_ENCODING_LEGACY
128 const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN;
167 virtual void Print( FILE* cfile,
int depth )
const = 0;
198 int Row()
const {
return location.row + 1; }
199 int Column()
const {
return location.col + 1; }
201 void SetUserData(
void* user ) {
userData = user; }
202 void* GetUserData() {
return userData; }
206 static const int utf8ByteTable[256];
208 virtual const char* Parse(
const char* p,
209 TiXmlParsingData* data,
210 TiXmlEncoding encoding ) = 0;
216 TIXML_ERROR_OPENING_FILE,
217 TIXML_ERROR_OUT_OF_MEMORY,
218 TIXML_ERROR_PARSING_ELEMENT,
219 TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,
220 TIXML_ERROR_READING_ELEMENT_VALUE,
221 TIXML_ERROR_READING_ATTRIBUTES,
222 TIXML_ERROR_PARSING_EMPTY,
223 TIXML_ERROR_READING_END_TAG,
224 TIXML_ERROR_PARSING_UNKNOWN,
225 TIXML_ERROR_PARSING_COMMENT,
226 TIXML_ERROR_PARSING_DECLARATION,
227 TIXML_ERROR_DOCUMENT_EMPTY,
228 TIXML_ERROR_EMBEDDED_NULL,
229 TIXML_ERROR_PARSING_CDATA,
231 TIXML_ERROR_STRING_COUNT
246 static const char* SkipWhiteSpace(
const char*, TiXmlEncoding encoding );
247 inline static bool IsWhiteSpace(
char c )
249 return ( isspace( (
unsigned char) c ) || c ==
'\n' || c ==
'\r' );
251 inline static bool IsWhiteSpace(
int c )
254 return IsWhiteSpace( (
char) c );
258 virtual void StreamOut (TIXML_OSTREAM *)
const = 0;
261 static bool StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag );
262 static bool StreamTo( TIXML_ISTREAM * in,
int character, TIXML_STRING * tag );
269 static const char* ReadName(
const char* p, TIXML_STRING* name, TiXmlEncoding encoding );
274 static const char* ReadText(
const char* in,
276 bool ignoreWhiteSpace,
279 TiXmlEncoding encoding );
282 static const char* GetEntity(
const char* in,
char* value,
int* length, TiXmlEncoding encoding );
286 inline static const char* GetChar(
const char* p,
char* _value,
int* length, TiXmlEncoding encoding )
289 if ( encoding == TIXML_ENCODING_UTF8 )
291 *length = utf8ByteTable[ *((
unsigned char*)p) ];
292 assert( *length >= 0 && *length < 5 );
302 return GetEntity( p, _value, length, encoding );
310 for(
int i=0; p[i] && i<*length; ++i ) {
313 return p + (*length);
324 static void PutString(
const TIXML_STRING& str, TIXML_OSTREAM* out );
326 static void PutString(
const TIXML_STRING& str, TIXML_STRING* out );
331 static bool StringEqual(
const char* p,
334 TiXmlEncoding encoding );
336 static const char* errorString[ TIXML_ERROR_STRING_COUNT ];
338 TiXmlCursor location;
345 static int IsAlpha(
unsigned char anyByte, TiXmlEncoding encoding );
346 static int IsAlphaNum(
unsigned char anyByte, TiXmlEncoding encoding );
347 inline static int ToLower(
int v, TiXmlEncoding encoding )
349 if ( encoding == TIXML_ENCODING_UTF8 )
351 if ( v < 128 )
return tolower( v );
359 static void ConvertUTF32ToUTF8(
unsigned long input,
char* output,
int* length );
362 TiXmlBase(
const TiXmlBase& );
363 void operator=(
const TiXmlBase& base );
368 unsigned int strLength;
374 MAX_ENTITY_LENGTH = 6
377 static Entity entity[ NUM_ENTITY ];
378 static bool condenseWhiteSpace;
399 friend std::istream& operator >> (std::istream& in,
TiXmlNode& base);
417 friend std::ostream& operator<< (std::ostream& out,
const TiXmlNode& base);
420 friend std::string& operator<< (std::string& out,
const TiXmlNode& base );
424 friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out,
const TiXmlNode& base);
455 const char *
Value()
const {
return value.c_str (); }
462 const std::string& ValueStr()
const {
return value; }
474 void SetValue(
const char * _value) { value = _value;}
478 void SetValue(
const std::string& _value ) { value = _value; }
490 const TiXmlNode*
FirstChild(
const char * value )
const;
493 const TiXmlNode* LastChild()
const {
return lastChild; }
495 const TiXmlNode* LastChild(
const char * value )
const;
496 TiXmlNode* LastChild(
const char * value );
501 const TiXmlNode* LastChild(
const std::string& _value )
const {
return LastChild (_value.c_str ()); }
502 TiXmlNode* LastChild(
const std::string& _value ) {
return LastChild (_value.c_str ()); }
525 const TiXmlNode*
IterateChildren(
const char * value,
const TiXmlNode* previous )
const;
529 const TiXmlNode*
IterateChildren(
const std::string& _value,
const TiXmlNode* previous )
const {
return IterateChildren (_value.c_str (), previous); }
558 TiXmlNode*
InsertAfterChild( TiXmlNode* afterThis,
const TiXmlNode& addThis );
563 TiXmlNode*
ReplaceChild( TiXmlNode* replaceThis,
const TiXmlNode& withThis );
588 const TiXmlNode*
NextSibling(
const char * )
const;
627 int Type()
const {
return type; }
666 virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0;
670 TiXmlNode* Identify(
const char* start, TiXmlEncoding encoding );
710 TiXmlAttribute(
const std::string& _name,
const std::string& _value )
728 const char*
Name()
const {
return name.c_str (); }
729 const char*
Value()
const {
return value.c_str (); }
734 const TIXML_STRING& NameTStr()
const {
return name; }
749 void SetName(
const char* _name ) { name = _name; }
750 void SetValue(
const char* _value ) { value = _value; }
757 void SetName(
const std::string& _name ) { name = _name; }
759 void SetValue(
const std::string& _value ) { value = _value; }
769 bool operator==(
const TiXmlAttribute& rhs )
const {
return rhs.name == name; }
770 bool operator<(
const TiXmlAttribute& rhs )
const {
return name < rhs.name; }
771 bool operator>(
const TiXmlAttribute& rhs )
const {
return name > rhs.name; }
776 virtual const char* Parse(
const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
779 virtual void Print( FILE* cfile,
int depth )
const;
781 virtual void StreamOut( TIXML_OSTREAM * out )
const;
784 void SetDocument( TiXmlDocument* doc ) { document = doc; }
790 TiXmlDocument* document;
819 const TiXmlAttribute* First()
const {
return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
820 TiXmlAttribute* First() {
return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
821 const TiXmlAttribute* Last()
const {
return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
822 TiXmlAttribute* Last() {
return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
861 const char*
Attribute(
const char* name )
const;
869 const char*
Attribute(
const char* name,
int* i )
const;
877 const char*
Attribute(
const char* name,
double* d )
const;
893 if ( result == TIXML_SUCCESS ) {
902 void SetAttribute(
const char* name,
const char * _value );
905 const char*
Attribute(
const std::string& name )
const {
return Attribute( name.c_str() ); }
906 const char*
Attribute(
const std::string& name,
int* i )
const {
return Attribute( name.c_str(), i ); }
907 const char*
Attribute(
const std::string& name,
double* d )
const {
return Attribute( name.c_str(), d ); }
912 void SetAttribute(
const std::string& name,
const std::string& _value );
914 void SetAttribute(
const std::string& name,
int _value );
974 virtual TiXmlNode*
Clone()
const;
976 virtual void Print( FILE* cfile,
int depth )
const;
981 virtual const char* Parse(
const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
993 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
995 virtual void StreamOut( TIXML_OSTREAM * out )
const;
1001 const char* ReadValue(
const char* in,
TiXmlParsingData* prevData, TiXmlEncoding encoding );
1022 virtual TiXmlNode*
Clone()
const;
1024 virtual void Print( FILE* cfile,
int depth )
const;
1029 virtual const char* Parse(
const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
1038 #ifdef TIXML_USE_STL
1039 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
1041 virtual void StreamOut( TIXML_OSTREAM * out )
const;
1068 #ifdef TIXML_USE_STL
1070 TiXmlText(
const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT)
1077 TiXmlText(
const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo(
this ); }
1078 void operator=(
const TiXmlText& base ) { base.CopyTo(
this ); }
1081 virtual void Print( FILE* cfile,
int depth )
const;
1088 virtual const char* Parse(
const char* p,
TiXmlParsingData* data, TiXmlEncoding encoding );
1098 virtual void StreamOut ( TIXML_OSTREAM * out )
const;
1101 #ifdef TIXML_USE_STL
1102 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
1129 #ifdef TIXML_USE_STL
1132 const std::string& _encoding,
1133 const std::string& _standalone );
1138 const char* _encoding,
1139 const char* _standalone );
1147 const char *
Version()
const {
return version.c_str (); }
1149 const char *
Encoding()
const {
return encoding.c_str (); }
1156 virtual void Print( FILE* cfile,
int depth )
const;
1158 virtual const char* Parse(
const char* p,
TiXmlParsingData* data, TiXmlEncoding encoding );
1166 #ifdef TIXML_USE_STL
1167 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
1169 virtual void StreamOut ( TIXML_OSTREAM * out)
const;
1173 TIXML_STRING version;
1174 TIXML_STRING encoding;
1175 TIXML_STRING standalone;
1193 void operator=(
const TiXmlUnknown& copy ) { copy.CopyTo(
this ); }
1198 virtual void Print( FILE* cfile,
int depth )
const;
1200 virtual const char* Parse(
const char* p,
TiXmlParsingData* data, TiXmlEncoding encoding );
1208 #ifdef TIXML_USE_STL
1209 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
1211 virtual void StreamOut ( TIXML_OSTREAM * out )
const;
1230 #ifdef TIXML_USE_STL
1244 bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
1248 bool LoadFile(
const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
1250 bool SaveFile(
const char * filename )
const;
1256 bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
1260 #ifdef TIXML_USE_STL
1261 bool LoadFile(
const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )
1264 return ( f.buffer && LoadFile( f.buffer, encoding ));
1266 bool SaveFile(
const std::string& filename )
const
1269 return ( f.buffer && SaveFile( f.buffer ));
1277 virtual const char*
Parse(
const char* p,
TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
1294 const char *
ErrorDesc()
const {
return errorDesc.c_str (); }
1337 int TabSize()
const {
return tabsize; }
1345 errorLocation.row = errorLocation.col = 0;
1353 virtual void Print( FILE* cfile,
int depth = 0 )
const;
1355 void SetError(
int err,
const char* errorLocation,
TiXmlParsingData* prevData, TiXmlEncoding encoding );
1361 virtual void StreamOut ( TIXML_OSTREAM * out)
const;
1364 #ifdef TIXML_USE_STL
1365 virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
1373 TIXML_STRING errorDesc;
1376 bool useMicrosoftBOM;
1497 #ifdef TIXML_USE_STL
1501 TiXmlHandle Child(
const std::string& _value,
int index )
const {
return Child( _value.c_str(), index ); }
1520 #pragma warning( pop )