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 2004/11/02 06:33:43 UTC

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

dbertoni    2004/11/01 21:33:43

  Modified:    c/src/xalanc/XPath XPathProcessorImpl.cpp
                        XPathProcessorImpl.hpp
  Log:
  Fixed a bug where we were not detecting a missing term in binary operators.
  
  Revision  Changes    Path
  1.13      +224 -162  xml-xalan/c/src/xalanc/XPath/XPathProcessorImpl.cpp
  
  Index: XPathProcessorImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XPath/XPathProcessorImpl.cpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- XPathProcessorImpl.cpp	27 Oct 2004 17:05:25 -0000	1.12
  +++ XPathProcessorImpl.cpp	2 Nov 2004 05:33:43 -0000	1.13
  @@ -79,6 +79,8 @@
   			const PrefixResolver&		resolver,
   			const LocatorType*			locator)
   {
  +	m_isMatchPattern = false;
  +
   	m_requireLiterals = false;
   
   	m_xpath = &pathObj;
  @@ -647,7 +649,7 @@
   
   
   
  -void
  +bool
   XPathProcessorImpl::nextToken()
   {
   	assert(m_expression != 0);
  @@ -667,10 +669,14 @@
   	if(length(m_token) > 0)
   	{
   		m_tokenChar = charAt(m_token, 0);
  +
  +        return true;
   	}
   	else
   	{
   		m_tokenChar = 0;
  +
  +        return false;
   	}
   }
   
  @@ -777,7 +783,6 @@
   			{
   				thePrintWriter.print(XalanMessageLoader::getMessage(XalanMessages::ExpressionIs_1Param,theCurrentPattern));
   			}
  -
   		}
   
   		// Back up one token, since we've consumed one...
  @@ -830,15 +835,22 @@
   
   	if(tokenIs(s_orString) == true)
   	{
  -		nextToken();
  -
  -		m_expression->insertOpCode(XPathExpression::eOP_OR,
  -								   opPos);
  -
  -		OrExpr();
  -
  -		m_expression->updateOpCodeLength(XPathExpression::eOP_OR,
  -										 opPos);
  +		if (nextToken() == false)
  +        {
  +		    error(XalanMessageLoader::getMessage(XalanMessages::ExpectedToken));
  +        }
  +        else
  +        {
  +		    m_expression->insertOpCode(
  +                XPathExpression::eOP_OR,
  +				opPos);
  +
  +		    OrExpr();
  +
  +		    m_expression->updateOpCodeLength(
  +                XPathExpression::eOP_OR,
  +				opPos);
  +        }
   	}
   }
   
  @@ -853,15 +865,22 @@
   
   	if(tokenIs(s_andString) == true)
   	{
  -		nextToken();
  -
  -		m_expression->insertOpCode(XPathExpression::eOP_AND,
  -								   opPos);
  -
  -		AndExpr();
  -
  -		m_expression->updateOpCodeLength(XPathExpression::eOP_AND,
  -										 opPos);
  +		if (nextToken() == false)
  +        {
  +		    error(XalanMessageLoader::getMessage(XalanMessages::ExpectedToken));
  +        }
  +        else
  +        {
  +		    m_expression->insertOpCode(
  +                XPathExpression::eOP_AND,
  +				opPos);
  +
  +            AndExpr();
  +
  +		    m_expression->updateOpCodeLength(
  +                XPathExpression::eOP_AND,
  +				opPos);
  +        }
   	}
   }
   
  @@ -879,52 +898,64 @@
   	XPathExpression::eOpCodes	theOpCode =
   			XPathExpression::eENDOP;
   
  +    bool    foundToken = false;
  +
   	if(tokenIs(XalanUnicode::charExclamationMark) && lookahead(XalanUnicode::charEqualsSign, 1))
   	{
   		nextToken();
  -		nextToken();
  +
  +        foundToken = nextToken();
   
   		theOpCode = XPathExpression::eOP_NOTEQUALS;
   	}
   	else if(tokenIs(XalanUnicode::charEqualsSign))
   	{
  -		nextToken();
  +		foundToken = nextToken();
   
   		theOpCode = XPathExpression::eOP_EQUALS;
   	}
   
   	if (theOpCode != XPathExpression::eENDOP)
   	{
  -		// Save the number of bytes we inserted
  -		// into the map.
  -		const int	theLocalDisplacement =
  -				m_expression->insertOpCode(theOpCode,
  -										   opPos);
  -
  -		// Update the length
  -		m_expression->updateOpCodeLength(theOpCode,
  -										 opPos);
  -
  -		// Do the right term of the expression.
  -		theOpDisplacement += EqualityExpr(opPos);
  -
  -		// If there's any displacement from the right
  -		// term, update the length for a shift. Otherwise,
  -		// just update the length.
  -		if (theOpDisplacement > 0)
  -		{
  -			m_expression->updateShiftedOpCodeLength(theOpCode,
  -													opPos,
  -													opPos + theOpDisplacement);
  -		}
  -		else
  -		{
  -			m_expression->updateOpCodeLength(theOpCode,
  -											 opPos);
  -		}
  -
  -		// Accumulate the displacement.
  -		theOpDisplacement += theLocalDisplacement;
  +        if (foundToken == false)
  +        {
  +            error(XalanMessageLoader::getMessage(XalanMessages::ExpectedToken));
  +        }
  +        else
  +        {
  +		    // Save the number of bytes we inserted
  +		    // into the map.
  +		    const int	theLocalDisplacement =
  +				    m_expression->insertOpCode(theOpCode,
  +										       opPos);
  +
  +		    // Update the length
  +		    m_expression->updateOpCodeLength(theOpCode,
  +										     opPos);
  +
  +		    // Do the right term of the expression.
  +		    theOpDisplacement += EqualityExpr(opPos);
  +
  +		    // If there's any displacement from the right
  +		    // term, update the length for a shift. Otherwise,
  +		    // just update the length.
  +		    if (theOpDisplacement > 0)
  +		    {
  +			    m_expression->updateShiftedOpCodeLength(
  +                    theOpCode,
  +					opPos,
  +					opPos + theOpDisplacement);
  +		    }
  +		    else
  +		    {
  +			    m_expression->updateOpCodeLength(
  +                    theOpCode,
  +					opPos);
  +		    }
  +
  +		    // Accumulate the displacement.
  +		    theOpDisplacement += theLocalDisplacement;
  +        }
   	}
   
   	return theOpDisplacement;
  @@ -943,16 +974,18 @@
   
   	if(0 != length(m_token))
   	{
  +        bool    foundToken = false;
  +
   		XPathExpression::eOpCodes	theOpCode =
   			XPathExpression::eENDOP;
   
   		if(tokenIs(XalanUnicode::charLessThanSign) == true)
   		{
  -			nextToken();
  +			foundToken = nextToken();
   
   			if(tokenIs(XalanUnicode::charEqualsSign) == true)
   			{
  -				nextToken();
  +				foundToken = nextToken();
   
   				theOpCode = XPathExpression::eOP_LTE;
   			}
  @@ -963,11 +996,11 @@
   		}
   		else if(tokenIs(XalanUnicode::charGreaterThanSign) == true)
   		{
  -			nextToken();
  +			foundToken = nextToken();
   
   			if(tokenIs(XalanUnicode::charEqualsSign) == true)
   			{
  -				nextToken();
  +				foundToken = nextToken();
   
   				theOpCode = XPathExpression::eOP_GTE;
   			}
  @@ -979,36 +1012,45 @@
   
   		if (theOpCode != XPathExpression::eENDOP)
   		{
  -			// Save the number of bytes we inserted
  -			// into the map.
  -			const int	theLocalDisplacement =
  -				m_expression->insertOpCode(theOpCode,
  -										   opPos);
  -
  -			// Update the length
  -			m_expression->updateOpCodeLength(theOpCode,
  -											 opPos);
  -
  -			// Do the right term of the expression.
  -			theOpDisplacement += RelationalExpr(opPos);
  -
  -			// If there's any displacement from the right
  -			// term, update the length for a shift. Otherwise,
  -			// just update the length.
  -			if (theOpDisplacement > 0)
  -			{
  -				m_expression->updateShiftedOpCodeLength(theOpCode,
  -														opPos,
  -														opPos + theOpDisplacement);
  -			}
  -			else
  -			{
  -				m_expression->updateOpCodeLength(theOpCode,
  -												 opPos);
  -			}
  -
  -			// Accumulate the displacement.
  -			theOpDisplacement += theLocalDisplacement;
  +            if (foundToken == false)
  +            {
  +                error(XalanMessageLoader::getMessage(XalanMessages::ExpectedToken));
  +            }
  +            else
  +            {
  +                // Save the number of bytes we inserted
  +			    // into the map.
  +			    const int	theLocalDisplacement =
  +				    m_expression->insertOpCode(theOpCode,
  +										       opPos);
  +
  +			    // Update the length
  +			    m_expression->updateOpCodeLength(theOpCode,
  +											     opPos);
  +
  +			    // Do the right term of the expression.
  +			    theOpDisplacement += RelationalExpr(opPos);
  +
  +			    // If there's any displacement from the right
  +			    // term, update the length for a shift. Otherwise,
  +			    // just update the length.
  +			    if (theOpDisplacement > 0)
  +			    {
  +				    m_expression->updateShiftedOpCodeLength(
  +                        theOpCode,
  +						opPos,
  +						opPos + theOpDisplacement);
  +			    }
  +			    else
  +			    {
  +				    m_expression->updateOpCodeLength(
  +                        theOpCode,
  +						opPos);
  +			    }
  +
  +			    // Accumulate the displacement.
  +			    theOpDisplacement += theLocalDisplacement;
  +            }
   		}
   	}
   
  @@ -1042,38 +1084,45 @@
   
   		if (theOpCode != XPathExpression::eENDOP)
   		{
  -			nextToken();
  -
  -			// Save the number of bytes we inserted
  -			// into the map.
  -			const int	theLocalDisplacement =
  -				m_expression->insertOpCode(theOpCode,
  -										   opPos);
  -
  -			// Update the length
  -			m_expression->updateOpCodeLength(theOpCode,
  -											 opPos);
  -
  -			// Do the right term of the expression.
  -			theOpDisplacement += AdditiveExpr(opPos);
  -
  -			// If there's any displacement from the right
  -			// term, update the length for a shift. Otherwise,
  -			// just update the length.
  -			if (theOpDisplacement > 0)
  -			{
  -				m_expression->updateShiftedOpCodeLength(theOpCode,
  -														opPos,
  -														opPos + theOpDisplacement);
  -			}
  -			else
  -			{
  -				m_expression->updateOpCodeLength(theOpCode,
  -												 opPos);
  -			}
  -
  -			// Accumulate the displacement.
  -			theOpDisplacement += theLocalDisplacement;
  +		    if (nextToken() == false)
  +            {
  +		        error(XalanMessageLoader::getMessage(XalanMessages::ExpectedToken));
  +            }
  +            else
  +            {
  +			    // Save the number of bytes we inserted
  +			    // into the map.
  +			    const int	theLocalDisplacement =
  +				    m_expression->insertOpCode(theOpCode,
  +										       opPos);
  +
  +			    // Update the length
  +			    m_expression->updateOpCodeLength(theOpCode,
  +											     opPos);
  +
  +			    // Do the right term of the expression.
  +			    theOpDisplacement += AdditiveExpr(opPos);
  +
  +			    // If there's any displacement from the right
  +			    // term, update the length for a shift. Otherwise,
  +			    // just update the length.
  +			    if (theOpDisplacement > 0)
  +			    {
  +				    m_expression->updateShiftedOpCodeLength(
  +                        theOpCode,
  +						opPos,
  +						opPos + theOpDisplacement);
  +			    }
  +			    else
  +			    {
  +				    m_expression->updateOpCodeLength(
  +                        theOpCode,
  +						opPos);
  +			    }
  +
  +			    // Accumulate the displacement.
  +			    theOpDisplacement += theLocalDisplacement;
  +            }
   		}
   	}
   
  @@ -1111,38 +1160,45 @@
   
   		if (theOpCode != XPathExpression::eENDOP)
   		{
  -			nextToken();
  -
  -			// Save the number of bytes we inserted
  -			// into the map.
  -			const int	theLocalDisplacement =
  -				m_expression->insertOpCode(theOpCode,
  -										   opPos);
  -
  -			// Update the length
  -			m_expression->updateOpCodeLength(theOpCode,
  -											 opPos);
  -
  -			// Do the right term of the expression.
  -			theOpDisplacement += MultiplicativeExpr(opPos);
  -
  -			// If there's any displacement from the right
  -			// term, update the length for a shift. Otherwise,
  -			// just update the length.
  -			if (theOpDisplacement > 0)
  -			{
  -				m_expression->updateShiftedOpCodeLength(theOpCode,
  -														opPos,
  -														opPos + theOpDisplacement);
  -			}
  -			else
  -			{
  -				m_expression->updateOpCodeLength(theOpCode,
  -												 opPos);
  -			}
  -
  -			// Accumulate the displacement.
  -			theOpDisplacement += theLocalDisplacement;
  +            if (nextToken() == false)
  +            {
  +                error(XalanMessageLoader::getMessage(XalanMessages::ExpectedToken));
  +            }
  +            else
  +            {
  +			    // Save the number of bytes we inserted
  +			    // into the map.
  +			    const int	theLocalDisplacement =
  +				    m_expression->insertOpCode(theOpCode,
  +										       opPos);
  +
  +			    // Update the length
  +			    m_expression->updateOpCodeLength(theOpCode,
  +											     opPos);
  +
  +			    // Do the right term of the expression.
  +			    theOpDisplacement += MultiplicativeExpr(opPos);
  +
  +			    // If there's any displacement from the right
  +			    // term, update the length for a shift. Otherwise,
  +			    // just update the length.
  +			    if (theOpDisplacement > 0)
  +			    {
  +				    m_expression->updateShiftedOpCodeLength(
  +                        theOpCode,
  +						opPos,
  +						opPos + theOpDisplacement);
  +			    }
  +			    else
  +			    {
  +				    m_expression->updateOpCodeLength(
  +                        theOpCode,
  +						opPos);
  +			    }
  +
  +			    // Accumulate the displacement.
  +			    theOpDisplacement += theLocalDisplacement;
  +            }
   		}
   	}
   
  @@ -1234,15 +1290,17 @@
   	{
   		nextToken();
   
  -		m_expression->insertOpCode(XPathExpression::eOP_LOCATIONPATH,
  -								   opPos);
  +		m_expression->insertOpCode(
  +            XPathExpression::eOP_LOCATIONPATH,
  +			opPos);
   
   		RelativeLocationPath();
   
   		m_expression->appendOpCode(XPathExpression::eENDOP);
   
  -		m_expression->updateOpCodeLength(XPathExpression::eOP_LOCATIONPATH,
  -										 opPos);
  +		m_expression->updateOpCodeLength(
  +            XPathExpression::eOP_LOCATIONPATH,
  +			opPos);
   	}
   }
   
  @@ -1300,8 +1358,9 @@
   
   		Literal();
   
  -		m_expression->updateOpCodeLength(XPathExpression::eOP_LITERAL,
  -										 opPos);
  +		m_expression->updateOpCodeLength(
  +            XPathExpression::eOP_LITERAL,
  +			opPos);
   	}
   	else if(tokenIs(XalanUnicode::charDollarSign) == true)
   	{
  @@ -1311,8 +1370,9 @@
   
   		QName();
   
  -		m_expression->updateOpCodeLength(XPathExpression::eOP_VARIABLE,
  -											 opPos);
  +		m_expression->updateOpCodeLength(
  +            XPathExpression::eOP_VARIABLE,
  +			opPos);
   	}
   	else if(tokenIs(XalanUnicode::charLeftParenthesis) == true)
   	{
  @@ -1324,8 +1384,9 @@
   
   		consumeExpected(XalanUnicode::charRightParenthesis);
   
  -		m_expression->updateOpCodeLength(XPathExpression::eOP_GROUP,
  -										 opPos);
  +		m_expression->updateOpCodeLength(
  +            XPathExpression::eOP_GROUP,
  +			opPos);
   	}
   	else if((tokenIs(XalanUnicode::charFullStop) == true &&
   				length(m_token) > 1 &&
  @@ -1336,8 +1397,9 @@
   
   		Number();
   
  -		m_expression->updateOpCodeLength(XPathExpression::eOP_NUMBERLIT,
  -										 opPos);
  +		m_expression->updateOpCodeLength(
  +            XPathExpression::eOP_NUMBERLIT,
  +			opPos);
   	}
   	else if(lookahead(XalanUnicode::charLeftParenthesis, 1) == true ||
   			(lookahead(XalanUnicode::charColon, 1) == true && lookahead(XalanUnicode::charLeftParenthesis, 3) == true))
  
  
  
  1.9       +1 -1      xml-xalan/c/src/xalanc/XPath/XPathProcessorImpl.hpp
  
  Index: XPathProcessorImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XPath/XPathProcessorImpl.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XPathProcessorImpl.hpp	17 Sep 2004 22:23:10 -0000	1.8
  +++ XPathProcessorImpl.hpp	2 Nov 2004 05:33:43 -0000	1.9
  @@ -211,7 +211,7 @@
   	 * Retrieve the next token from the command and
   	 * store it in m_token string.
   	 */
  -	void
  +	bool
   	nextToken();
   
   	/**
  
  
  

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