diff options
| -rw-r--r-- | src/pugixpath.cpp | 14 | ||||
| -rw-r--r-- | tests/test_xpath_api.cpp | 5 | 
2 files changed, 15 insertions, 4 deletions
| diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp index 0478f39..c4134ed 100644 --- a/src/pugixpath.cpp +++ b/src/pugixpath.cpp @@ -965,6 +965,7 @@ namespace pugi  	private:  		const char_t* m_cur; +		const char_t* m_cur_lexeme_pos;  		xpath_lexer_string m_cur_lexeme_contents;  		lexeme_t m_cur_lexeme; @@ -986,6 +987,9 @@ namespace pugi  			while (IS_CHARTYPEX(*cur, ctx_space)) ++cur; +			// save lexeme position for error reporting +			m_cur_lexeme_pos = cur; +  			switch (*cur)  			{  			case 0: @@ -1230,6 +1234,11 @@ namespace pugi  			return m_cur_lexeme;  		} +		const char_t* current_pos() const +		{ +			return m_cur_lexeme_pos; +		} +  		const xpath_lexer_string& contents() const  		{  			assert(m_cur_lexeme == lex_number || m_cur_lexeme == lex_string || m_cur_lexeme == lex_quoted_string); @@ -2568,6 +2577,7 @@ namespace pugi  	{  	    xpath_allocator& m_alloc;  	    xpath_lexer m_lexer; +		const char_t* m_query;  		xpath_parse_result* m_result;  		jmp_buf m_error_handler; @@ -2577,7 +2587,7 @@ namespace pugi  		void throw_error(const char* message)  		{  			m_result->error = message; -			m_result->offset = 0; // $$$ lexer +			m_result->offset = m_lexer.current_pos() - m_query;  			longjmp(m_error_handler, 1);  		} @@ -3332,7 +3342,7 @@ namespace pugi  			return parse_or_expression();  		} -		xpath_parser(const char_t* query, xpath_allocator& alloc, xpath_parse_result* result): m_alloc(alloc), m_lexer(query), m_result(result) +		xpath_parser(const char_t* query, xpath_allocator& alloc, xpath_parse_result* result): m_alloc(alloc), m_lexer(query), m_query(query), m_result(result)  		{  		} diff --git a/tests/test_xpath_api.cpp b/tests/test_xpath_api.cpp index 87cc40a..b5b63a7 100644 --- a/tests/test_xpath_api.cpp +++ b/tests/test_xpath_api.cpp @@ -4,6 +4,7 @@  #include "helpers.hpp" +#include <string.h>  #include <string>  TEST_XML(xpath_api_select_nodes, "<node><head/><foo/><foo/><tail/></node>") @@ -215,7 +216,7 @@ TEST(xpath_api_query_result_fail)  	try  	{  #endif -		xpath_query q(STR("string-length(1, 2, 3)")); +		xpath_query q(STR("//foo/child::/bar"));  #ifndef PUGIXML_NO_EXCEPTIONS  		CHECK_FORCE_FAIL("Expected exception"); @@ -228,7 +229,7 @@ TEST(xpath_api_query_result_fail)  		CHECK(!result);  		CHECK(result.error != 0 && result.error[0] != 0);  		CHECK(result.description() == result.error); -		CHECK(result.offset == 0); // $$$ +		CHECK(result.offset == 13);  #ifndef PUGIXML_NO_EXCEPTIONS  	} | 
