diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 77b5cc4..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, "%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, "%u", value ) == 1 ) { + if (TIXML_SSCANF(str, IsPrefixHex(str) ? "%x" : "%u", value) == 1) { return true; } return false; @@ -671,7 +671,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; } @@ -681,7 +681,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 1beadaa..3c702ec 100755 --- a/tinyxml2.h +++ b/tinyxml2.h @@ -590,6 +590,11 @@ public: || ch == '-'; } + inline static bool IsPrefixHex( const char* p) { + 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 ) { if ( p == q ) { return true; @@ -1478,7 +1483,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 adcba6d..77cd6d7 100755 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -1674,6 +1674,24 @@ int main( int argc, const char ** argv ) XMLTest("FloatText()) test", true, test6); } + { + // 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 = ""