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 } |