diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pugixml.cpp | 36 | ||||
| -rw-r--r-- | src/pugixml.hpp | 10 | 
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__ | 
