dbertoni    01/01/03 11:32:53

  Modified:    c/src/TestXPath TestXPath.cpp
               c/src/XPath FunctionID.cpp FunctionID.hpp FunctionLang.cpp
                        FunctionLocalName.cpp FunctionName.cpp
                        FunctionNamespaceURI.cpp FunctionSum.cpp
                        SimpleNodeLocator.cpp XObject.cpp XObject.hpp
                        XPath.cpp XPathExecutionContext.hpp
                        XPathExecutionContextDefault.cpp
                        XPathExecutionContextDefault.hpp XPathSupport.hpp
                        XPathSupportDefault.cpp XPathSupportDefault.hpp
               c/src/XSLT ElemApplyImport.cpp ElemNumber.cpp
                        StylesheetExecutionContext.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp
                        XSLTEngineImpl.cpp XSLTEngineImpl.hpp
  Log:
  Performance tweaks requiring that XObject comparison functions be passed an 
XPathExecutionContext instance.  Made some DOMServices static functions inline, 
and removed the virtual calls into the support objects.
  
  Revision  Changes    Path
  1.26      +1 -1      xml-xalan/c/src/TestXPath/TestXPath.cpp
  
  Index: TestXPath.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/TestXPath/TestXPath.cpp,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- TestXPath.cpp     2000/11/30 21:09:42     1.25
  +++ TestXPath.cpp     2001/01/03 19:32:34     1.26
  @@ -766,7 +766,7 @@
                                                
thePrintWriter.println(XALAN_STATIC_UCODE_STRING(" failed!"));
                                        }
   
  -                                     if (theResult1->equals(*theResult2) == 
true)
  +                                     if (theResult1->equals(*theResult2, 
theExecutionContext) == true)
                                        {
                                                
thePrintWriter.print(XALAN_STATIC_UCODE_STRING("theResult1 is equal to 
theResult2"));
                                                thePrintWriter.println();
  
  
  
  1.6       +105 -2    xml-xalan/c/src/XPath/FunctionID.cpp
  
  Index: FunctionID.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionID.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FunctionID.cpp    2000/12/06 21:00:23     1.5
  +++ FunctionID.cpp    2001/01/03 19:32:36     1.6
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XObjectFactory.hpp"
   
   
  @@ -157,8 +161,7 @@
                                {
                                        thePreviousTokens.insert(theToken);
   
  -                                     XalanNode* const        theNode =
  -                                             
executionContext.getElementByID(theToken, *theDocContext);
  +                                     XalanNode* const        theNode = 
theDocContext->getElementById(theToken);
   
                                        if (theNode != 0)
                                        {
  @@ -236,3 +239,103 @@
                "The id() function takes one argument!");
   }
   
  +
  +
  
+FunctionID::FunctionIDXObjectTypeCallback::FunctionIDXObjectTypeCallback(XPathExecutionContext&
      theExecutionContext) :
  +     XObjectTypeCallback(),
  +     m_resultString(),
  +     m_executionContext(theExecutionContext)                 
  +{
  +}
  +
  +
  +
  +const XalanDOMString&
  +FunctionID::FunctionIDXObjectTypeCallback::processCallback(const XObject&    
theXObject)
  +{
  +     theXObject.ProcessXObjectTypeCallback(*this);
  +
  +     return m_resultString;
  +}
  +
  +
  +
  +void
  +FunctionID::FunctionIDXObjectTypeCallback::Number(
  +                     const XObject&  theXObject,
  +                     double                  /* theValue */)
  +{
  +     m_resultString = theXObject.str();
  +}
  +
  +
  +
  +void
  +FunctionID::FunctionIDXObjectTypeCallback::Boolean(
  +                     const XObject&  theXObject,
  +                     bool                    /* theValue */)
  +{
  +     m_resultString = theXObject.str();
  +}
  +
  +
  +
  +void
  +FunctionID::FunctionIDXObjectTypeCallback::String(
  +                     const XObject&                  theXObject,
  +                     const XalanDOMString&   /* theValue */)
  +{
  +     m_resultString = theXObject.str();
  +}
  +
  +
  +
  +void
  +FunctionID::FunctionIDXObjectTypeCallback::ResultTreeFragment(
  +                     const XObject&                          theXObject,
  +                     const ResultTreeFragBase&       /* theValue */)
  +{
  +     m_resultString = theXObject.str();
  +}
  +
  +
  +
  +void
  +FunctionID::FunctionIDXObjectTypeCallback::ResultTreeFragment(
  +                     const XObject&                  theXObject,
  +                     ResultTreeFragBase&             /* theValue */)
  +{
  +     m_resultString = theXObject.str();
  +}
  +
  +
  +
  +void
  +FunctionID::FunctionIDXObjectTypeCallback::NodeSet(
  +                     const XObject&                  /* theXObject */,
  +                     const NodeRefListBase&  theValue)
  +{
  +     const unsigned int      theNodeCount = theValue.getLength();
  +
  +     for (unsigned int i = 0 ; i < theNodeCount; i++)
  +     {
  +             DOMServices::getNodeData(*theValue.item(i), m_resultString);
  +
  +             append(m_resultString, XalanDOMChar(XalanUnicode::charSpace));  
                
  +     }
  +}
  +
  +
  +
  +void
  +FunctionID::FunctionIDXObjectTypeCallback::Unknown(
  +                     const XObject&                  /* theObject */,
  +                     const XalanDOMString&   /* theName */)
  +{
  +}
  +
  +
  +void
  +FunctionID::FunctionIDXObjectTypeCallback::Null(const XObject&               
/* theObject */)
  +{
  +}
  
  
  
  1.20      +24 -56    xml-xalan/c/src/XPath/FunctionID.hpp
  
  Index: FunctionID.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionID.hpp,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- FunctionID.hpp    2000/12/06 21:00:24     1.19
  +++ FunctionID.hpp    2001/01/03 19:32:37     1.20
  @@ -150,82 +150,50 @@
        {
        public:
   
  -             FunctionIDXObjectTypeCallback(XPathExecutionContext&    
theExecutionContext) :
  -                     XObjectTypeCallback(),
  -                     m_resultString(),
  -                     m_executionContext(theExecutionContext)                 
  -             {
  -             }
  +             FunctionIDXObjectTypeCallback(XPathExecutionContext&    
theExecutionContext);
   
                const XalanDOMString&
  -             processCallback(const XObject&  theXObject)
  -             {
  -                     theXObject.ProcessXObjectTypeCallback(*this);
  +             processCallback(const XObject&  theXObject);
   
  -                     return m_resultString;
  -             }
  -
                // These methods are inherited from XObjectTypeCallback ...
   
                virtual void
  -             Number(const XObject&   theXObject,
  -                        double                       /* theValue */)
  -             {
  -                     m_resultString = theXObject.str();
  -             }
  +             Number(
  +                     const XObject&  theXObject,
  +                     double                  /* theValue */);
   
                virtual void
  -             Boolean(const XObject&  theXObject,
  -                             bool                    /* theValue */)
  -             {
  -                     m_resultString = theXObject.str();
  -             }
  +             Boolean(
  +                     const XObject&  theXObject,
  +                     bool                    /* theValue */);
   
                virtual void
  -             String(const XObject&                   theXObject,
  -                        const XalanDOMString&        /* theValue */)
  -             {
  -                     m_resultString = theXObject.str();
  -             }
  +             String(
  +                     const XObject&                  theXObject,
  +                     const XalanDOMString&   /* theValue */);
   
                virtual void
  -             ResultTreeFragment(const XObject&                               
theXObject,
  -                                                const ResultTreeFragBase&    
/* theValue */)
  -             {
  -                     m_resultString = theXObject.str();
  -             }
  +             ResultTreeFragment(
  +                     const XObject&                          theXObject,
  +                     const ResultTreeFragBase&       /* theValue */);
   
                virtual void
  -             ResultTreeFragment(const XObject&               theXObject,
  -                                                ResultTreeFragBase&  /* 
theValue */)
  -             {
  -                     m_resultString = theXObject.str();
  -             }
  +             ResultTreeFragment(
  +                     const XObject&                  theXObject,
  +                     ResultTreeFragBase&             /* theValue */);
   
                virtual void
  -             NodeSet(const XObject&                  /* theXObject */,
  -                             const NodeRefListBase&  theValue)
  -             {
  -                     const unsigned int      theNodeCount = 
theValue.getLength();
  -
  -                     for (unsigned int i = 0 ; i < theNodeCount; i++)
  -                     {
  -                             
m_executionContext.getNodeData(*theValue.item(i), m_resultString);
  -
  -                             append(m_resultString, 
XalanDOMChar(XalanUnicode::charSpace));                  
  -                     }
  -             }
  +             NodeSet(
  +                     const XObject&                  /* theXObject */,
  +                     const NodeRefListBase&  theValue);
   
                virtual void
  -             Unknown(const XObject&                  /* theObject */,
  -                             const XalanDOMString&   /* theName */)
  -             {
  -             }
  +             Unknown(
  +                     const XObject&                  /* theObject */,
  +                     const XalanDOMString&   /* theName */);
   
                virtual void
  -             Null(const XObject&             /* theObject */)
  -             {
  -             }
  +             Null(const XObject&             /* theObject */);
   
        private:
   
  
  
  
  1.6       +5 -1      xml-xalan/c/src/XPath/FunctionLang.cpp
  
  Index: FunctionLang.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionLang.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FunctionLang.cpp  2000/12/06 21:00:25     1.5
  +++ FunctionLang.cpp  2001/01/03 19:32:37     1.6
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XObjectFactory.hpp"
   
   
  @@ -132,7 +136,7 @@
                        }
                }
   
  -             parent = executionContext.getParentOfNode(*parent);
  +             parent = DOMServices::getParentOfNode(*parent);
        }
   
        return executionContext.getXObjectFactory().createBoolean(fMatch);
  
  
  
  1.9       +8 -4      xml-xalan/c/src/XPath/FunctionLocalName.cpp
  
  Index: FunctionLocalName.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionLocalName.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FunctionLocalName.cpp     2000/12/21 04:29:29     1.8
  +++ FunctionLocalName.cpp     2001/01/03 19:32:37     1.9
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XObjectFactory.hpp"
   
   
  @@ -95,9 +99,9 @@
   
   XObjectPtr
   FunctionLocalName::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              
context,                        
  -             const XObjectPtr                                        arg1)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              /* context */,          
        
  +             const XObjectPtr                arg1)
   {
        assert(arg1.null() == false);   
   
  @@ -170,7 +174,7 @@
                theType == XalanNode::ELEMENT_NODE ||
                theType == XalanNode::PROCESSING_INSTRUCTION_NODE)
        {
  -             return 
executionContext.getXObjectFactory().createStringReference(executionContext.getLocalNameOfNode(node));
  +             return 
executionContext.getXObjectFactory().createStringReference(DOMServices::getLocalNameOfNode(node));
        }
        else
        {
  
  
  
  1.8       +6 -2      xml-xalan/c/src/XPath/FunctionName.cpp
  
  Index: FunctionName.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionName.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- FunctionName.cpp  2000/12/21 15:05:33     1.7
  +++ FunctionName.cpp  2001/01/03 19:32:38     1.8
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XObjectFactory.hpp"
   
   
  @@ -88,7 +92,7 @@
        }
        else
        {
  -         return 
executionContext.getXObjectFactory().createStringReference(executionContext.getNameOfNode(*context));
  +             return 
executionContext.getXObjectFactory().createStringReference(DOMServices::getNameOfNode(*context));
        }
   }
   
  @@ -112,7 +116,7 @@
        {
                assert(theNodeList.item(0) != 0);
   
  -        const XalanDOMString&   theData = 
executionContext.getNameOfNode(*theNodeList.item(0));
  +        const XalanDOMString&   theData = 
DOMServices::getNameOfNode(*theNodeList.item(0));
   
            return 
executionContext.getXObjectFactory().createStringReference(theData);
        }
  
  
  
  1.8       +4 -0      xml-xalan/c/src/XPath/FunctionNamespaceURI.cpp
  
  Index: FunctionNamespaceURI.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionNamespaceURI.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- FunctionNamespaceURI.cpp  2000/12/21 04:29:29     1.7
  +++ FunctionNamespaceURI.cpp  2001/01/03 19:32:38     1.8
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XObjectFactory.hpp"
   
   
  
  
  
  1.6       +13 -9     xml-xalan/c/src/XPath/FunctionSum.cpp
  
  Index: FunctionSum.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionSum.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FunctionSum.cpp   2000/12/06 21:01:05     1.5
  +++ FunctionSum.cpp   2001/01/03 19:32:38     1.6
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XObjectFactory.hpp"
   
   
  @@ -88,9 +92,9 @@
   
   XObjectPtr
   FunctionSum::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              /* 
context */,                  
  -             const XObjectPtr                                arg1)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              /* context */,          
        
  +             const XObjectPtr                arg1)
   {
        assert(arg1.null() == false);
   
  @@ -100,13 +104,15 @@
   
        const unsigned int              count = nl.getLength();
   
  +     XPathExecutionContext::GetAndReleaseCachedString        
theData(executionContext);
  +
        for (unsigned int i = 0; i < count; i++)
        {
  -             XalanDOMString  theData;
  +             DOMServices::getNodeData(*nl.item(i), theData);
   
  -             executionContext.getNodeData(*nl.item(i), theData);
  -
                sum += DoubleSupport::toDouble(theData);
  +
  +             clear(theData);
        }
   
        return executionContext.getXObjectFactory().createNumber(sum);
  @@ -172,7 +178,5 @@
   const XalanDOMString
   FunctionSum::getError() const
   {
  -     return XALAN_STATIC_UCODE_STRING(
  -             "The sum() function takes one argument!");
  +     return XALAN_STATIC_UCODE_STRING("The sum() function takes one 
argument!");
   }
  -
  
  
  
  1.28      +17 -17    xml-xalan/c/src/XPath/SimpleNodeLocator.cpp
  
  Index: SimpleNodeLocator.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/SimpleNodeLocator.cpp,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- SimpleNodeLocator.cpp     2000/11/21 21:08:20     1.27
  +++ SimpleNodeLocator.cpp     2001/01/03 19:32:39     1.28
  @@ -352,7 +352,7 @@
   
                scoreHolder = xpath.s_MatchScoreOther;
   
  -             localContext = executionContext.getParentOfNode(*localContext);
  +             localContext = DOMServices::getParentOfNode(*localContext);
   
                if(0 == localContext)
                {
  @@ -457,7 +457,7 @@
                                        if(xpath.s_MatchScoreNone != score)
                                                break;
   
  -                                     localContext = 
executionContext.getParentOfNode(*localContext);
  +                                     localContext = 
DOMServices::getParentOfNode(*localContext);
                                }
                        }
                }
  @@ -569,7 +569,7 @@
        executionContext.setThrowFoundIndex(false);
   
        XalanNode* const        parentContext =
  -                             executionContext.getParentOfNode(*localContext);
  +                             DOMServices::getParentOfNode(*localContext);
   
        typedef XPathExecutionContext::BorrowReturnMutableNodeRefList   
BorrowReturnMutableNodeRefList;
   
  @@ -662,7 +662,7 @@
   
        opPos += 3;
   
  -     XalanNode* const        theParent = 
executionContext.getParentOfNode(*context);
  +     XalanNode* const        theParent = 
DOMServices::getParentOfNode(*context);
   
        if(0 != theParent)
        {
  @@ -747,7 +747,7 @@
                xpath.getExpression();
   
        XalanNode*                              contextNode =
  -             executionContext.getParentOfNode(*context);
  +             DOMServices::getParentOfNode(*context);
   
        // $$ ToDO: Can we reduce this to some call on the
        // XPathExpression interface?
  @@ -770,7 +770,7 @@
                        subQueryResults.addNode(contextNode);
                }
   
  -             contextNode = executionContext.getParentOfNode(*contextNode);
  +             contextNode = DOMServices::getParentOfNode(*contextNode);
        }
   
        return argLen + 3;
  @@ -816,7 +816,7 @@
                        subQueryResults.addNode(contextNode);
                }
   
  -             contextNode = executionContext.getParentOfNode(*contextNode);
  +             contextNode = DOMServices::getParentOfNode(*contextNode);
        }
   
        return argLen + 3;
  @@ -988,7 +988,7 @@
   
                        if(0 == nextNode)
                        {
  -                             pos = executionContext.getParentOfNode(*pos);
  +                             pos = DOMServices::getParentOfNode(*pos);
   
                                if(context == pos || pos == 0)
                                {
  @@ -1066,9 +1066,9 @@
                        // following axis.
                        if (pos->getNodeType() == XalanNode::ATTRIBUTE_NODE)
                        {
  -                             assert(executionContext.getParentOfNode(*pos) 
!= 0);
  +                             assert(DOMServices::getParentOfNode(*pos) != 0);
   
  -                             nextNode = 
executionContext.getParentOfNode(*pos)->getFirstChild();
  +                             nextNode = 
DOMServices::getParentOfNode(*pos)->getFirstChild();
                        }
                        else
                        {
  @@ -1077,7 +1077,7 @@
   
                        if(0 == nextNode)
                        {
  -                             pos = executionContext.getParentOfNode(*pos);
  +                             pos = DOMServices::getParentOfNode(*pos);
   
                                if(doc == pos || 0 == pos)
                                {
  @@ -1170,7 +1170,7 @@
                        context->getNodeType() == XalanNode::ATTRIBUTE_NODE ? 
true : false;
   
        const XalanNode* const  theAttributeContextParent =
  -             contextIsAttribute == true ? 
executionContext.getParentOfNode(*context) : 0;
  +             contextIsAttribute == true ? 
DOMServices::getParentOfNode(*context) : 0;
   
        while(0 != pos)
        {
  @@ -1192,7 +1192,7 @@
                        // sure there's a better way to check for the parent.
                        bool            isParent = false;
   
  -                     XalanNode*      parent = 
executionContext.getParentOfNode(*context);
  +                     XalanNode*      parent = 
DOMServices::getParentOfNode(*context);
   
                        while(0 != parent)
                        {
  @@ -1202,7 +1202,7 @@
                                        break;
                                }
   
  -                             parent = 
executionContext.getParentOfNode(*parent);
  +                             parent = DOMServices::getParentOfNode(*parent);
                        }
   
                        if(isParent == false)
  @@ -1231,7 +1231,7 @@
   
                        if(0 == nextNode)
                        {
  -                             pos = executionContext.getParentOfNode(*pos);
  +                             pos = DOMServices::getParentOfNode(*pos);
   
                                if(doc == pos)
                                {
  @@ -1557,7 +1557,7 @@
                                                                        if 
(isNamespace == false)
                                                                        {
                                                                                
const XalanDOMString&   localAttrName =
  -                                                                             
        executionContext.getLocalNameOfNode(*context);
  +                                                                             
        DOMServices::getLocalNameOfNode(*context);
   
                                                                                
if (equals(localAttrName, targetLocalName) == true)
                                                                                
{
  @@ -1600,7 +1600,7 @@
                                                        }
                                                        else
                                                        {
  -                                                             if 
(equals(executionContext.getLocalNameOfNode(*context),
  +                                                             if 
(equals(DOMServices::getLocalNameOfNode(*context),
                                                                                
   targetLocalName) == true)
                                                                {
                                                                        score = 
xpath.s_MatchScoreQName;
  
  
  
  1.18      +190 -495  xml-xalan/c/src/XPath/XObject.cpp
  
  Index: XObject.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XObject.cpp,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- XObject.cpp       2000/12/21 04:43:48     1.17
  +++ XObject.cpp       2001/01/03 19:32:39     1.18
  @@ -59,10 +59,6 @@
   
   
   
  -//#include <stdexcept>
  -
  -
  -
   #include <XalanDOM/XalanNode.hpp>
   
   
  @@ -77,6 +73,7 @@
   
   #include "NodeRefList.hpp"
   #include "XObjectFactory.hpp"
  +#include "XPathExecutionContext.hpp"
   
   
   
  @@ -209,14 +206,15 @@
   struct
   getStringFromNodeFunction
   {
  -     getStringFromNodeFunction()
  +     getStringFromNodeFunction(XPathExecutionContext&        
executionContext) :
  +             m_executionContext(executionContext)
        {
        }
   
        const XalanDOMString
        operator()(const XalanNode&             theNode) const
        {
  -             XalanDOMString  theString;
  +             XPathExecutionContext::GetAndReleaseCachedString        
theString(m_executionContext);
   
                getStringFromNode(theNode, theString);
   
  @@ -230,36 +228,19 @@
        {
                getStringFromNode(theNode, theString);
        }
  -};
  -
  -
  -
  -double
  -getNumberFromNode(const XalanNode&   theNode)
  -{
  -     XalanDOMString  theString;
  -
  -     getStringFromNode(theNode, theString);
  -
  -     return DoubleSupport::toDouble(theString);
  -}
  -
   
  +private:
   
  -void
  -getNumberFromNode(
  -                     const XalanNode&        theNode,
  -                     double&                         theNumber)
  -{
  -     theNumber = getNumberFromNode(theNode);
  -}
  +     XPathExecutionContext&  m_executionContext;
  +};
   
   
   
   struct
   getNumberFromNodeFunction
   {
  -     getNumberFromNodeFunction()
  +     getNumberFromNodeFunction(XPathExecutionContext&        
executionContext) :
  +             m_executionContext(executionContext)
        {
        }
   
  @@ -276,18 +257,40 @@
        {
                getNumberFromNode(theNode, theNumber);
        }
  -};
   
  +private:
  +
  +     double
  +     getNumberFromNode(const XalanNode&      theNode) const
  +     {
  +             XPathExecutionContext::GetAndReleaseCachedString        
theString(m_executionContext);
  +
  +             getStringFromNode(theNode, theString);
  +
  +             return DoubleSupport::toDouble(theString);
  +     }
  +
  +     void
  +     getNumberFromNode(
  +                     const XalanNode&        theNode,
  +                     double&                         theNumber) const
  +     {
  +             theNumber = getNumberFromNode(theNode);
  +     }
   
  +     XPathExecutionContext&  m_executionContext;
  +};
   
   
  +
   template<class CompareFunction, class TypeFunction>
   bool
   doCompareNodeSets(
                        const NodeRefListBase&  theLHSNodeSet,
                        const NodeRefListBase&  theRHSNodeSet,
                        const TypeFunction&             theTypeFunction,
  -                     const CompareFunction&  theCompareFunction)
  +                     const CompareFunction&  theCompareFunction,
  +                     XPathExecutionContext&  executionContext)
   {
        // From http://www.w3.org/TR/xpath: 
        // If both objects to be compared are node-sets, then the comparison 
  @@ -311,23 +314,25 @@
                const XalanNode* const  theLHSNode = theLHSNodeSet.item(i);
                assert(theLHSNode != 0);
   
  -             XalanDOMString  s1;
  +             XPathExecutionContext::GetAndReleaseCachedString        
s1(executionContext);
   
                theTypeFunction(*theLHSNode, s1);
   
  +             XPathExecutionContext::GetAndReleaseCachedString        
s2(executionContext);
  +
                for(unsigned int k = 0; k < len2 && theResult == false; k++)
                {
                        const XalanNode* const  theRHSNode = 
theRHSNodeSet.item(k);
                        assert(theRHSNode != 0);
   
  -                     XalanDOMString  s2;
  -
                        theTypeFunction(*theRHSNode, s2);
   
                        if(theCompareFunction(s1, s2) == true)
                        {
                                theResult = true;
                        }
  +
  +                     clear(s2);
                }
        }
   
  @@ -336,31 +341,34 @@
   
   
   
  -template<class CompareFunction, class TypeFunction, class Type>
  +template<class CompareFunction, class StringFunction>
   bool
  -doCompare(
  +doCompareString(
                        const NodeRefListBase&  theLHSNodeSet,
  -                     const TypeFunction&             theTypeFunction,
  -                     const Type&                             theRHS,
  -                     const CompareFunction&  theCompareFunction)
  +                     const StringFunction&   theStringFunction,
  +                     const XalanDOMString&   theRHS,
  +                     const CompareFunction&  theCompareFunction,
  +                     XPathExecutionContext&  executionContext)
   {
        bool                            theResult = false;
   
        const unsigned int      len1 = theLHSNodeSet.getLength();
   
  +     XPathExecutionContext::GetAndReleaseCachedString        
theLHS(executionContext);
  +
        for(unsigned int i = 0; i < len1 && theResult == false; i++)
        {
                const XalanNode* const  theLHSNode = theLHSNodeSet.item(i);
                assert(theLHSNode != 0);
   
  -             Type    theLHS;
  +             theStringFunction(*theLHSNode, theLHS);
   
  -             theTypeFunction(*theLHSNode, theLHS);
  -
                if (theCompareFunction(theLHS, theRHS) == true)
                {
                        theResult = true;
                }
  +
  +             clear(theLHS);
        }
   
        return theResult;
  @@ -368,105 +376,45 @@
   
   
   
  +template<class CompareFunction, class NumberFunction>
   bool
  -equalNodeSet(
  -                     const XObject&                  theLHS,
  -                     const XObject&                  theRHS,
  -                     XObject::eObjectType    theRHSType)
  +doCompareNumber(
  +                     const NodeRefListBase&  theLHSNodeSet,
  +                     const NumberFunction&   theNumberFunction,
  +                     const double                    theRHS,
  +                     const CompareFunction&  theCompareFunction)
   {
  -     bool    theResult = false;
  -
  -     if(theRHSType == XObject::eTypeNodeSet)
  -     {
  -             // Compare as node sets...
  -             theResult = doCompareNodeSets(
  -                             theLHS.nodeset(),
  -                             theRHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             DOMStringEqualsFunction());
  +     bool                            theResult = false;
   
  -     }
  -     else if(theRHSType == XObject::eTypeBoolean)
  -     {
  -       // From http://www.w3.org/TR/xpath: 
  -       // If one object to be compared is a node-set and the other is a 
boolean, 
  -       // then the comparison will be true if and only if the result of 
  -       // performing the comparison on the boolean and on the result of 
  -       // converting the node-set to a boolean using the boolean function 
  -       // is true.
  -             const double    num1 = theLHS.boolean() == true ? 1.0 : 0.0;
  +     const unsigned int      len1 = theLHSNodeSet.getLength();
   
  -             theResult = DoubleSupport::equal(num1, theRHS.num());
  -     }
  -     else if(theRHSType == XObject::eTypeNumber)
  +     for(unsigned int i = 0; i < len1 && theResult == false; i++)
        {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a number, 
  -             // then the comparison will be true if and only if there is a 
  -             // node in the node-set such that the result of performing the 
  -             // comparison on the number to be compared and on the result of 
  -             // converting the string-value of that node to a number using 
  -             // the number function is true. 
  +             const XalanNode* const  theLHSNode = theLHSNodeSet.item(i);
  +             assert(theLHSNode != 0);
   
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getNumberFromNodeFunction(),
  -                             theRHS.num(),
  -                             DoubleSupport::equalFunction());
  -     }
  -     else if(theRHSType == XObject::eTypeResultTreeFrag)
  -     {
  -             // hmmm... 
  -             const double    theRHSNumber = theRHS.num();
  +             const double    theLHS = theNumberFunction(*theLHSNode);
   
  -             if(DoubleSupport::isNaN(theRHSNumber) == false)
  -             {
  -                     // Compare as number...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getNumberFromNodeFunction(),
  -                                     theRHS.num(),
  -                                     DoubleSupport::equalFunction());
  -             }
  -             else
  +             if (theCompareFunction(theLHS, theRHS) == true)
                {
  -                     // Compare as string...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getStringFromNodeFunction(),
  -                                     theRHS.str(),
  -                                     DOMStringEqualsFunction());
  +                     theResult = true;
                }
        }
  -     else if(theRHSType == XObject::eTypeString)
  -     {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a 
  -             // string, then the comparison will be true if and only if 
there 
  -             // is a node in the node-set such that the result of performing 
  -             // the comparison on the string-value of the node and the other 
  -             // string is true. 
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             theRHS.str(),
  -                             DOMStringEqualsFunction());
  -     }
  -     else
  -     {
  -             assert(false);
  -     }
   
        return theResult;
   }
   
   
   
  +template<class StringCompareFunction, class NumberCompareFunction>
   bool
  -notEqualNodeSet(
  -                     const XObject&                  theLHS,
  -                     const XObject&                  theRHS,
  -                     XObject::eObjectType    theRHSType)
  +compareNodeSets(
  +                     const XObject&                                  theLHS,
  +                     const XObject&                                  theRHS,
  +                     XObject::eObjectType                    theRHSType,
  +                     const StringCompareFunction&    
theStringCompareFunction,
  +                     const NumberCompareFunction&    
theNumberCompareFunction,
  +                     XPathExecutionContext&                  
executionContext)
   {
        bool    theResult = false;
   
  @@ -476,8 +424,9 @@
                theResult = doCompareNodeSets(
                                theLHS.nodeset(),
                                theRHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             DOMStringNotEqualsFunction());
  +                             getStringFromNodeFunction(executionContext),
  +                             theStringCompareFunction,
  +                             executionContext);
   
        }
        else if(theRHSType == XObject::eTypeBoolean)
  @@ -490,7 +439,7 @@
          // is true.
                const double    num1 = theLHS.boolean() == true ? 1.0 : 0.0;
   
  -             theResult = DoubleSupport::notEqual(num1, theRHS.num());
  +             theResult = theNumberCompareFunction(num1, theRHS.num());
        }
        else if(theRHSType == XObject::eTypeNumber)
        {
  @@ -502,11 +451,11 @@
                // converting the string-value of that node to a number using 
                // the number function is true. 
   
  -             theResult = doCompare(
  +             theResult = doCompareNumber(
                                theLHS.nodeset(),
  -                             getNumberFromNodeFunction(),
  +                             getNumberFromNodeFunction(executionContext),
                                theRHS.num(),
  -                             DoubleSupport::notEqualFunction());
  +                             theNumberCompareFunction);
        }
        else if(theRHSType == XObject::eTypeResultTreeFrag)
        {
  @@ -516,20 +465,21 @@
                if(DoubleSupport::isNaN(theRHSNumber) == false)
                {
                        // Compare as number...
  -                     theResult = doCompare(
  +                     theResult = doCompareNumber(
                                        theLHS.nodeset(),
  -                                     getNumberFromNodeFunction(),
  +                                     
getNumberFromNodeFunction(executionContext),
                                        theRHS.num(),
  -                                     DoubleSupport::notEqualFunction());
  +                                     theNumberCompareFunction);
                }
                else
                {
                        // Compare as string...
  -                     theResult = doCompare(
  +                     theResult = doCompareString(
                                        theLHS.nodeset(),
  -                                     getStringFromNodeFunction(),
  +                                     
getStringFromNodeFunction(executionContext),
                                        theRHS.str(),
  -                                     DOMStringNotEqualsFunction());
  +                                     theStringCompareFunction,
  +                                     executionContext);
                }
        }
        else if(theRHSType == XObject::eTypeString)
  @@ -540,11 +490,12 @@
                // is a node in the node-set such that the result of performing 
                // the comparison on the string-value of the node and the other 
                // string is true. 
  -             theResult = doCompare(
  +             theResult = doCompareString(
                                theLHS.nodeset(),
  -                             getStringFromNodeFunction(),
  +                             getStringFromNodeFunction(executionContext),
                                theRHS.str(),
  -                             DOMStringNotEqualsFunction());
  +                             theStringCompareFunction,
  +                             executionContext);
        }
        else
        {
  @@ -556,384 +507,118 @@
   
   
   
  -bool
  -lessThanNodeSet(
  +inline bool
  +equalNodeSet(
                        const XObject&                  theLHS,
                        const XObject&                  theRHS,
  -                     XObject::eObjectType    theRHSType)
  +                     XObject::eObjectType    theRHSType,
  +                     XPathExecutionContext&  executionContext)
   {
  -     bool    theResult = false;
  +     return compareNodeSets(
  +                             theLHS,
  +                             theRHS,
  +                             theRHSType,
  +                             DOMStringEqualsFunction(),
  +                             DoubleSupport::equalFunction(),
  +                             executionContext);
  +}
   
  -     if(theRHSType == XObject::eTypeNodeSet)
  -     {
  -             // Compare as node sets...
  -             theResult = doCompareNodeSets(
  -                             theLHS.nodeset(),
  -                             theRHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             DOMStringLessThanFunction());
   
  -     }
  -     else if(theRHSType == XObject::eTypeBoolean)
  -     {
  -       // From http://www.w3.org/TR/xpath: 
  -       // If one object to be compared is a node-set and the other is a 
boolean, 
  -       // then the comparison will be true if and only if the result of 
  -       // performing the comparison on the boolean and on the result of 
  -       // converting the node-set to a boolean using the boolean function 
  -       // is true.
  -             const double    num1 = theLHS.boolean() == true ? 1.0 : 0.0;
   
  -             theResult = DoubleSupport::lessThan(num1, theRHS.num());
  -     }
  -     else if(theRHSType == XObject::eTypeNumber)
  -     {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a number, 
  -             // then the comparison will be true if and only if there is a 
  -             // node in the node-set such that the result of performing the 
  -             // comparison on the number to be compared and on the result of 
  -             // converting the string-value of that node to a number using 
  -             // the number function is true. 
  +inline bool
  +notEqualNodeSet(
  +                     const XObject&                  theLHS,
  +                     const XObject&                  theRHS,
  +                     XObject::eObjectType    theRHSType,
  +                     XPathExecutionContext&  executionContext)
  +{
  +     return compareNodeSets(
  +                             theLHS,
  +                             theRHS,
  +                             theRHSType,
  +                             DOMStringNotEqualsFunction(),
  +                             DoubleSupport::notEqualFunction(),
  +                             executionContext);
  +}
   
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getNumberFromNodeFunction(),
  -                             theRHS.num(),
  -                             DoubleSupport::lessThanFunction());
  -     }
  -     else if(theRHSType == XObject::eTypeResultTreeFrag)
  -     {
  -             // hmmm... 
  -             const double    theRHSNumber = theRHS.num();
   
  -             if(DoubleSupport::isNaN(theRHSNumber) == false)
  -             {
  -                     // Compare as number...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getNumberFromNodeFunction(),
  -                                     theRHS.num(),
  -                                     DoubleSupport::lessThanFunction());
  -             }
  -             else
  -             {
  -                     // Compare as string...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getStringFromNodeFunction(),
  -                                     theRHS.str(),
  -                                     DOMStringLessThanFunction());
  -             }
  -     }
  -     else if(theRHSType == XObject::eTypeString)
  -     {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a 
  -             // string, then the comparison will be true if and only if 
there 
  -             // is a node in the node-set such that the result of performing 
  -             // the comparison on the string-value of the node and the other 
  -             // string is true. 
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             theRHS.str(),
  -                             DOMStringLessThanFunction());
  -     }
  -     else
  -     {
  -             assert(false);
  -     }
   
  -     return theResult;
  +inline bool
  +lessThanNodeSet(
  +                     const XObject&                  theLHS,
  +                     const XObject&                  theRHS,
  +                     XObject::eObjectType    theRHSType,
  +                     XPathExecutionContext&  executionContext)
  +{
  +     return compareNodeSets(
  +                             theLHS,
  +                             theRHS,
  +                             theRHSType,
  +                             DOMStringLessThanFunction(),
  +                             DoubleSupport::lessThanFunction(),
  +                             executionContext);
   }
   
   
   
  -bool
  +inline bool
   lessThanOrEqualNodeSet(
                        const XObject&                  theLHS,
                        const XObject&                  theRHS,
  -                     XObject::eObjectType    theRHSType)
  +                     XObject::eObjectType    theRHSType,
  +                     XPathExecutionContext&  executionContext)
   {
  -     bool    theResult = false;
  -
  -     if(theRHSType == XObject::eTypeNodeSet)
  -     {
  -             // Compare as node sets...
  -             theResult = doCompareNodeSets(
  -                             theLHS.nodeset(),
  -                             theRHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             DOMStringLessThanOrEqualFunction());
  -
  -     }
  -     else if(theRHSType == XObject::eTypeBoolean)
  -     {
  -       // From http://www.w3.org/TR/xpath: 
  -       // If one object to be compared is a node-set and the other is a 
boolean, 
  -       // then the comparison will be true if and only if the result of 
  -       // performing the comparison on the boolean and on the result of 
  -       // converting the node-set to a boolean using the boolean function 
  -       // is true.
  -             const double    num1 = theLHS.boolean() == true ? 1.0 : 0.0;
  -
  -             theResult = DoubleSupport::lessThanOrEqual(num1, theRHS.num());
  -     }
  -     else if(theRHSType == XObject::eTypeNumber)
  -     {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a number, 
  -             // then the comparison will be true if and only if there is a 
  -             // node in the node-set such that the result of performing the 
  -             // comparison on the number to be compared and on the result of 
  -             // converting the string-value of that node to a number using 
  -             // the number function is true. 
  -
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getNumberFromNodeFunction(),
  -                             theRHS.num(),
  -                             DoubleSupport::lessThanOrEqualFunction());
  -     }
  -     else if(theRHSType == XObject::eTypeResultTreeFrag)
  -     {
  -             // hmmm... 
  -             const double    theRHSNumber = theRHS.num();
  -
  -             if(DoubleSupport::isNaN(theRHSNumber) == false)
  -             {
  -                     // Compare as number...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getNumberFromNodeFunction(),
  -                                     theRHS.num(),
  -                                     
DoubleSupport::lessThanOrEqualFunction());
  -             }
  -             else
  -             {
  -                     // Compare as string...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getStringFromNodeFunction(),
  -                                     theRHS.str(),
  -                                     DOMStringLessThanOrEqualFunction());
  -             }
  -     }
  -     else if(theRHSType == XObject::eTypeString)
  -     {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a 
  -             // string, then the comparison will be true if and only if 
there 
  -             // is a node in the node-set such that the result of performing 
  -             // the comparison on the string-value of the node and the other 
  -             // string is true. 
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             theRHS.str(),
  -                             DOMStringLessThanOrEqualFunction());
  -     }
  -     else
  -     {
  -             assert(false);
  -     }
  -
  -     return theResult;
  +     return compareNodeSets(
  +                             theLHS,
  +                             theRHS,
  +                             theRHSType,
  +                             DOMStringLessThanOrEqualFunction(),
  +                             DoubleSupport::lessThanOrEqualFunction(),
  +                             executionContext);
   }
   
   
   
  -bool
  +inline bool
   greaterThanNodeSet(
                        const XObject&                  theLHS,
                        const XObject&                  theRHS,
  -                     XObject::eObjectType    theRHSType)
  +                     XObject::eObjectType    theRHSType,
  +                     XPathExecutionContext&  executionContext)
   {
  -     bool    theResult = false;
  -
  -     if(theRHSType == XObject::eTypeNodeSet)
  -     {
  -             // Compare as node sets...
  -             theResult = doCompareNodeSets(
  -                             theLHS.nodeset(),
  -                             theRHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             DOMStringGreaterThanFunction());
  -
  -     }
  -     else if(theRHSType == XObject::eTypeBoolean)
  -     {
  -       // From http://www.w3.org/TR/xpath: 
  -       // If one object to be compared is a node-set and the other is a 
boolean, 
  -       // then the comparison will be true if and only if the result of 
  -       // performing the comparison on the boolean and on the result of 
  -       // converting the node-set to a boolean using the boolean function 
  -       // is true.
  -             const double    num1 = theLHS.boolean() == true ? 1.0 : 0.0;
  -
  -             theResult = DoubleSupport::greaterThan(num1, theRHS.num());
  -     }
  -     else if(theRHSType == XObject::eTypeNumber)
  -     {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a number, 
  -             // then the comparison will be true if and only if there is a 
  -             // node in the node-set such that the result of performing the 
  -             // comparison on the number to be compared and on the result of 
  -             // converting the string-value of that node to a number using 
  -             // the number function is true. 
  -
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getNumberFromNodeFunction(),
  -                             theRHS.num(),
  -                             DoubleSupport::greaterThanFunction());
  -     }
  -     else if(theRHSType == XObject::eTypeResultTreeFrag)
  -     {
  -             // hmmm... 
  -             const double    theRHSNumber = theRHS.num();
  -
  -             if(DoubleSupport::isNaN(theRHSNumber) == false)
  -             {
  -                     // Compare as number...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getNumberFromNodeFunction(),
  -                                     theRHS.num(),
  -                                     DoubleSupport::greaterThanFunction());
  -             }
  -             else
  -             {
  -                     // Compare as string...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getStringFromNodeFunction(),
  -                                     theRHS.str(),
  -                                     DOMStringGreaterThanFunction());
  -             }
  -     }
  -     else if(theRHSType == XObject::eTypeString)
  -     {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a 
  -             // string, then the comparison will be true if and only if 
there 
  -             // is a node in the node-set such that the result of performing 
  -             // the comparison on the string-value of the node and the other 
  -             // string is true. 
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             theRHS.str(),
  -                             DOMStringGreaterThanFunction());
  -     }
  -     else
  -     {
  -             assert(false);
  -     }
  -
  -     return theResult;
  +     return compareNodeSets(
  +                             theLHS,
  +                             theRHS,
  +                             theRHSType,
  +                             DOMStringGreaterThanFunction(),
  +                             DoubleSupport::greaterThanFunction(),
  +                             executionContext);
   }
   
   
   
  -bool
  +inline bool
   greaterThanOrEqualNodeSet(
                        const XObject&                  theLHS,
                        const XObject&                  theRHS,
  -                     XObject::eObjectType    theRHSType)
  +                     XObject::eObjectType    theRHSType,
  +                     XPathExecutionContext&  executionContext)
   {
  -     bool    theResult = false;
  -
  -     if(theRHSType == XObject::eTypeNodeSet)
  -     {
  -             // Compare as node sets...
  -             theResult = doCompareNodeSets(
  -                             theLHS.nodeset(),
  -                             theRHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             DOMStringGreaterThanOrEqualFunction());
  -
  -     }
  -     else if(theRHSType == XObject::eTypeBoolean)
  -     {
  -       // From http://www.w3.org/TR/xpath: 
  -       // If one object to be compared is a node-set and the other is a 
boolean, 
  -       // then the comparison will be true if and only if the result of 
  -       // performing the comparison on the boolean and on the result of 
  -       // converting the node-set to a boolean using the boolean function 
  -       // is true.
  -             const double    num1 = theLHS.boolean() == true ? 1.0 : 0.0;
  -
  -             theResult = DoubleSupport::greaterThanOrEqual(num1, 
theRHS.num());
  -     }
  -     else if(theRHSType == XObject::eTypeNumber)
  -     {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a number, 
  -             // then the comparison will be true if and only if there is a 
  -             // node in the node-set such that the result of performing the 
  -             // comparison on the number to be compared and on the result of 
  -             // converting the string-value of that node to a number using 
  -             // the number function is true. 
  -
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getNumberFromNodeFunction(),
  -                             theRHS.num(),
  -                             DoubleSupport::greaterThanOrEqualFunction());
  -     }
  -     else if(theRHSType == XObject::eTypeResultTreeFrag)
  -     {
  -             // hmmm... 
  -             const double    theRHSNumber = theRHS.num();
  -
  -             if(DoubleSupport::isNaN(theRHSNumber) == false)
  -             {
  -                     // Compare as number...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getNumberFromNodeFunction(),
  -                                     theRHS.num(),
  -                                     
DoubleSupport::greaterThanOrEqualFunction());
  -             }
  -             else
  -             {
  -                     // Compare as string...
  -                     theResult = doCompare(
  -                                     theLHS.nodeset(),
  -                                     getStringFromNodeFunction(),
  -                                     theRHS.str(),
  -                                     DOMStringGreaterThanOrEqualFunction());
  -             }
  -     }
  -     else if(theRHSType == XObject::eTypeString)
  -     {
  -             // From http://www.w3.org/TR/xpath: 
  -             // If one object to be compared is a node-set and the other is 
a 
  -             // string, then the comparison will be true if and only if 
there 
  -             // is a node in the node-set such that the result of performing 
  -             // the comparison on the string-value of the node and the other 
  -             // string is true. 
  -             theResult = doCompare(
  -                             theLHS.nodeset(),
  -                             getStringFromNodeFunction(),
  -                             theRHS.str(),
  -                             DOMStringGreaterThanOrEqualFunction());
  -     }
  -     else
  -     {
  -             assert(false);
  -     }
  -
  -     return theResult;
  +     return compareNodeSets(
  +                             theLHS,
  +                             theRHS,
  +                             theRHSType,
  +                             DOMStringGreaterThanOrEqualFunction(),
  +                             DoubleSupport::greaterThanOrEqualFunction(),
  +                             executionContext);
   }
   
   
   
   bool
  -XObject::equals(const XObject&       theRHS) const
  +XObject::equals(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const
   {
        if (this == &theRHS)
        {
  @@ -953,7 +638,7 @@
                }
                else if (theLHSType == eTypeNodeSet)
                {
  -                     return equalNodeSet(*this, theRHS, theRHS.getType());
  +                     return equalNodeSet(*this, theRHS, theRHS.getType(), 
executionContext);
                }
                else
                {
  @@ -961,7 +646,7 @@
   
                        if (theRHSType == eTypeNodeSet)
                        {
  -                             return equalNodeSet(theRHS, *this, theLHSType);
  +                             return equalNodeSet(theRHS, *this, theLHSType, 
executionContext);
                        }
                        else
                        {
  @@ -985,7 +670,9 @@
   
   
   bool
  -XObject::notEquals(const XObject&    theRHS) const
  +XObject::notEquals(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const
   {
        if (this == &theRHS)
        {
  @@ -1005,7 +692,7 @@
                }
                else if (theLHSType == eTypeNodeSet)
                {
  -                     return notEqualNodeSet(*this, theRHS, theRHS.getType());
  +                     return notEqualNodeSet(*this, theRHS, theRHS.getType(), 
executionContext);
                }
                else
                {
  @@ -1013,7 +700,7 @@
   
                        if (theRHSType == eTypeNodeSet)
                        {
  -                             return notEqualNodeSet(theRHS, *this, 
theLHSType);
  +                             return notEqualNodeSet(theRHS, *this, 
theLHSType, executionContext);
                        }
                        else
                        {
  @@ -1037,7 +724,9 @@
   
   
   bool
  -XObject::lessThan(const XObject&     theRHS) const
  +XObject::lessThan(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const
   {
        if (this == &theRHS)
        {
  @@ -1053,11 +742,11 @@
                }
                else if (theLHSType == eTypeNodeSet)
                {
  -                     return lessThanNodeSet(*this, theRHS, theRHS.getType());
  +                     return lessThanNodeSet(*this, theRHS, theRHS.getType(), 
executionContext);
                }
                else if (theRHS.getType() == eTypeNodeSet)
                {
  -                     return greaterThanNodeSet(theRHS, *this, theLHSType);
  +                     return greaterThanNodeSet(theRHS, *this, theLHSType, 
executionContext);
                }
                else
                {
  @@ -1069,7 +758,9 @@
   
   
   bool
  -XObject::lessThanOrEqual(const XObject&              theRHS) const
  +XObject::lessThanOrEquals(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const
   {
        if (this == &theRHS)
        {
  @@ -1085,11 +776,11 @@
                }
                else if (theLHSType == eTypeNodeSet)
                {
  -                     return lessThanOrEqualNodeSet(*this, theRHS, 
theRHS.getType());
  +                     return lessThanOrEqualNodeSet(*this, theRHS, 
theRHS.getType(), executionContext);
                }
                else if (theRHS.getType() == eTypeNodeSet)
                {
  -                     return greaterThanOrEqualNodeSet(theRHS, *this, 
theLHSType);
  +                     return greaterThanOrEqualNodeSet(theRHS, *this, 
theLHSType, executionContext);
                }
                else
                {
  @@ -1101,7 +792,9 @@
   
   
   bool
  -XObject::greaterThan(const XObject&          theRHS) const
  +XObject::greaterThan(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const
   {
        if (this == &theRHS)
        {
  @@ -1117,11 +810,11 @@
                }
                else if (theLHSType == eTypeNodeSet)
                {
  -                     return greaterThanNodeSet(*this, theRHS, 
theRHS.getType());
  +                     return greaterThanNodeSet(*this, theRHS, 
theRHS.getType(), executionContext);
                }
                else if (theRHS.getType() == eTypeNodeSet)
                {
  -                     return lessThanNodeSet(theRHS, *this, theLHSType);
  +                     return lessThanNodeSet(theRHS, *this, theLHSType, 
executionContext);
                }
                else
                {
  @@ -1133,7 +826,9 @@
   
   
   bool
  -XObject::greaterThanOrEqual(const XObject&   theRHS) const
  +XObject::greaterThanOrEquals(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const
   {
        if (this == &theRHS)
        {
  @@ -1149,11 +844,11 @@
                }
                else if (theLHSType == eTypeNodeSet)
                {
  -                     return greaterThanOrEqualNodeSet(*this, theRHS, 
theRHS.getType());
  +                     return greaterThanOrEqualNodeSet(*this, theRHS, 
theRHS.getType(), executionContext);
                }
                else if (theRHS.getType() == eTypeNodeSet)
                {
  -                     return lessThanOrEqualNodeSet(theRHS, *this, 
theLHSType);
  +                     return lessThanOrEqualNodeSet(theRHS, *this, 
theLHSType, executionContext);
                }
                else
                {
  
  
  
  1.15      +19 -66    xml-xalan/c/src/XPath/XObject.hpp
  
  Index: XObject.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XObject.hpp,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- XObject.hpp       2000/12/21 04:43:49     1.14
  +++ XObject.hpp       2001/01/03 19:32:39     1.15
  @@ -205,7 +205,9 @@
         * @return true if they are equal
         */
        bool
  -     equals(const XObject&   theRHS) const;
  +     equals(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const;
   
        /**
         * Tell if two objects are functionally not equal.
  @@ -215,7 +217,9 @@
         * @return true if they are equal
         */
        bool
  -     notEquals(const XObject&        theRHS) const;
  +     notEquals(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const;
   
        /**
         * Tell if one object is less than the other.
  @@ -224,7 +228,9 @@
         * @return true if they are equal
         */
        bool
  -     lessThan(const XObject&         theRHS) const;
  +     lessThan(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const;
   
        /**
         * Tell if one object is less than or equal
  @@ -234,7 +240,9 @@
         * @return true if they are equal
         */
        bool
  -     lessThanOrEqual(const XObject&  theRHS) const;
  +     lessThanOrEquals(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const;
   
        /**
         * Tell if one object is greater than the other.
  @@ -243,7 +251,9 @@
         * @return true if they are equal
         */
        bool
  -     greaterThan(const XObject&      theRHS) const;
  +     greaterThan(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const;
   
        /**
         * Tell if one object is greater than or equal
  @@ -253,7 +263,9 @@
         * @return true if they are equal
         */
        bool
  -     greaterThanOrEqual(const XObject&       theRHS) const;
  +     greaterThanOrEquals(
  +                     const XObject&                  theRHS,
  +                     XPathExecutionContext&  executionContext) const;
   
        /**
         * Tell what kind of class this is.
  @@ -358,66 +370,6 @@
   
   
   
  -inline bool
  -operator==(
  -                     const XObject&  theLHS,
  -                     const XObject&  theRHS)
  -{
  -     return theLHS.equals(theRHS);
  -}
  -
  -
  -
  -inline bool
  -operator!=(
  -                     const XObject&  theLHS,
  -                     const XObject&  theRHS)
  -{
  -     return theLHS.notEquals(theRHS);
  -}
  -
  -
  -
  -inline bool
  -operator<(
  -                     const XObject&  theLHS,
  -                     const XObject&  theRHS)
  -{
  -     return theLHS.lessThan(theRHS);
  -}
  -
  -
  -
  -inline bool
  -operator<=(
  -                     const XObject&  theLHS,
  -                     const XObject&  theRHS)
  -{
  -     return theLHS.lessThanOrEqual(theRHS);
  -}
  -
  -
  -
  -inline bool
  -operator>(
  -                     const XObject&  theLHS,
  -                     const XObject&  theRHS)
  -{
  -     return theLHS.greaterThan(theRHS);
  -}
  -
  -
  -
  -inline bool
  -operator>=(
  -                     const XObject&  theLHS,
  -                     const XObject&  theRHS)
  -{
  -     return theLHS.greaterThanOrEqual(theRHS);
  -}
  -
  -
  -
   /**
    * Class to hold XObjectPtr return types.
    */
  @@ -426,6 +378,7 @@
   public:
   
        friend bool operator==(const XObjectPtr&, const XObjectPtr&);
  +
        /**
         * Create an XObjectPtr.
         */
  
  
  
  1.38      +6 -6      xml-xalan/c/src/XPath/XPath.cpp
  
  Index: XPath.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPath.cpp,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- XPath.cpp 2000/12/04 20:48:17     1.37
  +++ XPath.cpp 2001/01/03 19:32:40     1.38
  @@ -733,7 +733,7 @@
        const XObjectPtr        expr2(executeMore(context, expr2Pos, 
executionContext));
        assert(expr2.get() != 0);
   
  -     return executionContext.getXObjectFactory().createBoolean(*expr1.get() 
!= *expr2.get());
  +     return 
executionContext.getXObjectFactory().createBoolean(expr1->notEquals(*expr2.get(),
 executionContext));
   }
   
   
  @@ -754,7 +754,7 @@
        const XObjectPtr        expr2(executeMore(context, expr2Pos, 
executionContext));
        assert(expr2.get() != 0);
   
  -     return executionContext.getXObjectFactory().createBoolean(*expr1.get() 
== *expr2.get());
  +     return 
executionContext.getXObjectFactory().createBoolean(expr1->equals(*expr2.get(), 
executionContext));
   }
   
   
  @@ -775,7 +775,7 @@
        const XObjectPtr        expr2(executeMore(context, expr2Pos, 
executionContext));
        assert(expr2.get() != 0);
   
  -     return executionContext.getXObjectFactory().createBoolean(*expr1.get() 
<= *expr2.get());
  +     return 
executionContext.getXObjectFactory().createBoolean(expr1->lessThanOrEquals(*expr2.get(),
 executionContext));
   }
   
   
  @@ -796,7 +796,7 @@
        const XObjectPtr        expr2(executeMore(context, expr2Pos, 
executionContext));
        assert(expr2.get() != 0);
   
  -     return executionContext.getXObjectFactory().createBoolean(*expr1.get() 
< *expr2.get());
  +     return 
executionContext.getXObjectFactory().createBoolean(expr1->lessThan(*expr2.get(),
 executionContext));
   }
   
   
  @@ -817,7 +817,7 @@
        const XObjectPtr        expr2(executeMore(context, expr2Pos, 
executionContext));
        assert(expr2.get() != 0);
   
  -     return executionContext.getXObjectFactory().createBoolean(*expr1.get() 
>= *expr2.get());
  +     return 
executionContext.getXObjectFactory().createBoolean(expr1->greaterThanOrEquals(*expr2.get(),
 executionContext));
   }
   
   
  @@ -838,7 +838,7 @@
        const XObjectPtr        expr2(executeMore(context, expr2Pos, 
executionContext));
        assert(expr2.get() != 0);
   
  -     return executionContext.getXObjectFactory().createBoolean(*expr1.get() 
> *expr2.get());
  +     return 
executionContext.getXObjectFactory().createBoolean(expr1->greaterThan(*expr2.get(),
 executionContext));
   }
   
   
  
  
  
  1.32      +5 -57     xml-xalan/c/src/XPath/XPathExecutionContext.hpp
  
  Index: XPathExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExecutionContext.hpp,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- XPathExecutionContext.hpp 2000/12/21 04:44:27     1.31
  +++ XPathExecutionContext.hpp 2001/01/03 19:32:40     1.32
  @@ -197,44 +197,6 @@
        isIgnorableWhitespace(const XalanText&  node) const = 0;
   
        /**
  -      * Retrieve namespace corresponding to a DOM node.
  -      * 
  -      * @param n DOM node queried
  -      * @return namespace string corresponding to 'n'
  -      */
  -     virtual const XalanDOMString&
  -     getNamespaceOfNode(const XalanNode&             n) const = 0;
  -
  -     /**
  -      * Retrieve the name of the node, taking into
  -      * account the differences between the DOM and
  -      * XSLT data models.
  -      * 
  -      * @param node  DOM node whose name is returned
  -      * @return name of the node
  -      */
  -     virtual const XalanDOMString&
  -     getNameOfNode(const XalanNode&  n) const = 0;
  -
  -     /**
  -      * Returns the local name of the given node.
  -      * 
  -      * @param n node queried
  -      * @return local name string corresponding to 'n'
  -      */
  -     virtual const XalanDOMString&
  -     getLocalNameOfNode(const XalanNode&             n) const = 0;
  -
  -     /**
  -      * Returns the parent of the given node.
  -      * 
  -      * @param n DOM node queried
  -      * @return parent node for 'n'
  -      */
  -     virtual XalanNode*
  -     getParentOfNode(const XalanNode&        n) const = 0;
  -
  -     /**
         * Determine if a node is after another node, in document order.
         *
         * @param node1 The first node
  @@ -247,27 +209,13 @@
                        const XalanNode&        node2) const = 0;
   
        /**
  -      * Get node data recursively.
  +      * Retrieve namespace corresponding to a DOM node
         * 
  -      * @param n DOM node queried
  -      * @param s string to which the node's data will be appended.
  -      */
  -     virtual void
  -     getNodeData(
  -                     const XalanNode&        n,
  -                     XalanDOMString&         s) const = 0;
  -
  -     /**
  -      * Given a valid element id, return the corresponding element.
  -      *
  -      * @param id  string representing ID
  -      * @param doc document to search
  -      * @return element for ID
  +      * @param theNode DOM node whose namespace is queried
  +      * @return namespace corresponding to 'theNode'
         */
  -     virtual XalanElement*
  -     getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const = 0;
  +     virtual const XalanDOMString&
  +     getNamespaceOfNode(const XalanNode&     theNode) const = 0;
   
        /**
         * Retrieve node list for current context.
  
  
  
  1.29      +5 -49     xml-xalan/c/src/XPath/XPathExecutionContextDefault.cpp
  
  Index: XPathExecutionContextDefault.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExecutionContextDefault.cpp,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- XPathExecutionContextDefault.cpp  2000/12/15 23:25:55     1.28
  +++ XPathExecutionContextDefault.cpp  2001/01/03 19:32:41     1.29
  @@ -185,38 +185,6 @@
   
   
   
  -const XalanDOMString&
  -XPathExecutionContextDefault::getNamespaceOfNode(const XalanNode&    n) const
  -{
  -     return m_xpathSupport.getNamespaceOfNode(n);
  -}
  -
  -
  -
  -const XalanDOMString&
  -XPathExecutionContextDefault::getNameOfNode(const XalanNode& n) const
  -{
  -     return m_xpathSupport.getNameOfNode(n);
  -}
  -
  -
  -
  -const XalanDOMString&
  -XPathExecutionContextDefault::getLocalNameOfNode(const XalanNode&    n) const
  -{
  -     return m_xpathSupport.getLocalNameOfNode(n);
  -}
  -
  -
  -
  -XalanNode*
  -XPathExecutionContextDefault::getParentOfNode(const XalanNode&       n) const
  -{
  -     return m_xpathSupport.getParentOfNode(n);
  -}
  -
  -
  -
   bool
   XPathExecutionContextDefault::isNodeAfter(
                        const XalanNode&        node1,
  @@ -227,25 +195,13 @@
   
   
   
  -void
  -XPathExecutionContextDefault::getNodeData(
  -                     const XalanNode&        n,
  -                     XalanDOMString&         s) const
  -{
  -     m_xpathSupport.getNodeData(n, s);
  -}
  -
  -
  -
  -XalanElement*
  -XPathExecutionContextDefault::getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const
  +const XalanDOMString&
  +XPathExecutionContextDefault::getNamespaceOfNode(const XalanNode&    
theNode) const
   {
  -     return m_xpathSupport.getElementByID(id, doc);
  +     return m_xpathSupport.getNamespaceOfNode(theNode);
   }
  -
  -
  +     
  +     
   
   const NodeRefListBase&
   XPathExecutionContextDefault::getContextNodeList() const
  
  
  
  1.29      +2 -21     xml-xalan/c/src/XPath/XPathExecutionContextDefault.hpp
  
  Index: XPathExecutionContextDefault.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExecutionContextDefault.hpp,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- XPathExecutionContextDefault.hpp  2000/12/15 23:25:55     1.28
  +++ XPathExecutionContextDefault.hpp  2001/01/03 19:32:41     1.29
  @@ -143,32 +143,13 @@
        virtual bool
        isIgnorableWhitespace(const XalanText&  node) const;
   
  -     virtual const XalanDOMString&
  -     getNamespaceOfNode(const XalanNode&             n) const;
  -
  -     virtual const XalanDOMString&
  -     getNameOfNode(const XalanNode&  n) const;
  -
  -     virtual const XalanDOMString&
  -     getLocalNameOfNode(const XalanNode&             n) const;
  -
  -     virtual XalanNode*
  -     getParentOfNode(const XalanNode&        n) const;
  -
        virtual bool
        isNodeAfter(
                        const XalanNode&        node1,
                        const XalanNode&        node2) const;
   
  -     virtual void
  -     getNodeData(
  -                     const XalanNode&        n,
  -                     XalanDOMString&         s) const;
  -
  -     virtual XalanElement*
  -     getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const;
  +     virtual const XalanDOMString&
  +     getNamespaceOfNode(const XalanNode&     theNode) const;
   
        virtual const NodeRefListBase&
        getContextNodeList() const;
  
  
  
  1.10      +6 -59     xml-xalan/c/src/XPath/XPathSupport.hpp
  
  Index: XPathSupport.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathSupport.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XPathSupport.hpp  2000/12/15 23:25:55     1.9
  +++ XPathSupport.hpp  2001/01/03 19:32:41     1.10
  @@ -113,56 +113,6 @@
                        const XalanElement&             namespaceContext) const 
= 0;
   
        /**
  -      * Returns the namespace of the given node.
  -      *
  -      * @param node  DOM node whose namespace is returned
  -      * @return namespace of node
  -      */
  -     virtual const XalanDOMString&
  -     getNamespaceOfNode(const XalanNode&             n) const = 0;
  -
  -     /**
  -      * Retrieve the name of the node, taking into
  -      * account the differences between the DOM and
  -      * XSLT data models.
  -      * 
  -      * @param node  DOM node whose name is returned
  -      * @return name of the node
  -      */
  -     virtual const XalanDOMString&
  -     getNameOfNode(const XalanNode&  n) const = 0;
  -
  -     /**
  -      * Retrieve local name of node
  -      * 
  -      * @param node  DOM node whose name is returned
  -      * @return name of node without namespace
  -      */
  -     virtual const XalanDOMString&
  -     getLocalNameOfNode(const XalanNode&             n) const = 0;
  -
  -     /**
  -      * Get node data recursively.
  -      * 
  -      * @param n DOM node queried
  -      * @param s string to which the node's data will be appended.
  -      */
  -     virtual void
  -     getNodeData(
  -                     const XalanNode&        n,
  -                     XalanDOMString&         s) const = 0;
  -
  -     /**
  -      * Retrieve the parent of a node. This function has to be implemented,
  -      * because the DOM WG decided that attributes don't have parents.
  -      *
  -      * @param node child node
  -      * @return parent node
  -      */
  -     virtual XalanNode*
  -     getParentOfNode(const XalanNode&        n) const = 0;
  -
  -     /**
         * Determine if a node is after another node, in document order.
         *
         * @param node1 The first node
  @@ -175,16 +125,13 @@
                        const XalanNode&        node2) const = 0;
   
        /**
  -      * Given a valid element id, return the corresponding element.
  -      *
  -      * @param id  string representing ID
  -      * @param doc document to search
  -      * @return element for ID
  +      * Retrieve namespace corresponding to a DOM node
  +      * 
  +      * @param theNode DOM node whose namespace is queried
  +      * @return namespace corresponding to 'theNode'
         */
  -     virtual XalanElement*
  -     getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const = 0;
  +     virtual const XalanDOMString&
  +     getNamespaceOfNode(const XalanNode&     theNode) const = 0;
   
        /**
         * Set whether or not the liaison attempts to expand namespaces.        
Used 
  
  
  
  1.13      +0 -44     xml-xalan/c/src/XPath/XPathSupportDefault.cpp
  
  Index: XPathSupportDefault.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathSupportDefault.cpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- XPathSupportDefault.cpp   2000/12/15 23:25:56     1.12
  +++ XPathSupportDefault.cpp   2001/01/03 19:32:42     1.13
  @@ -125,56 +125,12 @@
   
   
   
  -const XalanDOMString&
  -XPathSupportDefault::getNameOfNode(const XalanNode&          n) const
  -{
  -     return DOMServices::getNameOfNode(n);
  -}
  -
  -
  -
  -const XalanDOMString&
  -XPathSupportDefault::getLocalNameOfNode(const XalanNode&     n) const
  -{
  -     return DOMServices::getLocalNameOfNode(n);
  -}
  -
  -
  -
  -void
  -XPathSupportDefault::getNodeData(
  -                     const XalanNode&        n,
  -                     XalanDOMString&         s) const
  -{
  -     DOMServices::getNodeData(n, s);
  -}
  -
  -
  -
  -XalanNode*
  -XPathSupportDefault::getParentOfNode(const XalanNode&        node) const
  -{
  -     return DOMServices::getParentOfNode(node);
  -}
  -
  -
  -
   bool
   XPathSupportDefault::isNodeAfter(
                        const XalanNode&        node1,
                        const XalanNode&        node2) const
   {
        return DOMServices::isNodeAfter(node1, node2);
  -}
  -
  -
  -
  -XalanElement*
  -XPathSupportDefault::getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const
  -{
  -     return doc.getElementById(id);
   }
   
   
  
  
  
  1.10      +2 -21     xml-xalan/c/src/XPath/XPathSupportDefault.hpp
  
  Index: XPathSupportDefault.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathSupportDefault.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XPathSupportDefault.hpp   2000/12/15 23:25:56     1.9
  +++ XPathSupportDefault.hpp   2001/01/03 19:32:42     1.10
  @@ -96,32 +96,13 @@
                        const XalanDOMString&   prefix, 
                        const XalanElement&             namespaceContext) const;
   
  -     virtual const XalanDOMString&
  -     getNamespaceOfNode(const XalanNode&             n) const;
  -
  -     virtual const XalanDOMString&
  -     getNameOfNode(const XalanNode&  n) const;
  -
  -     virtual const XalanDOMString&
  -     getLocalNameOfNode(const XalanNode&             n) const;
  -
  -     virtual void
  -     getNodeData(
  -                     const XalanNode&        n,
  -                     XalanDOMString&         s) const;
  -
  -     virtual XalanNode*
  -     getParentOfNode(const XalanNode&        node) const;
  -
        virtual bool
        isNodeAfter(
                        const XalanNode&        node1,
                        const XalanNode&        node2) const;
   
  -     virtual XalanElement*
  -     getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const;
  +     virtual const XalanDOMString&
  +     getNamespaceOfNode(const XalanNode&     theNode) const;
   
        virtual void
        setProcessNamespaces(bool       processNamespaces);
  
  
  
  1.6       +5 -1      xml-xalan/c/src/XSLT/ElemApplyImport.cpp
  
  Index: ElemApplyImport.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemApplyImport.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ElemApplyImport.cpp       2000/11/30 20:34:06     1.5
  +++ ElemApplyImport.cpp       2001/01/03 19:32:48     1.6
  @@ -70,6 +70,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "Constants.hpp"
   #include "StylesheetConstructionContext.hpp"
   #include "StylesheetExecutionContext.hpp"
  @@ -123,7 +127,7 @@
                                   0, 
                                   0, 
                      sourceTree, 
  -                   executionContext.getParentOfNode(*sourceNode), 
  +                                DOMServices::getParentOfNode(*sourceNode), 
                                   sourceNode, 
                      mode,
                                   getXSLToken());
  
  
  
  1.32      +8 -4      xml-xalan/c/src/XSLT/ElemNumber.cpp
  
  Index: ElemNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.cpp,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- ElemNumber.cpp    2000/12/21 04:45:27     1.31
  +++ ElemNumber.cpp    2001/01/03 19:32:48     1.32
  @@ -73,6 +73,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include <Include/XalanAutoPtr.hpp>
   
   
  @@ -256,7 +260,7 @@
                        }
                }
                
  -             contextCopy = executionContext.getParentOfNode(*contextCopy);
  +             contextCopy = DOMServices::getParentOfNode(*contextCopy);
        }
        return contextCopy;
   }                                    
  @@ -300,7 +304,7 @@
   
                if(prevSibling == 0)
                {
  -                     contextCopy = 
executionContext.getParentOfNode(*contextCopy);
  +                     contextCopy = 
DOMServices::getParentOfNode(*contextCopy);
                }
                else
                {
  @@ -619,7 +623,7 @@
                        if(stopAtFirstFound)
                                break;
                }
  -             node = executionContext.getParentOfNode(*node);
  +             node = DOMServices::getParentOfNode(*node);
        }
        return ancestors;
   } // end getMatchingAncestors method
  @@ -897,7 +901,7 @@
                                        }
                                        else
                                        {
  -                                             assert(digitsTable.size() > 
tables[k]);
  +                                             assert(digitsTable.size() > 
DigitsTableVectorType::size_type(tables[k]));
   
                                                // get the table
                                                const XalanDOMCharVectorType&   
THEletters =
  
  
  
  1.43      +2 -21     xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp
  
  Index: StylesheetExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- StylesheetExecutionContext.hpp    2000/12/21 04:48:31     1.42
  +++ StylesheetExecutionContext.hpp    2001/01/03 19:32:48     1.43
  @@ -1377,32 +1377,13 @@
        virtual bool
        isIgnorableWhitespace(const XalanText&  node) const = 0;
   
  -     virtual const XalanDOMString&
  -     getNamespaceOfNode(const XalanNode&             n) const = 0;
  -
  -     virtual const XalanDOMString&
  -     getNameOfNode(const XalanNode&  n) const = 0;
  -
  -     virtual const XalanDOMString&
  -     getLocalNameOfNode(const XalanNode&             n) const = 0;
  -
  -     virtual XalanNode*
  -     getParentOfNode(const XalanNode&        n) const = 0;
  -
        virtual bool
        isNodeAfter(
                        const XalanNode&        node1,
                        const XalanNode&        node2) const = 0;
   
  -     virtual void
  -     getNodeData(
  -                     const XalanNode&        n,
  -                     XalanDOMString&         s) const = 0;
  -
  -     virtual XalanElement*
  -     getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const = 0;
  +     virtual const XalanDOMString&
  +     getNamespaceOfNode(const XalanNode&     theNode) const = 0;
   
        virtual const NodeRefListBase&
        getContextNodeList() const = 0;
  
  
  
  1.47      +5 -49     
xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp
  
  Index: StylesheetExecutionContextDefault.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp,v
  retrieving revision 1.46
  retrieving revision 1.47
  diff -u -r1.46 -r1.47
  --- StylesheetExecutionContextDefault.cpp     2000/12/21 04:48:31     1.46
  +++ StylesheetExecutionContextDefault.cpp     2001/01/03 19:32:49     1.47
  @@ -1342,38 +1342,6 @@
   
   
   
  -const XalanDOMString&
  -StylesheetExecutionContextDefault::getNamespaceOfNode(const XalanNode&       
n) const
  -{
  -     return m_xpathExecutionContextDefault.getNamespaceOfNode(n);
  -}
  -
  -
  -
  -const XalanDOMString&
  -StylesheetExecutionContextDefault::getNameOfNode(const XalanNode&    n) const
  -{
  -     return m_xpathExecutionContextDefault.getNameOfNode(n);
  -}
  -
  -
  -
  -const XalanDOMString&
  -StylesheetExecutionContextDefault::getLocalNameOfNode(const XalanNode&       
n) const
  -{
  -     return m_xpathExecutionContextDefault.getLocalNameOfNode(n);
  -}
  -
  -
  -
  -XalanNode*
  -StylesheetExecutionContextDefault::getParentOfNode(const XalanNode&          
theNode) const
  -{
  -     return m_xpathExecutionContextDefault.getParentOfNode(theNode);
  -}
  -
  -
  -
   bool
   StylesheetExecutionContextDefault::isNodeAfter(
                        const XalanNode&        node1,
  @@ -1384,25 +1352,13 @@
   
   
   
  -void
  -StylesheetExecutionContextDefault::getNodeData(
  -                     const XalanNode&        n,
  -                     XalanDOMString&         s) const
  -{
  -     m_xpathExecutionContextDefault.getNodeData(n, s);
  -}
  -
  -
  -
  -XalanElement*
  -StylesheetExecutionContextDefault::getElementByID(
  -                     const XalanDOMString&           id,
  -                     const XalanDocument&            doc) const
  +const XalanDOMString&
  +StylesheetExecutionContextDefault::getNamespaceOfNode(const XalanNode&       
theNode) const
   {
  -     return m_xpathExecutionContextDefault.getElementByID(id, doc);
  +     return m_xpathExecutionContextDefault.getNamespaceOfNode(theNode);
   }
  -
  -
  +     
  +     
   
   const NodeRefListBase&
   StylesheetExecutionContextDefault::getContextNodeList() const
  
  
  
  1.43      +2 -21     
xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp
  
  Index: StylesheetExecutionContextDefault.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- StylesheetExecutionContextDefault.hpp     2000/12/21 04:48:31     1.42
  +++ StylesheetExecutionContextDefault.hpp     2001/01/03 19:32:49     1.43
  @@ -595,32 +595,13 @@
        virtual bool
        isIgnorableWhitespace(const XalanText&  node) const;
   
  -     virtual const XalanDOMString&
  -     getNamespaceOfNode(const XalanNode&             n) const;
  -
  -     virtual const XalanDOMString&
  -     getNameOfNode(const XalanNode&  n) const;
  -
  -     virtual const XalanDOMString&
  -     getLocalNameOfNode(const XalanNode&             n) const;
  -
  -     virtual XalanNode*
  -     getParentOfNode(const XalanNode&        n) const;
  -
        virtual bool
        isNodeAfter(
                        const XalanNode&        node1,
                        const XalanNode&        node2) const;
   
  -     virtual void
  -     getNodeData(
  -                     const XalanNode&        n,
  -                     XalanDOMString&         s) const;
  -
  -     virtual XalanElement*
  -     getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const;
  +     virtual const XalanDOMString&
  +     getNamespaceOfNode(const XalanNode&     theNode) const;
   
        virtual const NodeRefListBase&
        getContextNodeList() const;
  
  
  
  1.78      +13 -29    xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp
  
  Index: XSLTEngineImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp,v
  retrieving revision 1.77
  retrieving revision 1.78
  diff -u -r1.77 -r1.78
  --- XSLTEngineImpl.cpp        2000/12/30 17:56:57     1.77
  +++ XSLTEngineImpl.cpp        2001/01/03 19:32:49     1.78
  @@ -535,18 +535,14 @@
   XalanNode*
   XSLTEngineImpl::getSourceTreeFromInput(const XSLTInputSource&        
inputSource)
   {
  -     XalanNode*              sourceTree = 0;
  +     XalanNode*              sourceTree = inputSource.getNode();
   
  -     XalanDOMString  xmlIdentifier = 0 != inputSource.getSystemId() ?
  -                                                                             
        XalanDOMString(inputSource.getSystemId()) :
  -                                                                             
        StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("Input XML"));
  -
  -     if(0 != inputSource.getNode())
  -     {
  -             sourceTree = inputSource.getNode();
  -     }
  -     else
  +     if(0 == sourceTree)
        {
  +             const XalanDOMString    xmlIdentifier = 0 != 
inputSource.getSystemId() ?
  +                                                                             
                XalanDOMString(inputSource.getSystemId()) :
  +                                                                             
                StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("Input XML"));
  +
                // In case we have a fragment identifier, go ahead and 
                // try to parse the XML here.
                try
  @@ -878,7 +874,7 @@
        if(equals(ns, s_XSLNameSpaceURL))
        {
                const XalanDOMString&   localName =
  -                     m_xpathSupport.getLocalNameOfNode(node);
  +                     DOMServices::getLocalNameOfNode(node);
   
                const ElementKeysMapType::const_iterator                j =
                                                s_elementKeys.find(localName);
  @@ -891,7 +887,7 @@
        else if(equals(ns, s_XSLT4JNameSpaceURL))
        {
                const XalanDOMString&   localName =
  -                     m_xpathSupport.getLocalNameOfNode(node);
  +                     DOMServices::getLocalNameOfNode(node);
   
                const ElementKeysMapType::const_iterator                j =
                                                
s_XSLT4JElementKeys.find(localName);
  @@ -1988,7 +1984,7 @@
                                                                                
false);
                        }
   
  -                     
startElement(c_wstr(m_executionContext->getNameOfNode(node)));
  +                     startElement(c_wstr(DOMServices::getNameOfNode(node)));
                }
                break;
   
  @@ -2016,7 +2012,7 @@
                                static_cast<const XalanAttr&>(node);
   #endif
                        addResultAttribute(getPendingAttributesImpl(),
  -                                                        
m_executionContext->getNameOfNode(attr),
  +                                                        
DOMServices::getNameOfNode(attr),
                                                           attr.getValue());
                }
                break;
  @@ -2713,16 +2709,6 @@
   
   
    
  -XalanElement*
  -XSLTEngineImpl::getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const
  -{
  -     return m_xpathSupport.getElementByID(id, doc);
  -}
  -
  -
  -
   bool
   XSLTEngineImpl::shouldStripSourceNode(
                        XPathExecutionContext&  executionContext,
  @@ -2748,19 +2734,17 @@
   
                        if(!theTextNode.isIgnorableWhitespace())
                        {
  -                             const XalanDOMString&   data = 
theTextNode.getData();
  -
  -                             if(0 == length(data))
  +                             if(0 == length(theTextNode.getData()))
                                {
                                        return true;
                                }
  -                             else if(!isXMLWhitespace(data))
  +                             else
                                {
                                        return false;
                                }
                        }
   
  -                     XalanNode*      parent = 
m_xpathSupport.getParentOfNode(textNode);
  +                     XalanNode*      parent = 
DOMServices::getParentOfNode(textNode);
   
                        while(0 != parent)
                        {
  
  
  
  1.56      +0 -12     xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp
  
  Index: XSLTEngineImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp,v
  retrieving revision 1.55
  retrieving revision 1.56
  diff -u -r1.55 -r1.56
  --- XSLTEngineImpl.hpp        2000/12/21 04:48:31     1.55
  +++ XSLTEngineImpl.hpp        2001/01/03 19:32:50     1.56
  @@ -963,18 +963,6 @@
                        XPathExecutionContext&  executionContext);
   
        /**
  -      * Given a valid element id, return the corresponding element.
  -      *
  -      * @param id  string representing ID
  -      * @param doc document to search
  -      * @return element for ID
  -      */
  -     XalanElement*
  -     getElementByID(
  -                     const XalanDOMString&   id,
  -                     const XalanDocument&    doc) const;
  -
  -     /**
         * Copy an attribute to the created output element, executing attribute
         * templates as need be, and processing the 'xsl:use' attribute.
         *
  
  
  

Reply via email to