1
0
mirror of https://github.com/leethomason/tinyxml2.git synced 2026-07-22 11:43:00 +04:00

Compare commits

...

19 Commits

Author SHA1 Message Date
Lee Thomason 118358092a remove the c code path 2025-11-22 15:59:12 -08:00
Lee Thomason 888bbb912a Merge branch 'MattHuangGarmin-master' into leethomason/fallthrough 2025-11-22 15:47:41 -08:00
Lee Thomason 9c09e46619 move to cpp file 2025-11-22 15:46:45 -08:00
Lee Thomason 6d6285b18a Merge branch 'master' of github.com:MattHuangGarmin/tinyxml2 into MattHuangGarmin-master 2025-11-22 15:44:05 -08:00
Lee Thomason 2722500313 Merge pull request #1043 from gruenich/feature/replace-c-style-casts
Replace C-style casts
2025-11-22 15:38:08 -08:00
MattHuangGarmin be7b5a107f Fix GCC 4.9.3 Build Errors
Since GCC version 4.9.3 does not support the -Wimplicit-fallthrough warning option or the __attribute__((fallthrough)) annotation,
introduce the corresponding fixes to prevent build errors.
2025-11-04 14:40:21 +08:00
Christoph Grüninger b5e767a6b9 Fix more warnings for C-style casts
Use static_cast or reinterpret_cast.
Found by g++ 15.
2025-07-26 23:08:21 +02:00
Lurend e186491558 fix compilation warnings produced by -Wold-style-cast 2025-07-26 14:26:04 +02:00
Lee Thomason 36ff404c34 Update yaml file
Update yaml file
2025-07-09 20:54:23 -07:00
Lee Thomason 302f4661a7 update yaml 2025-07-09 20:48:05 -07:00
Lee Thomason e6caeae857 Fix the build actions by increasing the ubuntu test version
Update ubuntu build version
2025-06-08 11:37:20 -07:00
Lee Thomason b765a210b3 grumble 2025-06-08 11:29:52 -07:00
Lee Thomason 6e246aec4d update ubuntu build version 2025-06-08 11:28:28 -07:00
Lee Thomason 30dee1efa0 Merge pull request #1021 from Malcohol/Malcohol/optionalAposHandling
Optional Apos escaping
2025-06-08 11:17:12 -07:00
Lee Thomason a93163d2f5 Merge pull request #1020 from lbatuska/master
Remove unnecessary assert >=0 on size_t
2025-06-08 11:08:25 -07:00
Malcolm Tyrrell f87d0e3077 Add test for new and default behaviour 2025-03-30 10:20:26 +01:00
Malcolm Tyrrell 487f42aa69 Optional apos escaping 2025-03-29 18:13:43 +00:00
Levente Batuska afff7bf328 fix: remove unnecessary assert 2025-03-20 02:06:08 +01:00
Lee Thomason 9148bdf719 setting the version to 11.0.0 2025-03-15 14:45:48 -07:00
7 changed files with 106 additions and 44 deletions
+4 -4
View File
@@ -6,15 +6,15 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ windows-2019, macos-latest, ubuntu-20.04 ]
os: [ windows-latest, macos-latest, ubuntu-latest ]
cmake: [ 3.15, 3.x ]
include:
- os: windows-2019
- os: windows-latest
static_postfix: _static
tree: tree /F
CXX: cl
- os: ubuntu-20.04
- os: ubuntu-latest
tree: tree
- os: macos-latest
@@ -33,7 +33,7 @@ jobs:
# System set-up
- uses: actions/checkout@v4
- uses: ilammy/msvc-dev-cmd@v1
- uses: seanmiddleditch/gha-setup-ninja@master
- uses: seanmiddleditch/gha-setup-ninja@v4
- uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: ${{ matrix.cmake }}
+1 -1
View File
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.15)
project(tinyxml2 VERSION 10.1.0)
project(tinyxml2 VERSION 11.0.0)
include(CTest)
option(tinyxml2_BUILD_TESTING "Build tests for tinyxml2" "${BUILD_TESTING}")
+1 -1
View File
@@ -38,7 +38,7 @@ PROJECT_NAME = "TinyXML-2"
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER = 10.1.0
PROJECT_NUMBER = 11.0.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
+1 -1
View File
@@ -22,7 +22,7 @@
project(
'tinyxml2',
['cpp'],
version : '10.1.0',
version : '11.0.0',
meson_version : '>= 0.49.0',
)
+30 -7
View File
@@ -32,6 +32,27 @@ distribution.
# include <cstdarg>
#endif
// Handle fallthrough attribute for different compilers
#ifndef __has_attribute
# define __has_attribute(x) 0
#endif
#ifndef __has_cpp_attribute
# define __has_cpp_attribute(x) 0
#endif
#if defined(_MSC_VER)
# define TIXML_FALLTHROUGH (void(0))
#elif (__cplusplus >= 201703L && __has_cpp_attribute(fallthrough))
# define TIXML_FALLTHROUGH [[fallthrough]]
#elif __has_cpp_attribute(clang::fallthrough)
# define TIXML_FALLTHROUGH [[clang::fallthrough]]
#elif __has_attribute(fallthrough)
# define TIXML_FALLTHROUGH __attribute__((fallthrough))
#else
# define TIXML_FALLTHROUGH (void(0))
#endif
#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE)
// Microsoft Visual Studio, version 2005 and higher. Not WinCE.
/*int _snprintf_s(
@@ -446,17 +467,17 @@ void XMLUtil::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length
--output;
*output = static_cast<char>((input | BYTE_MARK) & BYTE_MASK);
input >>= 6;
//fall through
TIXML_FALLTHROUGH;
case 3:
--output;
*output = static_cast<char>((input | BYTE_MARK) & BYTE_MASK);
input >>= 6;
//fall through
TIXML_FALLTHROUGH;
case 2:
--output;
*output = static_cast<char>((input | BYTE_MARK) & BYTE_MASK);
input >>= 6;
//fall through
TIXML_FALLTHROUGH;
case 1:
--output;
*output = static_cast<char>(input | FIRST_BYTE_MARK[*length]);
@@ -2577,7 +2598,7 @@ void XMLDocument::PopDepth()
--_parsingDepth;
}
XMLPrinter::XMLPrinter( FILE* file, bool compact, int depth ) :
XMLPrinter::XMLPrinter( FILE* file, bool compact, int depth, EscapeAposCharsInAttributes aposInAttributes ) :
_elementJustOpened( false ),
_stack(),
_firstElement( true ),
@@ -2594,9 +2615,11 @@ 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 = static_cast<unsigned char>(entityValue);
TIXMLASSERT( flagIndex < ENTITY_RANGE );
_entityFlag[flagIndex] = true;
if ((aposInAttributes == ESCAPE_APOS_CHARS_IN_ATTRIBUTES) || (entityValue != SINGLE_QUOTE)) {
const unsigned char flagIndex = static_cast<unsigned char>(entityValue);
TIXMLASSERT( flagIndex < ENTITY_RANGE );
_entityFlag[flagIndex] = true;
}
}
_restrictedEntityFlag[static_cast<unsigned char>('&')] = true;
_restrictedEntityFlag[static_cast<unsigned char>('<')] = true;
+10 -6
View File
@@ -96,12 +96,12 @@ distribution.
/* Versioning, past 1.0.14:
http://semver.org/
*/
static const int TIXML2_MAJOR_VERSION = 10;
static const int TIXML2_MINOR_VERSION = 1;
static const int TIXML2_MAJOR_VERSION = 11;
static const int TIXML2_MINOR_VERSION = 0;
static const int TIXML2_PATCH_VERSION = 0;
#define TINYXML2_MAJOR_VERSION 10
#define TINYXML2_MINOR_VERSION 1
#define TINYXML2_MAJOR_VERSION 11
#define TINYXML2_MINOR_VERSION 0
#define TINYXML2_PATCH_VERSION 0
// A fixed element depth limit is problematic. There needs to be a
@@ -266,7 +266,6 @@ public:
}
size_t Size() const {
TIXMLASSERT( _size >= 0 );
return _size;
}
@@ -2240,13 +2239,18 @@ private:
class TINYXML2_LIB XMLPrinter : public XMLVisitor
{
public:
enum EscapeAposCharsInAttributes {
ESCAPE_APOS_CHARS_IN_ATTRIBUTES,
DONT_ESCAPE_APOS_CHARS_IN_ATTRIBUTES
};
/** Construct the printer. If the FILE* is specified,
this will print to the FILE. Else it will print
to memory, and the result is available in CStr().
If 'compact' is set to true, then output is created
with only required whitespace and newlines.
*/
XMLPrinter( FILE* file=0, bool compact = false, int depth = 0 );
XMLPrinter( FILE* file=0, bool compact = false, int depth = 0, EscapeAposCharsInAttributes aposInAttributes = ESCAPE_APOS_CHARS_IN_ATTRIBUTES );
virtual ~XMLPrinter() {}
/** If streaming, write the BOM and declaration. */
+59 -24
View File
@@ -324,9 +324,9 @@ int main( int argc, const char ** argv )
printf( "Test file '%s' loaded. ErrorID=%d\n", argv[1], errorID );
if ( !errorID ) {
printf( "Load time=%u\n", (unsigned)(loadTime - startTime) );
printf( "Delete time=%u\n", (unsigned)(deleteTime - loadTime) );
printf( "Total time=%u\n", (unsigned)(deleteTime - startTime) );
printf( "Load time=%u\n", static_cast<unsigned>(loadTime - startTime) );
printf( "Delete time=%u\n", static_cast<unsigned>(deleteTime - loadTime) );
printf( "Total time=%u\n", static_cast<unsigned>(deleteTime - startTime) );
}
exit(0);
}
@@ -595,8 +595,8 @@ int main( int argc, const char ** argv )
result = ele->QueryDoubleAttribute( "attr0", &dVal );
XMLTest( "Query attribute: int as double", XML_SUCCESS, result);
XMLTest( "Query attribute: int as double", 1, (int)dVal );
XMLTest( "Query attribute: int as double", 1, (int)ele->DoubleAttribute("attr0"));
XMLTest( "Query attribute: int as double", 1, static_cast<int>(dVal) );
XMLTest( "Query attribute: int as double", 1, static_cast<int>(ele->DoubleAttribute("attr0")));
result = ele->QueryDoubleAttribute( "attr1", &dVal );
XMLTest( "Query attribute: double as double", XML_SUCCESS, result);
@@ -648,17 +648,17 @@ int main( int argc, const char ** argv )
{
XMLError queryResult = ele->QueryAttribute( "int", &iVal2 );
XMLTest( "Query int attribute generic", (int)XML_SUCCESS, queryResult);
XMLTest( "Query int attribute generic", static_cast<int>(XML_SUCCESS), queryResult);
}
{
XMLError queryResult = ele->QueryAttribute( "double", &dVal2 );
XMLTest( "Query double attribute generic", (int)XML_SUCCESS, queryResult);
XMLTest( "Query double attribute generic", static_cast<int>(XML_SUCCESS), queryResult);
}
XMLTest( "Attribute match test", "strValue", ele->Attribute( "str", "strValue" ) );
XMLTest( "Attribute round trip. c-string.", "strValue", cStr );
XMLTest( "Attribute round trip. int.", 1, iVal );
XMLTest( "Attribute round trip. double.", -1, (int)dVal );
XMLTest( "Attribute round trip. double.", -1, static_cast<int>(dVal) );
XMLTest( "Alternate query", true, iVal == iVal2 );
XMLTest( "Alternate query", true, dVal == dVal2 );
XMLTest( "Alternate query", true, iVal == ele->IntAttribute("int") );
@@ -675,7 +675,7 @@ int main( int argc, const char ** argv )
const unsigned char correctValue[] = { 0xd1U, 0x86U, 0xd0U, 0xb5U, 0xd0U, 0xbdU, 0xd0U, 0xbdU,
0xd0U, 0xbeU, 0xd1U, 0x81U, 0xd1U, 0x82U, 0xd1U, 0x8cU, 0 };
XMLTest( "UTF-8: Russian value.", (const char*)correctValue, element->Attribute( "value" ) );
XMLTest( "UTF-8: Russian value.", reinterpret_cast<const char*>(correctValue), element->Attribute( "value" ) );
const unsigned char russianElementName[] = { 0xd0U, 0xa0U, 0xd1U, 0x83U,
0xd1U, 0x81U, 0xd1U, 0x81U,
@@ -683,7 +683,7 @@ int main( int argc, const char ** argv )
0xd0U, 0xb9U, 0 };
const char russianText[] = "<\xD0\xB8\xD0\xBC\xD0\xB5\xD0\xB5\xD1\x82>";
XMLText* text = doc.FirstChildElement( "document" )->FirstChildElement( (const char*) russianElementName )->FirstChild()->ToText();
XMLText* text = doc.FirstChildElement( "document" )->FirstChildElement( reinterpret_cast<const char*>(russianElementName) )->FirstChild()->ToText();
XMLTest( "UTF-8: Browsing russian element name.",
russianText,
text->Value() );
@@ -824,7 +824,7 @@ int main( int argc, const char ** argv )
{
int v = 0;
XMLError queryResult = element->QueryAttribute("attrib", &v);
XMLTest("Attribute: int", (int)XML_SUCCESS, queryResult, true);
XMLTest("Attribute: int", static_cast<int>(XML_SUCCESS), queryResult, true);
XMLTest("Attribute: int", -100, v, true);
}
XMLTest("Attribute: int", -100, element->IntAttribute("attrib"), true);
@@ -840,7 +840,7 @@ int main( int argc, const char ** argv )
{
unsigned v = 0;
XMLError queryResult = element->QueryAttribute("attrib", &v);
XMLTest("Attribute: unsigned", (int)XML_SUCCESS, queryResult, true);
XMLTest("Attribute: unsigned", static_cast<int>(XML_SUCCESS), queryResult, true);
XMLTest("Attribute: unsigned", unsigned(100), v, true);
}
{
@@ -864,7 +864,7 @@ int main( int argc, const char ** argv )
{
int64_t v = 0;
XMLError queryResult = element->QueryAttribute("attrib", &v);
XMLTest("Attribute: int64_t", (int)XML_SUCCESS, queryResult, true);
XMLTest("Attribute: int64_t", static_cast<int>(XML_SUCCESS), queryResult, true);
XMLTest("Attribute: int64_t", BIG, v, true);
}
XMLTest("Attribute: int64_t", BIG, element->Int64Attribute("attrib"), true);
@@ -880,7 +880,7 @@ int main( int argc, const char ** argv )
{
uint64_t v = 0;
XMLError queryResult = element->QueryAttribute("attrib", &v);
XMLTest("Attribute: uint64_t", (int)XML_SUCCESS, queryResult, true);
XMLTest("Attribute: uint64_t", static_cast<int>(XML_SUCCESS), queryResult, true);
XMLTest("Attribute: uint64_t", BIG_POS, v, true);
}
XMLTest("Attribute: uint64_t", BIG_POS, element->Unsigned64Attribute("attrib"), true);
@@ -896,7 +896,7 @@ int main( int argc, const char ** argv )
{
bool v = false;
XMLError queryResult = element->QueryAttribute("attrib", &v);
XMLTest("Attribute: bool", (int)XML_SUCCESS, queryResult, true);
XMLTest("Attribute: bool", static_cast<int>(XML_SUCCESS), queryResult, true);
XMLTest("Attribute: bool", true, v, true);
}
XMLTest("Attribute: bool", true, element->BoolAttribute("attrib"), true);
@@ -924,7 +924,7 @@ int main( int argc, const char ** argv )
{
double v = 0;
XMLError queryResult = element->QueryAttribute("attrib", &v);
XMLTest("Attribute: bool", (int)XML_SUCCESS, queryResult, true);
XMLTest("Attribute: bool", static_cast<int>(XML_SUCCESS), queryResult, true);
XMLTest("Attribute: double", 100.0, v, true);
}
XMLTest("Attribute: double", 100.0, element->DoubleAttribute("attrib"), true);
@@ -940,7 +940,7 @@ int main( int argc, const char ** argv )
{
float v = 0;
XMLError queryResult = element->QueryAttribute("attrib", &v);
XMLTest("Attribute: float", (int)XML_SUCCESS, queryResult, true);
XMLTest("Attribute: float", static_cast<int>(XML_SUCCESS), queryResult, true);
XMLTest("Attribute: float", 100.0f, v, true);
}
XMLTest("Attribute: float", 100.0f, element->FloatAttribute("attrib"), true);
@@ -1068,15 +1068,15 @@ int main( int argc, const char ** argv )
unsigned unsigned_value;
unsigned_value = root->FirstChildElement("unsigned")->UnsignedText();
XMLTest("PushText( unsigned value ) test", (unsigned)12, unsigned_value);
XMLTest("PushText( unsigned value ) test", static_cast<unsigned>(12), unsigned_value);
int64_t int64_t_value;
int64_t_value = root->FirstChildElement("int64_t")->Int64Text();
XMLTest("PushText( int64_t value ) test", (int64_t) 13, int64_t_value);
XMLTest("PushText( int64_t value ) test", static_cast<int64_t>(13), int64_t_value);
uint64_t uint64_t_value;
uint64_t_value = root->FirstChildElement("uint64_t")->Unsigned64Text();
XMLTest("PushText( uint64_t value ) test", (uint64_t) 14, uint64_t_value);
XMLTest("PushText( uint64_t value ) test", static_cast<uint64_t>(14), uint64_t_value);
float float_value;
float_value = root->FirstChildElement("float")->FloatText();
@@ -1397,7 +1397,7 @@ int main( int argc, const char ** argv )
buf[61] = 0;
XMLDocument doc;
doc.Parse( (const char*)buf);
doc.Parse( reinterpret_cast<const char*>(buf) );
XMLTest( "Broken CDATA", true, doc.Error() );
}
@@ -1753,7 +1753,7 @@ int main( int argc, const char ** argv )
unsigned unsignedValue = 0;
XMLError queryResult = pointElement->FirstChildElement( "y" )->QueryUnsignedText( &unsignedValue );
XMLTest( "QueryUnsignedText result", XML_SUCCESS, queryResult, false );
XMLTest( "QueryUnsignedText", (unsigned)1, unsignedValue, false );
XMLTest( "QueryUnsignedText", static_cast<unsigned>(1), unsignedValue, false );
}
{
@@ -2695,6 +2695,41 @@ int main( int argc, const char ** argv )
XMLTest("Test attribute encode with a Hex value", value5, "!"); // hex value in unicode value
}
// ---------- XMLPrinter Apos Escaping ------
{
const char* testText = "text containing a ' character";
XMLDocument doc;
XMLElement* element = doc.NewElement( "element" );
doc.InsertEndChild( element );
element->SetAttribute( "attrib", testText );
{
XMLPrinter defaultPrinter;
doc.Print( &defaultPrinter );
const char* defaultOutput = defaultPrinter.CStr();
const bool foundTextWithUnescapedApos = (strstr(defaultOutput, testText) != nullptr);
XMLTest("Default XMLPrinter should escape ' characters", false, foundTextWithUnescapedApos);
{
XMLDocument parsingDoc;
parsingDoc.Parse(defaultOutput);
const XMLAttribute* attrib = parsingDoc.FirstChildElement("element")->FindAttribute("attrib");
XMLTest("Default XMLPrinter should output parsable xml", testText, attrib->Value(), true);
}
}
{
XMLPrinter customPrinter(0, false, 0, XMLPrinter::DONT_ESCAPE_APOS_CHARS_IN_ATTRIBUTES);
doc.Print( &customPrinter );
const char* customOutput = customPrinter.CStr();
const bool foundTextWithUnescapedApos = (strstr(customOutput, testText) != nullptr);
XMLTest("Custom XMLPrinter should not escape ' characters", true, foundTextWithUnescapedApos);
{
XMLDocument parsingDoc;
parsingDoc.Parse(customOutput);
const XMLAttribute* attrib = parsingDoc.FirstChildElement("element")->FindAttribute("attrib");
XMLTest("Custom XMLPrinter should output parsable xml", testText, attrib->Value(), true);
}
}
}
// ----------- Performance tracking --------------
{
#if defined( _MSC_VER )
@@ -2744,9 +2779,9 @@ int main( int argc, const char ** argv )
#endif
#if defined( _MSC_VER )
const double duration = 1000.0 * (double)(end - start) / ((double)freq * (double)COUNT);
const double duration = 1000.0 * static_cast<double>(end - start) / (static_cast<double>(freq) * static_cast<double>(COUNT));
#else
const double duration = (double)(cend - cstart) / (double)COUNT;
const double duration = static_cast<double>(cend - cstart) / static_cast<double>(COUNT);
#endif
printf("\nParsing dream.xml (%s): %.3f milli-seconds\n", note, duration);
}