From 59e034149fd3fd95c14a19e4e5588f4861131cbb Mon Sep 17 00:00:00 2001
From: "arseny.kapoulkine"
 <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>
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(-)

(limited to 'src')

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