diff options
author | arseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640> | 2010-08-29 15:08:33 +0000 |
---|---|---|
committer | arseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640> | 2010-08-29 15:08:33 +0000 |
commit | 608d5bbd79b120602a3a5272fa73ca3d5916aeb1 (patch) | |
tree | d747aac40a5c4ee8ba81dd3aaf12d4032cbe972d /src | |
parent | 12607d60470b34a7381d269a8a916f7ff1ff5a61 (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.cpp | 14 |
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) { } |