dbertoni    2002/06/19 14:00:54

  Modified:    c/src/XPath XPathProcessorImpl.cpp XPathProcessorImpl.hpp
  Log:
  Fixed bug with child and attribute axes in match patterns.  Added better 
error message handling.
  
  Revision  Changes    Path
  1.55      +49 -11    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.54
  retrieving revision 1.55
  diff -u -r1.54 -r1.55
  --- XPathProcessorImpl.cpp    6 May 2002 05:26:59 -0000       1.54
  +++ XPathProcessorImpl.cpp    19 Jun 2002 21:00:54 -0000      1.55
  @@ -92,6 +92,7 @@
        m_expression(0),
        m_prefixResolver(0),
        m_requireLiterals(false),
  +     m_isMatchPattern(false),
        m_positionPredicateStack()
   {
   }
  @@ -152,6 +153,8 @@
                        const PrefixResolver&   prefixResolver,
                        const Locator*                  locator)
   {
  +     m_isMatchPattern = true;
  +
        m_xpath = &pathObj;
   
        m_expression = &m_xpath->getExpression();
  @@ -1005,7 +1008,15 @@
   
                if (length(theCurrentPattern) != 0)
                {
  -                     thePrintWriter.print(XALAN_STATIC_UCODE_STRING("pattern 
= '"));
  +                     if (m_isMatchPattern == true)
  +                     {
  +                             
thePrintWriter.print(XALAN_STATIC_UCODE_STRING("pattern = '"));
  +                     }
  +                     else
  +                     {
  +                             
thePrintWriter.print(XALAN_STATIC_UCODE_STRING("expression = '"));
  +                     }
  +
                        thePrintWriter.print(theCurrentPattern);
   
                        thePrintWriter.print("'");
  @@ -2415,34 +2426,34 @@
   
        const int       opPos = m_expression->opCodeMapLength();
   
  -     int                     axisType = 0;
  -
        int                     matchTypePos = -1;
   
  +     XPathExpression::eOpCodes       axisType = XPathExpression::eENDOP;
  +
        // The next blocks guarantee that a MATCH_XXX will be added.
        if(tokenIs(XalanUnicode::charCommercialAt) == true)
        {
                axisType = XPathExpression::eMATCH_ATTRIBUTE;
   
  -             m_expression->appendOpCode(XPathExpression::eMATCH_ATTRIBUTE);
  +             m_expression->appendOpCode(axisType);
   
                nextToken();
        }
        else if(lookahead(s_axisString, 1) == true)
        {
  -             // $$$ To Do: Perhaps these strings should be in the
  -             // axis table?
  +             matchTypePos = m_expression->opCodeMapLength();
  +
                if(tokenIs(s_attributeString) == true)
                {
                        axisType = XPathExpression::eMATCH_ATTRIBUTE;
   
  -                     
m_expression->appendOpCode(XPathExpression::eMATCH_ATTRIBUTE);
  +                     m_expression->appendOpCode(axisType);
                }
                else if(tokenIs(s_childString) == true)
                {
                        axisType = XPathExpression::eMATCH_IMMEDIATE_ANCESTOR;
   
  -                     
m_expression->appendOpCode(XPathExpression::eMATCH_IMMEDIATE_ANCESTOR);
  +                     m_expression->appendOpCode(axisType);
                }
                else
                {
  @@ -2454,9 +2465,36 @@
        }
        else if(tokenIs(XalanUnicode::charSolidus) == true)
        {
  -             axisType = XPathExpression::eMATCH_ANY_ANCESTOR;
  +             if(lookahead(s_axisString, 2) == false)
  +             {
  +                     axisType = XPathExpression::eMATCH_ANY_ANCESTOR;
   
  -             
m_expression->appendOpCode(XPathExpression::eMATCH_ANY_ANCESTOR);
  +                     m_expression->appendOpCode(axisType);
  +             }
  +             else
  +             {
  +                     nextToken();
  +
  +                     if(tokenIs(s_attributeString) == true)
  +                     {
  +                             axisType = XPathExpression::eMATCH_ATTRIBUTE;
  +
  +                             m_expression->appendOpCode(axisType);
  +                     }
  +                     else if(tokenIs(s_childString) == true)
  +                     {
  +                             axisType = XPathExpression::eMATCH_ANY_ANCESTOR;
  +
  +                             m_expression->appendOpCode(axisType);
  +                     }
  +                     else
  +                     {
  +                             error("Only child:: and attribute:: axes are 
allowed in match patterns!");
  +                     }
  +
  +                     nextToken();
  +
  +             }
   
                nextToken();
        }
  @@ -2471,7 +2509,7 @@
   
                axisType = XPathExpression::eMATCH_IMMEDIATE_ANCESTOR;
   
  -             
m_expression->appendOpCode(XPathExpression::eMATCH_IMMEDIATE_ANCESTOR);
  +             m_expression->appendOpCode(axisType);
        }
   
       // Make room for telling how long the step is without the predicate.
  
  
  
  1.20      +3 -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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- XPathProcessorImpl.hpp    3 Apr 2002 05:13:10 -0000       1.19
  +++ XPathProcessorImpl.hpp    19 Jun 2002 21:00:54 -0000      1.20
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights 
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -820,6 +820,8 @@
        const PrefixResolver*                   m_prefixResolver;
   
        bool                                                    
m_requireLiterals;
  +
  +     bool                                                    
m_isMatchPattern;
   
        const Locator*                                  m_locator;
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to