From bafaf58e39fa6665e9302f3426ce2d048591d8f5 Mon Sep 17 00:00:00 2001 From: JinWang An Date: Fri, 30 Oct 2020 14:35:26 +0900 Subject: [PATCH] Imported Upstream version 7.1.0 --- CMakeLists.txt | 8 ++- LICENSE.txt | 18 +++++++ dox | 6 +-- readme.md | 9 ++-- tinyxml2.cpp | 160 ++++++++++++++++++++++++++++++++++++++++++++------------- tinyxml2.h | 71 +++++++++++++++++++------ xmltest.cpp | 107 +++++++++++++++++++++++++++++++++++--- 7 files changed, 309 insertions(+), 70 deletions(-) create mode 100644 LICENSE.txt mode change 100644 => 100755 xmltest.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 378b48a..3eedc48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ include(CTest) ################################ # set lib version here -set(GENERIC_LIB_VERSION "7.0.1") +set(GENERIC_LIB_VERSION "7.1.0") set(GENERIC_LIB_SOVERSION "7") ################################ @@ -121,8 +121,14 @@ configure_package_config_file( "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}" ) +write_basic_package_version_file( + "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake" + VERSION ${GENERIC_LIB_VERSION} + COMPATIBILITY SameMajorVersion +) install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake + ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}) install(EXPORT ${CMAKE_PROJECT_NAME}Targets NAMESPACE tinyxml2:: diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..85a6a36 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,18 @@ +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. diff --git a/dox b/dox index fd50e79..d954a20 100644 --- a/dox +++ b/dox @@ -38,11 +38,7 @@ PROJECT_NAME = "TinyXML-2" # could be handy for archiving the generated documentation or if some version # control system is used. -<<<<<<< HEAD -PROJECT_NUMBER = 7.0.1 -======= -PROJECT_NUMBER = 7.0.1 ->>>>>>> master +PROJECT_NUMBER = 7.1.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/readme.md b/readme.md index a519bfa..7dad55d 100644 --- a/readme.md +++ b/readme.md @@ -54,9 +54,8 @@ What it doesn't do. TinyXML-2 doesn't parse or use DTDs (Document Type Definitions) or XSLs (eXtensible Stylesheet Language.) There are other parsers out there -that are much more fully featured. But they are also much bigger, -take longer to set up in your project, have a higher learning curve, -and often have a more restrictive license. If you are working with +that are much more fully featured. But they are generally bigger and +more difficult to use. If you are working with browsers or have more complete XML needs, TinyXML-2 is not the parser for you. TinyXML-1 vs. TinyXML-2 @@ -265,7 +264,7 @@ And additionally a test file: Simply compile and run. There is a visual studio 2017 project included, a simple Makefile, an Xcode project, a Code::Blocks project, and a cmake CMakeLists.txt included to help you. -The top of tinyxml.h even has a simple g++ command line if you are are Unix/Linuk/BSD and +The top of tinyxml.h even has a simple g++ command line if you are using Unix/Linux/BSD and don't want to use a build system. Versioning @@ -279,7 +278,7 @@ common. Documentation ------------- -The documentation is build with Doxygen, using the 'dox' +The documentation is built with Doxygen, using the 'dox' configuration file. License diff --git a/tinyxml2.cpp b/tinyxml2.cpp index fd27f78..6b79917 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -45,14 +45,14 @@ distribution. { va_list va; va_start( va, format ); - int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); + const int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); va_end( va ); return result; } static inline int TIXML_VSNPRINTF( char* buffer, size_t size, const char* format, va_list va ) { - int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); + const int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); return result; } @@ -101,9 +101,9 @@ distribution. #endif -static const char LINE_FEED = (char)0x0a; // all line endings are normalized to LF +static const char LINE_FEED = static_cast(0x0a); // all line endings are normalized to LF static const char LF = LINE_FEED; -static const char CARRIAGE_RETURN = (char)0x0d; // CR gets filtered out +static const char CARRIAGE_RETURN = static_cast(0x0d); // CR gets filtered out static const char CR = CARRIAGE_RETURN; static const char SINGLE_QUOTE = '\''; static const char DOUBLE_QUOTE = '\"'; @@ -197,7 +197,7 @@ char* StrPair::ParseText( char* p, const char* endTag, int strFlags, int* curLin TIXMLASSERT(curLineNumPtr); char* start = p; - char endChar = *endTag; + const char endChar = *endTag; size_t length = strlen( endTag ); // Inner loop of text parsing. @@ -310,7 +310,7 @@ const char* StrPair::GetStr() const int buflen = 10; char buf[buflen] = { 0 }; int len = 0; - char* adjusted = const_cast( XMLUtil::GetCharacterRef( p, buf, &len ) ); + const char* adjusted = const_cast( XMLUtil::GetCharacterRef( p, buf, &len ) ); if ( adjusted == 0 ) { *q = *p; ++p; @@ -430,22 +430,22 @@ void XMLUtil::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length switch (*length) { case 4: --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); + *output = static_cast((input | BYTE_MARK) & BYTE_MASK); input >>= 6; //fall through case 3: --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); + *output = static_cast((input | BYTE_MARK) & BYTE_MASK); input >>= 6; //fall through case 2: --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); + *output = static_cast((input | BYTE_MARK) & BYTE_MASK); input >>= 6; //fall through case 1: --output; - *output = (char)(input | FIRST_BYTE_MARK[*length]); + *output = static_cast(input | FIRST_BYTE_MARK[*length]); break; default: TIXMLASSERT( false ); @@ -582,12 +582,17 @@ void XMLUtil::ToStr( double v, char* buffer, int bufferSize ) } -void XMLUtil::ToStr(int64_t v, char* buffer, int bufferSize) +void XMLUtil::ToStr( int64_t v, char* buffer, int bufferSize ) { // horrible syntax trick to make the compiler happy about %lld - TIXML_SNPRINTF(buffer, bufferSize, "%lld", (long long)v); + TIXML_SNPRINTF(buffer, bufferSize, "%lld", static_cast(v)); } +void XMLUtil::ToStr( uint64_t v, char* buffer, int bufferSize ) +{ + // horrible syntax trick to make the compiler happy about %llu + TIXML_SNPRINTF(buffer, bufferSize, "%llu", (long long)v); +} bool XMLUtil::ToInt( const char* str, int* value ) { @@ -612,13 +617,20 @@ bool XMLUtil::ToBool( const char* str, bool* value ) *value = (ival==0) ? false : true; return true; } - if ( StringEqual( str, "true" ) ) { - *value = true; - return true; + static const char* TRUE[] = { "true", "True", "TRUE", 0 }; + static const char* FALSE[] = { "false", "False", "FALSE", 0 }; + + for (int i = 0; TRUE[i]; ++i) { + if (StringEqual(str, TRUE[i])) { + *value = true; + return true; + } } - else if ( StringEqual( str, "false" ) ) { - *value = false; - return true; + for (int i = 0; FALSE[i]; ++i) { + if (StringEqual(str, FALSE[i])) { + *value = false; + return true; + } } return false; } @@ -646,13 +658,23 @@ bool XMLUtil::ToInt64(const char* str, int64_t* value) { long long v = 0; // horrible syntax trick to make the compiler happy about %lld if (TIXML_SSCANF(str, "%lld", &v) == 1) { - *value = (int64_t)v; + *value = static_cast(v); return true; } return false; } +bool XMLUtil::ToUnsigned64(const char* str, uint64_t* value) { + unsigned long long v = 0; // horrible syntax trick to make the compiler happy about %llu + if(TIXML_SSCANF(str, "%llu", &v) == 1) { + *value = (uint64_t)v; + return true; + } + return false; +} + + char* XMLDocument::Identify( char* p, XMLNode** node ) { TIXMLASSERT( node ); @@ -1017,7 +1039,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ) break; } - int initialLineNum = node->_parseLineNum; + const int initialLineNum = node->_parseLineNum; StrPair endTag; p = node->ParseDeep( p, &endTag, curLineNumPtr ); @@ -1029,7 +1051,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ) break; } - XMLDeclaration* decl = node->ToDeclaration(); + const XMLDeclaration* const decl = node->ToDeclaration(); if ( decl ) { // Declarations are only allowed at document level // @@ -1038,7 +1060,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ) // // Optimized due to a security test case. If the first node is // a declaration, and the last node is a declaration, then only - // declarations have so far been addded. + // declarations have so far been added. bool wellLocated = false; if (ToDocument()) { @@ -1373,7 +1395,7 @@ char* XMLAttribute::ParseDeep( char* p, bool processEntities, int* curLineNumPtr return 0; } - char endTag[2] = { *p, 0 }; + const char endTag[2] = { *p, 0 }; ++p; // move past opening quote p = _value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES, curLineNumPtr ); @@ -1414,6 +1436,15 @@ XMLError XMLAttribute::QueryInt64Value(int64_t* value) const } +XMLError XMLAttribute::QueryUnsigned64Value(uint64_t* value) const +{ + if(XMLUtil::ToUnsigned64(Value(), value)) { + return XML_SUCCESS; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + XMLError XMLAttribute::QueryBoolValue( bool* value ) const { if ( XMLUtil::ToBool( Value(), value )) { @@ -1470,6 +1501,12 @@ void XMLAttribute::SetAttribute(int64_t v) _value.SetStr(buf); } +void XMLAttribute::SetAttribute(uint64_t v) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(v, buf, BUF_SIZE); + _value.SetStr(buf); +} void XMLAttribute::SetAttribute( bool v ) @@ -1556,6 +1593,13 @@ int64_t XMLElement::Int64Attribute(const char* name, int64_t defaultValue) const return i; } +uint64_t XMLElement::Unsigned64Attribute(const char* name, uint64_t defaultValue) const +{ + uint64_t i = defaultValue; + QueryUnsigned64Attribute(name, &i); + return i; +} + bool XMLElement::BoolAttribute(const char* name, bool defaultValue) const { bool b = defaultValue; @@ -1620,6 +1664,12 @@ void XMLElement::SetText(int64_t v) SetText(buf); } +void XMLElement::SetText(uint64_t v) { + char buf[BUF_SIZE]; + XMLUtil::ToStr(v, buf, BUF_SIZE); + SetText(buf); +} + void XMLElement::SetText( bool v ) { @@ -1684,6 +1734,19 @@ XMLError XMLElement::QueryInt64Text(int64_t* ival) const } +XMLError XMLElement::QueryUnsigned64Text(uint64_t* ival) const +{ + if(FirstChild() && FirstChild()->ToText()) { + const char* t = FirstChild()->Value(); + if(XMLUtil::ToUnsigned64(t, ival)) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + XMLError XMLElement::QueryBoolText( bool* bval ) const { if ( FirstChild() && FirstChild()->ToText() ) { @@ -1743,6 +1806,13 @@ int64_t XMLElement::Int64Text(int64_t defaultValue) const return i; } +uint64_t XMLElement::Unsigned64Text(uint64_t defaultValue) const +{ + uint64_t i = defaultValue; + QueryUnsigned64Text(&i); + return i; +} + bool XMLElement::BoolText(bool defaultValue) const { bool b = defaultValue; @@ -1830,7 +1900,7 @@ char* XMLElement::ParseAttributes( char* p, int* curLineNumPtr ) TIXMLASSERT( attrib ); attrib->_parseLineNum = _document->_parseCurLineNum; - int attrLineNum = attrib->_parseLineNum; + const int attrLineNum = attrib->_parseLineNum; p = attrib->ParseDeep( p, _document->ProcessEntities(), curLineNumPtr ); if ( !p || Attribute( attrib->Name() ) ) { @@ -2136,7 +2206,7 @@ static FILE* callfopen( const char* filepath, const char* mode ) TIXMLASSERT( mode ); #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) FILE* fp = 0; - errno_t err = fopen_s( &fp, filepath, mode ); + const errno_t err = fopen_s( &fp, filepath, mode ); if ( err ) { return 0; } @@ -2194,7 +2264,7 @@ template struct LongFitsIntoSizeTMinusOne { static bool Fits( unsigned long value ) { - return value < (size_t)-1; + return value < static_cast(-1); } }; @@ -2239,7 +2309,7 @@ XMLError XMLDocument::LoadFile( FILE* fp ) const size_t size = filelength; TIXMLASSERT( _charBuffer == 0 ); _charBuffer = new char[size+1]; - size_t read = fread( _charBuffer, 1, size, fp ); + const size_t read = fread( _charBuffer, 1, size, fp ); if ( read != size ) { SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); return _errorID; @@ -2290,7 +2360,7 @@ XMLError XMLDocument::Parse( const char* p, size_t len ) SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } - if ( len == (size_t)(-1) ) { + if ( len == static_cast(-1) ) { len = strlen( p ); } TIXMLASSERT( _charBuffer == 0 ); @@ -2332,7 +2402,7 @@ void XMLDocument::SetError( XMLError error, int lineNum, const char* format, ... _errorLineNum = lineNum; _errorStr.Reset(); - size_t BUFFER_SIZE = 1000; + const size_t BUFFER_SIZE = 1000; char* buffer = new char[BUFFER_SIZE]; TIXMLASSERT(sizeof(error) <= sizeof(int)); @@ -2424,13 +2494,13 @@ XMLPrinter::XMLPrinter( FILE* file, bool compact, int depth ) : } for( int i=0; i(entityValue); TIXMLASSERT( flagIndex < ENTITY_RANGE ); _entityFlag[flagIndex] = true; } - _restrictedEntityFlag[(unsigned char)'&'] = true; - _restrictedEntityFlag[(unsigned char)'<'] = true; - _restrictedEntityFlag[(unsigned char)'>'] = true; // not required, but consistency is nice + _restrictedEntityFlag[static_cast('&')] = true; + _restrictedEntityFlag[static_cast('<')] = true; + _restrictedEntityFlag[static_cast('>')] = true; // not required, but consistency is nice _buffer.Push( 0 ); } @@ -2505,10 +2575,10 @@ void XMLPrinter::PrintString( const char* p, bool restricted ) // Check for entities. If one is found, flush // the stream up until the entity, write the // entity, and keep looking. - if ( flag[(unsigned char)(*q)] ) { + if ( flag[static_cast(*q)] ) { while ( p < q ) { const size_t delta = q - p; - const int toPrint = ( INT_MAX < delta ) ? INT_MAX : (int)delta; + const int toPrint = ( INT_MAX < delta ) ? INT_MAX : static_cast(delta); Write( p, toPrint ); p += toPrint; } @@ -2536,7 +2606,7 @@ void XMLPrinter::PrintString( const char* p, bool restricted ) // string if an entity wasn't found. if ( p < q ) { const size_t delta = q - p; - const int toPrint = ( INT_MAX < delta ) ? INT_MAX : (int)delta; + const int toPrint = ( INT_MAX < delta ) ? INT_MAX : static_cast(delta); Write( p, toPrint ); } } @@ -2614,6 +2684,14 @@ void XMLPrinter::PushAttribute(const char* name, int64_t v) } +void XMLPrinter::PushAttribute(const char* name, uint64_t v) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(v, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + void XMLPrinter::PushAttribute( const char* name, bool v ) { char buf[BUF_SIZE]; @@ -2683,6 +2761,7 @@ void XMLPrinter::PushText( const char* text, bool cdata ) } } + void XMLPrinter::PushText( int64_t value ) { char buf[BUF_SIZE]; @@ -2690,6 +2769,15 @@ void XMLPrinter::PushText( int64_t value ) PushText( buf, false ); } + +void XMLPrinter::PushText( uint64_t value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + void XMLPrinter::PushText( int value ) { char buf[BUF_SIZE]; diff --git a/tinyxml2.h b/tinyxml2.h index ee83d2c..a432f7e 100755 --- a/tinyxml2.h +++ b/tinyxml2.h @@ -99,12 +99,12 @@ distribution. http://semver.org/ */ static const int TIXML2_MAJOR_VERSION = 7; -static const int TIXML2_MINOR_VERSION = 0; -static const int TIXML2_PATCH_VERSION = 1; +static const int TIXML2_MINOR_VERSION = 1; +static const int TIXML2_PATCH_VERSION = 0; #define TINYXML2_MAJOR_VERSION 7 -#define TINYXML2_MINOR_VERSION 0 -#define TINYXML2_PATCH_VERSION 1 +#define TINYXML2_MINOR_VERSION 1 +#define TINYXML2_PATCH_VERSION 0 // A fixed element depth limit is problematic. There needs to be a // limit to avoid a stack overflow. However, that limit varies per @@ -303,7 +303,7 @@ private: TIXMLASSERT( cap > 0 ); if ( cap > _allocated ) { TIXMLASSERT( cap <= INT_MAX / 2 ); - int newAllocated = cap * 2; + const int newAllocated = cap * 2; T* newMem = new T[newAllocated]; TIXMLASSERT( newAllocated >= _size ); memcpy( newMem, _mem, sizeof(T)*_size ); // warning: not using constructors, only works for PODs @@ -617,6 +617,7 @@ public: static void ToStr( float v, char* buffer, int bufferSize ); static void ToStr( double v, char* buffer, int bufferSize ); static void ToStr(int64_t v, char* buffer, int bufferSize); + static void ToStr(uint64_t v, char* buffer, int bufferSize); // converts strings to primitive types static bool ToInt( const char* str, int* value ); @@ -625,7 +626,7 @@ public: static bool ToFloat( const char* str, float* value ); static bool ToDouble( const char* str, double* value ); static bool ToInt64(const char* str, int64_t* value); - + static bool ToUnsigned64(const char* str, uint64_t* value); // Changes what is serialized for a boolean value. // Default to "true" and "false". Shouldn't be changed // unless you have a special testing or compatibility need. @@ -1164,6 +1165,12 @@ public: return i; } + uint64_t Unsigned64Value() const { + uint64_t i = 0; + QueryUnsigned64Value(&i); + return i; + } + /// Query as an unsigned integer. See IntValue() unsigned UnsignedValue() const { unsigned i=0; @@ -1198,6 +1205,8 @@ public: XMLError QueryUnsignedValue( unsigned int* value ) const; /// See QueryIntValue XMLError QueryInt64Value(int64_t* value) const; + /// See QueryIntValue + XMLError QueryUnsigned64Value(uint64_t* value) const; /// See QueryIntValue XMLError QueryBoolValue( bool* value ) const; /// See QueryIntValue @@ -1213,7 +1222,9 @@ public: void SetAttribute( unsigned value ); /// Set the attribute to value. void SetAttribute(int64_t value); - /// Set the attribute to value. + /// Set the attribute to value. + void SetAttribute(uint64_t value); + /// Set the attribute to value. void SetAttribute( bool value ); /// Set the attribute to value. void SetAttribute( double value ); @@ -1301,6 +1312,8 @@ public: unsigned UnsignedAttribute(const char* name, unsigned defaultValue = 0) const; /// See IntAttribute() int64_t Int64Attribute(const char* name, int64_t defaultValue = 0) const; + /// See IntAttribute() + uint64_t Unsigned64Attribute(const char* name, uint64_t defaultValue = 0) const; /// See IntAttribute() bool BoolAttribute(const char* name, bool defaultValue = false) const; /// See IntAttribute() @@ -1347,6 +1360,15 @@ public: return a->QueryInt64Value(value); } + /// See QueryIntAttribute() + XMLError QueryUnsigned64Attribute(const char* name, uint64_t* value) const { + const XMLAttribute* a = FindAttribute(name); + if(!a) { + return XML_NO_ATTRIBUTE; + } + return a->QueryUnsigned64Value(value); + } + /// See QueryIntAttribute() XMLError QueryBoolAttribute( const char* name, bool* value ) const { const XMLAttribute* a = FindAttribute( name ); @@ -1413,7 +1435,11 @@ public: return QueryInt64Attribute(name, value); } - XMLError QueryAttribute( const char* name, bool* value ) const { + XMLError QueryAttribute(const char* name, uint64_t* value) const { + return QueryUnsigned64Attribute(name, value); + } + + XMLError QueryAttribute( const char* name, bool* value ) const { return QueryBoolAttribute( name, value ); } @@ -1447,7 +1473,13 @@ public: a->SetAttribute(value); } - /// Sets the named attribute to value. + /// Sets the named attribute to value. + void SetAttribute(const char* name, uint64_t value) { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + + /// Sets the named attribute to value. void SetAttribute( const char* name, bool value ) { XMLAttribute* a = FindOrCreateAttribute( name ); a->SetAttribute( value ); @@ -1546,6 +1578,8 @@ public: void SetText( unsigned value ); /// Convenience method for setting text inside an element. See SetText() for important limitations. void SetText(int64_t value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(uint64_t value); /// Convenience method for setting text inside an element. See SetText() for important limitations. void SetText( bool value ); /// Convenience method for setting text inside an element. See SetText() for important limitations. @@ -1585,6 +1619,8 @@ public: /// See QueryIntText() XMLError QueryInt64Text(int64_t* uval) const; /// See QueryIntText() + XMLError QueryUnsigned64Text(uint64_t* uval) const; + /// See QueryIntText() XMLError QueryBoolText( bool* bval ) const; /// See QueryIntText() XMLError QueryDoubleText( double* dval ) const; @@ -1597,6 +1633,8 @@ public: unsigned UnsignedText(unsigned defaultValue = 0) const; /// See QueryIntText() int64_t Int64Text(int64_t defaultValue = 0) const; + /// See QueryIntText() + uint64_t Unsigned64Text(uint64_t defaultValue = 0) const; /// See QueryIntText() bool BoolText(bool defaultValue = false) const; /// See QueryIntText() @@ -1684,7 +1722,7 @@ public: specified, TinyXML-2 will assume 'xml' points to a null terminated string. */ - XMLError Parse( const char* xml, size_t nBytes=(size_t)(-1) ); + XMLError Parse( const char* xml, size_t nBytes=static_cast(-1) ); /** Load an XML file from disk. @@ -2194,7 +2232,8 @@ public: void PushAttribute( const char* name, const char* value ); void PushAttribute( const char* name, int value ); void PushAttribute( const char* name, unsigned value ); - void PushAttribute(const char* name, int64_t value); + void PushAttribute( const char* name, int64_t value ); + void PushAttribute( const char* name, uint64_t value ); void PushAttribute( const char* name, bool value ); void PushAttribute( const char* name, double value ); /// If streaming, close the Element. @@ -2206,8 +2245,10 @@ public: void PushText( int value ); /// Add a text node from an unsigned. void PushText( unsigned value ); - /// Add a text node from an unsigned. - void PushText(int64_t value); + /// Add a text node from a signed 64bit integer. + void PushText( int64_t value ); + /// Add a text node from an unsigned 64bit integer. + void PushText( uint64_t value ); /// Add a text node from a bool. void PushText( bool value ); /// Add a text node from a float. @@ -2253,10 +2294,10 @@ public: If in print to memory mode, reset the buffer to the beginning. */ - void ClearBuffer() { + void ClearBuffer( bool resetToFirstElement = true ) { _buffer.Clear(); _buffer.Push(0); - _firstElement = true; + _firstElement = resetToFirstElement; } protected: diff --git a/xmltest.cpp b/xmltest.cpp old mode 100644 new mode 100755 index a0aaee7..5a07547 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -461,9 +461,9 @@ int main( int argc, const char ** argv ) // Build: // // + // // - // - // & Text! + // & Text! // XMLDocument* doc = new XMLDocument(); @@ -804,6 +804,7 @@ int main( int argc, const char ** argv ) // ---------- Attributes --------- { static const int64_t BIG = -123456789012345678; + static const uint64_t BIG_POS = 123456789012345678; XMLDocument doc; XMLElement* element = doc.NewElement("element"); doc.InsertFirstChild(element); @@ -864,7 +865,23 @@ int main( int argc, const char ** argv ) } XMLTest("Attribute: int64_t", BIG, element->Int64Attribute("attrib"), true); } - { + { + element->SetAttribute("attrib", BIG_POS); + { + uint64_t v = 0; + XMLError queryResult = element->QueryUnsigned64Attribute("attrib", &v); + XMLTest("Attribute: uint64_t", XML_SUCCESS, queryResult, true); + XMLTest("Attribute: uint64_t", BIG_POS, v, true); + } + { + uint64_t v = 0; + int queryResult = element->QueryAttribute("attrib", &v); + XMLTest("Attribute: uint64_t", (int)XML_SUCCESS, queryResult, true); + XMLTest("Attribute: uint64_t", BIG_POS, v, true); + } + XMLTest("Attribute: uint64_t", BIG_POS, element->Unsigned64Attribute("attrib"), true); + } + { element->SetAttribute("attrib", true); { bool v = false; @@ -931,7 +948,14 @@ int main( int argc, const char ** argv ) XMLTest("Element: int64_t", XML_SUCCESS, queryResult, true); XMLTest("Element: int64_t", BIG, v, true); } - } + { + element->SetText(BIG_POS); + uint64_t v = 0; + XMLError queryResult = element->QueryUnsigned64Text(&v); + XMLTest("Element: uint64_t", XML_SUCCESS, queryResult, true); + XMLTest("Element: uint64_t", BIG_POS, v, true); + } + } // ---------- XMLPrinter stream mode ------ { @@ -944,7 +968,8 @@ int main( int argc, const char ** argv ) printer.PushAttribute("attrib-int", int(1)); printer.PushAttribute("attrib-unsigned", unsigned(2)); printer.PushAttribute("attrib-int64", int64_t(3)); - printer.PushAttribute("attrib-bool", true); + printer.PushAttribute("attrib-uint64", uint64_t(37)); + printer.PushAttribute("attrib-bool", true); printer.PushAttribute("attrib-double", 4.0); printer.CloseElement(); fclose(printerfp); @@ -964,7 +989,9 @@ int main( int argc, const char ** argv ) XMLTest("attrib-unsigned", unsigned(2), attrib->UnsignedValue(), true); attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-int64"); XMLTest("attrib-int64", int64_t(3), attrib->Int64Value(), true); - attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-bool"); + attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-uint64"); + XMLTest("attrib-uint64", uint64_t(37), attrib->Unsigned64Value(), true); + attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-bool"); XMLTest("attrib-bool", true, attrib->BoolValue(), true); attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-double"); XMLTest("attrib-double", 4.0, attrib->DoubleValue(), true); @@ -1523,6 +1550,70 @@ int main( int argc, const char ** argv ) XMLTest( "Ill formed XML", true, doc.Error() ); } + { + //API:IntText(),UnsignedText(),Int64Text(),DoubleText(),BoolText() and FloatText() test + const char* xml = " -24 42 \ + 38 true 2.35 "; + XMLDocument doc; + doc.Parse(xml); + + const XMLElement* pointElement = doc.RootElement(); + int test1 = pointElement->FirstChildElement("IntText")->IntText(); + XMLTest("IntText() test", -24, test1); + + unsigned test2 = pointElement->FirstChildElement("UnsignedText")->UnsignedText(); + XMLTest("UnsignedText() test", static_cast(42), test2); + + int64_t test3 = pointElement->FirstChildElement("Int64Text")->Int64Text(); + XMLTest("Int64Text() test", static_cast(38), test3); + + double test4 = pointElement->FirstChildElement("DoubleText")->DoubleText(); + XMLTest("DoubleText() test", 2.35, test4); + + float test5 = pointElement->FirstChildElement("DoubleText")->FloatText(); + XMLTest("FloatText()) test", 2.35f, test5); + + bool test6 = pointElement->FirstChildElement("BoolText")->BoolText(); + XMLTest("FloatText()) test", true, test6); + } + + { + //API:ShallowEqual() test + const char* xml = "" + "voice" + ""; + XMLDocument doc; + doc.Parse( xml ); + const XMLNode* PlaylistNode = doc.RootElement(); + const XMLNode* PropertyNode = PlaylistNode->FirstChildElement(); + bool result; + result = PlaylistNode->ShallowEqual(PropertyNode); + XMLTest("ShallowEqual() test",false,result); + result = PlaylistNode->ShallowEqual(PlaylistNode); + XMLTest("ShallowEqual() test",true,result); + } + + { + //API: previousSiblingElement() and NextSiblingElement() test + const char* xml = "" + "voice" + "" + "" + ""; + XMLDocument doc; + doc.Parse( xml ); + XMLElement* ElementPlaylist = doc.FirstChildElement("playlist"); + XMLTest("previousSiblingElement() test",true,ElementPlaylist != 0); + const XMLElement* pre = ElementPlaylist->PreviousSiblingElement(); + XMLTest("previousSiblingElement() test",true,pre == 0); + const XMLElement* ElementBlank = ElementPlaylist->FirstChildElement("entry")->NextSiblingElement("blank"); + XMLTest("NextSiblingElement() test",true,ElementBlank != 0); + const XMLElement* next = ElementBlank->NextSiblingElement(); + XMLTest("NextSiblingElement() test",true,next == 0); + const XMLElement* ElementEntry = ElementBlank->PreviousSiblingElement("entry"); + XMLTest("PreviousSiblingElement test",true,ElementEntry != 0); + } + // QueryXYZText { const char* xml = " 1.2 1 38 true "; @@ -1702,12 +1793,12 @@ int main( int argc, const char ** argv ) doc.Print( &printer ); XMLTest( "BOM preservation (compare)", xml_bom_preservation, printer.CStr(), false, true ); - doc.SaveFile( "resources/bomtest.xml" ); + doc.SaveFile( "resources/out/bomtest.xml" ); XMLTest( "Save bomtest.xml", false, doc.Error() ); } { XMLDocument doc; - doc.LoadFile( "resources/bomtest.xml" ); + doc.LoadFile( "resources/out/bomtest.xml" ); XMLTest( "Load bomtest.xml", false, doc.Error() ); XMLTest( "BOM preservation (load)", true, doc.HasBOM(), false ); -- 2.7.4