From 59e034149fd3fd95c14a19e4e5588f4861131cbb Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Sun, 29 Aug 2010 15:40:38 +0000 Subject: XPath: Reworked variable reference parsing, '$ name' and '$foo:*' are now correctly rejected git-svn-id: http://pugixml.googlecode.com/svn/trunk@682 99668b35-9821-0410-8761-19e4c4f06640 --- src/pugixml.cpp | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 1a69a8e..7981d16 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -5946,13 +5946,34 @@ namespace pugi _cur_lexeme = lex_union; break; - + case '$': cur += 1; - _cur_lexeme = lex_var_ref; + + if (IS_CHARTYPEX(*cur, ctx_start_symbol)) + { + _cur_lexeme_contents.begin = cur; + + while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + + if (cur[0] == ':' && IS_CHARTYPEX(cur[1], ctx_symbol)) // qname + { + cur++; // : + + while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + } + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_var_ref; + } + else + { + _cur_lexeme = lex_none; + } break; - + case '(': cur += 1; _cur_lexeme = lex_open_brace; @@ -6124,7 +6145,7 @@ namespace pugi const xpath_lexer_string& contents() const { - assert(_cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string); + assert(_cur_lexeme == lex_var_ref || _cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string); return _cur_lexeme_contents; } @@ -7738,16 +7759,11 @@ namespace pugi { case lex_var_ref: { - _lexer.next(); - - if (_lexer.current() != lex_string) - throw_error("Variable name expected"); + xpath_lexer_string name = _lexer.contents(); if (!_variables) throw_error("Unknown variable: variable set is not provided"); - xpath_lexer_string name = _lexer.contents(); - xpath_variable* var = get_variable(_variables, name.begin, name.end); if (!var) -- cgit v1.2.3