From dfb45cb73b24fed35c6749e00b3695f3da1ae2a6 Mon Sep 17 00:00:00 2001 From: netcan <1469709759@qq.com> Date: Sat, 15 Feb 2020 21:35:58 +0800 Subject: [PATCH 1/2] support IntText(),UnsignedText(),Int64Text() for hex value --- tinyxml2.cpp | 8 ++++---- tinyxml2.h | 9 ++++++++- xmltest.cpp | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 6b79917..d0479ba 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -596,7 +596,7 @@ void XMLUtil::ToStr( uint64_t v, char* buffer, int bufferSize ) bool XMLUtil::ToInt( const char* str, int* value ) { - if ( TIXML_SSCANF( str, "%d", value ) == 1 ) { + if ( TIXML_SSCANF( str, IsPrefixHex(str) ? "%x" : "%d", value ) == 1 ) { return true; } return false; @@ -604,7 +604,7 @@ bool XMLUtil::ToInt( const char* str, int* value ) bool XMLUtil::ToUnsigned( const char* str, unsigned *value ) { - if ( TIXML_SSCANF( str, "%u", value ) == 1 ) { + if ( TIXML_SSCANF( str, IsPrefixHex(str) ? "%x" : "%u", value ) == 1 ) { return true; } return false; @@ -657,7 +657,7 @@ bool XMLUtil::ToDouble( const char* str, double* value ) 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) { + if (TIXML_SSCANF(str, IsPrefixHex(str) ? "%llx" : "%lld", &v) == 1) { *value = static_cast(v); return true; } @@ -667,7 +667,7 @@ bool XMLUtil::ToInt64(const char* str, int64_t* value) 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) { + if(TIXML_SSCANF(str, IsPrefixHex(str) ? "%llx" : "%llu", &v) == 1) { *value = (uint64_t)v; return true; } diff --git a/tinyxml2.h b/tinyxml2.h index a432f7e..9646e85 100755 --- a/tinyxml2.h +++ b/tinyxml2.h @@ -590,6 +590,13 @@ public: || ch == '-'; } + inline static bool IsPrefixHex( const char* p) { + while (p && *p != '\0' && !isdigit(*p)) { + ++p; + } + return *p == '0' && ( *(p + 1) == 'x' || *(p + 1) == 'X'); + } + inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) { if ( p == q ) { return true; @@ -1478,7 +1485,7 @@ public: XMLAttribute* a = FindOrCreateAttribute(name); a->SetAttribute(value); } - + /// Sets the named attribute to value. void SetAttribute( const char* name, bool value ) { XMLAttribute* a = FindOrCreateAttribute( name ); diff --git a/xmltest.cpp b/xmltest.cpp index 5a07547..a4c71a2 100755 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -1577,6 +1577,24 @@ int main( int argc, const char ** argv ) XMLTest("FloatText()) test", true, test6); } + { + //API:IntText(),UnsignedText(),Int64Text(), hex value test + const char* xml = " -0x2020 0x2020 \ + +0x1234"; + XMLDocument doc; + doc.Parse(xml); + + const XMLElement* pointElement = doc.RootElement(); + int test1 = pointElement->FirstChildElement("IntText")->IntText(); + XMLTest("IntText() hex value test", -0x2020, test1); + + unsigned test2 = pointElement->FirstChildElement("UnsignedText")->UnsignedText(); + XMLTest("UnsignedText() hex value test", static_cast(0x2020), test2); + + int64_t test3 = pointElement->FirstChildElement("Int64Text")->Int64Text(); + XMLTest("Int64Text() hex value test", static_cast(+0x1234), test3); + } + { //API:ShallowEqual() test const char* xml = "" From 18468b8cc463f49808c27ab4d21634eb50a20ad6 Mon Sep 17 00:00:00 2001 From: Lee Thomason Date: Sat, 13 Jun 2020 17:35:21 -0700 Subject: [PATCH 2/2] minor changes to hex parsing --- tinyxml2.cpp | 8 ++++---- tinyxml2.h | 6 ++---- xmltest.cpp | 10 +++++----- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 5050064..b9c94e9 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -608,17 +608,17 @@ void XMLUtil::ToStr( uint64_t v, char* buffer, int bufferSize ) TIXML_SNPRINTF(buffer, bufferSize, "%llu", (long long)v); } -bool XMLUtil::ToInt( const char* str, int* value ) +bool XMLUtil::ToInt(const char* str, int* value) { - if ( TIXML_SSCANF( str, IsPrefixHex(str) ? "%x" : "%d", value ) == 1 ) { + if (TIXML_SSCANF(str, IsPrefixHex(str) ? "%x" : "%d", value) == 1) { return true; } return false; } -bool XMLUtil::ToUnsigned( const char* str, unsigned *value ) +bool XMLUtil::ToUnsigned(const char* str, unsigned* value) { - if ( TIXML_SSCANF( str, IsPrefixHex(str) ? "%x" : "%u", value ) == 1 ) { + if (TIXML_SSCANF(str, IsPrefixHex(str) ? "%x" : "%u", value) == 1) { return true; } return false; diff --git a/tinyxml2.h b/tinyxml2.h index c577af4..3c702ec 100755 --- a/tinyxml2.h +++ b/tinyxml2.h @@ -591,10 +591,8 @@ public: } inline static bool IsPrefixHex( const char* p) { - while (p && *p != '\0' && !isdigit(*p)) { - ++p; - } - return *p == '0' && ( *(p + 1) == 'x' || *(p + 1) == 'X'); + p = SkipWhiteSpace(p, 0); + return p && *p == '0' && ( *(p + 1) == 'x' || *(p + 1) == 'X'); } inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) { diff --git a/xmltest.cpp b/xmltest.cpp index aaed91f..77cd6d7 100755 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -1675,21 +1675,21 @@ int main( int argc, const char ** argv ) } { - //API:IntText(),UnsignedText(),Int64Text(), hex value test - const char* xml = " -0x2020 0x2020 \ - +0x1234"; + // hex value test + const char* xml = " 0x2020 0X2020 \ + 0x1234"; XMLDocument doc; doc.Parse(xml); const XMLElement* pointElement = doc.RootElement(); int test1 = pointElement->FirstChildElement("IntText")->IntText(); - XMLTest("IntText() hex value test", -0x2020, test1); + XMLTest("IntText() hex value test", 0x2020, test1); unsigned test2 = pointElement->FirstChildElement("UnsignedText")->UnsignedText(); XMLTest("UnsignedText() hex value test", static_cast(0x2020), test2); int64_t test3 = pointElement->FirstChildElement("Int64Text")->Int64Text(); - XMLTest("Int64Text() hex value test", static_cast(+0x1234), test3); + XMLTest("Int64Text() hex value test", static_cast(0x1234), test3); } {