diff --git a/src/pugixml.cpp b/src/pugixml.cpp index b84658d2..6fbba89a 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -16,33 +16,35 @@ #include "pugixml.hpp" -#include -#include -#include -#include -#include - -#ifdef PUGIXML_WCHAR_MODE -# include -#endif +#ifndef PUGIXML_EXPORT_MODULE +# include +# include +# include +# include +# include + +# ifdef PUGIXML_WCHAR_MODE +# include +# endif -#ifndef PUGIXML_NO_XPATH -# include -# include -#endif +# ifndef PUGIXML_NO_XPATH +# include +# include +# endif -#ifndef PUGIXML_NO_STL -# include -# include -# include -#endif +# ifndef PUGIXML_NO_STL +# include +# include +# include +# endif // For placement new -#include +# include // For load_file -#if defined(__linux__) || defined(__APPLE__) -#include +# if defined(__linux__) || defined(__APPLE__) +# include +# endif #endif #ifdef _MSC_VER @@ -196,7 +198,9 @@ namespace pugi typedef unsigned __int32 uint32_t; } #else -# include +# ifndef PUGIXML_EXPORT_MODULE +# include +# endif #endif // Memory allocation diff --git a/src/pugixml.cppm b/src/pugixml.cppm new file mode 100644 index 00000000..3b58b032 --- /dev/null +++ b/src/pugixml.cppm @@ -0,0 +1,79 @@ +/** + * pugixml parser - version 1.14 + * -------------------------------------------------------- + * Copyright (C) 2006-2024, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) + * Report bugs and download new versions at https://pugixml.org/ + * + * This library is distributed under the MIT License. See notice at the end + * of this file. + * + * This work is based on the pugxml parser, which is: + * Copyright (C) 2003, by Kristen Wegner (kristen@tima.net) + */ + +module; + +#define PUGIXML_EXPORT_MODULE + +#include + +#ifndef PUGIXML_USE_STD_MODULE +# include +# include +# include +# include +# include +# include +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef PUGIXML_WCHAR_MODE +# include +#endif + +#ifndef PUGIXML_NO_XPATH +# include +# include +#endif + +#if defined(__linux__) || defined(__APPLE__) +# include +#endif + +export module pugixml; + +#ifdef PUGIXML_USE_STD_MODULE +import std.compat; +#endif + +#define PUGIXML_MODULE_EXPORT export +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Winclude-angled-in-module-purview" +#endif +#if !defined(PUGIXML_HEADER_ONLY) +extern "C++" { +#endif +#include +#if !defined(PUGIXML_HEADER_ONLY) +} +#endif +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + + +module :private; + +#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE) +# define PUGIXML_SOURCE "pugixml.cpp" +# include PUGIXML_SOURCE +#endif diff --git a/src/pugixml.hpp b/src/pugixml.hpp index f2d985e0..689cb39f 100644 --- a/src/pugixml.hpp +++ b/src/pugixml.hpp @@ -23,19 +23,21 @@ #ifndef HEADER_PUGIXML_HPP #define HEADER_PUGIXML_HPP +#ifndef PUGIXML_EXPORT_MODULE // Include stddef.h for size_t and ptrdiff_t -#include +# include // Include exception header for XPath -#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS) -# include -#endif +# if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS) +# include +# endif // Include STL headers -#ifndef PUGIXML_NO_STL -# include -# include -# include +# ifndef PUGIXML_NO_STL +# include +# include +# include +# endif #endif // Check if std::string_view is both requested and available @@ -48,8 +50,10 @@ #endif // Include string_view if appropriate -#ifdef PUGIXML_HAS_STRING_VIEW -# include +#ifndef PUGIXML_EXPORT_MODULE +# ifdef PUGIXML_HAS_STRING_VIEW +# include +# endif #endif // Macro for deprecated features @@ -136,6 +140,29 @@ # endif #endif +#ifndef PUGIXML_CONSTEXPR11 +# if __cplusplus >= 201103 +# define PUGIXML_CONSTEXPR11 constexpr +# elif defined(_MSC_VER) && _MSC_VER >= 1910 +# define PUGIXML_CONSTEXPR11 constexpr +# else +# define PUGIXML_CONSTEXPR11 +# endif +#endif + +// If C++ is 2011 or higher, add 'constexpr' qualifiers to constants +// If C++ is 2017 or higher, add 'inline' qualifiers to constants +// inline constexpr is required for C++20 module +#ifndef PUGIXML_CONSTANT +# if __cplusplus >= 201703 +# define PUGIXML_CONSTANT inline PUGIXML_CONSTEXPR11 +# elif __cplusplus >= 201103 +# define PUGIXML_CONSTANT PUGIXML_CONSTEXPR11 +# else +# define PUGIXML_CONSTANT const +# endif +#endif + // Character interface macros #ifdef PUGIXML_WCHAR_MODE # define PUGIXML_TEXT(t) L ## t @@ -145,6 +172,10 @@ # define PUGIXML_CHAR char #endif +#ifndef PUGIXML_MODULE_EXPORT +# define PUGIXML_MODULE_EXPORT +#endif + namespace pugi { // Character type used for all internal storage and operations; depends on PUGIXML_WCHAR_MODE @@ -162,7 +193,7 @@ namespace pugi } // The PugiXML namespace -namespace pugi +PUGIXML_MODULE_EXPORT namespace pugi { // Tree node types enum xml_node_type @@ -182,69 +213,69 @@ namespace pugi // Minimal parsing mode (equivalent to turning all other flags off). // Only elements and PCDATA sections are added to the DOM tree, no text conversions are performed. - const unsigned int parse_minimal = 0x0000; + PUGIXML_CONSTANT unsigned int parse_minimal = 0x0000; // This flag determines if processing instructions (node_pi) are added to the DOM tree. This flag is off by default. - const unsigned int parse_pi = 0x0001; + PUGIXML_CONSTANT unsigned int parse_pi = 0x0001; // This flag determines if comments (node_comment) are added to the DOM tree. This flag is off by default. - const unsigned int parse_comments = 0x0002; + PUGIXML_CONSTANT unsigned int parse_comments = 0x0002; // This flag determines if CDATA sections (node_cdata) are added to the DOM tree. This flag is on by default. - const unsigned int parse_cdata = 0x0004; + PUGIXML_CONSTANT unsigned int parse_cdata = 0x0004; // This flag determines if plain character data (node_pcdata) that consist only of whitespace are added to the DOM tree. // This flag is off by default; turning it on usually results in slower parsing and more memory consumption. - const unsigned int parse_ws_pcdata = 0x0008; + PUGIXML_CONSTANT unsigned int parse_ws_pcdata = 0x0008; // This flag determines if character and entity references are expanded during parsing. This flag is on by default. - const unsigned int parse_escapes = 0x0010; + PUGIXML_CONSTANT unsigned int parse_escapes = 0x0010; // This flag determines if EOL characters are normalized (converted to #xA) during parsing. This flag is on by default. - const unsigned int parse_eol = 0x0020; + PUGIXML_CONSTANT unsigned int parse_eol = 0x0020; // This flag determines if attribute values are normalized using CDATA normalization rules during parsing. This flag is on by default. - const unsigned int parse_wconv_attribute = 0x0040; + PUGIXML_CONSTANT unsigned int parse_wconv_attribute = 0x0040; // This flag determines if attribute values are normalized using NMTOKENS normalization rules during parsing. This flag is off by default. - const unsigned int parse_wnorm_attribute = 0x0080; + PUGIXML_CONSTANT unsigned int parse_wnorm_attribute = 0x0080; // This flag determines if document declaration (node_declaration) is added to the DOM tree. This flag is off by default. - const unsigned int parse_declaration = 0x0100; + PUGIXML_CONSTANT unsigned int parse_declaration = 0x0100; // This flag determines if document type declaration (node_doctype) is added to the DOM tree. This flag is off by default. - const unsigned int parse_doctype = 0x0200; + PUGIXML_CONSTANT unsigned int parse_doctype = 0x0200; // This flag determines if plain character data (node_pcdata) that is the only child of the parent node and that consists only // of whitespace is added to the DOM tree. // This flag is off by default; turning it on may result in slower parsing and more memory consumption. - const unsigned int parse_ws_pcdata_single = 0x0400; + PUGIXML_CONSTANT unsigned int parse_ws_pcdata_single = 0x0400; // This flag determines if leading and trailing whitespace is to be removed from plain character data. This flag is off by default. - const unsigned int parse_trim_pcdata = 0x0800; + PUGIXML_CONSTANT unsigned int parse_trim_pcdata = 0x0800; // This flag determines if plain character data that does not have a parent node is added to the DOM tree, and if an empty document // is a valid document. This flag is off by default. - const unsigned int parse_fragment = 0x1000; + PUGIXML_CONSTANT unsigned int parse_fragment = 0x1000; // This flag determines if plain character data is be stored in the parent element's value. This significantly changes the structure of // the document; this flag is only recommended for parsing documents with many PCDATA nodes in memory-constrained environments. // This flag is off by default. - const unsigned int parse_embed_pcdata = 0x2000; + PUGIXML_CONSTANT unsigned int parse_embed_pcdata = 0x2000; // This flag determines whether determines whether the the two pcdata should be merged or not, if no intermediatory data are parsed in the document. // This flag is off by default. - const unsigned int parse_merge_pcdata = 0x4000; + PUGIXML_CONSTANT unsigned int parse_merge_pcdata = 0x4000; // The default parsing mode. // Elements, PCDATA and CDATA sections are added to the DOM tree, character/reference entities are expanded, // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. - const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol; + PUGIXML_CONSTANT unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol; // The full parsing mode. // Nodes of all types are added to the DOM tree, character/reference entities are expanded, // End-of-Line characters are normalized, attribute values are normalized using CDATA normalization rules. - const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype; + PUGIXML_CONSTANT unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype; // These flags determine the encoding of input data for XML document enum xml_encoding @@ -264,41 +295,41 @@ namespace pugi // Formatting flags // Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree. This flag is on by default. - const unsigned int format_indent = 0x01; + PUGIXML_CONSTANT unsigned int format_indent = 0x01; // Write encoding-specific BOM to the output stream. This flag is off by default. - const unsigned int format_write_bom = 0x02; + PUGIXML_CONSTANT unsigned int format_write_bom = 0x02; // Use raw output mode (no indentation and no line breaks are written). This flag is off by default. - const unsigned int format_raw = 0x04; + PUGIXML_CONSTANT unsigned int format_raw = 0x04; // Omit default XML declaration even if there is no declaration in the document. This flag is off by default. - const unsigned int format_no_declaration = 0x08; + PUGIXML_CONSTANT unsigned int format_no_declaration = 0x08; // Don't escape attribute values and PCDATA contents. This flag is off by default. - const unsigned int format_no_escapes = 0x10; + PUGIXML_CONSTANT unsigned int format_no_escapes = 0x10; // Open file using text mode in xml_document::save_file. This enables special character (i.e. new-line) conversions on some systems. This flag is off by default. - const unsigned int format_save_file_text = 0x20; + PUGIXML_CONSTANT unsigned int format_save_file_text = 0x20; // Write every attribute on a new line with appropriate indentation. This flag is off by default. - const unsigned int format_indent_attributes = 0x40; + PUGIXML_CONSTANT unsigned int format_indent_attributes = 0x40; // Don't output empty element tags, instead writing an explicit start and end tag even if there are no children. This flag is off by default. - const unsigned int format_no_empty_element_tags = 0x80; + PUGIXML_CONSTANT unsigned int format_no_empty_element_tags = 0x80; // Skip characters belonging to range [0; 32) instead of "&#xNN;" encoding. This flag is off by default. - const unsigned int format_skip_control_chars = 0x100; + PUGIXML_CONSTANT unsigned int format_skip_control_chars = 0x100; // Use single quotes ' instead of double quotes " for enclosing attribute values. This flag is off by default. - const unsigned int format_attribute_single_quote = 0x200; + PUGIXML_CONSTANT unsigned int format_attribute_single_quote = 0x200; // The default set of formatting flags. // Nodes are indented depending on their depth in DOM tree, a default declaration is output if document has none. - const unsigned int format_default = format_indent; + PUGIXML_CONSTANT unsigned int format_default = format_indent; - const int default_double_precision = 17; - const int default_float_precision = 9; + PUGIXML_CONSTANT int default_double_precision = 17; + PUGIXML_CONSTANT int default_float_precision = 9; // Forward declarations struct xml_attribute_struct;