summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '3rdParty/Boost/src/boost/property_tree/detail/xml_parser_write.hpp')
-rw-r--r--3rdParty/Boost/src/boost/property_tree/detail/xml_parser_write.hpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/property_tree/detail/xml_parser_write.hpp b/3rdParty/Boost/src/boost/property_tree/detail/xml_parser_write.hpp
new file mode 100644
index 0000000..614854e
--- /dev/null
+++ b/3rdParty/Boost/src/boost/property_tree/detail/xml_parser_write.hpp
@@ -0,0 +1,194 @@
+// ----------------------------------------------------------------------------
+// Copyright (C) 2002-2006 Marcin Kalicinski
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see www.boost.org
+// ----------------------------------------------------------------------------
+#ifndef BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_WRITE_HPP_INCLUDED
+#define BOOST_PROPERTY_TREE_DETAIL_XML_PARSER_WRITE_HPP_INCLUDED
+
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/detail/xml_parser_utils.hpp>
+#include <string>
+#include <ostream>
+#include <iomanip>
+
+namespace boost { namespace property_tree { namespace xml_parser
+{
+ template<class Ch>
+ void write_xml_indent(std::basic_ostream<Ch> &stream,
+ int indent,
+ const xml_writer_settings<Ch> & settings
+ )
+ {
+ stream << std::basic_string<Ch>(indent * settings.indent_count, settings.indent_char);
+ }
+
+ template<class Ch>
+ void write_xml_comment(std::basic_ostream<Ch> &stream,
+ const std::basic_string<Ch> &s,
+ int indent,
+ bool separate_line,
+ const xml_writer_settings<Ch> & settings
+ )
+ {
+ typedef typename std::basic_string<Ch> Str;
+ if (separate_line)
+ write_xml_indent(stream,indent,settings);
+ stream << Ch('<') << Ch('!') << Ch('-') << Ch('-');
+ stream << s;
+ stream << Ch('-') << Ch('-') << Ch('>');
+ if (separate_line)
+ stream << Ch('\n');
+ }
+
+ template<class Ch>
+ void write_xml_text(std::basic_ostream<Ch> &stream,
+ const std::basic_string<Ch> &s,
+ int indent,
+ bool separate_line,
+ const xml_writer_settings<Ch> & settings
+ )
+ {
+ if (separate_line)
+ write_xml_indent(stream,indent,settings);
+ stream << encode_char_entities(s);
+ if (separate_line)
+ stream << Ch('\n');
+ }
+
+ template<class Ptree>
+ void write_xml_element(std::basic_ostream<typename Ptree::key_type::value_type> &stream,
+ const std::basic_string<typename Ptree::key_type::value_type> &key,
+ const Ptree &pt,
+ int indent,
+ const xml_writer_settings<typename Ptree::key_type::value_type> & settings)
+ {
+
+ typedef typename Ptree::key_type::value_type Ch;
+ typedef typename std::basic_string<Ch> Str;
+ typedef typename Ptree::const_iterator It;
+
+ bool want_pretty = settings.indent_count > 0;
+ // Find if elements present
+ bool has_elements = false;
+ bool has_attrs_only = pt.data().empty();
+ for (It it = pt.begin(), end = pt.end(); it != end; ++it)
+ {
+ if (it->first != xmlattr<Ch>() )
+ {
+ has_attrs_only = false;
+ if (it->first != xmltext<Ch>())
+ {
+ has_elements = true;
+ break;
+ }
+ }
+ }
+
+ // Write element
+ if (pt.data().empty() && pt.empty()) // Empty key
+ {
+ if (indent >= 0)
+ {
+ write_xml_indent(stream,indent,settings);
+ stream << Ch('<') << key <<
+ Ch('/') << Ch('>');
+ if (want_pretty)
+ stream << Ch('\n');
+ }
+ }
+ else // Nonempty key
+ {
+
+ // Write opening tag, attributes and data
+ if (indent >= 0)
+ {
+
+ // Write opening brace and key
+ write_xml_indent(stream,indent,settings);
+ stream << Ch('<') << key;
+
+ // Write attributes
+ if (optional<const Ptree &> attribs = pt.get_child_optional(xmlattr<Ch>()))
+ for (It it = attribs.get().begin(); it != attribs.get().end(); ++it)
+ stream << Ch(' ') << it->first << Ch('=') <<
+ Ch('"') << it->second.template get_value<std::basic_string<Ch> >() << Ch('"');
+
+ if ( has_attrs_only )
+ {
+ // Write closing brace
+ stream << Ch('/') << Ch('>');
+ if (want_pretty)
+ stream << Ch('\n');
+ }
+ else
+ {
+ // Write closing brace
+ stream << Ch('>');
+
+ // Break line if needed and if we want pretty-printing
+ if (has_elements && want_pretty)
+ stream << Ch('\n');
+ }
+ }
+
+ // Write data text, if present
+ if (!pt.data().empty())
+ write_xml_text(stream,
+ pt.template get_value<std::basic_string<Ch> >(),
+ indent + 1, has_elements && want_pretty, settings);
+
+ // Write elements, comments and texts
+ for (It it = pt.begin(); it != pt.end(); ++it)
+ {
+ if (it->first == xmlattr<Ch>())
+ continue;
+ else if (it->first == xmlcomment<Ch>())
+ write_xml_comment(stream,
+ it->second.template get_value<std::basic_string<Ch> >(),
+ indent + 1, want_pretty, settings);
+ else if (it->first == xmltext<Ch>())
+ write_xml_text(stream,
+ it->second.template get_value<std::basic_string<Ch> >(),
+ indent + 1, has_elements && want_pretty, settings);
+ else
+ write_xml_element(stream, it->first, it->second,
+ indent + 1, settings);
+ }
+
+ // Write closing tag
+ if (indent >= 0 && !has_attrs_only)
+ {
+ if (has_elements)
+ write_xml_indent(stream,indent,settings);
+ stream << Ch('<') << Ch('/') << key << Ch('>');
+ if (want_pretty)
+ stream << Ch('\n');
+ }
+
+ }
+ }
+
+ template<class Ptree>
+ void write_xml_internal(std::basic_ostream<typename Ptree::key_type::value_type> &stream,
+ const Ptree &pt,
+ const std::string &filename,
+ const xml_writer_settings<typename Ptree::key_type::value_type> & settings)
+ {
+ typedef typename Ptree::key_type::value_type Ch;
+ typedef typename std::basic_string<Ch> Str;
+ stream << detail::widen<Ch>("<?xml version=\"1.0\" encoding=\"")
+ << settings.encoding
+ << detail::widen<Ch>("\"?>\n");
+ write_xml_element(stream, Str(), pt, -1, settings);
+ if (!stream)
+ BOOST_PROPERTY_TREE_THROW(xml_parser_error("write error", filename, 0));
+ }
+
+} } }
+
+#endif