1 #ifndef DDCORE_SRC_XML_TINYXMLPARSER_INL_H
2 #define DDCORE_SRC_XML_TINYXMLPARSER_INL_H
38 #if defined( DEBUG_PARSER )
39 # if defined( DEBUG ) && defined( _MSC_VER )
41 # define TIXML_LOG OutputDebugString
43 # define TIXML_LOG printf
61 {
""", 6,
'\"' },
82 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
83 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
84 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
85 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
86 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
87 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
88 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
89 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
90 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
91 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
92 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
93 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
94 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
96 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
97 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
103 const unsigned long BYTE_MASK = 0xBF;
104 const unsigned long BYTE_MARK = 0x80;
105 const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
109 else if ( input < 0x800 )
111 else if ( input < 0x10000 )
113 else if ( input < 0x200000 )
116 { *length = 0;
return; }
125 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
130 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
135 *output = (char)((input | BYTE_MARK) & BYTE_MASK);
140 *output = (char)(input | FIRST_BYTE_MARK[*length]);
158 return isalpha( anyByte );
179 return isalnum( anyByte );
228 const char* p =
stamp;
234 const unsigned char* pU = (
const unsigned char*)p;
283 if ( *(p+1) && *(p+2) )
289 else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU )
291 else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU )
343 const unsigned char* pU = (
const unsigned char*)p;
376 while ( ( *p &&
IsWhiteSpace( *p ) ) || *p ==
'\n' || *p ==
'\r' )
388 if ( !in->good() )
return false;
395 *tag += (char) in->get();
405 if ( c == character )
436 && (
IsAlpha( (
unsigned char) *p, encoding ) || *p ==
'_' ) )
438 const char* start = p;
440 && (
IsAlphaNum( (
unsigned char ) *p, encoding )
450 name->assign( start, p-start );
464 if ( *(p+1) && *(p+1) ==
'#' && *(p+2) )
466 unsigned long ucs = 0;
473 if ( !*(p+3) )
return 0;
476 q = strchr( q,
';' );
478 if ( !q || !*q )
return 0;
485 if ( *q >=
'0' && *q <=
'9' )
486 ucs += mult * (*q -
'0');
487 else if ( *q >=
'a' && *q <=
'f' )
488 ucs += mult * (*q -
'a' + 10);
489 else if ( *q >=
'A' && *q <=
'F' )
490 ucs += mult * (*q -
'A' + 10 );
500 if ( !*(p+2) )
return 0;
503 q = strchr( q,
';' );
505 if ( !q || !*q )
return 0;
512 if ( *q >=
'0' && *q <=
'9' )
513 ucs += mult * (*q -
'0');
530 return p +
delta + 1;
536 if ( strncmp(
entity[i].str, p,
entity[i].strLength ) == 0 )
538 assert( strlen(
entity[i].str ) ==
entity[i].strLength );
541 return ( p +
entity[i].strLength );
570 while ( *q && *tag &&
ToLower( *q, encoding ) ==
ToLower( *tag, encoding ) )
581 while ( *q && *tag && *q == *tag )
597 bool caseInsensitive,
606 && !
StringEqual( p, endTag, caseInsensitive, encoding )
610 char cArr[4] = { 0, 0, 0, 0 };
611 p =
GetChar( p, cArr, &len, encoding );
612 text->append( cArr, len );
617 bool whitespace =
false;
622 && !
StringEqual( p, endTag, caseInsensitive, encoding ) )
624 if ( *p ==
'\r' || *p ==
'\n' )
644 char cArr[4] = { 0, 0, 0, 0 };
645 p =
GetChar( p, cArr, &len, encoding );
649 text->append( cArr, len );
654 p += strlen( endTag );
677 int tagIndex = (int) tag->length();
678 while ( in->good() && in->peek() !=
'>' )
756 const unsigned char* pU = (
const unsigned char*)p;
778 p = node->
Parse( p, &data, encoding );
829 if ( pError && data )
831 data->
Stamp( pError, encoding );
842 if( !p || !*p || *p !=
'<' )
862 const char* xmlHeader = {
"<?xml" };
863 const char* commentHeader = {
"<!--" };
864 const char* dtdHeader = {
"<!" };
865 const char* cdataHeader = {
"<![CDATA[" };
870 TIXML_LOG(
"XML parsing Declaration\n" );
874 else if (
StringEqual( p, commentHeader,
false, encoding ) )
877 TIXML_LOG(
"XML parsing Comment\n" );
881 else if (
StringEqual( p, cdataHeader,
false, encoding ) )
884 TIXML_LOG(
"XML parsing CDATA\n" );
890 else if (
StringEqual( p, dtdHeader,
false, encoding ) )
893 TIXML_LOG(
"XML parsing Unknown(1)\n" );
897 else if (
IsAlpha( *(p+1), encoding )
901 TIXML_LOG(
"XML parsing Element\n" );
908 TIXML_LOG(
"XML parsing Unknown(2)\n" );
916 returnNode->
parent =
this;
948 if ( tag->length() < 3 )
return;
953 if ( tag->at( tag->length() - 1 ) ==
'>'
954 && tag->at( tag->length() - 2 ) ==
'/' )
959 else if ( tag->at( tag->length() - 1 ) ==
'>' )
971 if ( in->good() && in->peek() !=
'<' )
975 text.StreamIn( in, tag );
984 if ( !in->good() )
return;
985 assert( in->peek() ==
'<' );
986 int tagIndex = (int) tag->length();
988 bool closingTag =
false;
989 bool firstCharFound =
false;
1012 if ( c ==
'[' && tag->size() >= 9 )
1014 size_t len = tag->size();
1015 const char* start = tag->c_str() + len - 9;
1016 if ( strcmp( start,
"<![CDATA[" ) == 0 ) {
1017 assert( !closingTag );
1022 if ( !firstCharFound && c !=
'<' && !
IsWhiteSpace( c ) )
1024 firstCharFound =
true;
1053 const char* tagloc = tag->c_str() + tagIndex;
1081 data->
Stamp( p, encoding );
1094 const char* pErr = p;
1129 else if ( *p ==
'>' )
1140 if (
StringEqual( p, endTag.c_str(),
false, encoding ) )
1142 p += endTag.length();
1163 p = attrib->
Parse( p, data, encoding );
1173 #ifdef TIXML_USE_STL
1197 const char* pWithWhiteSpace = p;
1215 p = textNode->
Parse( p, data, encoding );
1221 p = textNode->
Parse( pWithWhiteSpace, data, encoding );
1224 if ( !textNode->
Blank() )
1243 p = node->
Parse( p, data, encoding );
1252 pWithWhiteSpace = p;
1264 #ifdef TIXML_USE_STL
1267 while ( in->good() )
1296 data->
Stamp( p, encoding );
1299 if ( !p || !*p || *p !=
'<' )
1307 while ( p && *p && *p !=
'>' )
1322 #ifdef TIXML_USE_STL
1325 while ( in->good() )
1339 && tag->at( tag->length() - 2 ) ==
'-'
1340 && tag->at( tag->length() - 3 ) ==
'-' )
1359 data->
Stamp( p, encoding );
1362 const char* startTag =
"<!--";
1363 const char* endTag =
"-->";
1365 if ( !
StringEqual( p, startTag,
false, encoding ) )
1370 p += strlen( startTag );
1379 if ( !p || !*p )
return 0;
1387 data->
Stamp( p, encoding );
1391 const char* pErr = p;
1399 if ( !p || !*p || *p !=
'=' )
1414 const char SINGLE_QUOTE =
'\'';
1415 const char DOUBLE_QUOTE =
'\"';
1417 if ( *p == SINGLE_QUOTE )
1423 else if ( *p == DOUBLE_QUOTE )
1437 && *p !=
'/' && *p !=
'>' )
1439 if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) {
1453 #ifdef TIXML_USE_STL
1456 while ( in->good() )
1459 if ( !
cdata && (c ==
'<' ) )
1474 if (
cdata && c ==
'>' && tag->size() >= 3 ) {
1475 size_t len = tag->size();
1476 if ( (*tag)[len-2] ==
']' && (*tag)[len-3] ==
']' ) {
1492 data->
Stamp( p, encoding );
1496 const char*
const startTag =
"<![CDATA[";
1497 const char*
const endTag =
"]]>";
1503 if ( !
StringEqual( p, startTag,
false, encoding ) )
1508 p += strlen( startTag );
1520 p =
ReadText( p, &dummy,
false, endTag,
false, encoding );
1525 bool ignoreWhite =
true;
1527 const char* end =
"<";
1528 p =
ReadText( p, &
value, ignoreWhite, end,
false, encoding );
1535 #ifdef TIXML_USE_STL
1538 while ( in->good() )
1565 if ( !p || !*p || !
StringEqual( p,
"<?xml",
true, _encoding ) )
1572 data->
Stamp( p, _encoding );
1590 if (
StringEqual( p,
"version",
true, _encoding ) )
1593 p = attrib.
Parse( p, data, _encoding );
1596 else if (
StringEqual( p,
"encoding",
true, _encoding ) )
1599 p = attrib.
Parse( p, data, _encoding );
1602 else if (
StringEqual( p,
"standalone",
true, _encoding ) )
1605 p = attrib.
Parse( p, data, _encoding );
1620 for (
unsigned i=0; i<
value.length(); i++ )