From 608d5bbd79b120602a3a5272fa73ca3d5916aeb1 Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Sun, 29 Aug 2010 15:08:33 +0000 Subject: XPath: Added error offset reporting git-svn-id: http://pugixml.googlecode.com/svn/trunk@639 99668b35-9821-0410-8761-19e4c4f06640 --- src/pugixpath.cpp | 14 ++++++++++++-- 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 #include TEST_XML(xpath_api_select_nodes, "") @@ -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 } -- cgit v1.2.3