25 #ifndef _MADARA_NO_XML_
33 #if defined( DEBUG_PARSER )
34 # if defined( DEBUG ) && defined( _MSC_VER )
36 # define TIXML_LOG OutputDebugString
38 # define TIXML_LOG printf
50 {
""", 6,
'\"' },
71 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
72 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
73 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
74 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
75 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
76 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
77 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
78 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
79 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
80 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
81 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
82 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
83 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
84 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
85 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
86 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
92 const unsigned long BYTE_MASK = 0xBF;
93 const unsigned long BYTE_MARK = 0x80;
94 const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
98 else if ( input < 0x800 )
100 else if ( input < 0x10000 )
102 else if ( input < 0x200000 )
105 { *length = 0;
return; }
114 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
118 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
122 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
126 *output = (char)(input | FIRST_BYTE_MARK[*length]);
141 return isalpha( anyByte );
162 return isalnum( anyByte );
213 const char* p =
stamp;
219 const unsigned char* pU = (
const unsigned char*)p;
268 if ( *(p+1) && *(p+2) )
274 else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU )
276 else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU )
328 const unsigned char* pU = (
const unsigned char*)p;
373 if ( !in->good() )
return false;
380 *tag += (char) in->get();
390 if ( c == character )
421 && (
IsAlpha( (
unsigned char) *p, encoding ) || *p ==
'_' ) )
423 const char* start = p;
425 && (
IsAlphaNum( (
unsigned char ) *p, encoding )
435 name->assign( start, p-start );
449 if ( *(p+1) && *(p+1) ==
'#' && *(p+2) )
451 unsigned long ucs = 0;
458 if ( !*(p+3) )
return 0;
461 q = strchr( q,
';' );
463 if ( !q || !*q )
return 0;
470 if ( *q >=
'0' && *q <=
'9' )
471 ucs += mult * (*q -
'0');
472 else if ( *q >=
'a' && *q <=
'f' )
473 ucs += mult * (*q -
'a' + 10);
474 else if ( *q >=
'A' && *q <=
'F' )
475 ucs += mult * (*q -
'A' + 10 );
485 if ( !*(p+2) )
return 0;
488 q = strchr( q,
';' );
490 if ( !q || !*q )
return 0;
497 if ( *q >=
'0' && *q <=
'9' )
498 ucs += mult * (*q -
'0');
515 return p + delta + 1;
521 if ( strncmp(
entity[i].str, p,
entity[i].strLength ) == 0 )
523 assert( strlen(
entity[i].str ) ==
entity[i].strLength );
526 return ( p +
entity[i].strLength );
555 while ( *q && *tag &&
ToLower( *q, encoding ) ==
ToLower( *tag, encoding ) )
566 while ( *q && *tag && *q == *tag )
582 bool caseInsensitive,
591 && !
StringEqual( p, endTag, caseInsensitive, encoding )
595 char cArr[4] = { 0, 0, 0, 0 };
596 p =
GetChar( p, cArr, &len, encoding );
597 text->append( cArr, len );
602 bool whitespace =
false;
607 && !
StringEqual( p, endTag, caseInsensitive, encoding ) )
609 if ( *p ==
'\r' || *p ==
'\n' )
629 char cArr[4] = { 0, 0, 0, 0 };
630 p =
GetChar( p, cArr, &len, encoding );
634 text->append( cArr, len );
639 p += strlen( endTag );
662 int tagIndex = (int) tag->length();
663 while ( in->good() && in->peek() !=
'>' )
741 const unsigned char* pU = (
const unsigned char*)p;
763 p = node->
Parse( p, &data, encoding );
814 if ( pError && data )
816 data->
Stamp( pError, encoding );
827 if( !p || !*p || *p !=
'<' )
846 const char* xmlHeader = {
"<?xml" };
847 const char* commentHeader = {
"<!--" };
848 const char* dtdHeader = {
"<!" };
849 const char* cdataHeader = {
"<![CDATA[" };
854 TIXML_LOG(
"XML parsing Declaration\n" );
858 else if (
StringEqual( p, commentHeader,
false, encoding ) )
861 TIXML_LOG(
"XML parsing Comment\n" );
865 else if (
StringEqual( p, cdataHeader,
false, encoding ) )
868 TIXML_LOG(
"XML parsing CDATA\n" );
874 else if (
StringEqual( p, dtdHeader,
false, encoding ) )
877 TIXML_LOG(
"XML parsing Unknown(1)\n" );
881 else if (
IsAlpha( *(p+1), encoding )
885 TIXML_LOG(
"XML parsing Element\n" );
892 TIXML_LOG(
"XML parsing Unknown(2)\n" );
900 returnNode->
parent =
this;
927 if ( tag->length() < 3 )
return;
932 if ( tag->at( tag->length() - 1 ) ==
'>'
933 && tag->at( tag->length() - 2 ) ==
'/' )
938 else if ( tag->at( tag->length() - 1 ) ==
'>' )
950 if ( in->good() && in->peek() !=
'<' )
963 if ( !in->good() )
return;
964 assert( in->peek() ==
'<' );
965 int tagIndex = (int) tag->length();
967 bool closingTag =
false;
968 bool firstCharFound =
false;
991 if ( c ==
'[' && tag->size() >= 9 )
993 size_t len = tag->size();
994 const char* start = tag->c_str() + len - 9;
995 if ( strcmp( start,
"<![CDATA[" ) == 0 ) {
996 assert( !closingTag );
1001 if ( !firstCharFound && c !=
'<' && !
IsWhiteSpace( c ) )
1003 firstCharFound =
true;
1032 const char* tagloc = tag->c_str() + tagIndex;
1060 data->
Stamp( p, encoding );
1073 const char* pErr = p;
1107 else if ( *p ==
'>' )
1126 if (
StringEqual( p, endTag.c_str(),
false, encoding ) )
1128 p += endTag.length();
1130 if ( p && *p && *p ==
'>' ) {
1154 p = attrib->
Parse( p, data, encoding );
1164 #ifdef TIXML_USE_STL
1188 const char* pWithWhiteSpace = p;
1205 p = textNode->
Parse( p, data, encoding );
1211 p = textNode->
Parse( pWithWhiteSpace, data, encoding );
1214 if ( !textNode->
Blank() )
1233 p = node->
Parse( p, data, encoding );
1242 pWithWhiteSpace = p;
1254 #ifdef TIXML_USE_STL
1257 while ( in->good() )
1286 data->
Stamp( p, encoding );
1289 if ( !p || !*p || *p !=
'<' )
1297 while ( p && *p && *p !=
'>' )
1312 #ifdef TIXML_USE_STL
1315 while ( in->good() )
1329 && tag->at( tag->length() - 2 ) ==
'-'
1330 && tag->at( tag->length() - 3 ) ==
'-' )
1349 data->
Stamp( p, encoding );
1352 const char* startTag =
"<!--";
1353 const char* endTag =
"-->";
1355 if ( !
StringEqual( p, startTag,
false, encoding ) )
1360 p += strlen( startTag );
1382 while ( p && *p && !
StringEqual( p, endTag,
false, encoding ) )
1384 value.append( p, 1 );
1388 p += strlen( endTag );
1397 if ( !p || !*p )
return 0;
1401 data->
Stamp( p, encoding );
1405 const char* pErr = p;
1413 if ( !p || !*p || *p !=
'=' )
1428 const char SINGLE_QUOTE =
'\'';
1429 const char DOUBLE_QUOTE =
'\"';
1431 if ( *p == SINGLE_QUOTE )
1437 else if ( *p == DOUBLE_QUOTE )
1451 && *p !=
'/' && *p !=
'>' )
1453 if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) {
1467 #ifdef TIXML_USE_STL
1470 while ( in->good() )
1473 if ( !
cdata && (c ==
'<' ) )
1488 if (
cdata && c ==
'>' && tag->size() >= 3 ) {
1489 size_t len = tag->size();
1490 if ( (*tag)[len-2] ==
']' && (*tag)[len-3] ==
']' ) {
1506 data->
Stamp( p, encoding );
1510 const char*
const startTag =
"<![CDATA[";
1511 const char*
const endTag =
"]]>";
1517 if ( !
StringEqual( p, startTag,
false, encoding ) )
1522 p += strlen( startTag );
1534 p =
ReadText( p, &dummy,
false, endTag,
false, encoding );
1539 bool ignoreWhite =
true;
1541 const char* end =
"<";
1542 p =
ReadText( p, &
value, ignoreWhite, end,
false, encoding );
1549 #ifdef TIXML_USE_STL
1552 while ( in->good() )
1579 if ( !p || !*p || !
StringEqual( p,
"<?xml",
true, _encoding ) )
1586 data->
Stamp( p, _encoding );
1604 if (
StringEqual( p,
"version",
true, _encoding ) )
1607 p = attrib.
Parse( p, data, _encoding );
1610 else if (
StringEqual( p,
"encoding",
true, _encoding ) )
1613 p = attrib.
Parse( p, data, _encoding );
1616 else if (
StringEqual( p,
"standalone",
true, _encoding ) )
1619 p = attrib.
Parse( p, data, _encoding );
1634 for (
unsigned i=0; i<
value.length(); i++ )
1641 #endif // _MADARA_NO_XML_
virtual void StreamIn(std::istream *in, std::string *tag)
static const int utf8ByteTable[256]
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
An attribute is a name-value pair.
virtual void StreamIn(std::istream *in, std::string *tag)
static bool StreamWhiteSpace(std::istream *in, std::string *tag)
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
static int ToLower(int v, TiXmlEncoding encoding)
static int IsAlphaNum(unsigned char anyByte, TiXmlEncoding encoding)
Internal structure for tracking location of items in the XML file.
virtual void StreamIn(std::istream *in, std::string *tag)
virtual void StreamIn(std::istream *in, std::string *tag)
const unsigned char TIXML_UTF_LEAD_2
void ClearError()
If you have handled the error, it can be reset with this call.
const char * Value() const
Return the value of this attribute.
void Clear()
Sets row and column to -1.
const TiXmlCursor & Cursor()
static const char * errorString[TIXML_ERROR_STRING_COUNT]
static void ConvertUTF32ToUTF8(unsigned long input, char *output, int *length)
const std::string & NameTStr() const
static bool condenseWhiteSpace
virtual const TiXmlDeclaration * ToDeclaration() const
Cast to a more defined type. Will return null if not of the requested type.
const char * Encoding() const
Encoding. Will return an empty string if none was found.
TiXmlNode * LinkEndChild(TiXmlNode *addThis)
Add a new node related to this.
const char * Name() const
Return the name of this attribute.
In correct XML the declaration is the first entry in the file.
static bool IsWhiteSpace(char c)
TiXmlAttributeSet attributeSet
Any tag that tinyXml doesn't recognize is saved as an unknown.
const TiXmlEncoding TIXML_DEFAULT_ENCODING
Internal entity struct for holding string elements.
static bool IsWhiteSpaceCondensed()
Return the current white space setting.
static const char * ReadName(const char *p, std::string *name, TiXmlEncoding encoding)
const unsigned char TIXML_UTF_LEAD_1
TiXmlAttribute * Find(const char *_name) const
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
void SetCDATA(bool _cdata)
Turns on or off a CDATA representation of text.
virtual void StreamIn(std::istream *in, std::string *tag)=0
Always the top level node.
TiXmlEncoding
Used by the parsing routines.
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)=0
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
const unsigned char TIXML_UTF_LEAD_0
static Entity entity[NUM_ENTITY]
static const char * SkipWhiteSpace(const char *, TiXmlEncoding encoding)
friend class TiXmlElement
TiXmlNode * Identify(const char *start, TiXmlEncoding encoding)
virtual void StreamIn(std::istream *in, std::string *tag)
virtual const TiXmlElement * ToElement() const
Cast to a more defined type. Will return null if not of the requested type.
const char * ReadValue(const char *in, TiXmlParsingData *prevData, TiXmlEncoding encoding)
void Add(TiXmlAttribute *attribute)
const TiXmlDocument * GetDocument() const
Return a pointer to the Document this node lives in.
static const char * GetEntity(const char *in, char *value, int *length, TiXmlEncoding encoding)
virtual const char * Parse(const char *p, TiXmlParsingData *data, TiXmlEncoding encoding)
static bool StringEqual(const char *p, const char *endTag, bool ignoreCase, TiXmlEncoding encoding)
static bool StreamTo(std::istream *in, int character, std::string *tag)
virtual const char * Parse(const char *p, TiXmlParsingData *data=0, TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING)
Parse the given null terminated block of xml data.
void SetError(int err, const char *errorLocation, TiXmlParsingData *prevData, TiXmlEncoding encoding)
The parent class for everything in the Document Object Model.
INTERNAL USE: holds parsing data for tabs, cursors, etc.
void Stamp(const char *now, TiXmlEncoding encoding)
static const char * GetChar(const char *p, char *_value, int *length, TiXmlEncoding encoding)
TiXmlParsingData(const char *start, int _tabsize, int row, int col)
void SetDocument(TiXmlDocument *doc)
static int IsAlpha(unsigned char anyByte, TiXmlEncoding encoding)
static const char * ReadText(const char *in, std::string *text, bool ignoreWhiteSpace, const char *endTag, bool ignoreCase, TiXmlEncoding encoding)
TiXmlCursor errorLocation