summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-08-29 15:08:33 +0000
committerarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-08-29 15:08:33 +0000
commit608d5bbd79b120602a3a5272fa73ca3d5916aeb1 (patch)
treed747aac40a5c4ee8ba81dd3aaf12d4032cbe972d
parent12607d60470b34a7381d269a8a916f7ff1ff5a61 (diff)
XPath: Added error offset reporting
git-svn-id: http://pugixml.googlecode.com/svn/trunk@639 99668b35-9821-0410-8761-19e4c4f06640
-rw-r--r--src/pugixpath.cpp14
-rw-r--r--tests/test_xpath_api.cpp5
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
}