@@ -103,18 +103,10 @@ 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(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || (__CYGWIN__)
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(__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
117
- #elif defined(__unix__) && defined(__x86_64__)
109
+ #elif defined(__ANDROID__) && __ANDROID_API__ > 24
118
110
#define TIXML_FSEEK fseeko64
119
111
#define TIXML_FTELL ftello64
120
112
#else
@@ -613,7 +605,7 @@ void XMLUtil::ToStr( int64_t v, char* buffer, int bufferSize )
613
605
void XMLUtil::ToStr ( uint64_t v, char * buffer, int bufferSize )
614
606
{
615
607
// horrible syntax trick to make the compiler happy about %llu
616
- TIXML_SNPRINTF (buffer, bufferSize, " %llu" , ( long long )v );
608
+ TIXML_SNPRINTF (buffer, bufferSize, " %llu" , static_cast < unsigned long long >(v) );
617
609
}
618
610
619
611
bool XMLUtil::ToInt (const char * str, int * value)
@@ -715,7 +707,7 @@ bool XMLUtil::ToUnsigned64(const char* str, uint64_t* value) {
715
707
}
716
708
717
709
718
- char * XMLDocument::Identify ( char * p, XMLNode** node )
710
+ char * XMLDocument::Identify ( char * p, XMLNode** node, bool first )
719
711
{
720
712
TIXMLASSERT ( node );
721
713
TIXMLASSERT ( p );
@@ -767,9 +759,19 @@ char* XMLDocument::Identify( char* p, XMLNode** node )
767
759
p += dtdHeaderLen;
768
760
}
769
761
else if ( XMLUtil::StringEqual ( p, elementHeader, elementHeaderLen ) ) {
770
- returnNode = CreateUnlinkedNode<XMLElement>( _elementPool );
771
- returnNode->_parseLineNum = _parseCurLineNum;
772
- p += elementHeaderLen;
762
+
763
+ // Preserve whitespace pedantically before closing tag, when it's immediately after opening tag
764
+ if (WhitespaceMode () == PEDANTIC_WHITESPACE && first && p != start && *(p + elementHeaderLen) == ' /' ) {
765
+ returnNode = CreateUnlinkedNode<XMLText>(_textPool);
766
+ returnNode->_parseLineNum = startLine;
767
+ p = start; // Back it up, all the text counts.
768
+ _parseCurLineNum = startLine;
769
+ }
770
+ else {
771
+ returnNode = CreateUnlinkedNode<XMLElement>(_elementPool);
772
+ returnNode->_parseLineNum = _parseCurLineNum;
773
+ p += elementHeaderLen;
774
+ }
773
775
}
774
776
else {
775
777
returnNode = CreateUnlinkedNode<XMLText>( _textPool );
@@ -822,6 +824,34 @@ XMLNode::~XMLNode()
822
824
}
823
825
}
824
826
827
+ // ChildElementCount was originally suggested by msteiger on the sourceforge page for TinyXML and modified by KB1SPH for TinyXML-2.
828
+
829
+ int XMLNode::ChildElementCount (const char *value) const {
830
+ int count = 0 ;
831
+
832
+ const XMLElement *e = FirstChildElement (value);
833
+
834
+ while (e) {
835
+ e = e->NextSiblingElement (value);
836
+ count++;
837
+ }
838
+
839
+ return count;
840
+ }
841
+
842
+ int XMLNode::ChildElementCount () const {
843
+ int count = 0 ;
844
+
845
+ const XMLElement *e = FirstChildElement ();
846
+
847
+ while (e) {
848
+ e = e->NextSiblingElement ();
849
+ count++;
850
+ }
851
+
852
+ return count;
853
+ }
854
+
825
855
const char * XMLNode::Value () const
826
856
{
827
857
// Edge case: XMLDocuments don't have a Value. Return null.
@@ -1070,14 +1100,16 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr )
1070
1100
if (_document->Error ())
1071
1101
return 0 ;
1072
1102
1103
+ bool first = true ;
1073
1104
while ( p && *p ) {
1074
1105
XMLNode* node = 0 ;
1075
1106
1076
- p = _document->Identify ( p, &node );
1107
+ p = _document->Identify ( p, &node, first );
1077
1108
TIXMLASSERT ( p );
1078
1109
if ( node == 0 ) {
1079
1110
break ;
1080
1111
}
1112
+ first = false ;
1081
1113
1082
1114
const int initialLineNum = node->_parseLineNum ;
1083
1115
@@ -2189,7 +2221,7 @@ void XMLDocument::MarkInUse(const XMLNode* const node)
2189
2221
TIXMLASSERT (node);
2190
2222
TIXMLASSERT (node->_parent == 0 );
2191
2223
2192
- for (int i = 0 ; i < _unlinked.Size (); ++i) {
2224
+ for (size_t i = 0 ; i < _unlinked.Size (); ++i) {
2193
2225
if (node == _unlinked[i]) {
2194
2226
_unlinked.SwapRemove (i);
2195
2227
break ;
@@ -2472,7 +2504,7 @@ void XMLDocument::ClearError() {
2472
2504
2473
2505
void XMLDocument::SetError ( XMLError error, int lineNum, const char * format, ... )
2474
2506
{
2475
- TIXMLASSERT ( error >= 0 && error < XML_ERROR_COUNT );
2507
+ TIXMLASSERT (error >= 0 && error < XML_ERROR_COUNT);
2476
2508
_errorID = error;
2477
2509
_errorLineNum = lineNum;
2478
2510
_errorStr.Reset ();
@@ -2481,7 +2513,8 @@ void XMLDocument::SetError( XMLError error, int lineNum, const char* format, ...
2481
2513
char * buffer = new char [BUFFER_SIZE];
2482
2514
2483
2515
TIXMLASSERT (sizeof (error) <= sizeof (int ));
2484
- TIXML_SNPRINTF (buffer, BUFFER_SIZE, " Error=%s ErrorID=%d (0x%x) Line number=%d" , ErrorIDToName (error), int (error), int (error), lineNum);
2516
+ TIXML_SNPRINTF (buffer, BUFFER_SIZE, " Error=%s ErrorID=%d (0x%x) Line number=%d" ,
2517
+ ErrorIDToName (error), static_cast <int >(error), static_cast <unsigned int >(error), lineNum);
2485
2518
2486
2519
if (format) {
2487
2520
size_t len = strlen (buffer);
0 commit comments