sboag       99/12/12 23:56:48

  Modified:    src/org/apache/xalan/xpath XPathProcessorImpl.java
  Log:
  Fixed order of evaluation for relational and equality operators.
  
  Revision  Changes    Path
  1.11      +36 -18    
xml-xalan/src/org/apache/xalan/xpath/XPathProcessorImpl.java
  
  Index: XPathProcessorImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/src/org/apache/xalan/xpath/XPathProcessorImpl.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- XPathProcessorImpl.java   1999/12/03 08:43:12     1.10
  +++ XPathProcessorImpl.java   1999/12/13 07:56:47     1.11
  @@ -1403,7 +1403,7 @@
       throws org.xml.sax.SAXException
     {
       int opPos = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH];
  -    EqualityExpr();
  +    EqualityExpr(-1);
       if((null != m_token) && tokenIs("and"))
       {
         nextToken();
  @@ -1422,29 +1422,38 @@
      | EqualityExpr '=' RelationalExpr   
      * 
--------------------------------------------------------------------------------
      */
  -  protected void EqualityExpr() 
  +  protected int EqualityExpr(int addPos) 
       throws org.xml.sax.SAXException
     {
       int opPos = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH];
  -    RelationalExpr();
  +    if(-1 == addPos)
  +      addPos = opPos;
  +    RelationalExpr(-1);
       if(null != m_token)
       {
         if(tokenIs('!') && lookahead('=', 1))
         {
           nextToken();
           nextToken();
  -        insertOp(opPos, 2, m_xpath.OP_NOTEQUALS);
  -        EqualityExpr();
  -        m_xpath.m_opMap[opPos + m_xpath.MAPINDEX_LENGTH] = 
m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - opPos;
  +        insertOp(addPos, 2, m_xpath.OP_NOTEQUALS);
  +        int opPlusLeftHandLen = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - 
addPos;
  +        addPos = EqualityExpr(addPos);
  +        m_xpath.m_opMap[addPos + m_xpath.MAPINDEX_LENGTH] 
  +          = m_xpath.m_opMap[addPos+opPlusLeftHandLen+1] + opPlusLeftHandLen;
  +        addPos+=2;
         }
         else if(tokenIs('='))
         {
           nextToken();
  -        insertOp(opPos, 2, m_xpath.OP_EQUALS);
  -        EqualityExpr();
  -        m_xpath.m_opMap[opPos + m_xpath.MAPINDEX_LENGTH] = 
m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - opPos;
  +        insertOp(addPos, 2, m_xpath.OP_EQUALS);
  +        int opPlusLeftHandLen = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - 
addPos;
  +        addPos = EqualityExpr(addPos);
  +        m_xpath.m_opMap[addPos + m_xpath.MAPINDEX_LENGTH] 
  +          = m_xpath.m_opMap[addPos+opPlusLeftHandLen+1] + opPlusLeftHandLen;
  +        addPos+=2;
         }
       }
  +    return addPos;
     }
   
     /**
  @@ -1459,10 +1468,12 @@
      | RelationalExpr '>=' AdditiveExpr   
      * 
--------------------------------------------------------------------------------
      */
  -  protected void RelationalExpr() 
  +  protected int RelationalExpr(int addPos) 
       throws org.xml.sax.SAXException
     {
       int opPos = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH];
  +    if(-1 == addPos)
  +      addPos = opPos;
       AdditiveExpr(-1);
       if(null != m_token)
       {
  @@ -1472,14 +1483,17 @@
           if(tokenIs('='))
           {
             nextToken();
  -          insertOp(opPos, 2, m_xpath.OP_LTE);
  +          insertOp(addPos, 2, m_xpath.OP_LTE);
           }
           else
           {
  -          insertOp(opPos, 2, m_xpath.OP_LT);
  +          insertOp(addPos, 2, m_xpath.OP_LT);
           }
  -        RelationalExpr();
  -        m_xpath.m_opMap[opPos + m_xpath.MAPINDEX_LENGTH] = 
m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - opPos;
  +        int opPlusLeftHandLen = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - 
addPos;
  +        addPos = RelationalExpr(addPos);
  +        m_xpath.m_opMap[addPos + m_xpath.MAPINDEX_LENGTH] 
  +          = m_xpath.m_opMap[addPos+opPlusLeftHandLen+1] + opPlusLeftHandLen;
  +        addPos+=2;
         }
         else if(tokenIs('>'))
         {
  @@ -1487,16 +1501,20 @@
           if(tokenIs('='))
           {
             nextToken();
  -          insertOp(opPos, 2, m_xpath.OP_GTE);
  +          insertOp(addPos, 2, m_xpath.OP_GTE);
           }
           else
           {
  -          insertOp(opPos, 2, m_xpath.OP_GT);
  +          insertOp(addPos, 2, m_xpath.OP_GT);
           }
  -        RelationalExpr();
  -        m_xpath.m_opMap[opPos + m_xpath.MAPINDEX_LENGTH] = 
m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - opPos;
  +        int opPlusLeftHandLen = m_xpath.m_opMap[m_xpath.MAPINDEX_LENGTH] - 
addPos;
  +        addPos = RelationalExpr(addPos);
  +        m_xpath.m_opMap[addPos + m_xpath.MAPINDEX_LENGTH] 
  +          = m_xpath.m_opMap[addPos+opPlusLeftHandLen+1] + opPlusLeftHandLen;
  +        addPos+=2;
         }
       }
  +    return addPos;
     }
   
     /**
  
  
  

Reply via email to