Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c740e8d23 | ||
|
|
50daa32fc2 | ||
|
|
f60928eaa4 | ||
|
|
4994f1cc57 | ||
|
|
5bf58f0d1f | ||
|
|
141d2117ba | ||
|
|
87aaa25922 | ||
|
|
c3601c62f6 | ||
|
|
effdf95f8c | ||
|
|
c36d59f6b5 | ||
|
|
7fd646a8a2 | ||
|
|
1675bec2f2 | ||
|
|
f12d7a241f | ||
|
|
e08c2d2e0e | ||
|
|
38f7d65b4a | ||
|
|
c341cea501 | ||
|
|
710a3324f4 | ||
|
|
4add958b49 | ||
|
|
eda7f81b1f | ||
|
|
1dbfe31858 | ||
|
|
47e229e189 | ||
|
|
75a5acc6bb | ||
|
|
61a4c7d507 | ||
|
|
db39dbc0fd | ||
|
|
eb2b8c47c4 | ||
|
|
bd5a1414df | ||
|
|
e1b3013182 | ||
|
|
0e7f289590 | ||
|
|
f5641e5470 | ||
|
|
8f4a9a8cc2 | ||
|
|
d944ef762f |
@@ -21,7 +21,7 @@ include(CTest)
|
|||||||
################################
|
################################
|
||||||
# set lib version here
|
# set lib version here
|
||||||
|
|
||||||
set(GENERIC_LIB_VERSION "7.0.1")
|
set(GENERIC_LIB_VERSION "7.1.0")
|
||||||
set(GENERIC_LIB_SOVERSION "7")
|
set(GENERIC_LIB_SOVERSION "7")
|
||||||
|
|
||||||
################################
|
################################
|
||||||
@@ -121,8 +121,14 @@ configure_package_config_file(
|
|||||||
"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake"
|
"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake"
|
||||||
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}"
|
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
|
install(FILES
|
||||||
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake
|
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake
|
||||||
|
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME})
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME})
|
||||||
|
|
||||||
install(EXPORT ${CMAKE_PROJECT_NAME}Targets NAMESPACE tinyxml2::
|
install(EXPORT ${CMAKE_PROJECT_NAME}Targets NAMESPACE tinyxml2::
|
||||||
|
|||||||
18
LICENSE.txt
Normal file
18
LICENSE.txt
Normal file
@@ -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.
|
||||||
6
dox
6
dox
@@ -38,11 +38,7 @@ PROJECT_NAME = "TinyXML-2"
|
|||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
# control system is used.
|
# control system is used.
|
||||||
|
|
||||||
<<<<<<< HEAD
|
PROJECT_NUMBER = 7.1.0
|
||||||
PROJECT_NUMBER = 7.0.1
|
|
||||||
=======
|
|
||||||
PROJECT_NUMBER = 7.0.1
|
|
||||||
>>>>>>> master
|
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# 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
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
|
|||||||
@@ -54,9 +54,8 @@ What it doesn't do.
|
|||||||
|
|
||||||
TinyXML-2 doesn't parse or use DTDs (Document Type Definitions) or XSLs
|
TinyXML-2 doesn't parse or use DTDs (Document Type Definitions) or XSLs
|
||||||
(eXtensible Stylesheet Language.) There are other parsers out there
|
(eXtensible Stylesheet Language.) There are other parsers out there
|
||||||
that are much more fully featured. But they are also much bigger,
|
that are much more fully featured. But they are generally bigger and
|
||||||
take longer to set up in your project, have a higher learning curve,
|
more difficult to use. If you are working with
|
||||||
and often have a more restrictive license. If you are working with
|
|
||||||
browsers or have more complete XML needs, TinyXML-2 is not the parser for you.
|
browsers or have more complete XML needs, TinyXML-2 is not the parser for you.
|
||||||
|
|
||||||
TinyXML-1 vs. TinyXML-2
|
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,
|
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.
|
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.
|
don't want to use a build system.
|
||||||
|
|
||||||
Versioning
|
Versioning
|
||||||
@@ -279,7 +278,7 @@ common.
|
|||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
The documentation is build with Doxygen, using the 'dox'
|
The documentation is built with Doxygen, using the 'dox'
|
||||||
configuration file.
|
configuration file.
|
||||||
|
|
||||||
License
|
License
|
||||||
|
|||||||
160
tinyxml2.cpp
160
tinyxml2.cpp
@@ -45,14 +45,14 @@ distribution.
|
|||||||
{
|
{
|
||||||
va_list va;
|
va_list va;
|
||||||
va_start( va, format );
|
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 );
|
va_end( va );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int TIXML_VSNPRINTF( char* buffer, size_t size, const char* format, va_list va )
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,9 +101,9 @@ distribution.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static const char LINE_FEED = (char)0x0a; // all line endings are normalized to LF
|
static const char LINE_FEED = static_cast<char>(0x0a); // all line endings are normalized to LF
|
||||||
static const char LF = LINE_FEED;
|
static const char LF = LINE_FEED;
|
||||||
static const char CARRIAGE_RETURN = (char)0x0d; // CR gets filtered out
|
static const char CARRIAGE_RETURN = static_cast<char>(0x0d); // CR gets filtered out
|
||||||
static const char CR = CARRIAGE_RETURN;
|
static const char CR = CARRIAGE_RETURN;
|
||||||
static const char SINGLE_QUOTE = '\'';
|
static const char SINGLE_QUOTE = '\'';
|
||||||
static const char DOUBLE_QUOTE = '\"';
|
static const char DOUBLE_QUOTE = '\"';
|
||||||
@@ -197,7 +197,7 @@ char* StrPair::ParseText( char* p, const char* endTag, int strFlags, int* curLin
|
|||||||
TIXMLASSERT(curLineNumPtr);
|
TIXMLASSERT(curLineNumPtr);
|
||||||
|
|
||||||
char* start = p;
|
char* start = p;
|
||||||
char endChar = *endTag;
|
const char endChar = *endTag;
|
||||||
size_t length = strlen( endTag );
|
size_t length = strlen( endTag );
|
||||||
|
|
||||||
// Inner loop of text parsing.
|
// Inner loop of text parsing.
|
||||||
@@ -310,7 +310,7 @@ const char* StrPair::GetStr()
|
|||||||
const int buflen = 10;
|
const int buflen = 10;
|
||||||
char buf[buflen] = { 0 };
|
char buf[buflen] = { 0 };
|
||||||
int len = 0;
|
int len = 0;
|
||||||
char* adjusted = const_cast<char*>( XMLUtil::GetCharacterRef( p, buf, &len ) );
|
const char* adjusted = const_cast<char*>( XMLUtil::GetCharacterRef( p, buf, &len ) );
|
||||||
if ( adjusted == 0 ) {
|
if ( adjusted == 0 ) {
|
||||||
*q = *p;
|
*q = *p;
|
||||||
++p;
|
++p;
|
||||||
@@ -430,22 +430,22 @@ void XMLUtil::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length
|
|||||||
switch (*length) {
|
switch (*length) {
|
||||||
case 4:
|
case 4:
|
||||||
--output;
|
--output;
|
||||||
*output = (char)((input | BYTE_MARK) & BYTE_MASK);
|
*output = static_cast<char>((input | BYTE_MARK) & BYTE_MASK);
|
||||||
input >>= 6;
|
input >>= 6;
|
||||||
//fall through
|
//fall through
|
||||||
case 3:
|
case 3:
|
||||||
--output;
|
--output;
|
||||||
*output = (char)((input | BYTE_MARK) & BYTE_MASK);
|
*output = static_cast<char>((input | BYTE_MARK) & BYTE_MASK);
|
||||||
input >>= 6;
|
input >>= 6;
|
||||||
//fall through
|
//fall through
|
||||||
case 2:
|
case 2:
|
||||||
--output;
|
--output;
|
||||||
*output = (char)((input | BYTE_MARK) & BYTE_MASK);
|
*output = static_cast<char>((input | BYTE_MARK) & BYTE_MASK);
|
||||||
input >>= 6;
|
input >>= 6;
|
||||||
//fall through
|
//fall through
|
||||||
case 1:
|
case 1:
|
||||||
--output;
|
--output;
|
||||||
*output = (char)(input | FIRST_BYTE_MARK[*length]);
|
*output = static_cast<char>(input | FIRST_BYTE_MARK[*length]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
TIXMLASSERT( false );
|
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
|
// 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<long long>(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 )
|
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;
|
*value = (ival==0) ? false : true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if ( StringEqual( str, "true" ) ) {
|
static const char* TRUE[] = { "true", "True", "TRUE", 0 };
|
||||||
*value = true;
|
static const char* FALSE[] = { "false", "False", "FALSE", 0 };
|
||||||
return true;
|
|
||||||
|
for (int i = 0; TRUE[i]; ++i) {
|
||||||
|
if (StringEqual(str, TRUE[i])) {
|
||||||
|
*value = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if ( StringEqual( str, "false" ) ) {
|
for (int i = 0; FALSE[i]; ++i) {
|
||||||
*value = false;
|
if (StringEqual(str, FALSE[i])) {
|
||||||
return true;
|
*value = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
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
|
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, "%lld", &v) == 1) {
|
||||||
*value = (int64_t)v;
|
*value = static_cast<int64_t>(v);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
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 )
|
char* XMLDocument::Identify( char* p, XMLNode** node )
|
||||||
{
|
{
|
||||||
TIXMLASSERT( node );
|
TIXMLASSERT( node );
|
||||||
@@ -1017,7 +1039,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr )
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int initialLineNum = node->_parseLineNum;
|
const int initialLineNum = node->_parseLineNum;
|
||||||
|
|
||||||
StrPair endTag;
|
StrPair endTag;
|
||||||
p = node->ParseDeep( p, &endTag, curLineNumPtr );
|
p = node->ParseDeep( p, &endTag, curLineNumPtr );
|
||||||
@@ -1029,7 +1051,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr )
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
XMLDeclaration* decl = node->ToDeclaration();
|
const XMLDeclaration* const decl = node->ToDeclaration();
|
||||||
if ( decl ) {
|
if ( decl ) {
|
||||||
// Declarations are only allowed at document level
|
// 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
|
// Optimized due to a security test case. If the first node is
|
||||||
// a declaration, and the last node is a declaration, then only
|
// 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;
|
bool wellLocated = false;
|
||||||
|
|
||||||
if (ToDocument()) {
|
if (ToDocument()) {
|
||||||
@@ -1373,7 +1395,7 @@ char* XMLAttribute::ParseDeep( char* p, bool processEntities, int* curLineNumPtr
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char endTag[2] = { *p, 0 };
|
const char endTag[2] = { *p, 0 };
|
||||||
++p; // move past opening quote
|
++p; // move past opening quote
|
||||||
|
|
||||||
p = _value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES, curLineNumPtr );
|
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
|
XMLError XMLAttribute::QueryBoolValue( bool* value ) const
|
||||||
{
|
{
|
||||||
if ( XMLUtil::ToBool( Value(), value )) {
|
if ( XMLUtil::ToBool( Value(), value )) {
|
||||||
@@ -1470,6 +1501,12 @@ void XMLAttribute::SetAttribute(int64_t v)
|
|||||||
_value.SetStr(buf);
|
_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 )
|
void XMLAttribute::SetAttribute( bool v )
|
||||||
@@ -1556,6 +1593,13 @@ int64_t XMLElement::Int64Attribute(const char* name, int64_t defaultValue) const
|
|||||||
return i;
|
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 XMLElement::BoolAttribute(const char* name, bool defaultValue) const
|
||||||
{
|
{
|
||||||
bool b = defaultValue;
|
bool b = defaultValue;
|
||||||
@@ -1620,6 +1664,12 @@ void XMLElement::SetText(int64_t v)
|
|||||||
SetText(buf);
|
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 )
|
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
|
XMLError XMLElement::QueryBoolText( bool* bval ) const
|
||||||
{
|
{
|
||||||
if ( FirstChild() && FirstChild()->ToText() ) {
|
if ( FirstChild() && FirstChild()->ToText() ) {
|
||||||
@@ -1743,6 +1806,13 @@ int64_t XMLElement::Int64Text(int64_t defaultValue) const
|
|||||||
return i;
|
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 XMLElement::BoolText(bool defaultValue) const
|
||||||
{
|
{
|
||||||
bool b = defaultValue;
|
bool b = defaultValue;
|
||||||
@@ -1830,7 +1900,7 @@ char* XMLElement::ParseAttributes( char* p, int* curLineNumPtr )
|
|||||||
TIXMLASSERT( attrib );
|
TIXMLASSERT( attrib );
|
||||||
attrib->_parseLineNum = _document->_parseCurLineNum;
|
attrib->_parseLineNum = _document->_parseCurLineNum;
|
||||||
|
|
||||||
int attrLineNum = attrib->_parseLineNum;
|
const int attrLineNum = attrib->_parseLineNum;
|
||||||
|
|
||||||
p = attrib->ParseDeep( p, _document->ProcessEntities(), curLineNumPtr );
|
p = attrib->ParseDeep( p, _document->ProcessEntities(), curLineNumPtr );
|
||||||
if ( !p || Attribute( attrib->Name() ) ) {
|
if ( !p || Attribute( attrib->Name() ) ) {
|
||||||
@@ -2136,7 +2206,7 @@ static FILE* callfopen( const char* filepath, const char* mode )
|
|||||||
TIXMLASSERT( mode );
|
TIXMLASSERT( mode );
|
||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE)
|
#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE)
|
||||||
FILE* fp = 0;
|
FILE* fp = 0;
|
||||||
errno_t err = fopen_s( &fp, filepath, mode );
|
const errno_t err = fopen_s( &fp, filepath, mode );
|
||||||
if ( err ) {
|
if ( err ) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -2194,7 +2264,7 @@ template
|
|||||||
struct LongFitsIntoSizeTMinusOne {
|
struct LongFitsIntoSizeTMinusOne {
|
||||||
static bool Fits( unsigned long value )
|
static bool Fits( unsigned long value )
|
||||||
{
|
{
|
||||||
return value < (size_t)-1;
|
return value < static_cast<size_t>(-1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2239,7 +2309,7 @@ XMLError XMLDocument::LoadFile( FILE* fp )
|
|||||||
const size_t size = filelength;
|
const size_t size = filelength;
|
||||||
TIXMLASSERT( _charBuffer == 0 );
|
TIXMLASSERT( _charBuffer == 0 );
|
||||||
_charBuffer = new char[size+1];
|
_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 ) {
|
if ( read != size ) {
|
||||||
SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 );
|
SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 );
|
||||||
return _errorID;
|
return _errorID;
|
||||||
@@ -2290,7 +2360,7 @@ XMLError XMLDocument::Parse( const char* p, size_t len )
|
|||||||
SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
|
SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 );
|
||||||
return _errorID;
|
return _errorID;
|
||||||
}
|
}
|
||||||
if ( len == (size_t)(-1) ) {
|
if ( len == static_cast<size_t>(-1) ) {
|
||||||
len = strlen( p );
|
len = strlen( p );
|
||||||
}
|
}
|
||||||
TIXMLASSERT( _charBuffer == 0 );
|
TIXMLASSERT( _charBuffer == 0 );
|
||||||
@@ -2332,7 +2402,7 @@ void XMLDocument::SetError( XMLError error, int lineNum, const char* format, ...
|
|||||||
_errorLineNum = lineNum;
|
_errorLineNum = lineNum;
|
||||||
_errorStr.Reset();
|
_errorStr.Reset();
|
||||||
|
|
||||||
size_t BUFFER_SIZE = 1000;
|
const size_t BUFFER_SIZE = 1000;
|
||||||
char* buffer = new char[BUFFER_SIZE];
|
char* buffer = new char[BUFFER_SIZE];
|
||||||
|
|
||||||
TIXMLASSERT(sizeof(error) <= sizeof(int));
|
TIXMLASSERT(sizeof(error) <= sizeof(int));
|
||||||
@@ -2424,13 +2494,13 @@ XMLPrinter::XMLPrinter( FILE* file, bool compact, int depth ) :
|
|||||||
}
|
}
|
||||||
for( int i=0; i<NUM_ENTITIES; ++i ) {
|
for( int i=0; i<NUM_ENTITIES; ++i ) {
|
||||||
const char entityValue = entities[i].value;
|
const char entityValue = entities[i].value;
|
||||||
const unsigned char flagIndex = (unsigned char)entityValue;
|
const unsigned char flagIndex = static_cast<unsigned char>(entityValue);
|
||||||
TIXMLASSERT( flagIndex < ENTITY_RANGE );
|
TIXMLASSERT( flagIndex < ENTITY_RANGE );
|
||||||
_entityFlag[flagIndex] = true;
|
_entityFlag[flagIndex] = true;
|
||||||
}
|
}
|
||||||
_restrictedEntityFlag[(unsigned char)'&'] = true;
|
_restrictedEntityFlag[static_cast<unsigned char>('&')] = true;
|
||||||
_restrictedEntityFlag[(unsigned char)'<'] = true;
|
_restrictedEntityFlag[static_cast<unsigned char>('<')] = true;
|
||||||
_restrictedEntityFlag[(unsigned char)'>'] = true; // not required, but consistency is nice
|
_restrictedEntityFlag[static_cast<unsigned char>('>')] = true; // not required, but consistency is nice
|
||||||
_buffer.Push( 0 );
|
_buffer.Push( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2505,10 +2575,10 @@ void XMLPrinter::PrintString( const char* p, bool restricted )
|
|||||||
// Check for entities. If one is found, flush
|
// Check for entities. If one is found, flush
|
||||||
// the stream up until the entity, write the
|
// the stream up until the entity, write the
|
||||||
// entity, and keep looking.
|
// entity, and keep looking.
|
||||||
if ( flag[(unsigned char)(*q)] ) {
|
if ( flag[static_cast<unsigned char>(*q)] ) {
|
||||||
while ( p < q ) {
|
while ( p < q ) {
|
||||||
const size_t delta = q - p;
|
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<int>(delta);
|
||||||
Write( p, toPrint );
|
Write( p, toPrint );
|
||||||
p += toPrint;
|
p += toPrint;
|
||||||
}
|
}
|
||||||
@@ -2536,7 +2606,7 @@ void XMLPrinter::PrintString( const char* p, bool restricted )
|
|||||||
// string if an entity wasn't found.
|
// string if an entity wasn't found.
|
||||||
if ( p < q ) {
|
if ( p < q ) {
|
||||||
const size_t delta = q - p;
|
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<int>(delta);
|
||||||
Write( p, toPrint );
|
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 )
|
void XMLPrinter::PushAttribute( const char* name, bool v )
|
||||||
{
|
{
|
||||||
char buf[BUF_SIZE];
|
char buf[BUF_SIZE];
|
||||||
@@ -2683,6 +2761,7 @@ void XMLPrinter::PushText( const char* text, bool cdata )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void XMLPrinter::PushText( int64_t value )
|
void XMLPrinter::PushText( int64_t value )
|
||||||
{
|
{
|
||||||
char buf[BUF_SIZE];
|
char buf[BUF_SIZE];
|
||||||
@@ -2690,6 +2769,15 @@ void XMLPrinter::PushText( int64_t value )
|
|||||||
PushText( buf, false );
|
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 )
|
void XMLPrinter::PushText( int value )
|
||||||
{
|
{
|
||||||
char buf[BUF_SIZE];
|
char buf[BUF_SIZE];
|
||||||
|
|||||||
71
tinyxml2.h
71
tinyxml2.h
@@ -99,12 +99,12 @@ distribution.
|
|||||||
http://semver.org/
|
http://semver.org/
|
||||||
*/
|
*/
|
||||||
static const int TIXML2_MAJOR_VERSION = 7;
|
static const int TIXML2_MAJOR_VERSION = 7;
|
||||||
static const int TIXML2_MINOR_VERSION = 0;
|
static const int TIXML2_MINOR_VERSION = 1;
|
||||||
static const int TIXML2_PATCH_VERSION = 1;
|
static const int TIXML2_PATCH_VERSION = 0;
|
||||||
|
|
||||||
#define TINYXML2_MAJOR_VERSION 7
|
#define TINYXML2_MAJOR_VERSION 7
|
||||||
#define TINYXML2_MINOR_VERSION 0
|
#define TINYXML2_MINOR_VERSION 1
|
||||||
#define TINYXML2_PATCH_VERSION 1
|
#define TINYXML2_PATCH_VERSION 0
|
||||||
|
|
||||||
// A fixed element depth limit is problematic. There needs to be a
|
// A fixed element depth limit is problematic. There needs to be a
|
||||||
// limit to avoid a stack overflow. However, that limit varies per
|
// limit to avoid a stack overflow. However, that limit varies per
|
||||||
@@ -303,7 +303,7 @@ private:
|
|||||||
TIXMLASSERT( cap > 0 );
|
TIXMLASSERT( cap > 0 );
|
||||||
if ( cap > _allocated ) {
|
if ( cap > _allocated ) {
|
||||||
TIXMLASSERT( cap <= INT_MAX / 2 );
|
TIXMLASSERT( cap <= INT_MAX / 2 );
|
||||||
int newAllocated = cap * 2;
|
const int newAllocated = cap * 2;
|
||||||
T* newMem = new T[newAllocated];
|
T* newMem = new T[newAllocated];
|
||||||
TIXMLASSERT( newAllocated >= _size );
|
TIXMLASSERT( newAllocated >= _size );
|
||||||
memcpy( newMem, _mem, sizeof(T)*_size ); // warning: not using constructors, only works for PODs
|
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( float v, char* buffer, int bufferSize );
|
||||||
static void ToStr( double 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(int64_t v, char* buffer, int bufferSize);
|
||||||
|
static void ToStr(uint64_t v, char* buffer, int bufferSize);
|
||||||
|
|
||||||
// converts strings to primitive types
|
// converts strings to primitive types
|
||||||
static bool ToInt( const char* str, int* value );
|
static bool ToInt( const char* str, int* value );
|
||||||
@@ -625,7 +626,7 @@ public:
|
|||||||
static bool ToFloat( const char* str, float* value );
|
static bool ToFloat( const char* str, float* value );
|
||||||
static bool ToDouble( const char* str, double* value );
|
static bool ToDouble( const char* str, double* value );
|
||||||
static bool ToInt64(const char* str, int64_t* 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.
|
// Changes what is serialized for a boolean value.
|
||||||
// Default to "true" and "false". Shouldn't be changed
|
// Default to "true" and "false". Shouldn't be changed
|
||||||
// unless you have a special testing or compatibility need.
|
// unless you have a special testing or compatibility need.
|
||||||
@@ -1164,6 +1165,12 @@ public:
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t Unsigned64Value() const {
|
||||||
|
uint64_t i = 0;
|
||||||
|
QueryUnsigned64Value(&i);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
/// Query as an unsigned integer. See IntValue()
|
/// Query as an unsigned integer. See IntValue()
|
||||||
unsigned UnsignedValue() const {
|
unsigned UnsignedValue() const {
|
||||||
unsigned i=0;
|
unsigned i=0;
|
||||||
@@ -1198,6 +1205,8 @@ public:
|
|||||||
XMLError QueryUnsignedValue( unsigned int* value ) const;
|
XMLError QueryUnsignedValue( unsigned int* value ) const;
|
||||||
/// See QueryIntValue
|
/// See QueryIntValue
|
||||||
XMLError QueryInt64Value(int64_t* value) const;
|
XMLError QueryInt64Value(int64_t* value) const;
|
||||||
|
/// See QueryIntValue
|
||||||
|
XMLError QueryUnsigned64Value(uint64_t* value) const;
|
||||||
/// See QueryIntValue
|
/// See QueryIntValue
|
||||||
XMLError QueryBoolValue( bool* value ) const;
|
XMLError QueryBoolValue( bool* value ) const;
|
||||||
/// See QueryIntValue
|
/// See QueryIntValue
|
||||||
@@ -1213,7 +1222,9 @@ public:
|
|||||||
void SetAttribute( unsigned value );
|
void SetAttribute( unsigned value );
|
||||||
/// Set the attribute to value.
|
/// Set the attribute to value.
|
||||||
void SetAttribute(int64_t 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 );
|
void SetAttribute( bool value );
|
||||||
/// Set the attribute to value.
|
/// Set the attribute to value.
|
||||||
void SetAttribute( double value );
|
void SetAttribute( double value );
|
||||||
@@ -1301,6 +1312,8 @@ public:
|
|||||||
unsigned UnsignedAttribute(const char* name, unsigned defaultValue = 0) const;
|
unsigned UnsignedAttribute(const char* name, unsigned defaultValue = 0) const;
|
||||||
/// See IntAttribute()
|
/// See IntAttribute()
|
||||||
int64_t Int64Attribute(const char* name, int64_t defaultValue = 0) const;
|
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()
|
/// See IntAttribute()
|
||||||
bool BoolAttribute(const char* name, bool defaultValue = false) const;
|
bool BoolAttribute(const char* name, bool defaultValue = false) const;
|
||||||
/// See IntAttribute()
|
/// See IntAttribute()
|
||||||
@@ -1347,6 +1360,15 @@ public:
|
|||||||
return a->QueryInt64Value(value);
|
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()
|
/// See QueryIntAttribute()
|
||||||
XMLError QueryBoolAttribute( const char* name, bool* value ) const {
|
XMLError QueryBoolAttribute( const char* name, bool* value ) const {
|
||||||
const XMLAttribute* a = FindAttribute( name );
|
const XMLAttribute* a = FindAttribute( name );
|
||||||
@@ -1413,7 +1435,11 @@ public:
|
|||||||
return QueryInt64Attribute(name, value);
|
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 );
|
return QueryBoolAttribute( name, value );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1447,7 +1473,13 @@ public:
|
|||||||
a->SetAttribute(value);
|
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 ) {
|
void SetAttribute( const char* name, bool value ) {
|
||||||
XMLAttribute* a = FindOrCreateAttribute( name );
|
XMLAttribute* a = FindOrCreateAttribute( name );
|
||||||
a->SetAttribute( value );
|
a->SetAttribute( value );
|
||||||
@@ -1546,6 +1578,8 @@ public:
|
|||||||
void SetText( unsigned value );
|
void SetText( unsigned value );
|
||||||
/// Convenience method for setting text inside an element. See SetText() for important limitations.
|
/// Convenience method for setting text inside an element. See SetText() for important limitations.
|
||||||
void SetText(int64_t value);
|
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.
|
/// Convenience method for setting text inside an element. See SetText() for important limitations.
|
||||||
void SetText( bool value );
|
void SetText( bool value );
|
||||||
/// Convenience method for setting text inside an element. See SetText() for important limitations.
|
/// Convenience method for setting text inside an element. See SetText() for important limitations.
|
||||||
@@ -1585,6 +1619,8 @@ public:
|
|||||||
/// See QueryIntText()
|
/// See QueryIntText()
|
||||||
XMLError QueryInt64Text(int64_t* uval) const;
|
XMLError QueryInt64Text(int64_t* uval) const;
|
||||||
/// See QueryIntText()
|
/// See QueryIntText()
|
||||||
|
XMLError QueryUnsigned64Text(uint64_t* uval) const;
|
||||||
|
/// See QueryIntText()
|
||||||
XMLError QueryBoolText( bool* bval ) const;
|
XMLError QueryBoolText( bool* bval ) const;
|
||||||
/// See QueryIntText()
|
/// See QueryIntText()
|
||||||
XMLError QueryDoubleText( double* dval ) const;
|
XMLError QueryDoubleText( double* dval ) const;
|
||||||
@@ -1597,6 +1633,8 @@ public:
|
|||||||
unsigned UnsignedText(unsigned defaultValue = 0) const;
|
unsigned UnsignedText(unsigned defaultValue = 0) const;
|
||||||
/// See QueryIntText()
|
/// See QueryIntText()
|
||||||
int64_t Int64Text(int64_t defaultValue = 0) const;
|
int64_t Int64Text(int64_t defaultValue = 0) const;
|
||||||
|
/// See QueryIntText()
|
||||||
|
uint64_t Unsigned64Text(uint64_t defaultValue = 0) const;
|
||||||
/// See QueryIntText()
|
/// See QueryIntText()
|
||||||
bool BoolText(bool defaultValue = false) const;
|
bool BoolText(bool defaultValue = false) const;
|
||||||
/// See QueryIntText()
|
/// See QueryIntText()
|
||||||
@@ -1684,7 +1722,7 @@ public:
|
|||||||
specified, TinyXML-2 will assume 'xml' points to a
|
specified, TinyXML-2 will assume 'xml' points to a
|
||||||
null terminated string.
|
null terminated string.
|
||||||
*/
|
*/
|
||||||
XMLError Parse( const char* xml, size_t nBytes=(size_t)(-1) );
|
XMLError Parse( const char* xml, size_t nBytes=static_cast<size_t>(-1) );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Load an XML file from disk.
|
Load an XML file from disk.
|
||||||
@@ -2194,7 +2232,8 @@ public:
|
|||||||
void PushAttribute( const char* name, const char* value );
|
void PushAttribute( const char* name, const char* value );
|
||||||
void PushAttribute( const char* name, int value );
|
void PushAttribute( const char* name, int value );
|
||||||
void PushAttribute( const char* name, unsigned 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, bool value );
|
||||||
void PushAttribute( const char* name, double value );
|
void PushAttribute( const char* name, double value );
|
||||||
/// If streaming, close the Element.
|
/// If streaming, close the Element.
|
||||||
@@ -2206,8 +2245,10 @@ public:
|
|||||||
void PushText( int value );
|
void PushText( int value );
|
||||||
/// Add a text node from an unsigned.
|
/// Add a text node from an unsigned.
|
||||||
void PushText( unsigned value );
|
void PushText( unsigned value );
|
||||||
/// Add a text node from an unsigned.
|
/// Add a text node from a signed 64bit integer.
|
||||||
void PushText(int64_t value);
|
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.
|
/// Add a text node from a bool.
|
||||||
void PushText( bool value );
|
void PushText( bool value );
|
||||||
/// Add a text node from a float.
|
/// Add a text node from a float.
|
||||||
@@ -2253,10 +2294,10 @@ public:
|
|||||||
If in print to memory mode, reset the buffer to the
|
If in print to memory mode, reset the buffer to the
|
||||||
beginning.
|
beginning.
|
||||||
*/
|
*/
|
||||||
void ClearBuffer() {
|
void ClearBuffer( bool resetToFirstElement = true ) {
|
||||||
_buffer.Clear();
|
_buffer.Clear();
|
||||||
_buffer.Push(0);
|
_buffer.Push(0);
|
||||||
_firstElement = true;
|
_firstElement = resetToFirstElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
107
xmltest.cpp
Normal file → Executable file
107
xmltest.cpp
Normal file → Executable file
@@ -461,9 +461,9 @@ int main( int argc, const char ** argv )
|
|||||||
// Build:
|
// Build:
|
||||||
// <element>
|
// <element>
|
||||||
// <!--comment-->
|
// <!--comment-->
|
||||||
|
// <sub attrib="0" />
|
||||||
// <sub attrib="1" />
|
// <sub attrib="1" />
|
||||||
// <sub attrib="2" />
|
// <sub attrib="2" >& Text!</sub>
|
||||||
// <sub attrib="3" >& Text!</sub>
|
|
||||||
// <element>
|
// <element>
|
||||||
|
|
||||||
XMLDocument* doc = new XMLDocument();
|
XMLDocument* doc = new XMLDocument();
|
||||||
@@ -804,6 +804,7 @@ int main( int argc, const char ** argv )
|
|||||||
// ---------- Attributes ---------
|
// ---------- Attributes ---------
|
||||||
{
|
{
|
||||||
static const int64_t BIG = -123456789012345678;
|
static const int64_t BIG = -123456789012345678;
|
||||||
|
static const uint64_t BIG_POS = 123456789012345678;
|
||||||
XMLDocument doc;
|
XMLDocument doc;
|
||||||
XMLElement* element = doc.NewElement("element");
|
XMLElement* element = doc.NewElement("element");
|
||||||
doc.InsertFirstChild(element);
|
doc.InsertFirstChild(element);
|
||||||
@@ -864,7 +865,23 @@ int main( int argc, const char ** argv )
|
|||||||
}
|
}
|
||||||
XMLTest("Attribute: int64_t", BIG, element->Int64Attribute("attrib"), true);
|
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);
|
element->SetAttribute("attrib", true);
|
||||||
{
|
{
|
||||||
bool v = false;
|
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", XML_SUCCESS, queryResult, true);
|
||||||
XMLTest("Element: int64_t", BIG, v, 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 ------
|
// ---------- XMLPrinter stream mode ------
|
||||||
{
|
{
|
||||||
@@ -944,7 +968,8 @@ int main( int argc, const char ** argv )
|
|||||||
printer.PushAttribute("attrib-int", int(1));
|
printer.PushAttribute("attrib-int", int(1));
|
||||||
printer.PushAttribute("attrib-unsigned", unsigned(2));
|
printer.PushAttribute("attrib-unsigned", unsigned(2));
|
||||||
printer.PushAttribute("attrib-int64", int64_t(3));
|
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.PushAttribute("attrib-double", 4.0);
|
||||||
printer.CloseElement();
|
printer.CloseElement();
|
||||||
fclose(printerfp);
|
fclose(printerfp);
|
||||||
@@ -964,7 +989,9 @@ int main( int argc, const char ** argv )
|
|||||||
XMLTest("attrib-unsigned", unsigned(2), attrib->UnsignedValue(), true);
|
XMLTest("attrib-unsigned", unsigned(2), attrib->UnsignedValue(), true);
|
||||||
attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-int64");
|
attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-int64");
|
||||||
XMLTest("attrib-int64", int64_t(3), attrib->Int64Value(), true);
|
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);
|
XMLTest("attrib-bool", true, attrib->BoolValue(), true);
|
||||||
attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-double");
|
attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-double");
|
||||||
XMLTest("attrib-double", 4.0, attrib->DoubleValue(), true);
|
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() );
|
XMLTest( "Ill formed XML", true, doc.Error() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
//API:IntText(),UnsignedText(),Int64Text(),DoubleText(),BoolText() and FloatText() test
|
||||||
|
const char* xml = "<point> <IntText>-24</IntText> <UnsignedText>42</UnsignedText> \
|
||||||
|
<Int64Text>38</Int64Text> <BoolText>true</BoolText> <DoubleText>2.35</DoubleText> </point>";
|
||||||
|
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<unsigned>(42), test2);
|
||||||
|
|
||||||
|
int64_t test3 = pointElement->FirstChildElement("Int64Text")->Int64Text();
|
||||||
|
XMLTest("Int64Text() test", static_cast<int64_t>(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 = "<playlist id = 'playlist'>"
|
||||||
|
"<property name = 'track_name'>voice</property>"
|
||||||
|
"</playlist>";
|
||||||
|
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 = "<playlist id = 'playlist'>"
|
||||||
|
"<property name = 'track_name'>voice</property>"
|
||||||
|
"<entry out = '946' producer = '2_playlist1' in = '0'/>"
|
||||||
|
"<blank length = '1'/>"
|
||||||
|
"</playlist>";
|
||||||
|
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
|
// QueryXYZText
|
||||||
{
|
{
|
||||||
const char* xml = "<point> <x>1.2</x> <y>1</y> <z>38</z> <valid>true</valid> </point>";
|
const char* xml = "<point> <x>1.2</x> <y>1</y> <z>38</z> <valid>true</valid> </point>";
|
||||||
@@ -1702,12 +1793,12 @@ int main( int argc, const char ** argv )
|
|||||||
doc.Print( &printer );
|
doc.Print( &printer );
|
||||||
|
|
||||||
XMLTest( "BOM preservation (compare)", xml_bom_preservation, printer.CStr(), false, true );
|
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() );
|
XMLTest( "Save bomtest.xml", false, doc.Error() );
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
XMLDocument doc;
|
XMLDocument doc;
|
||||||
doc.LoadFile( "resources/bomtest.xml" );
|
doc.LoadFile( "resources/out/bomtest.xml" );
|
||||||
XMLTest( "Load bomtest.xml", false, doc.Error() );
|
XMLTest( "Load bomtest.xml", false, doc.Error() );
|
||||||
XMLTest( "BOM preservation (load)", true, doc.HasBOM(), false );
|
XMLTest( "BOM preservation (load)", true, doc.HasBOM(), false );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user