summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2009-01-18 11:44:57 +0000
committerarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2009-01-18 11:44:57 +0000
commitf57ab5289453e8323dc0aca03ee94fb5ee6ac696 (patch)
treeb44be2108c1a1e6693b7714c658ce98884afdd45 /src
parent9bc19368f2fe81fec271c57ac1583c6a9eb1d014 (diff)
Added offset_debug
git-svn-id: http://pugixml.googlecode.com/svn/trunk@108 99668b35-9821-0410-8761-19e4c4f06640
Diffstat (limited to 'src')
-rw-r--r--src/pugixml.cpp36
-rw-r--r--src/pugixml.hpp10
2 files changed, 45 insertions, 1 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index 06bd0ba..4ea08a9 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -203,11 +203,12 @@ namespace pugi
struct xml_document_struct: public xml_node_struct
{
- xml_document_struct(): xml_node_struct(node_document), allocator(0)
+ xml_document_struct(): xml_node_struct(node_document), allocator(0), buffer(0)
{
}
xml_allocator allocator;
+ const char* buffer;
};
xml_document_struct* xml_allocator::allocate_document()
@@ -2620,6 +2621,36 @@ namespace pugi
node_output(buffered_writer, *this, indent, flags, depth);
}
+ int xml_node::offset_debug() const
+ {
+ xml_node_struct* r = root()._root;
+
+ if (!r) return -1;
+
+ const char* buffer = static_cast<xml_document_struct*>(r)->buffer;
+
+ if (!buffer) return -1;
+
+ switch (type())
+ {
+ case node_document:
+ return 0;
+
+ case node_element:
+ case node_declaration:
+ return _root->name_insitu ? _root->name - buffer : -1;
+
+ case node_pcdata:
+ case node_cdata:
+ case node_comment:
+ case node_pi:
+ return _root->value_insitu ? _root->value - buffer : -1;
+
+ default:
+ return -1;
+ }
+ }
+
#ifdef __BORLANDC__
bool operator&&(const xml_node& lhs, bool rhs)
{
@@ -2891,6 +2922,9 @@ namespace pugi
{
destroy();
+ // for offset_debug
+ static_cast<xml_document_struct*>(_root)->buffer = xmlstr;
+
xml_allocator& alloc = static_cast<xml_document_struct*>(_root)->allocator;
xml_parser parser(alloc);
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index 3e6aa3d..5b9b5c7 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -1210,6 +1210,16 @@ namespace pugi
* \param depth - starting depth (used for indentation)
*/
void print(xml_writer& writer, const char* indent = "\t", unsigned int flags = format_default, unsigned int depth = 0);
+
+ /**
+ * Get node offset in parsed file/string (in bytes) for debugging purposes
+ *
+ * \return offset in bytes to start of node data, or -1 in case of error
+ * \note This will return -1 if node information changed to the extent that it's no longer possible to calculate offset, for example
+ * if element node name has significantly changed; this is guaranteed to return correct offset only for nodes that have not changed
+ * since parsing.
+ */
+ int offset_debug() const;
};
#ifdef __BORLANDC__