|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r65975 - in branches/release/boost/property_tree: . detail
From: sebastian.redl_at_[hidden]
Date: 2010-10-15 08:40:13
Author: cornedbee
Date: 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
New Revision: 65975
URL: http://svn.boost.org/trac/boost/changeset/65975
Log:
Merge long-overdue PTree changes to release (boost)
Properties modified:
branches/release/boost/property_tree/ (props changed)
Text files modified:
branches/release/boost/property_tree/detail/exception_implementation.hpp | 12
branches/release/boost/property_tree/detail/file_parser_error.hpp | 35 +--
branches/release/boost/property_tree/detail/json_parser_read.hpp | 11
branches/release/boost/property_tree/detail/json_parser_write.hpp | 86 ++++----
branches/release/boost/property_tree/detail/ptree_implementation.hpp | 13
branches/release/boost/property_tree/detail/rapidxml.hpp | 355 ++++++++++++++++++---------------------
branches/release/boost/property_tree/detail/xml_parser_error.hpp | 8
branches/release/boost/property_tree/detail/xml_parser_read_rapidxml.hpp | 48 +++-
branches/release/boost/property_tree/detail/xml_parser_utils.hpp | 3
branches/release/boost/property_tree/detail/xml_parser_write.hpp | 16 +
branches/release/boost/property_tree/detail/xml_parser_writer_settings.hpp | 12
branches/release/boost/property_tree/json_parser.hpp | 14 +
branches/release/boost/property_tree/ptree_fwd.hpp | 11
branches/release/boost/property_tree/string_path.hpp | 2
14 files changed, 314 insertions(+), 312 deletions(-)
Modified: branches/release/boost/property_tree/detail/exception_implementation.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/exception_implementation.hpp (original)
+++ branches/release/boost/property_tree/detail/exception_implementation.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -30,8 +30,8 @@
///////////////////////////////////////////////////////////////////////////
// ptree_error
- inline ptree_error::ptree_error(const std::string &what):
- std::runtime_error(what)
+ inline ptree_error::ptree_error(const std::string &w):
+ std::runtime_error(w)
{
}
@@ -43,8 +43,8 @@
// ptree_bad_data
template<class D> inline
- ptree_bad_data::ptree_bad_data(const std::string &what, const D &data):
- ptree_error(what), m_data(data)
+ ptree_bad_data::ptree_bad_data(const std::string &w, const D &d):
+ ptree_error(w), m_data(d)
{
}
@@ -62,8 +62,8 @@
// ptree_bad_path
template<class P> inline
- ptree_bad_path::ptree_bad_path(const std::string &what, const P &path):
- ptree_error(detail::prepare_bad_path_what(what, path)), m_path(path)
+ ptree_bad_path::ptree_bad_path(const std::string &w, const P &p):
+ ptree_error(detail::prepare_bad_path_what(w, p)), m_path(p)
{
}
Modified: branches/release/boost/property_tree/detail/file_parser_error.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/file_parser_error.hpp (original)
+++ branches/release/boost/property_tree/detail/file_parser_error.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -26,11 +26,11 @@
// Construction & destruction
// Construct error
- file_parser_error(const std::string &message,
- const std::string &filename,
- unsigned long line) :
- ptree_error(format_what(message, filename, line)),
- m_message(message), m_filename(filename), m_line(line)
+ file_parser_error(const std::string &msg,
+ const std::string &file,
+ unsigned long l) :
+ ptree_error(format_what(msg, file, l)),
+ m_message(msg), m_filename(file), m_line(l)
{
}
@@ -45,19 +45,19 @@
// Get error message (without line and file - use what() to get
// full message)
- std::string message()
+ std::string message() const
{
return m_message;
}
// Get error filename
- std::string filename()
+ std::string filename() const
{
return m_filename;
}
// Get error line number
- unsigned long line()
+ unsigned long line() const
{
return m_line;
}
@@ -69,20 +69,15 @@
unsigned long m_line;
// Format error message to be returned by std::runtime_error::what()
- std::string format_what(const std::string &message,
- const std::string &filename,
- unsigned long line)
+ static std::string format_what(const std::string &msg,
+ const std::string &file,
+ unsigned long l)
{
std::stringstream stream;
- if (line > 0)
- stream << (filename.empty() ? "<unspecified file>"
- : filename.c_str())
- << '(' << line << "): "
- << message;
- else
- stream << (filename.empty() ? "<unspecified file>"
- : filename.c_str())
- << ": " << message;
+ stream << (file.empty() ? "<unspecified file>" : file.c_str());
+ if (l > 0)
+ stream << '(' << l << ')';
+ stream << ": " << msg;
return stream.str();
}
Modified: branches/release/boost/property_tree/detail/json_parser_read.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/json_parser_read.hpp (original)
+++ branches/release/boost/property_tree/detail/json_parser_read.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -128,7 +128,6 @@
{
case Ch('\"'): c.string += Ch('\"'); break;
case Ch('\\'): c.string += Ch('\\'); break;
- case Ch('0'): c.string += Ch('\0'); break;
case Ch('b'): c.string += Ch('\b'); break;
case Ch('f'): c.string += Ch('\f'); break;
case Ch('n'): c.string += Ch('\n'); break;
@@ -232,8 +231,12 @@
;
number
- = strict_real_p
- | int_p
+ = !ch_p("-") >>
+ (ch_p("0") | (range_p(Ch('1'), Ch('9')) >> *digit_p)) >>
+ !(ch_p(".") >> +digit_p) >>
+ !(chset_p(detail::widen<Ch>("eE").c_str()) >>
+ !chset_p(detail::widen<Ch>("-+").c_str()) >>
+ +digit_p)
;
string
@@ -246,7 +249,7 @@
;
escape
- = chset_p(detail::widen<Ch>("\"\\0bfnrt").c_str())[typename Context::a_escape(self.c)]
+ = chset_p(detail::widen<Ch>("\"\\bfnrt").c_str())[typename Context::a_escape(self.c)]
| 'u' >> uint_parser<unsigned long, 16, 4, 4>()[typename Context::a_unicode(self.c)]
;
Modified: branches/release/boost/property_tree/detail/json_parser_write.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/json_parser_write.hpp (original)
+++ branches/release/boost/property_tree/detail/json_parser_write.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -21,37 +21,37 @@
// Create necessary escape sequences from illegal characters
template<class Ch>
- std::basic_string<Ch> create_escapes(const std::basic_string<Ch> &s,
- const std::locale &loc)
+ std::basic_string<Ch> create_escapes(const std::basic_string<Ch> &s)
{
std::basic_string<Ch> result;
typename std::basic_string<Ch>::const_iterator b = s.begin();
typename std::basic_string<Ch>::const_iterator e = s.end();
while (b != e)
{
- if (*b == Ch('\0')) result += Ch('\\'), result += Ch('0');
+ // This assumes an ASCII superset. But so does everything in PTree.
+ // We escape everything outside ASCII, because this code can't
+ // handle high unicode characters.
+ if (*b == 0x20 || *b == 0x21 ||
+ (*b >= 0x23 && *b <= 0x5B) || (*b >= 0x5D && *b <= 0xFF))
+ result += *b;
else if (*b == Ch('\b')) result += Ch('\\'), result += Ch('b');
else if (*b == Ch('\f')) result += Ch('\\'), result += Ch('f');
else if (*b == Ch('\n')) result += Ch('\\'), result += Ch('n');
else if (*b == Ch('\r')) result += Ch('\\'), result += Ch('r');
- else if (*b == Ch('"')) result += Ch('\\'), result += Ch('"');
+ else if (*b == Ch('"')) result += Ch('\\'), result += Ch('"');
else if (*b == Ch('\\')) result += Ch('\\'), result += Ch('\\');
else
{
- if (std::isprint(*b, loc))
- result += *b;
- else
- {
- const char *hexdigits = "0123456789ABCDEF";
- unsigned long u = (std::min)(static_cast<unsigned long>(*b), 0xFFFFul);
- int d1 = u / 4096; u -= d1 * 4096;
- int d2 = u / 256; u -= d2 * 256;
- int d3 = u / 16; u -= d3 * 16;
- int d4 = u;
- result += Ch('\\'); result += Ch('u');
- result += Ch(hexdigits[d1]); result += Ch(hexdigits[d2]);
- result += Ch(hexdigits[d3]); result += Ch(hexdigits[d4]);
- }
+ const char *hexdigits = "0123456789ABCDEF";
+ unsigned long u = (std::min)(static_cast<unsigned long>(*b),
+ 0xFFFFul);
+ int d1 = u / 4096; u -= d1 * 4096;
+ int d2 = u / 256; u -= d2 * 256;
+ int d3 = u / 16; u -= d3 * 16;
+ int d4 = u;
+ result += Ch('\\'); result += Ch('u');
+ result += Ch(hexdigits[d1]); result += Ch(hexdigits[d2]);
+ result += Ch(hexdigits[d3]); result += Ch(hexdigits[d4]);
}
++b;
}
@@ -60,60 +60,61 @@
template<class Ptree>
void write_json_helper(std::basic_ostream<typename Ptree::key_type::value_type> &stream,
- const Ptree &pt,
- int indent)
+ const Ptree &pt,
+ int indent, bool pretty)
{
typedef typename Ptree::key_type::value_type Ch;
typedef typename std::basic_string<Ch> Str;
-
+
// Value or object or array
if (indent > 0 && pt.empty())
{
-
// Write value
- Str data = create_escapes(pt.template get_value<Str>(), stream.getloc());
+ Str data = create_escapes(pt.template get_value<Str>());
stream << Ch('"') << data << Ch('"');
}
else if (indent > 0 && pt.count(Str()) == pt.size())
{
-
// Write array
- stream << Ch('[') << Ch('\n');
+ stream << Ch('[');
+ if (pretty) stream << Ch('\n');
typename Ptree::const_iterator it = pt.begin();
for (; it != pt.end(); ++it)
{
- stream << Str(4 * (indent + 1), Ch(' '));
- write_json_helper(stream, it->second, indent + 1);
+ if (pretty) stream << Str(4 * (indent + 1), Ch(' '));
+ write_json_helper(stream, it->second, indent + 1, pretty);
if (boost::next(it) != pt.end())
stream << Ch(',');
- stream << Ch('\n');
+ if (pretty) stream << Ch('\n');
}
stream << Str(4 * indent, Ch(' ')) << Ch(']');
}
else
{
-
// Write object
- stream << Ch('{') << Ch('\n');
+ stream << Ch('{');
+ if (pretty) stream << Ch('\n');
typename Ptree::const_iterator it = pt.begin();
for (; it != pt.end(); ++it)
{
- stream << Str(4 * (indent + 1), Ch(' '));
- stream << Ch('"') << create_escapes(it->first, stream.getloc()) << Ch('"') << Ch(':');
- if (it->second.empty())
- stream << Ch(' ');
- else
- stream << Ch('\n') << Str(4 * (indent + 1), Ch(' '));
- write_json_helper(stream, it->second, indent + 1);
+ if (pretty) stream << Str(4 * (indent + 1), Ch(' '));
+ stream << Ch('"') << create_escapes(it->first) << Ch('"') << Ch(':');
+ if (pretty) {
+ if (it->second.empty())
+ stream << Ch(' ');
+ else
+ stream << Ch('\n') << Str(4 * (indent + 1), Ch(' '));
+ }
+ write_json_helper(stream, it->second, indent + 1, pretty);
if (boost::next(it) != pt.end())
stream << Ch(',');
- stream << Ch('\n');
+ if (pretty) stream << Ch('\n');
}
- stream << Str(4 * indent, Ch(' ')) << Ch('}');
-
+ if (pretty) stream << Str(4 * indent, Ch(' '));
+ stream << Ch('}');
}
}
@@ -149,11 +150,12 @@
template<class Ptree>
void write_json_internal(std::basic_ostream<typename Ptree::key_type::value_type> &stream,
const Ptree &pt,
- const std::string &filename)
+ const std::string &filename,
+ bool pretty)
{
if (!verify_json(pt, 0))
BOOST_PROPERTY_TREE_THROW(json_parser_error("ptree contains data that cannot be represented in JSON format", filename, 0));
- write_json_helper(stream, pt, 0);
+ write_json_helper(stream, pt, 0, pretty);
stream << std::endl;
if (!stream.good())
BOOST_PROPERTY_TREE_THROW(json_parser_error("write error", filename, 0));
Modified: branches/release/boost/property_tree/detail/ptree_implementation.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/ptree_implementation.hpp (original)
+++ branches/release/boost/property_tree/detail/ptree_implementation.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -183,8 +183,8 @@
}
template<class K, class D, class C> inline
- basic_ptree<K, D, C>::basic_ptree(const data_type &data)
- : m_data(data), m_children(new typename subs::base_container)
+ basic_ptree<K, D, C>::basic_ptree(const data_type &d)
+ : m_data(d), m_children(new typename subs::base_container)
{
}
@@ -467,8 +467,8 @@
std::pair<typename subs::by_name_index::iterator,
typename subs::by_name_index::iterator> r(
subs::assoc(this).equal_range(key));
- return std::pair<assoc_iterator, assoc_iterator>(r.first.base(),
- r.second.base());
+ return std::pair<assoc_iterator, assoc_iterator>(
+ assoc_iterator(r.first), assoc_iterator(r.second));
}
template<class K, class D, class C> inline
@@ -481,7 +481,7 @@
typename subs::by_name_index::const_iterator> r(
subs::assoc(this).equal_range(key));
return std::pair<const_assoc_iterator, const_assoc_iterator>(
- r.first.base(), r.second.base());
+ const_assoc_iterator(r.first), const_assoc_iterator(r.second));
}
template<class K, class D, class C> inline
@@ -770,7 +770,8 @@
Translator tr) const
{
if (optional<const self_type&> child = get_child_optional(path))
- return child.get().BOOST_NESTED_TEMPLATE get_value_optional<Type>(tr);
+ return child.get().
+ BOOST_NESTED_TEMPLATE get_value_optional<Type>(tr);
else
return optional<Type>();
}
Modified: branches/release/boost/property_tree/detail/rapidxml.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/rapidxml.hpp (original)
+++ branches/release/boost/property_tree/detail/rapidxml.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -7,17 +7,14 @@
//
// For more information, see www.boost.org
// ----------------------------------------------------------------------------
-#ifndef RAPIDXML_HPP_INCLUDED
-#define RAPIDXML_HPP_INCLUDED
+#ifndef BOOST_PROPERTY_TREE_RAPIDXML_HPP_INCLUDED
+#define BOOST_PROPERTY_TREE_RAPIDXML_HPP_INCLUDED
//! \file rapidxml.hpp This file contains rapidxml parser and DOM implementation
-// If standard library is disabled, user must provide implementations of required functions and typedefs
-#if !defined(RAPIDXML_NO_STDLIB)
- #include <cstdlib> // For std::size_t
- #include <cassert> // For assert
- #include <new> // For placement new
-#endif
+#include <cstdlib> // For std::size_t
+#include <cassert> // For assert
+#include <new> // For placement new
// On MSVC, disable "conditional expression is constant" warning (level 4).
// This warning is almost impossible to avoid with certain types of templated code
@@ -27,40 +24,13 @@
#endif
///////////////////////////////////////////////////////////////////////////
-// RAPIDXML_PARSE_ERROR
-
-#if defined(RAPIDXML_NO_EXCEPTIONS)
-
-#define RAPIDXML_PARSE_ERROR(what, where) { parse_error_handler(what, where); assert(0); }
-
-namespace rapidxml
-{
- //! When exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS,
- //! this function is called to notify user about the error.
- //! It must be defined by the user.
- //! <br><br>
- //! This function cannot return. If it does, the results are undefined.
- //! <br><br>
- //! A very simple definition might look like that:
- //! <pre>
- //! void %rapidxml::%parse_error_handler(const char *what, void *where)
- //! {
- //! std::cout << "Parse error: " << what << "\n";
- //! std::abort();
- //! }
- //! </pre>
- //! \param what Human readable description of the error.
- //! \param where Pointer to character data where error was detected.
- void parse_error_handler(const char *what, void *where);
-}
-
-#else
+// BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR
#include <exception> // For std::exception
-#define RAPIDXML_PARSE_ERROR(what, where) throw parse_error(what, where)
+#define BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR(what, where) throw parse_error(what, where)
-namespace rapidxml
+namespace boost { namespace property_tree { namespace detail {namespace rapidxml
{
//! Parse error exception.
@@ -80,9 +50,9 @@
public:
//! Constructs parse error
- parse_error(const char *what, void *where)
- : m_what(what)
- , m_where(where)
+ parse_error(const char *wa, void *we)
+ : m_what(wa)
+ , m_where(we)
{
}
@@ -108,36 +78,34 @@
void *m_where;
};
-}
-
-#endif
+}}}}
///////////////////////////////////////////////////////////////////////////
// Pool sizes
-#ifndef RAPIDXML_STATIC_POOL_SIZE
+#ifndef BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE
// Size of static memory block of memory_pool.
- // Define RAPIDXML_STATIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value.
+ // Define BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value.
// No dynamic memory allocations are performed by memory_pool until static memory is exhausted.
- #define RAPIDXML_STATIC_POOL_SIZE (64 * 1024)
+ #define BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE (64 * 1024)
#endif
-#ifndef RAPIDXML_DYNAMIC_POOL_SIZE
+#ifndef BOOST_PROPERTY_TREE_RAPIDXML_DYNAMIC_POOL_SIZE
// Size of dynamic memory block of memory_pool.
- // Define RAPIDXML_DYNAMIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value.
+ // Define BOOST_PROPERTY_TREE_RAPIDXML_DYNAMIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value.
// After the static block is exhausted, dynamic blocks with approximately this size are allocated by memory_pool.
- #define RAPIDXML_DYNAMIC_POOL_SIZE (64 * 1024)
+ #define BOOST_PROPERTY_TREE_RAPIDXML_DYNAMIC_POOL_SIZE (64 * 1024)
#endif
-#ifndef RAPIDXML_ALIGNMENT
+#ifndef BOOST_PROPERTY_TREE_RAPIDXML_ALIGNMENT
// Memory allocation alignment.
- // Define RAPIDXML_ALIGNMENT before including rapidxml.hpp if you want to override the default value, which is the size of pointer.
+ // Define BOOST_PROPERTY_TREE_RAPIDXML_ALIGNMENT before including rapidxml.hpp if you want to override the default value, which is the size of pointer.
// All memory allocations for nodes, attributes and strings will be aligned to this value.
// This must be a power of 2 and at least 1, otherwise memory_pool will not work.
- #define RAPIDXML_ALIGNMENT sizeof(void *)
+ #define BOOST_PROPERTY_TREE_RAPIDXML_ALIGNMENT sizeof(void *)
#endif
-namespace rapidxml
+namespace boost { namespace property_tree { namespace detail {namespace rapidxml
{
// Forward declarations
template<class Ch> class xml_node;
@@ -364,20 +332,20 @@
//! It is also possible to create a standalone memory_pool, and use it
//! to allocate nodes, whose lifetime will not be tied to any document.
//! <br><br>
- //! Pool maintains <code>RAPIDXML_STATIC_POOL_SIZE</code> bytes of statically allocated memory.
+ //! Pool maintains <code>BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE</code> bytes of statically allocated memory.
//! Until static memory is exhausted, no dynamic memory allocations are done.
- //! When static memory is exhausted, pool allocates additional blocks of memory of size <code>RAPIDXML_DYNAMIC_POOL_SIZE</code> each,
+ //! When static memory is exhausted, pool allocates additional blocks of memory of size <code>BOOST_PROPERTY_TREE_RAPIDXML_DYNAMIC_POOL_SIZE</code> each,
//! by using global <code>new[]</code> and <code>delete[]</code> operators.
//! This behaviour can be changed by setting custom allocation routines.
//! Use set_allocator() function to set them.
//! <br><br>
- //! Allocations for nodes, attributes and strings are aligned at <code>RAPIDXML_ALIGNMENT</code> bytes.
+ //! Allocations for nodes, attributes and strings are aligned at <code>BOOST_PROPERTY_TREE_RAPIDXML_ALIGNMENT</code> bytes.
//! This value defaults to the size of pointer on target architecture.
//! <br><br>
//! To obtain absolutely top performance from the parser,
//! it is important that all nodes are allocated from a single, contiguous block of memory.
//! Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably.
- //! If required, you can tweak <code>RAPIDXML_STATIC_POOL_SIZE</code>, <code>RAPIDXML_DYNAMIC_POOL_SIZE</code> and <code>RAPIDXML_ALIGNMENT</code>
+ //! If required, you can tweak <code>BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE</code>, <code>BOOST_PROPERTY_TREE_RAPIDXML_DYNAMIC_POOL_SIZE</code> and <code>BOOST_PROPERTY_TREE_RAPIDXML_ALIGNMENT</code>
//! to obtain best wasted memory to performance compromise.
//! To do it, define their values before rapidxml.hpp file is included.
//! \param Ch Character type of created nodes.
@@ -578,7 +546,7 @@
char *align(char *ptr)
{
- std::size_t alignment = ((RAPIDXML_ALIGNMENT - (std::size_t(ptr) & (RAPIDXML_ALIGNMENT - 1))) & (RAPIDXML_ALIGNMENT - 1));
+ std::size_t alignment = ((BOOST_PROPERTY_TREE_RAPIDXML_ALIGNMENT - (std::size_t(ptr) & (BOOST_PROPERTY_TREE_RAPIDXML_ALIGNMENT - 1))) & (BOOST_PROPERTY_TREE_RAPIDXML_ALIGNMENT - 1));
return ptr + alignment;
}
@@ -594,10 +562,6 @@
else
{
memory = new char[size];
-#ifdef RAPIDXML_NO_EXCEPTIONS
- if (!memory) // If exceptions are disabled, verify memory allocation, because new will not be able to throw bad_alloc
- RAPIDXML_PARSE_ERROR("out of memory", 0);
-#endif
}
return static_cast<char *>(memory);
}
@@ -610,13 +574,13 @@
// If not enough memory left in current pool, allocate a new pool
if (result + size > m_end)
{
- // Calculate required pool size (may be bigger than RAPIDXML_DYNAMIC_POOL_SIZE)
- std::size_t pool_size = RAPIDXML_DYNAMIC_POOL_SIZE;
+ // Calculate required pool size (may be bigger than BOOST_PROPERTY_TREE_RAPIDXML_DYNAMIC_POOL_SIZE)
+ std::size_t pool_size = BOOST_PROPERTY_TREE_RAPIDXML_DYNAMIC_POOL_SIZE;
if (pool_size < size)
pool_size = size;
// Allocate
- std::size_t alloc_size = sizeof(header) + (2 * RAPIDXML_ALIGNMENT - 2) + pool_size; // 2 alignments required in worst case: one for header, one for actual allocation
+ std::size_t alloc_size = sizeof(header) + (2 * BOOST_PROPERTY_TREE_RAPIDXML_ALIGNMENT - 2) + pool_size; // 2 alignments required in worst case: one for header, one for actual allocation
char *raw_memory = allocate_raw(alloc_size);
// Setup new pool in allocated memory
@@ -639,7 +603,7 @@
char *m_begin; // Start of raw memory making up current pool
char *m_ptr; // First free byte in current pool
char *m_end; // One past last available byte in current pool
- char m_static_memory[RAPIDXML_STATIC_POOL_SIZE]; // Static raw memory
+ char m_static_memory[BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE]; // Static raw memory
alloc_func *m_alloc_func; // Allocator function, or 0 if default is to be used
free_func *m_free_func; // Free function, or 0 if default is to be used
};
@@ -722,20 +686,20 @@
//! <br><br>
//! Size of name must be specified separately, because name does not have to be zero terminated.
//! Use name(const Ch *) function to have the length automatically calculated (string must be zero terminated).
- //! \param name Name of node to set. Does not have to be zero terminated.
+ //! \param n Name of node to set. Does not have to be zero terminated.
//! \param size Size of name, in characters. This does not include zero terminator, if one is present.
- void name(const Ch *name, std::size_t size)
+ void name(const Ch *n, std::size_t size)
{
- m_name = const_cast<Ch *>(name);
+ m_name = const_cast<Ch *>(n);
m_name_size = size;
}
//! Sets name of node to a zero-terminated string.
//! See also \ref ownership_of_strings and xml_node::name(const Ch *, std::size_t).
- //! \param name Name of node to set. Must be zero terminated.
- void name(const Ch *name)
+ //! \param n Name of node to set. Must be zero terminated.
+ void name(const Ch *n)
{
- this->name(name, internal::measure(name));
+ name(n, internal::measure(n));
}
//! Sets value of node to a non zero-terminated string.
@@ -752,20 +716,20 @@
//! <br><br>
//! If an element has a child node of type node_data, it will take precedence over element value when printing.
//! If you want to manipulate data of elements using values, use parser flag rapidxml::parse_no_data_nodes to prevent creation of data nodes by the parser.
- //! \param value value of node to set. Does not have to be zero terminated.
+ //! \param val value of node to set. Does not have to be zero terminated.
//! \param size Size of value, in characters. This does not include zero terminator, if one is present.
- void value(const Ch *value, std::size_t size)
+ void value(const Ch *val, std::size_t size)
{
- m_value = const_cast<Ch *>(value);
+ m_value = const_cast<Ch *>(val);
m_value_size = size;
}
//! Sets value of node to a zero-terminated string.
//! See also \ref ownership_of_strings and xml_node::value(const Ch *, std::size_t).
- //! \param value Vame of node to set. Must be zero terminated.
- void value(const Ch *value)
+ //! \param val Vame of node to set. Must be zero terminated.
+ void value(const Ch *val)
{
- this->value(value, internal::measure(value));
+ this->value(val, internal::measure(val));
}
///////////////////////////////////////////////////////////////////////////
@@ -835,18 +799,18 @@
}
//! Gets previous attribute, optionally matching attribute name.
- //! \param name Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
- //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param n Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if nsize is non-zero
+ //! \param nsize Size of name, in characters, or 0 to have size calculated automatically from string
//! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
//! \return Pointer to found attribute, or 0 if not found.
- xml_attribute<Ch> *previous_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ xml_attribute<Ch> *previous_attribute(const Ch *n = 0, std::size_t nsize = 0, bool case_sensitive = true) const
{
- if (name)
+ if (n)
{
- if (name_size == 0)
- name_size = internal::measure(name);
+ if (nsize == 0)
+ nsize = internal::measure(n);
for (xml_attribute<Ch> *attribute = m_prev_attribute; attribute; attribute = attribute->m_prev_attribute)
- if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))
+ if (internal::compare(attribute->name(), attribute->name_size(), n, nsize, case_sensitive))
return attribute;
return 0;
}
@@ -855,18 +819,18 @@
}
//! Gets next attribute, optionally matching attribute name.
- //! \param name Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
- //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param n Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if nsize is non-zero
+ //! \param nsize Size of name, in characters, or 0 to have size calculated automatically from string
//! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
//! \return Pointer to found attribute, or 0 if not found.
- xml_attribute<Ch> *next_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ xml_attribute<Ch> *next_attribute(const Ch *n = 0, std::size_t nsize = 0, bool case_sensitive = true) const
{
- if (name)
+ if (n)
{
- if (name_size == 0)
- name_size = internal::measure(name);
+ if (nsize == 0)
+ nsize = internal::measure(n);
for (xml_attribute<Ch> *attribute = m_next_attribute; attribute; attribute = attribute->m_next_attribute)
- if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))
+ if (internal::compare(attribute->name(), attribute->name_size(), n, nsize, case_sensitive))
return attribute;
return 0;
}
@@ -903,9 +867,9 @@
//! Constructs an empty node with the specified type.
//! Consider using memory_pool of appropriate document to allocate nodes manually.
- //! \param type Type of node to construct.
- xml_node(node_type type)
- : m_type(type)
+ //! \param t Type of node to construct.
+ xml_node(node_type t)
+ : m_type(t)
, m_first_node(0)
, m_first_attribute(0)
{
@@ -935,18 +899,18 @@
}
//! Gets first child node, optionally matching node name.
- //! \param name Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
- //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param n Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if nsize is non-zero
+ //! \param nsize Size of name, in characters, or 0 to have size calculated automatically from string
//! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
//! \return Pointer to found child, or 0 if not found.
- xml_node<Ch> *first_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ xml_node<Ch> *first_node(const Ch *n = 0, std::size_t nsize = 0, bool case_sensitive = true) const
{
- if (name)
+ if (n)
{
- if (name_size == 0)
- name_size = internal::measure(name);
+ if (nsize == 0)
+ nsize = internal::measure(n);
for (xml_node<Ch> *child = m_first_node; child; child = child->next_sibling())
- if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive))
+ if (internal::compare(child->name(), child->name_size(), n, nsize, case_sensitive))
return child;
return 0;
}
@@ -957,19 +921,19 @@
//! Gets last child node, optionally matching node name.
//! Behaviour is undefined if node has no children.
//! Use first_node() to test if node has children.
- //! \param name Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
- //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param n Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if nsize is non-zero
+ //! \param nsize Size of name, in characters, or 0 to have size calculated automatically from string
//! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
//! \return Pointer to found child, or 0 if not found.
- xml_node<Ch> *last_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ xml_node<Ch> *last_node(const Ch *n = 0, std::size_t nsize = 0, bool case_sensitive = true) const
{
assert(m_first_node); // Cannot query for last child if node has no children
- if (name)
+ if (n)
{
- if (name_size == 0)
- name_size = internal::measure(name);
+ if (nsize == 0)
+ nsize = internal::measure(n);
for (xml_node<Ch> *child = m_last_node; child; child = child->previous_sibling())
- if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive))
+ if (internal::compare(child->name(), child->name_size(), n, nsize, case_sensitive))
return child;
return 0;
}
@@ -980,19 +944,19 @@
//! Gets previous sibling node, optionally matching node name.
//! Behaviour is undefined if node has no parent.
//! Use parent() to test if node has a parent.
- //! \param name Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
- //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param n Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if nsize is non-zero
+ //! \param nsize Size of name, in characters, or 0 to have size calculated automatically from string
//! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
//! \return Pointer to found sibling, or 0 if not found.
- xml_node<Ch> *previous_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ xml_node<Ch> *previous_sibling(const Ch *n = 0, std::size_t nsize = 0, bool case_sensitive = true) const
{
assert(this->m_parent); // Cannot query for siblings if node has no parent
- if (name)
+ if (n)
{
- if (name_size == 0)
- name_size = internal::measure(name);
+ if (nsize == 0)
+ nsize = internal::measure(n);
for (xml_node<Ch> *sibling = m_prev_sibling; sibling; sibling = sibling->m_prev_sibling)
- if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive))
+ if (internal::compare(sibling->name(), sibling->name_size(), n, nsize, case_sensitive))
return sibling;
return 0;
}
@@ -1003,19 +967,19 @@
//! Gets next sibling node, optionally matching node name.
//! Behaviour is undefined if node has no parent.
//! Use parent() to test if node has a parent.
- //! \param name Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
- //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param n Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if nsize is non-zero
+ //! \param nsize Size of name, in characters, or 0 to have size calculated automatically from string
//! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
//! \return Pointer to found sibling, or 0 if not found.
- xml_node<Ch> *next_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ xml_node<Ch> *next_sibling(const Ch *n = 0, std::size_t nsize = 0, bool case_sensitive = true) const
{
assert(this->m_parent); // Cannot query for siblings if node has no parent
- if (name)
+ if (n)
{
- if (name_size == 0)
- name_size = internal::measure(name);
+ if (nsize == 0)
+ nsize = internal::measure(n);
for (xml_node<Ch> *sibling = m_next_sibling; sibling; sibling = sibling->m_next_sibling)
- if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive))
+ if (internal::compare(sibling->name(), sibling->name_size(), n, nsize, case_sensitive))
return sibling;
return 0;
}
@@ -1024,18 +988,18 @@
}
//! Gets first attribute of node, optionally matching attribute name.
- //! \param name Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
- //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param n Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if nsize is non-zero
+ //! \param nsize Size of name, in characters, or 0 to have size calculated automatically from string
//! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
//! \return Pointer to found attribute, or 0 if not found.
- xml_attribute<Ch> *first_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ xml_attribute<Ch> *first_attribute(const Ch *n = 0, std::size_t nsize = 0, bool case_sensitive = true) const
{
- if (name)
+ if (n)
{
- if (name_size == 0)
- name_size = internal::measure(name);
+ if (nsize == 0)
+ nsize = internal::measure(n);
for (xml_attribute<Ch> *attribute = m_first_attribute; attribute; attribute = attribute->m_next_attribute)
- if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))
+ if (internal::compare(attribute->name(), attribute->name_size(), n, nsize, case_sensitive))
return attribute;
return 0;
}
@@ -1044,18 +1008,18 @@
}
//! Gets last attribute of node, optionally matching attribute name.
- //! \param name Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
- //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string
+ //! \param n Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if nsize is non-zero
+ //! \param nsize Size of name, in characters, or 0 to have size calculated automatically from string
//! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters
//! \return Pointer to found attribute, or 0 if not found.
- xml_attribute<Ch> *last_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
+ xml_attribute<Ch> *last_attribute(const Ch *n = 0, std::size_t nsize = 0, bool case_sensitive = true) const
{
- if (name)
+ if (n)
{
- if (name_size == 0)
- name_size = internal::measure(name);
+ if (nsize == 0)
+ nsize = internal::measure(n);
for (xml_attribute<Ch> *attribute = m_last_attribute; attribute; attribute = attribute->m_prev_attribute)
- if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive))
+ if (internal::compare(attribute->name(), attribute->name_size(), n, nsize, case_sensitive))
return attribute;
return 0;
}
@@ -1067,10 +1031,10 @@
// Node modification
//! Sets type of node.
- //! \param type Type of node to set.
- void type(node_type type)
+ //! \param t Type of node to set.
+ void type(node_type t)
{
- m_type = type;
+ m_type = t;
}
///////////////////////////////////////////////////////////////////////////
@@ -1411,7 +1375,7 @@
this->append_node(node);
}
else
- RAPIDXML_PARSE_ERROR("expected <", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected <", text);
}
}
@@ -1554,7 +1518,7 @@
}
else // Invalid, only codes up to 0x10FFFF are allowed in Unicode
{
- RAPIDXML_PARSE_ERROR("invalid numeric character entity", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("invalid numeric character entity", text);
}
}
}
@@ -1685,7 +1649,7 @@
if (*src == Ch(';'))
++src;
else
- RAPIDXML_PARSE_ERROR("expected ;", src);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected ;", src);
continue;
// Something else
@@ -1735,7 +1699,7 @@
static_cast<unsigned char>(text[1]) == 0xBB &&
static_cast<unsigned char>(text[2]) == 0xBF)
{
- text += 3; // Skup utf-8 bom
+ text += 3; // Skip utf-8 bom
}
}
@@ -1750,7 +1714,7 @@
while (text[0] != Ch('?') || text[1] != Ch('>'))
{
if (!text[0])
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
++text;
}
text += 2; // Skip '?>'
@@ -1768,7 +1732,7 @@
// Skip ?>
if (text[0] != Ch('?') || text[1] != Ch('>'))
- RAPIDXML_PARSE_ERROR("expected ?>", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected ?>", text);
text += 2;
return declaration;
@@ -1785,7 +1749,7 @@
while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>'))
{
if (!text[0])
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
++text;
}
text += 3; // Skip '-->'
@@ -1793,19 +1757,19 @@
}
// Remember value start
- Ch *value = text;
+ Ch *val = text;
// Skip until end of comment
while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>'))
{
if (!text[0])
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
++text;
}
// Create comment node
xml_node<Ch> *comment = this->allocate_node(node_comment);
- comment->value(value, text - value);
+ comment->value(val, text - val);
// Place zero terminator after comment value
if (!(Flags & parse_no_string_terminators))
@@ -1820,7 +1784,7 @@
xml_node<Ch> *parse_doctype(Ch *&text)
{
// Remember value start
- Ch *value = text;
+ Ch *val = text;
// Skip to >
while (*text != Ch('>'))
@@ -1841,7 +1805,8 @@
{
case Ch('['): ++depth; break;
case Ch(']'): --depth; break;
- case 0: RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ case 0: BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ default: break;
}
++text;
}
@@ -1850,7 +1815,7 @@
// Error on end of text
case Ch('\0'):
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
// Other character, skip it
default:
@@ -1864,7 +1829,7 @@
{
// Create a new doctype node
xml_node<Ch> *doctype = this->allocate_node(node_doctype);
- doctype->value(value, text - value);
+ doctype->value(val, text - val);
// Place zero terminator after value
if (!(Flags & parse_no_string_terminators))
@@ -1892,29 +1857,29 @@
xml_node<Ch> *pi = this->allocate_node(node_pi);
// Extract PI target name
- Ch *name = text;
+ Ch *n = text;
skip<node_name_pred, Flags>(text);
- if (text == name)
- RAPIDXML_PARSE_ERROR("expected PI target", text);
- pi->name(name, text - name);
+ if (text == n)
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected PI target", text);
+ pi->name(n, text - n);
// Skip whitespace between pi target and pi
skip<whitespace_pred, Flags>(text);
// Remember start of pi
- Ch *value = text;
+ Ch *val = text;
// Skip to '?>'
while (text[0] != Ch('?') || text[1] != Ch('>'))
{
if (*text == Ch('\0'))
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
++text;
}
// Set pi value (verbatim, no entity expansion or whitespace normalization)
- pi->value(value, text - value);
-
+ pi->value(val, text - val);
+
// Place zero terminator after name and value
if (!(Flags & parse_no_string_terminators))
{
@@ -1931,7 +1896,7 @@
while (text[0] != Ch('?') || text[1] != Ch('>'))
{
if (*text == Ch('\0'))
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
++text;
}
text += 2; // Skip '?>'
@@ -1950,7 +1915,7 @@
text = contents_start;
// Skip until end of data
- Ch *value = text, *end;
+ Ch *val = text, *end;
if (Flags & parse_normalize_whitespace)
end = skip_and_expand_character_refs<text_pred, text_pure_with_ws_pred, Flags>(text);
else
@@ -1978,14 +1943,14 @@
if (!(Flags & parse_no_data_nodes))
{
xml_node<Ch> *data = this->allocate_node(node_data);
- data->value(value, end - value);
+ data->value(val, end - val);
node->append_node(data);
}
// Add data to parent node if no data exists yet
if (!(Flags & parse_no_element_values))
if (*node->value() == Ch('\0'))
- node->value(value, end - value);
+ node->value(val, end - val);
// Place zero terminator after value
if (!(Flags & parse_no_string_terminators))
@@ -2010,7 +1975,7 @@
while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>'))
{
if (!text[0])
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
++text;
}
text += 3; // Skip ]]>
@@ -2018,17 +1983,17 @@
}
// Skip until end of cdata
- Ch *value = text;
+ Ch *val = text;
while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>'))
{
if (!text[0])
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
++text;
}
// Create new cdata node
xml_node<Ch> *cdata = this->allocate_node(node_cdata);
- cdata->value(value, text - value);
+ cdata->value(val, text - val);
// Place zero terminator after value
if (!(Flags & parse_no_string_terminators))
@@ -2046,11 +2011,11 @@
xml_node<Ch> *element = this->allocate_node(node_element);
// Extract element name
- Ch *name = text;
+ Ch *n = text;
skip<node_name_pred, Flags>(text);
- if (text == name)
- RAPIDXML_PARSE_ERROR("expected element name", text);
- element->name(name, text - name);
+ if (text == n)
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected element name", text);
+ element->name(n, text - n);
// Skip whitespace between element name and attributes or >
skip<whitespace_pred, Flags>(text);
@@ -2068,11 +2033,11 @@
{
++text;
if (*text != Ch('>'))
- RAPIDXML_PARSE_ERROR("expected >", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected >", text);
++text;
}
else
- RAPIDXML_PARSE_ERROR("expected >", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected >", text);
// Place zero terminator after name
if (!(Flags & parse_no_string_terminators))
@@ -2151,6 +2116,9 @@
text += 9; // skip '!DOCTYPE '
return parse_doctype<Flags>(text);
}
+ break;
+
+ default: break;
} // switch
@@ -2159,7 +2127,7 @@
while (*text != Ch('>'))
{
if (*text == 0)
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
++text;
}
++text; // Skip '>'
@@ -2177,7 +2145,8 @@
{
// Skip whitespace between > and node contents
Ch *contents_start = text; // Store start of node contents before whitespace is skipped
- skip<whitespace_pred, Flags>(text);
+ if (Flags & parse_trim_whitespace)
+ skip<whitespace_pred, Flags>(text);
Ch next_char = *text;
// After data nodes, instead of continuing the loop, control jumps here.
@@ -2202,7 +2171,7 @@
Ch *closing_name = text;
skip<node_name_pred, Flags>(text);
if (!internal::compare(node->name(), node->name_size(), closing_name, text - closing_name, true))
- RAPIDXML_PARSE_ERROR("invalid closing tag name", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("invalid closing tag name", text);
}
else
{
@@ -2212,7 +2181,7 @@
// Skip remaining whitespace after node name
skip<whitespace_pred, Flags>(text);
if (*text != Ch('>'))
- RAPIDXML_PARSE_ERROR("expected >", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected >", text);
++text; // Skip '>'
return; // Node closed, finished parsing contents
}
@@ -2227,7 +2196,7 @@
// End of data - error
case Ch('\0'):
- RAPIDXML_PARSE_ERROR("unexpected end of data", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("unexpected end of data", text);
// Data node
default:
@@ -2246,15 +2215,15 @@
while (attribute_name_pred::test(*text))
{
// Extract attribute name
- Ch *name = text;
+ Ch *n = text;
++text; // Skip first character of attribute name
skip<attribute_name_pred, Flags>(text);
- if (text == name)
- RAPIDXML_PARSE_ERROR("expected attribute name", name);
+ if (text == n)
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected attribute name", n);
// Create new attribute
xml_attribute<Ch> *attribute = this->allocate_attribute();
- attribute->name(name, text - name);
+ attribute->name(n, text - n);
node->append_attribute(attribute);
// Skip whitespace after attribute name
@@ -2262,7 +2231,7 @@
// Skip =
if (*text != Ch('='))
- RAPIDXML_PARSE_ERROR("expected =", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected =", text);
++text;
// Add terminating zero after name
@@ -2275,11 +2244,11 @@
// Skip quote and remember if it was ' or "
Ch quote = *text;
if (quote != Ch('\'') && quote != Ch('"'))
- RAPIDXML_PARSE_ERROR("expected ' or \"", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected ' or \"", text);
++text;
// Extract attribute value and expand char refs in it
- Ch *value = text, *end;
+ Ch *val = text, *end;
const int AttFlags = Flags & ~parse_normalize_whitespace; // No whitespace normalization in attributes
if (quote == Ch('\''))
end = skip_and_expand_character_refs<attribute_value_pred<Ch('\'')>, attribute_value_pure_pred<Ch('\'')>, AttFlags>(text);
@@ -2287,11 +2256,11 @@
end = skip_and_expand_character_refs<attribute_value_pred<Ch('"')>, attribute_value_pure_pred<Ch('"')>, AttFlags>(text);
// Set attribute value
- attribute->value(value, end - value);
+ attribute->value(val, end - val);
// Make sure that end quote is present
if (*text != quote)
- RAPIDXML_PARSE_ERROR("expected ' or \"", text);
+ BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected ' or \"", text);
++text; // Skip quote
// Add terminating zero after value
@@ -2589,10 +2558,10 @@
}
//! \endcond
-}
+}}}}
// Undefine internal macros
-#undef RAPIDXML_PARSE_ERROR
+#undef BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR
// On MSVC, restore warnings state
#ifdef _MSC_VER
Modified: branches/release/boost/property_tree/detail/xml_parser_error.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/xml_parser_error.hpp (original)
+++ branches/release/boost/property_tree/detail/xml_parser_error.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -20,10 +20,10 @@
class xml_parser_error: public file_parser_error
{
public:
- xml_parser_error(const std::string &message,
- const std::string &filename,
- unsigned long line):
- file_parser_error(message, filename, line)
+ xml_parser_error(const std::string &msg,
+ const std::string &file,
+ unsigned long l):
+ file_parser_error(msg, file, l)
{
}
};
Modified: branches/release/boost/property_tree/detail/xml_parser_read_rapidxml.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/xml_parser_read_rapidxml.hpp (original)
+++ branches/release/boost/property_tree/detail/xml_parser_read_rapidxml.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -21,49 +21,58 @@
{
template<class Ptree, class Ch>
- void read_xml_node(rapidxml::xml_node<Ch> *node, Ptree &pt, int flags)
+ void read_xml_node(detail::rapidxml::xml_node<Ch> *node,
+ Ptree &pt, int flags)
{
+ using namespace detail::rapidxml;
switch (node->type())
{
// Element nodes
- case rapidxml::node_element:
+ case node_element:
{
// Create node
- Ptree &pt_node = pt.push_back(std::make_pair(node->name(), Ptree()))->second;
-
+ Ptree &pt_node = pt.push_back(std::make_pair(node->name(),
+ Ptree()))->second;
+
// Copy attributes
if (node->first_attribute())
{
- Ptree &pt_attr_root = pt_node.push_back(std::make_pair(xmlattr<Ch>(), Ptree()))->second;
- for (rapidxml::xml_attribute<Ch> *attr = node->first_attribute(); attr; attr = attr->next_attribute())
+ Ptree &pt_attr_root = pt_node.push_back(
+ std::make_pair(xmlattr<Ch>(), Ptree()))->second;
+ for (xml_attribute<Ch> *attr = node->first_attribute();
+ attr; attr = attr->next_attribute())
{
- Ptree &pt_attr = pt_attr_root.push_back(std::make_pair(attr->name(), Ptree()))->second;
+ Ptree &pt_attr = pt_attr_root.push_back(
+ std::make_pair(attr->name(), Ptree()))->second;
pt_attr.data() = attr->value();
}
}
// Copy children
- for (rapidxml::xml_node<Ch> *child = node->first_node(); child; child = child->next_sibling())
+ for (xml_node<Ch> *child = node->first_node();
+ child; child = child->next_sibling())
read_xml_node(child, pt_node, flags);
}
break;
// Data nodes
- case rapidxml::node_data:
- case rapidxml::node_cdata:
+ case node_data:
+ case node_cdata:
{
if (flags & no_concat_text)
- pt.push_back(std::make_pair(xmltext<Ch>(), Ptree(node->value())));
+ pt.push_back(std::make_pair(xmltext<Ch>(),
+ Ptree(node->value())));
else
pt.data() += node->value();
}
break;
// Comment nodes
- case rapidxml::node_comment:
+ case node_comment:
{
if (!(flags & no_comments))
- pt.push_back(std::make_pair(xmlcomment<Ch>(), Ptree(node->value())));
+ pt.push_back(std::make_pair(xmlcomment<Ch>(),
+ Ptree(node->value())));
}
break;
@@ -81,6 +90,7 @@
const std::string &filename)
{
typedef typename Ptree::key_type::value_type Ch;
+ using namespace detail::rapidxml;
// Load data into vector
stream.unsetf(std::ios::skipws);
@@ -93,10 +103,13 @@
try {
// Parse using appropriate flags
- using namespace rapidxml;
const int f_tws = parse_normalize_whitespace
| parse_trim_whitespace;
const int f_c = parse_comment_nodes;
+ // Some compilers don't like the bitwise or in the template arg.
+ const int f_tws_c = parse_normalize_whitespace
+ | parse_trim_whitespace
+ | parse_comment_nodes;
xml_document<Ch> doc;
if (flags & no_comments) {
if (flags & trim_whitespace)
@@ -105,19 +118,20 @@
doc.BOOST_NESTED_TEMPLATE parse<0>(&v.front());
} else {
if (flags & trim_whitespace)
- doc.BOOST_NESTED_TEMPLATE parse<f_tws | f_c>(&v.front());
+ doc.BOOST_NESTED_TEMPLATE parse<f_tws_c>(&v.front());
else
doc.BOOST_NESTED_TEMPLATE parse<f_c>(&v.front());
}
// Create ptree from nodes
Ptree local;
- for (rapidxml::xml_node<Ch> *child = doc.first_node(); child; child = child->next_sibling())
+ for (xml_node<Ch> *child = doc.first_node();
+ child; child = child->next_sibling())
read_xml_node(child, local, flags);
// Swap local and result ptrees
pt.swap(local);
- } catch (rapidxml::parse_error &e) {
+ } catch (parse_error &e) {
long line = static_cast<long>(
std::count(&v.front(), e.where<Ch>(), Ch('\n')) + 1);
BOOST_PROPERTY_TREE_THROW(
Modified: branches/release/boost/property_tree/detail/xml_parser_utils.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/xml_parser_utils.hpp (original)
+++ branches/release/boost/property_tree/detail/xml_parser_utils.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -44,6 +44,9 @@
template<class Ch>
std::basic_string<Ch> encode_char_entities(const std::basic_string<Ch> &s)
{
+ // Don't do anything for empty strings.
+ if(s.empty()) return s;
+
typedef typename std::basic_string<Ch> Str;
Str r;
// To properly round-trip spaces and not uglify the XML beyond
Modified: branches/release/boost/property_tree/detail/xml_parser_write.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/xml_parser_write.hpp (original)
+++ branches/release/boost/property_tree/detail/xml_parser_write.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -31,14 +31,18 @@
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;
- write_xml_indent(stream,indent,settings);
+ if (separate_line)
+ write_xml_indent(stream,indent,settings);
stream << Ch('<') << Ch('!') << Ch('-') << Ch('-');
stream << s;
- stream << Ch('-') << Ch('-') << Ch('>') << std::endl;
+ stream << Ch('-') << Ch('-') << Ch('>');
+ if (separate_line)
+ stream << Ch('\n');
}
template<class Ch>
@@ -52,7 +56,7 @@
if (separate_line)
write_xml_indent(stream,indent,settings);
stream << encode_char_entities(s);
- if (separate_line)
+ if (separate_line)
stream << Ch('\n');
}
@@ -92,7 +96,9 @@
{
write_xml_indent(stream,indent,settings);
stream << Ch('<') << key <<
- Ch('/') << Ch('>') << std::endl;
+ Ch('/') << Ch('>');
+ if (want_pretty)
+ stream << Ch('\n');
}
}
else // Nonempty key
@@ -144,7 +150,7 @@
else if (it->first == xmlcomment<Ch>())
write_xml_comment(stream,
it->second.template get_value<std::basic_string<Ch> >(),
- indent + 1, settings);
+ indent + 1, want_pretty, settings);
else if (it->first == xmltext<Ch>())
write_xml_text(stream,
it->second.template get_value<std::basic_string<Ch> >(),
Modified: branches/release/boost/property_tree/detail/xml_parser_writer_settings.hpp
==============================================================================
--- branches/release/boost/property_tree/detail/xml_parser_writer_settings.hpp (original)
+++ branches/release/boost/property_tree/detail/xml_parser_writer_settings.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -35,12 +35,12 @@
class xml_writer_settings
{
public:
- xml_writer_settings(Ch indent_char = Ch(' '),
- typename std::basic_string<Ch>::size_type indent_count = 0,
- const std::basic_string<Ch> &encoding = widen<Ch>("utf-8"))
- : indent_char(indent_char)
- , indent_count(indent_count)
- , encoding(encoding)
+ xml_writer_settings(Ch inchar = Ch(' '),
+ typename std::basic_string<Ch>::size_type incount = 0,
+ const std::basic_string<Ch> &enc = widen<Ch>("utf-8"))
+ : indent_char(inchar)
+ , indent_count(incount)
+ , encoding(enc)
{
}
Modified: branches/release/boost/property_tree/json_parser.hpp
==============================================================================
--- branches/release/boost/property_tree/json_parser.hpp (original)
+++ branches/release/boost/property_tree/json_parser.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -85,14 +85,17 @@
* @param stream The stream to which to write the JSON representation of the
* property tree.
* @param pt The property tree to tranlsate to JSON and output.
+ * @param pretty Whether to pretty-print. Defaults to true for backward
+ * compatibility.
*/
template<class Ptree>
void write_json(std::basic_ostream<
typename Ptree::key_type::value_type
> &stream,
- const Ptree &pt)
+ const Ptree &pt,
+ bool pretty = true)
{
- write_json_internal(stream, pt, std::string());
+ write_json_internal(stream, pt, std::string(), pretty);
}
/**
@@ -106,11 +109,14 @@
* representation of the property tree.
* @param pt The property tree to translate to JSON and output.
* @param loc The locale to use when writing out to the output file.
+ * @param pretty Whether to pretty-print. Defaults to true and last place
+ * for backward compatibility.
*/
template<class Ptree>
void write_json(const std::string &filename,
const Ptree &pt,
- const std::locale &loc = std::locale())
+ const std::locale &loc = std::locale(),
+ bool pretty = true)
{
std::basic_ofstream<typename Ptree::key_type::value_type>
stream(filename.c_str());
@@ -118,7 +124,7 @@
BOOST_PROPERTY_TREE_THROW(json_parser_error(
"cannot open file", filename, 0));
stream.imbue(loc);
- write_json_internal(stream, pt, filename);
+ write_json_internal(stream, pt, filename, pretty);
}
} } }
Modified: branches/release/boost/property_tree/ptree_fwd.hpp
==============================================================================
--- branches/release/boost/property_tree/ptree_fwd.hpp (original)
+++ branches/release/boost/property_tree/ptree_fwd.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -13,6 +13,7 @@
#include <boost/config.hpp>
#include <boost/optional/optional_fwd.hpp>
+#include <boost/throw_exception.hpp>
#include <functional> // for std::less
#include <memory> // for std::allocator
#include <string>
@@ -87,9 +88,6 @@
/** Implements a path using a std::string as the key. */
typedef string_path<std::string, id_translator<std::string> > path;
- /** Implements a path using a std::wstring as the key. */
- typedef string_path<std::wstring, id_translator<std::wstring> > wpath;
-
/**
* A property tree with std::string for key and data, and default
* comparison.
@@ -104,7 +102,10 @@
detail::less_nocase<std::string> >
iptree;
-#ifndef BOOST_NO_CWCHAR
+#ifndef BOOST_NO_STD_WSTRING
+ /** Implements a path using a std::wstring as the key. */
+ typedef string_path<std::wstring, id_translator<std::wstring> > wpath;
+
/**
* A property tree with std::wstring for key and data, and default
* comparison.
@@ -136,7 +137,7 @@
#if !defined(BOOST_PROPERTY_TREE_DOXYGEN_INVOKED)
// Throwing macro to avoid no return warnings portably
-# define BOOST_PROPERTY_TREE_THROW(e) { throw_exception(e); std::exit(1); }
+# define BOOST_PROPERTY_TREE_THROW(e) BOOST_THROW_EXCEPTION(e)
#endif
#endif
Modified: branches/release/boost/property_tree/string_path.hpp
==============================================================================
--- branches/release/boost/property_tree/string_path.hpp (original)
+++ branches/release/boost/property_tree/string_path.hpp 2010-10-15 08:40:04 EDT (Fri, 15 Oct 2010)
@@ -57,10 +57,12 @@
{
return s;
}
+#ifndef BOOST_NO_STD_WSTRING
inline std::string dump_sequence(const std::wstring &s)
{
return narrow(s.c_str());
}
+#endif
}
/// Default path class. A path is a sequence of values. Groups of values
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk