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(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::
|
||||
|
||||
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
|
||||
# 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
|
||||
|
||||
@@ -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
|
||||
|
||||
160
tinyxml2.cpp
160
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<char>(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<char>(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<char*>( XMLUtil::GetCharacterRef( p, buf, &len ) );
|
||||
const char* adjusted = const_cast<char*>( 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<char>((input | BYTE_MARK) & BYTE_MASK);
|
||||
input >>= 6;
|
||||
//fall through
|
||||
case 3:
|
||||
--output;
|
||||
*output = (char)((input | BYTE_MARK) & BYTE_MASK);
|
||||
*output = static_cast<char>((input | BYTE_MARK) & BYTE_MASK);
|
||||
input >>= 6;
|
||||
//fall through
|
||||
case 2:
|
||||
--output;
|
||||
*output = (char)((input | BYTE_MARK) & BYTE_MASK);
|
||||
*output = static_cast<char>((input | BYTE_MARK) & BYTE_MASK);
|
||||
input >>= 6;
|
||||
//fall through
|
||||
case 1:
|
||||
--output;
|
||||
*output = (char)(input | FIRST_BYTE_MARK[*length]);
|
||||
*output = static_cast<char>(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<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 )
|
||||
{
|
||||
@@ -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<int64_t>(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<size_t>(-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<size_t>(-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<NUM_ENTITIES; ++i ) {
|
||||
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 );
|
||||
_entityFlag[flagIndex] = true;
|
||||
}
|
||||
_restrictedEntityFlag[(unsigned char)'&'] = true;
|
||||
_restrictedEntityFlag[(unsigned char)'<'] = true;
|
||||
_restrictedEntityFlag[(unsigned char)'>'] = true; // not required, but consistency is nice
|
||||
_restrictedEntityFlag[static_cast<unsigned char>('&')] = true;
|
||||
_restrictedEntityFlag[static_cast<unsigned char>('<')] = true;
|
||||
_restrictedEntityFlag[static_cast<unsigned char>('>')] = 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<unsigned char>(*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<int>(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<int>(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];
|
||||
|
||||
71
tinyxml2.h
71
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<size_t>(-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:
|
||||
|
||||
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:
|
||||
// <element>
|
||||
// <!--comment-->
|
||||
// <sub attrib="0" />
|
||||
// <sub attrib="1" />
|
||||
// <sub attrib="2" />
|
||||
// <sub attrib="3" >& Text!</sub>
|
||||
// <sub attrib="2" >& Text!</sub>
|
||||
// <element>
|
||||
|
||||
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 = "<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
|
||||
{
|
||||
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 );
|
||||
|
||||
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 );
|
||||
|
||||
|
||||
Reference in New Issue
Block a user