Explorar o código

2002-07-17 Piers Haken <[email protected]>

	* DefaultContext.cs: implement 'string-length()', 'normalize-space()'
	* Parser.jay: remove redundant production
	* Expression.cs: add switches for debugging under VS.NET

svn path=/trunk/mcs/; revision=5849
Piers Haken %!s(int64=23) %!d(string=hai) anos
pai
achega
2a157572bf

+ 6 - 0
mcs/class/System.XML/System.Xml.XPath/ChangeLog

@@ -1,3 +1,9 @@
+2002-07-17  Piers Haken <[email protected]>
+	
+	* DefaultContext.cs: implement 'string-length()', 'normalize-space()'
+	* Parser.jay: remove redundant production
+	* Expression.cs: add switches for debugging under VS.NET
+
 2002-07-17  Piers Haken <[email protected]>
 
 	* Expression.cs: implement nodeset/nodeset comparisons (non-optimal)

+ 32 - 3
mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs

@@ -428,7 +428,12 @@ namespace System.Xml.XPath
 		public override XPathResultType [] ArgTypes { get { return new XPathResultType [] { XPathResultType.String }; }}
 		public override object TypesafeInvoke (XsltContext xsltContext, object[] args, XPathNavigator docContext)
 		{
-			return (double) ((string) args [0]).Length;
+			string str;
+			if (args.Length == 1)
+				str = (string) args [0];
+			else
+				str = docContext.Value;
+			return (double) str.Length;
 		}
 		public override string Name { get { return "string-length"; }}
 	}
@@ -441,9 +446,33 @@ namespace System.Xml.XPath
 		[MonoTODO]
 		public override object TypesafeInvoke (XsltContext xsltContext, object[] args, XPathNavigator docContext)
 		{
-			throw new NotImplementedException ();
+			string str;
+			if (args.Length == 1)
+				str = (string) args [0];
+			else
+				str = docContext.Value;
+			System.Text.StringBuilder sb = new System.Text.StringBuilder ();
+			bool fSpace = false;
+			foreach (char ch in str)
+			{
+				if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n')
+				{
+					fSpace = true;
+				}
+				else
+				{
+					if (fSpace)
+					{
+						fSpace = false;
+						if (sb.Length > 0)
+							sb.Append (' ');
+					}
+					sb.Append (ch);
+				}
+			}
+			return sb.ToString ();
 		}
-		public override string Name { get { return "normalize-sace"; }}
+		public override string Name { get { return "normalize-space"; }}
 	}
 	internal class XPathFunctionTranslate : XPathFunction
 	{

+ 8 - 0
mcs/class/System.XML/System.Xml.XPath/Expression.cs

@@ -15,7 +15,11 @@ using System.Xml.Xsl;
 
 namespace System.Xml.XPath
 {
+#if XPATH_DEBUG
+	internal class CompiledExpression : Test.Xml.XPath.XPathExpression
+#else
 	internal class CompiledExpression : XPathExpression
+#endif
 	{
 		protected XmlNamespaceManager _nsm;
 		protected Expression _expr;
@@ -29,7 +33,11 @@ namespace System.Xml.XPath
 			_nsm = other._nsm;
 			_expr = other._expr;
 		}
+#if XPATH_DEBUG
+		public override Test.Xml.XPath.XPathExpression Clone () { return new CompiledExpression (this); }
+#else
 		public override XPathExpression Clone () { return new CompiledExpression (this); }
+#endif
 
 		public override void SetContext (XmlNamespaceManager nsManager)
 		{

+ 0 - 50
mcs/class/System.XML/System.Xml.XPath/Iterator.cs

@@ -15,56 +15,6 @@ using System.Xml.Xsl;
 
 namespace System.Xml.XPath
 {
-/*
-	internal abstract class XPathNodeIterator : ICloneable
-	{
-		private int _count;
-
-		#region Constructor
-
-		protected XPathNodeIterator () {}
-
-		#endregion
-
-		#region Properties
-
-		public virtual int Count
-		{
-			get
-			{
-				if (_count == 0)
-				{
-					// compute and cache the count
-					XPathNodeIterator tmp = Clone ();
-					while (tmp.MoveNext ())
-						;
-					_count = tmp.CurrentPosition;
-				}
-				return _count;
-			}
-		}
-
-		public abstract XPathNavigator Current { get; }
-
-		public abstract int CurrentPosition { get; }
-
-		#endregion
-
-		#region Methods
-
-		public abstract XPathNodeIterator Clone ();
-
-		object ICloneable.Clone ()
-		{
-			return Clone ();
-		}
-
-		public abstract bool MoveNext ();
-
-		#endregion
-	}
-*/
-
 	internal abstract class BaseIterator : XPathNodeIterator
 	{
 		private XsltContext _context;

+ 65 - 70
mcs/class/System.XML/System.Xml.XPath/Parser.cs

@@ -12,6 +12,7 @@
 
 using System;
 using System.Xml.XPath;
+using Test.Xml.XPath;
 
 namespace Mono.Xml.XPath
 {
@@ -22,7 +23,7 @@ namespace Mono.Xml.XPath
 			return yyparse (tok, new yydebug.yyDebugSimple ());
 		}
 
-					// line 26 "-"
+					// line 27 "-"
 
   /** simplified error message.
       @see <a href="#yyerror(java.lang.String, java.lang.String[])">yyerror</a>
@@ -329,341 +330,335 @@ namespace Mono.Xml.XPath
         yyVal = yyDefault(yyV > yyTop ? null : yyVals[yyV]);
         switch (yyN) {
 case 3:
-					// line 111 "Parser.jay"
+					// line 112 "Parser.jay"
   {
 		yyVal = new ExprOR ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 5:
-					// line 119 "Parser.jay"
+					// line 120 "Parser.jay"
   {
 		yyVal = new ExprAND ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 7:
-					// line 127 "Parser.jay"
+					// line 128 "Parser.jay"
   {
 		yyVal = new ExprEQ ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 8:
-					// line 131 "Parser.jay"
+					// line 132 "Parser.jay"
   {
 		yyVal = new ExprNE ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 10:
-					// line 139 "Parser.jay"
+					// line 140 "Parser.jay"
   {
 		yyVal = new ExprLT ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 11:
-					// line 143 "Parser.jay"
+					// line 144 "Parser.jay"
   {
 		yyVal = new ExprGT ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 12:
-					// line 147 "Parser.jay"
+					// line 148 "Parser.jay"
   {
 		yyVal = new ExprLE ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 13:
-					// line 151 "Parser.jay"
+					// line 152 "Parser.jay"
   {
 		yyVal = new ExprGE ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 15:
-					// line 159 "Parser.jay"
+					// line 160 "Parser.jay"
   {
 		yyVal = new ExprPLUS ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 16:
-					// line 163 "Parser.jay"
+					// line 164 "Parser.jay"
   {
 		yyVal = new ExprMINUS ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 18:
-					// line 171 "Parser.jay"
+					// line 172 "Parser.jay"
   {
 		yyVal = new ExprMULT ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 19:
-					// line 175 "Parser.jay"
+					// line 176 "Parser.jay"
   {
 		yyVal = new ExprDIV ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 20:
-					// line 179 "Parser.jay"
+					// line 180 "Parser.jay"
   {
 		yyVal = new ExprMOD ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 22:
-					// line 187 "Parser.jay"
+					// line 188 "Parser.jay"
   {
 		yyVal = new ExprNEG ((Expression) yyVals[0+yyTop]);
 	}
   break;
 case 24:
-					// line 195 "Parser.jay"
+					// line 196 "Parser.jay"
   {
 		yyVal = new ExprUNION ((NodeSet) yyVals[-2+yyTop], (NodeSet) yyVals[0+yyTop]);
 	}
   break;
 case 26:
-					// line 203 "Parser.jay"
+					// line 204 "Parser.jay"
   {
 		yyVal = new ExprRoot ();
 	}
   break;
 case 27:
-					// line 207 "Parser.jay"
+					// line 208 "Parser.jay"
   {
 		yyVal = new ExprSLASH (new ExprRoot (), (NodeSet) yyVals[0+yyTop]);
 	}
   break;
 case 28:
-					// line 211 "Parser.jay"
+					// line 212 "Parser.jay"
   {
 		ExprStep exprStep = new ExprStep (new NodeTypeTest (Axes.DescendantOrSelf, XPathNodeType.All));
 		yyVal = new ExprSLASH (new ExprSLASH (new ExprRoot (), exprStep), (NodeSet) yyVals[0+yyTop]);
 	}
   break;
 case 30:
-					// line 217 "Parser.jay"
+					// line 218 "Parser.jay"
   {
 		yyVal = new ExprSLASH ((NodeSet) yyVals[-2+yyTop], (NodeSet) yyVals[0+yyTop]);
 	}
   break;
 case 31:
-					// line 221 "Parser.jay"
+					// line 222 "Parser.jay"
   {
 		ExprStep exprStep = new ExprStep (new NodeTypeTest (Axes.DescendantOrSelf, XPathNodeType.All));
 		yyVal = new ExprSLASH (new ExprSLASH ((NodeSet) yyVals[-2+yyTop], exprStep), (NodeSet) yyVals[0+yyTop]);
 	}
   break;
 case 33:
-					// line 230 "Parser.jay"
+					// line 231 "Parser.jay"
   {
 		yyVal = new ExprSLASH ((NodeSet) yyVals[-2+yyTop], (NodeSet) yyVals[0+yyTop]);
 	}
   break;
 case 34:
-					// line 234 "Parser.jay"
+					// line 235 "Parser.jay"
   {
 		ExprStep exprStep = new ExprStep (new NodeTypeTest (Axes.DescendantOrSelf, XPathNodeType.All));
 		yyVal = new ExprSLASH (new ExprSLASH ((NodeSet) yyVals[-2+yyTop], exprStep), (NodeSet) yyVals[0+yyTop]);
 	}
   break;
 case 35:
-					// line 242 "Parser.jay"
+					// line 243 "Parser.jay"
   {
 		yyVal = new ExprStep (new NodeNameTest ((Axes) yyVals[-2+yyTop], (QName) yyVals[-1+yyTop]), (ExprPredicates) yyVals[0+yyTop]);
 	}
   break;
 case 36:
-					// line 246 "Parser.jay"
+					// line 247 "Parser.jay"
   {
 		yyVal = new ExprStep (new NodeTypeTest ((Axes) yyVals[-2+yyTop]), (ExprPredicates) yyVals[0+yyTop]);
 	}
   break;
 case 37:
-					// line 255 "Parser.jay"
+					// line 256 "Parser.jay"
   {
 		yyVal = new ExprStep (new NodeTypeTest ((Axes) yyVals[-5+yyTop], (XPathNodeType) yyVals[-4+yyTop], (String) yyVals[-2+yyTop]), (ExprPredicates) yyVals[0+yyTop]);
 	}
   break;
 case 38:
-					// line 259 "Parser.jay"
+					// line 260 "Parser.jay"
   {
 		yyVal = new ExprStep (new NodeTypeTest (Axes.Self, XPathNodeType.All));
 	}
   break;
 case 39:
-					// line 263 "Parser.jay"
+					// line 264 "Parser.jay"
   {
 		yyVal = new ExprStep (new NodeTypeTest (Axes.Parent, XPathNodeType.All));
 	}
   break;
 case 40:
-					// line 270 "Parser.jay"
+					// line 271 "Parser.jay"
   {
 		yyVal = Axes.Child;
 	}
   break;
 case 41:
-					// line 274 "Parser.jay"
+					// line 275 "Parser.jay"
   {
 		yyVal = Axes.Attribute;
 	}
   break;
 case 42:
-					// line 278 "Parser.jay"
+					// line 279 "Parser.jay"
   {
 		yyVal = yyVals[-1+yyTop];
 	}
   break;
 case 43:
-					// line 284 "Parser.jay"
+					// line 285 "Parser.jay"
   { yyVal = XPathNodeType.Comment; }
   break;
 case 44:
-					// line 285 "Parser.jay"
+					// line 286 "Parser.jay"
   { yyVal = XPathNodeType.Text; }
   break;
 case 45:
-					// line 286 "Parser.jay"
+					// line 287 "Parser.jay"
   { yyVal = XPathNodeType.ProcessingInstruction; }
   break;
 case 46:
-					// line 287 "Parser.jay"
+					// line 288 "Parser.jay"
   { yyVal = XPathNodeType.All; }
   break;
 case 48:
-					// line 294 "Parser.jay"
+					// line 295 "Parser.jay"
   {
 		yyVal = new ExprFilter ((Expression) yyVals[-1+yyTop], (Expression) yyVals[0+yyTop]);
 	}
   break;
 case 49:
-					// line 301 "Parser.jay"
+					// line 302 "Parser.jay"
   {
 		yyVal = new ExprVariable ((QName) yyVals[0+yyTop]);
 	}
   break;
 case 50:
-					// line 305 "Parser.jay"
+					// line 306 "Parser.jay"
   {
 		yyVal = yyVals[-1+yyTop];
 	}
   break;
 case 51:
-					// line 309 "Parser.jay"
+					// line 310 "Parser.jay"
   {
 		yyVal = new ExprLiteral ((String) yyVals[0+yyTop]);
 	}
   break;
 case 52:
-					// line 313 "Parser.jay"
+					// line 314 "Parser.jay"
   {
 		yyVal = new ExprNumber ((double) yyVals[0+yyTop]);
 	}
   break;
 case 54:
-					// line 321 "Parser.jay"
+					// line 322 "Parser.jay"
   {
 		yyVal = new ExprFunctionCall ((String) yyVals[-3+yyTop], (FunctionArguments) yyVals[-1+yyTop]);
 	}
   break;
 case 56:
-					// line 329 "Parser.jay"
+					// line 330 "Parser.jay"
   {
 		yyVal = new FunctionArguments ((Expression) yyVals[-1+yyTop], (FunctionArguments) yyVals[0+yyTop]);
 	}
   break;
 case 58:
-					// line 337 "Parser.jay"
+					// line 338 "Parser.jay"
   {
 		yyVal = new FunctionArguments ((Expression) yyVals[-1+yyTop], (FunctionArguments) yyVals[0+yyTop]);
 	}
   break;
 case 60:
-					// line 346 "Parser.jay"
+					// line 347 "Parser.jay"
   {
 		yyVal = new ExprPredicates ((Expression) yyVals[-1+yyTop], (ExprPredicates) yyVals[0+yyTop]);
 	}
   break;
 case 61:
-					// line 353 "Parser.jay"
+					// line 354 "Parser.jay"
   {
 		yyVal = yyVals[-1+yyTop];
 	}
   break;
 case 62:
-					// line 359 "Parser.jay"
+					// line 360 "Parser.jay"
   { yyVal = Axes.Ancestor; }
   break;
 case 63:
-					// line 360 "Parser.jay"
+					// line 361 "Parser.jay"
   { yyVal = Axes.AncestorOrSelf; }
   break;
 case 64:
-					// line 361 "Parser.jay"
+					// line 362 "Parser.jay"
   { yyVal = Axes.Attribute; }
   break;
 case 65:
-					// line 362 "Parser.jay"
+					// line 363 "Parser.jay"
   { yyVal = Axes.Child; }
   break;
 case 66:
-					// line 363 "Parser.jay"
+					// line 364 "Parser.jay"
   { yyVal = Axes.Descendant; }
   break;
 case 67:
-					// line 364 "Parser.jay"
+					// line 365 "Parser.jay"
   { yyVal = Axes.DescendantOrSelf; }
   break;
 case 68:
-					// line 365 "Parser.jay"
+					// line 366 "Parser.jay"
   { yyVal = Axes.Following; }
   break;
 case 69:
-					// line 366 "Parser.jay"
+					// line 367 "Parser.jay"
   { yyVal = Axes.FollowingSibling; }
   break;
 case 70:
-					// line 367 "Parser.jay"
+					// line 368 "Parser.jay"
   { yyVal = Axes.Namespace; }
   break;
 case 71:
-					// line 368 "Parser.jay"
+					// line 369 "Parser.jay"
   { yyVal = Axes.Parent; }
   break;
 case 72:
-					// line 369 "Parser.jay"
+					// line 370 "Parser.jay"
   { yyVal = Axes.Preceding; }
   break;
 case 73:
-					// line 370 "Parser.jay"
+					// line 371 "Parser.jay"
   { yyVal = Axes.PrecedingSibling; }
   break;
 case 74:
-					// line 371 "Parser.jay"
+					// line 372 "Parser.jay"
   { yyVal = Axes.Self; }
   break;
-case 76:
-					// line 377 "Parser.jay"
-  {
-		yyVal = yyVals[0+yyTop];
-	}
-  break;
 case 77:
-					// line 384 "Parser.jay"
+					// line 382 "Parser.jay"
   {
 		yyVal = new NCName ((String) yyVals[0+yyTop]);
 	}
   break;
 case 78:
-					// line 388 "Parser.jay"
+					// line 386 "Parser.jay"
   {
 		yyVal = new QName ((String) yyVals[-2+yyTop], null);
 	}
   break;
 case 79:
-					// line 392 "Parser.jay"
+					// line 390 "Parser.jay"
   {
 		yyVal = new QName ((String) yyVals[-2+yyTop], (String) yyVals[0+yyTop]);
 	}
   break;
-					// line 667 "-"
+					// line 662 "-"
         }
         yyTop -= yyLen[yyN];
         yyState = yyStates[yyTop];
@@ -928,9 +923,9 @@ case 79:
   271,   -1,  273,
   };
 
-					// line 398 "Parser.jay"
+					// line 396 "Parser.jay"
 	}
-					// line 934 "-"
+					// line 929 "-"
 namespace yydebug {
         using System;
 	 public interface yyDebug {

+ 1 - 3
mcs/class/System.XML/System.Xml.XPath/Parser.jay

@@ -10,6 +10,7 @@
 
 using System;
 using System.Xml.XPath;
+using Test.Xml.XPath;
 
 namespace Mono.Xml.XPath
 {
@@ -374,9 +375,6 @@ AxisName
 OptionalLiteral
 	: /* empty */
 	| LITERAL
-	{
-		$$ = $1;
-	}
 	;
 
 QName