@@ -103,12 +103,17 @@ distribution.
103
103
#if defined(_WIN64)
104
104
#define TIXML_FSEEK _fseeki64
105
105
#define TIXML_FTELL _ftelli64
106
- #elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__ANDROID__ )
106
+ #elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__CYGWIN__ )
107
107
#define TIXML_FSEEK fseeko
108
108
#define TIXML_FTELL ftello
109
- #elif defined(__unix__) && defined(__x86_64__)
110
- #define TIXML_FSEEK fseeko64
111
- #define TIXML_FTELL ftello64
109
+ #elif defined(__ANDROID__)
110
+ #if __ANDROID_API__ > 24
111
+ #define TIXML_FSEEK fseeko64
112
+ #define TIXML_FTELL ftello64
113
+ #else
114
+ #define TIXML_FSEEK fseeko
115
+ #define TIXML_FTELL ftello
116
+ #endif
112
117
#else
113
118
#define TIXML_FSEEK fseek
114
119
#define TIXML_FTELL ftell
@@ -707,7 +712,7 @@ bool XMLUtil::ToUnsigned64(const char* str, uint64_t* value) {
707
712
}
708
713
709
714
710
- char * XMLDocument::Identify ( char * p, XMLNode** node )
715
+ char * XMLDocument::Identify ( char * p, XMLNode** node, bool first )
711
716
{
712
717
TIXMLASSERT ( node );
713
718
TIXMLASSERT ( p );
@@ -759,9 +764,19 @@ char* XMLDocument::Identify( char* p, XMLNode** node )
759
764
p += dtdHeaderLen;
760
765
}
761
766
else if ( XMLUtil::StringEqual ( p, elementHeader, elementHeaderLen ) ) {
762
- returnNode = CreateUnlinkedNode<XMLElement>( _elementPool );
763
- returnNode->_parseLineNum = _parseCurLineNum;
764
- p += elementHeaderLen;
767
+
768
+ // Preserve whitespace pedantically before closing tag, when it's immediately after opening tag
769
+ if (WhitespaceMode () == PEDANTIC_WHITESPACE && first && p != start && *(p + elementHeaderLen) == ' /' ) {
770
+ returnNode = CreateUnlinkedNode<XMLText>(_textPool);
771
+ returnNode->_parseLineNum = startLine;
772
+ p = start; // Back it up, all the text counts.
773
+ _parseCurLineNum = startLine;
774
+ }
775
+ else {
776
+ returnNode = CreateUnlinkedNode<XMLElement>(_elementPool);
777
+ returnNode->_parseLineNum = _parseCurLineNum;
778
+ p += elementHeaderLen;
779
+ }
765
780
}
766
781
else {
767
782
returnNode = CreateUnlinkedNode<XMLText>( _textPool );
@@ -814,6 +829,34 @@ XMLNode::~XMLNode()
814
829
}
815
830
}
816
831
832
+ // ChildElementCount was originally suggested by msteiger on the sourceforge page for TinyXML and modified by KB1SPH for TinyXML-2.
833
+
834
+ int XMLNode::ChildElementCount (const char *value) const {
835
+ int count = 0 ;
836
+
837
+ const XMLElement *e = FirstChildElement (value);
838
+
839
+ while (e) {
840
+ e = e->NextSiblingElement (value);
841
+ count++;
842
+ }
843
+
844
+ return count;
845
+ }
846
+
847
+ int XMLNode::ChildElementCount () const {
848
+ int count = 0 ;
849
+
850
+ const XMLElement *e = FirstChildElement ();
851
+
852
+ while (e) {
853
+ e = e->NextSiblingElement ();
854
+ count++;
855
+ }
856
+
857
+ return count;
858
+ }
859
+
817
860
const char * XMLNode::Value () const
818
861
{
819
862
// Edge case: XMLDocuments don't have a Value. Return null.
@@ -1062,21 +1105,23 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr )
1062
1105
if (_document->Error ())
1063
1106
return 0 ;
1064
1107
1108
+ bool first = true ;
1065
1109
while ( p && *p ) {
1066
1110
XMLNode* node = 0 ;
1067
1111
1068
- p = _document->Identify ( p, &node );
1112
+ p = _document->Identify ( p, &node, first );
1069
1113
TIXMLASSERT ( p );
1070
1114
if ( node == 0 ) {
1071
1115
break ;
1072
1116
}
1117
+ first = false ;
1073
1118
1074
1119
const int initialLineNum = node->_parseLineNum ;
1075
1120
1076
1121
StrPair endTag;
1077
1122
p = node->ParseDeep ( p, &endTag, curLineNumPtr );
1078
1123
if ( !p ) {
1079
- DeleteNode ( node );
1124
+ _document-> DeleteNode ( node );
1080
1125
if ( !_document->Error () ) {
1081
1126
_document->SetError ( XML_ERROR_PARSING, initialLineNum, 0 );
1082
1127
}
@@ -1109,7 +1154,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr )
1109
1154
}
1110
1155
if ( !wellLocated ) {
1111
1156
_document->SetError ( XML_ERROR_PARSING_DECLARATION, initialLineNum, " XMLDeclaration value=%s" , decl->Value ());
1112
- DeleteNode ( node );
1157
+ _document-> DeleteNode ( node );
1113
1158
break ;
1114
1159
}
1115
1160
}
@@ -1144,7 +1189,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr )
1144
1189
}
1145
1190
if ( mismatch ) {
1146
1191
_document->SetError ( XML_ERROR_MISMATCHED_ELEMENT, initialLineNum, " XMLElement name=%s" , ele->Name ());
1147
- DeleteNode ( node );
1192
+ _document-> DeleteNode ( node );
1148
1193
break ;
1149
1194
}
1150
1195
}
@@ -1776,11 +1821,11 @@ XMLError XMLElement::QueryInt64Text(int64_t* ival) const
1776
1821
}
1777
1822
1778
1823
1779
- XMLError XMLElement::QueryUnsigned64Text (uint64_t * ival ) const
1824
+ XMLError XMLElement::QueryUnsigned64Text (uint64_t * uval ) const
1780
1825
{
1781
1826
if (FirstChild () && FirstChild ()->ToText ()) {
1782
1827
const char * t = FirstChild ()->Value ();
1783
- if (XMLUtil::ToUnsigned64 (t, ival )) {
1828
+ if (XMLUtil::ToUnsigned64 (t, uval )) {
1784
1829
return XML_SUCCESS;
1785
1830
}
1786
1831
return XML_CAN_NOT_CONVERT_TEXT;
@@ -2412,21 +2457,21 @@ XMLError XMLDocument::SaveFile( FILE* fp, bool compact )
2412
2457
}
2413
2458
2414
2459
2415
- XMLError XMLDocument::Parse ( const char * p , size_t len )
2460
+ XMLError XMLDocument::Parse ( const char * xml , size_t nBytes )
2416
2461
{
2417
2462
Clear ();
2418
2463
2419
- if ( len == 0 || !p || !*p ) {
2464
+ if ( nBytes == 0 || !xml || !*xml ) {
2420
2465
SetError ( XML_ERROR_EMPTY_DOCUMENT, 0 , 0 );
2421
2466
return _errorID;
2422
2467
}
2423
- if ( len == static_cast <size_t >(-1 ) ) {
2424
- len = strlen ( p );
2468
+ if ( nBytes == static_cast <size_t >(-1 ) ) {
2469
+ nBytes = strlen ( xml );
2425
2470
}
2426
2471
TIXMLASSERT ( _charBuffer == 0 );
2427
- _charBuffer = new char [ len +1 ];
2428
- memcpy ( _charBuffer, p, len );
2429
- _charBuffer[len ] = 0 ;
2472
+ _charBuffer = new char [ nBytes +1 ];
2473
+ memcpy ( _charBuffer, xml, nBytes );
2474
+ _charBuffer[nBytes ] = 0 ;
2430
2475
2431
2476
Parse ();
2432
2477
if ( Error () ) {
0 commit comments