diff --git a/tinyxml2.cppm b/tinyxml2.cppm new file mode 100644 index 00000000..900b7c9a --- /dev/null +++ b/tinyxml2.cppm @@ -0,0 +1,70 @@ +/* +Original code by Lee Thomason (www.grinninglizard.com) + +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. +*/ + +module; + +#include + +export module tinyxml2; + +export using ::TIXML2_MAJOR_VERSION; +export using ::TIXML2_MINOR_VERSION; +export using ::TIXML2_PATCH_VERSION; +export using ::TINYXML2_MAX_ELEMENT_DEPTH; + +#pragma push_macro("TINYXML2_MAJOR_VERSION") +#undef TINYXML2_MAJOR_VERSION +export inline constexpr auto TINYXML2_MAJOR_VERSION = +#pragma pop_macro("TINYXML2_MAJOR_VERSION") + TINYXML2_MAJOR_VERSION; + +#pragma push_macro("TINYXML2_MINOR_VERSION") +#undef TINYXML2_MINOR_VERSION +export inline constexpr auto TINYXML2_MINOR_VERSION = +#pragma pop_macro("TINYXML2_MINOR_VERSION") + TINYXML2_MINOR_VERSION; + +#pragma push_macro("TINYXML2_PATCH_VERSION") +#undef TINYXML2_PATCH_VERSION +export inline constexpr auto TINYXML2_PATCH_VERSION = +#pragma pop_macro("TINYXML2_PATCH_VERSION") + TINYXML2_PATCH_VERSION; + +export namespace tinyxml2 { +using tinyxml2::Whitespace; +using tinyxml2::XMLAttribute; +using tinyxml2::XMLComment; +using tinyxml2::XMLConstHandle; +using tinyxml2::XMLDeclaration; +using tinyxml2::XMLDocument; +using tinyxml2::XMLElement; +using tinyxml2::XMLError; +using tinyxml2::XMLHandle; +using tinyxml2::XMLNode; +using tinyxml2::XMLPrinter; +using tinyxml2::XMLText; +using tinyxml2::XMLUnknown; +using tinyxml2::XMLUtil; +using tinyxml2::XMLVisitor; +using tinyxml2::DynArray; +} // namespace tinyxml2 diff --git a/tinyxml2.h b/tinyxml2.h index 599397ca..6deea4ce 100644 --- a/tinyxml2.h +++ b/tinyxml2.h @@ -93,12 +93,21 @@ distribution. #endif #endif +#if defined(__cplusplus) && __cplusplus >= 201703L +#define TINYXML2_CPP17_CONSTANT inline constexpr +#elif defined(__cplusplus) && __cplusplus >= 201103L +#define TINYXML2_CPP17_CONSTANT static constexpr +#else +#define TINYXML2_CPP17_CONSTANT static const +#endif + + /* Versioning, past 1.0.14: http://semver.org/ */ -static const int TIXML2_MAJOR_VERSION = 10; -static const int TIXML2_MINOR_VERSION = 0; -static const int TIXML2_PATCH_VERSION = 0; +TINYXML2_CPP17_CONSTANT int TIXML2_MAJOR_VERSION = 10; +TINYXML2_CPP17_CONSTANT int TIXML2_MINOR_VERSION = 0; +TINYXML2_CPP17_CONSTANT int TIXML2_PATCH_VERSION = 0; #define TINYXML2_MAJOR_VERSION 10 #define TINYXML2_MINOR_VERSION 0 @@ -109,7 +118,7 @@ static const int TIXML2_PATCH_VERSION = 0; // system, and the capacity of the stack. On the other hand, it's a trivial // attack that can result from ill, malicious, or even correctly formed XML, // so there needs to be a limit in place. -static const int TINYXML2_MAX_ELEMENT_DEPTH = 500; +TINYXML2_CPP17_CONSTANT int TINYXML2_MAX_ELEMENT_DEPTH = 500; namespace tinyxml2 { diff --git a/xmake.lua b/xmake.lua new file mode 100644 index 00000000..ebf0ee45 --- /dev/null +++ b/xmake.lua @@ -0,0 +1,37 @@ +set_xmakever("2.9.0") +set_project("frozen") + +set_version("1.1.0", { build = "%Y%m%d%H%M" }) + +option("modules", { defines = "TINYXML2_USE_MODULE", default = false }) + +add_rules("mode.release", "mode.debug") +set_symbols("hidden") + +target("tinyxml") + set_kind("$(kind)") + if get_config("modules") then + set_languages("c++20") + add_files("tinyxml2.cppm", {public = true}) + end + add_headerfiles("tinyxml2.h") + add_files("tinyxml2.cpp") + if is_mode("debug") then + add_defines("TINYXML2_DEBUG", {public = true}) + end + add_defines("TINYXML2_EXPORT", "_FILE_OFFSET_BITS=64") + add_cxxflags("cl::/D_CRT_SRCURE_NO_WARNINGS") + add_includedirs(".", {public = true}) + add_options("modules") + +target("xmltest") + set_kind("binary") + if get_config("modules") then + set_languages("c++20") + end + set_default(false) + add_deps("tinyxml") + add_files("xmltest.cpp") + add_options("modules") + add_tests("tests", {rundir = os.projectdir()}) + diff --git a/xmltest.cpp b/xmltest.cpp index ae976042..afcbc37a 100644 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -4,12 +4,38 @@ #endif #endif -#include "tinyxml2.h" #include #include +#include +#include #include #include +#ifdef TINYXML2_USE_MODULE +// modules doesn't export macros +#if !defined(TIXMLASSERT) +#if defined(TINYXML2_DEBUG) +# if defined(_MSC_VER) +# // "(void)0," is for suppressing C4127 warning in "assert(false)", "assert(true)" and the like +# define TIXMLASSERT( x ) do { if ( !((void)0,(x))) { __debugbreak(); } } while(false) +# elif defined (ANDROID_NDK) +# include +# define TIXMLASSERT( x ) do { if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); } } while(false) +# else +# include +# define TIXMLASSERT assert +# endif +#else +# define TIXMLASSERT( x ) do {} while(false) +#endif +#endif +#undef NULL +#define NULL nullptr +import tinyxml2; +#else +#include "tinyxml2.h" +#endif + #if defined( _MSC_VER ) || defined (WIN32) #include #define WIN32_LEAN_AND_MEAN