summaryrefslogtreecommitdiff
path: root/src
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 /src
parent12607d60470b34a7381d269a8a916f7ff1ff5a61 (diff)
XPath: Added error offset reporting
git-svn-id: http://pugixml.googlecode.com/svn/trunk@639 99668b35-9821-0410-8761-19e4c4f06640
Diffstat (limited to 'src')
-rw-r--r--src/pugixpath.cpp14
1 files changed, 12 insertions, 2 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)
{
}