You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@apache.org on 2001/11/27 00:16:02 UTC

cvs commit: xml-xalan/c/src/XPath XPathProcessorImpl.cpp XPathProcessorImpl.hpp

dbertoni    01/11/26 15:16:02

  Modified:    c/src/XPath XPathProcessorImpl.cpp XPathProcessorImpl.hpp
  Log:
  Better error detection.  Fixes bugs 5049 and 5093.
  
  Revision  Changes    Path
  1.46      +87 -19    xml-xalan/c/src/XPath/XPathProcessorImpl.cpp
  
  Index: XPathProcessorImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathProcessorImpl.cpp,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- XPathProcessorImpl.cpp	2001/11/16 19:34:22	1.45
  +++ XPathProcessorImpl.cpp	2001/11/26 23:16:02	1.46
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights 
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -715,7 +715,7 @@
   			XalanDOMChar	c,
   			int 			n) const
   {
  -	const XalanDOMString 	tok =
  +	const XalanDOMString& 	tok =
   		getTokenRelative(n - 1);
   
   	if (length(tok) == 1 &&
  @@ -738,7 +738,7 @@
   {
   	assert(s != 0);
   
  -	const XalanDOMString 	tok =
  +	const XalanDOMString& 	tok =
   		getTokenRelative(n - 1);
   
   	return equals(tok, s);
  @@ -751,7 +751,7 @@
   			const XalanDOMString&	s,
   			int						n) const
   {
  -	const XalanDOMString 	tok =
  +	const XalanDOMString& 	tok =
   		getTokenRelative(n - 1);
   
   	return equals(tok, s);
  @@ -764,7 +764,7 @@
   			char	c,
   			int 	n) const
   {
  -	const XalanDOMString 	tok =
  +	const XalanDOMString& 	tok =
   		getTokenRelative(-(n + 1));
   
   	if (length(tok) == 1 &&
  @@ -783,7 +783,7 @@
   bool
   XPathProcessorImpl::lookbehindHasToken(int	n) const
   {
  -	const XalanDOMString 	tok =
  +	const XalanDOMString& 	tok =
   		getTokenRelative(-(n + 1));
   
   	const XalanDOMChar 		c0 = length(tok) == 0 ? XalanUnicode::charVerticalLine : charAt(tok, 0);
  @@ -844,7 +844,7 @@
   
   
   
  -XalanDOMString
  +const XalanDOMString&
   XPathProcessorImpl::getTokenRelative(int	theOffset) const
   {
   	assert(m_expression != 0);
  @@ -852,7 +852,7 @@
   	const XObject* const	theToken =
   		m_expression->getRelativeToken(theOffset);
   
  -	return theToken == 0 ? XalanDOMString() : theToken->str();
  +	return theToken == 0 ? s_emptyString : theToken->str();
   }
   
   
  @@ -1905,14 +1905,19 @@
   	}
   	else if(tokenIs(XalanUnicode::charSolidus) == true)
   	{
  -		axisType = XPathExpression::eFROM_DESCENDANTS_OR_SELF;
  +		// Check the current token in the expression.  It's
  +		// actually the next token in this context.
  +		//
  +		const XalanDOMString&	theNextToken = getTokenRelative(0);
   
  -		// Have to fix up for patterns such as '//@foo' or '//attribute::foo',
  -		// which translate to 'descendant-or-self::node()/attribute::foo'.
  -		// notice I leave the '/' on the queue, so the next will be processed 
  -		// by a regular step pattern.
  -		// if(lookahead(XalanUnicode::charCommercialAt, 1) == true || lookahead("::", 2) == true)
  +		if (isAxis(theNextToken) == false && isNodeTest(theNextToken) == false)
   		{
  +			nextToken();
  +
  +			error("Expected axis or node test!");
  +		}
  +		else
  +		{
   			// Tell how long the step is without the predicate
   			const XPathExpression::OpCodeMapValueVectorType		theArgs(1, 4);
   
  @@ -1926,10 +1931,6 @@
   
   			return; // make a quick exit...
   		}
  -		//else
  -		//{
  -		//	nextToken();
  -		//}
   	}
   	else
   	{
  @@ -1952,7 +1953,7 @@
   	assert(m_xpath != 0);
   	assert(m_expression != 0);
   
  -	AxisNamesMapType::const_iterator	i =
  +	const AxisNamesMapType::const_iterator	i =
   		s_axisNames.find(m_token);
   
   	if (i == s_axisNames.end())
  @@ -2034,6 +2035,10 @@
   		{
   			m_expression->appendOpCode(XPathExpression::eELEMWILDCARD);
   		}
  +		else if (isNodeTest(m_token) == false)
  +		{
  +			error("Expected node test!");
  +		}
   		else
   		{
   			if (axisType == XPathExpression::eFROM_NAMESPACE)
  @@ -2455,6 +2460,65 @@
   
   
   
  +bool
  +XPathProcessorImpl::isAxis(const XalanDOMString&	theToken)
  +{
  +	const XalanDOMString::size_type		theLength = length(theToken);
  +
  +	if (theLength == 0)
  +	{
  +		return false;
  +	}
  +	else if (theLength == 1 &&
  +			 charAt(theToken, 0) == XalanUnicode::charCommercialAt)
  +	{
  +		return true;
  +	}
  +	else
  +	{
  +		const AxisNamesMapType::const_iterator	i =
  +			s_axisNames.find(theToken);
  +
  +		if (i != s_axisNames.end())
  +		{
  +			return true;
  +		}
  +		else
  +		{
  +			return false;
  +		}
  +	}
  +}
  +
  +
  +
  +bool
  +XPathProcessorImpl::isNodeTest(const XalanDOMString&	theToken)
  +{
  +	const XalanDOMString::size_type		theLength = length(theToken);
  +
  +	if (theLength == 0)
  +	{
  +		return false;
  +	}
  +	else if (theLength == 1 &&
  +			 charAt(theToken, 0) == XalanUnicode::charAsterisk)
  +	{
  +		return true;
  +	}
  +	else if (charAt(theToken, 0) == XalanUnicode::charLowLine ||
  +			 XalanXMLChar::isLetter(charAt(theToken, 0)) == true)
  +	{
  +		return true;
  +	}
  +	else
  +	{
  +		return false;
  +	}
  +}
  +
  +
  +
   void
   XPathProcessorImpl::initializeKeywordsTable(KeywordsMapType&	/* theKeywords */)
   {
  @@ -2540,6 +2604,10 @@
   static XalanDOMString	s_attributeString;
   
   static XalanDOMString	s_childString;
  +
  +
  +const XalanDOMString	XPathProcessorImpl::s_emptyString;
  +
   
   
   const XalanDOMString&	XPathProcessorImpl::s_functionIDString = ::s_functionIDString;
  
  
  
  1.18      +21 -1     xml-xalan/c/src/XPath/XPathProcessorImpl.hpp
  
  Index: XPathProcessorImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathProcessorImpl.hpp,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- XPathProcessorImpl.hpp	2001/07/12 04:35:50	1.17
  +++ XPathProcessorImpl.hpp	2001/11/26 23:16:02	1.18
  @@ -355,7 +355,7 @@
   	 * Retrieve the next token from the command and
   	 * store it in m_token string.
   	 */
  -	XalanDOMString
  +	const XalanDOMString&
   	getTokenRelative(int	theOffset) const;
   
   	/**
  @@ -390,6 +390,24 @@
   	isCurrentLiteral() const;
   
   	/**
  +	 * Determine if the token is an axis
  +	 *
  +	 * @param theToken The token to test
  +	 * @return true if the token is a valid axis, false if not.
  +	 */
  +	static bool
  +	isAxis(const XalanDOMString&	theToken);
  +
  +	/**
  +	 * Determine if the token could be a node test
  +	 *
  +	 * @param theToken The token to test
  +	 * @return true if the token is a valid node test, false if not.
  +	 */
  +	static bool
  +	isNodeTest(const XalanDOMString&	theToken);
  +
  +	/**
   	 * Throw an exception using the provided message text.
   	 */
   	void
  @@ -805,6 +823,8 @@
   	{
   		TARGETEXTRA = 10000
   	};
  +
  +	static const XalanDOMString		s_emptyString;
   
   	// This shouldn't really be here, since it duplicates a string that is part
   	// of the information that is maintained by the class XPathFunctionTable,
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org