dbertoni    00/12/04 12:48:58

  Modified:    c/src/XMLSupport FormatterToText.cpp
               c/src/XPath Function.cpp Function.hpp FunctionBoolean.cpp
                        FunctionCeiling.cpp FunctionConcat.cpp
                        FunctionContains.cpp FunctionCount.cpp
                        FunctionFalse.cpp FunctionFloor.cpp FunctionID.cpp
                        FunctionLang.cpp FunctionLast.cpp
                        FunctionLocalName.cpp FunctionName.cpp
                        FunctionNamespaceURI.cpp FunctionNamespaceURI.hpp
                        FunctionNormalizeSpace.cpp FunctionNot.cpp
                        FunctionNumber.cpp FunctionPosition.cpp
                        FunctionRound.cpp FunctionStartsWith.cpp
                        FunctionString.cpp FunctionStringLength.cpp
                        FunctionSubstring.cpp FunctionSubstringAfter.cpp
                        FunctionSubstringBefore.cpp FunctionSum.cpp
                        FunctionTranslate.cpp FunctionTrue.cpp XNodeSet.cpp
                        XPath.cpp XPathExecutionContext.hpp
                        XPathExecutionContextDefault.cpp
                        XPathExecutionContextDefault.hpp
               c/src/XSLT ElemLiteralResult.cpp ElemParam.cpp
                        ElemVariable.cpp ElemVariable.hpp
                        FunctionDocument.cpp FunctionElementAvailable.cpp
                        FunctionFormatNumber.cpp
                        FunctionFunctionAvailable.cpp
                        FunctionGenerateID.cpp FunctionKey.cpp
                        FunctionSystemProperty.cpp
                        FunctionUnparsedEntityURI.cpp KeyTable.cpp
                        KeyTable.hpp Stylesheet.cpp
                        StylesheetExecutionContext.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp
                        VariablesStack.cpp VariablesStack.hpp
                        XSLTEngineImpl.cpp
  Log:
  Performance tweaks and fix for lazy evaluation of top-level variables and 
params.
  
  Revision  Changes    Path
  1.13      +1 -1      xml-xalan/c/src/XMLSupport/FormatterToText.cpp
  
  Index: FormatterToText.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterToText.cpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- FormatterToText.cpp       2000/11/20 16:18:52     1.12
  +++ FormatterToText.cpp       2000/12/04 20:48:12     1.13
  @@ -77,7 +77,7 @@
                        bool            normalizeLinefeed) :
        FormatterListener(OUTPUT_METHOD_TEXT),
        m_writer(writer),
  -     m_maxCharacter(~0),
  +     m_maxCharacter(XalanDOMChar(~0)),
        m_encoding(),
        m_haveEncoding(false),
        m_normalize(normalizeLinefeed)
  
  
  
  1.3       +4 -0      xml-xalan/c/src/XPath/Function.cpp
  
  Index: Function.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/Function.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Function.cpp      2000/11/21 21:07:49     1.2
  +++ Function.cpp      2000/12/04 20:48:12     1.3
  @@ -60,6 +60,10 @@
   
   
   
  +#include "XObjectFactory.hpp"
  +
  +
  +
   Function::Function()
   {
   }
  
  
  
  1.10      +3 -6      xml-xalan/c/src/XPath/Function.hpp
  
  Index: Function.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/Function.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Function.hpp      2000/11/21 21:07:50     1.9
  +++ Function.hpp      2000/12/04 20:48:13     1.10
  @@ -64,19 +64,16 @@
   
   
   
  -#include <XPath/XObject.hpp>
  -#include <XPath/XObjectFactory.hpp>
  -#include <XPath/XPathExecutionContext.hpp>
  +#include <vector>
   
   
   
  -#include <vector>
  +#include <XPath/XObject.hpp>
  +#include <XPath/XPathExecutionContext.hpp>
   
   
   
   class XalanNode;
  -class XObject;
  -class XPathExecutionContext;
   
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionBoolean.cpp
  
  Index: FunctionBoolean.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionBoolean.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionBoolean.cpp       2000/11/21 21:07:50     1.3
  +++ FunctionBoolean.cpp       2000/12/04 20:48:13     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionBoolean.hpp>
  +#include "FunctionBoolean.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +4 -0      xml-xalan/c/src/XPath/FunctionCeiling.cpp
  
  Index: FunctionCeiling.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionCeiling.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionCeiling.cpp       2000/11/21 21:07:52     1.3
  +++ FunctionCeiling.cpp       2000/12/04 20:48:13     1.4
  @@ -58,6 +58,10 @@
   
   
   
  +#include "XObjectFactory.hpp"
  +
  +
  +
   FunctionCeiling::FunctionCeiling()
   {
   }
  
  
  
  1.6       +5 -1      xml-xalan/c/src/XPath/FunctionConcat.cpp
  
  Index: FunctionConcat.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionConcat.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FunctionConcat.cpp        2000/11/21 21:07:53     1.5
  +++ FunctionConcat.cpp        2000/12/04 20:48:14     1.6
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionConcat.hpp>
  +#include "FunctionConcat.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionContains.cpp
  
  Index: FunctionContains.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionContains.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionContains.cpp      2000/11/21 21:07:54     1.3
  +++ FunctionContains.cpp      2000/12/04 20:48:15     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionContains.hpp>
  +#include "FunctionContains.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionCount.cpp
  
  Index: FunctionCount.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionCount.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionCount.cpp 2000/11/21 21:07:55     1.3
  +++ FunctionCount.cpp 2000/12/04 20:48:15     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionCount.hpp>
  +#include "FunctionCount.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionFalse.cpp
  
  Index: FunctionFalse.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionFalse.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionFalse.cpp 2000/11/21 21:07:57     1.3
  +++ FunctionFalse.cpp 2000/12/04 20:48:15     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionFalse.hpp>
  +#include "FunctionFalse.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionFloor.cpp
  
  Index: FunctionFloor.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionFloor.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionFloor.cpp 2000/11/21 21:07:58     1.3
  +++ FunctionFloor.cpp 2000/12/04 20:48:15     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionFloor.hpp>
  +#include "FunctionFloor.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionID.cpp    2000/11/21 21:07:58     1.3
  +++ FunctionID.cpp    2000/12/04 20:48:15     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionID.hpp>
  +#include "FunctionID.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionLang.cpp  2000/11/21 21:08:00     1.3
  +++ FunctionLang.cpp  2000/12/04 20:48:15     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionLang.hpp>
  +#include "FunctionLang.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionLast.cpp
  
  Index: FunctionLast.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionLast.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionLast.cpp  2000/11/21 21:08:00     1.3
  +++ FunctionLast.cpp  2000/12/04 20:48:15     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionLast.hpp>
  +#include "FunctionLast.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.6       +5 -1      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.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FunctionLocalName.cpp     2000/11/21 21:58:13     1.5
  +++ FunctionLocalName.cpp     2000/12/04 20:48:15     1.6
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionLocalName.hpp>
  +#include "FunctionLocalName.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionName.cpp  2000/11/21 21:08:02     1.3
  +++ FunctionName.cpp  2000/12/04 20:48:15     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionName.hpp>
  +#include "FunctionName.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.5       +25 -47    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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FunctionNamespaceURI.cpp  2000/11/21 21:08:03     1.4
  +++ FunctionNamespaceURI.cpp  2000/12/04 20:48:15     1.5
  @@ -54,10 +54,14 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionNamespaceURI.hpp>
  +#include "FunctionNamespaceURI.hpp"
   
   
   
  +#include "XObjectFactory.hpp"
  +
  +
  +
   FunctionNamespaceURI::FunctionNamespaceURI()
   {
   }
  @@ -72,72 +76,47 @@
   
   XObjectPtr
   FunctionNamespaceURI::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              /* 
context */,                  
  -             const XObjectPtr                                        arg1)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              /* context */,          
        
  +             const XObjectPtr                arg1)
   {
        assert(arg1.null() == false);   
        
  -     const XalanDOMString*   theNamespace = 0;
  +     const NodeRefListBase&  theList = arg1->nodeset();
   
  -     theNamespace = getNamespaceFromNodeSet(*arg1, executionContext);
  +     if (theList.getLength() == 0)
  +     {
  +             return 
executionContext.getXObjectFactory().createString(XalanDOMString());
  +     }
  +     else
  +     {
  +             assert(theList.item(0) != 0);
   
  -     return executionContext.getXObjectFactory().createString(theNamespace 
== 0 ? XalanDOMString() : *theNamespace);
  +             return 
executionContext.getXObjectFactory().createString(executionContext.getNamespaceOfNode(*theList.item(0)));
  +     }
   }
   
   
   
   XObjectPtr
   FunctionNamespaceURI::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              context)
  -{    
  -     const XalanDOMString*   theNamespace = 0;
  -
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              context)
  +{
        if (context == 0)
        {
                executionContext.error("The namespace-uri() function requires a 
non-null context node!");
  +
  +             // Dummy return value...
  +             return XObjectPtr(0);
        }
        else
        {
                // The XPath standard says that if there are no arguments,
                // the argument defaults to a node set with the context node
                // as the only member.
  -             // So we have to create an XObject with the context node as
  -             // the only member.
  -             // We shroud the temporary getNamespaceFromNodeSet( in a
  -             // FactoryObjectAutoPointer because it can be deleted once
  -             // we're done.
  -
  -             // An XObject that contains the context node.
  -             XObjectPtr      
theXObject(executionContext.createNodeSet(*context));
  -
  -
  -             theNamespace = getNamespaceFromNodeSet(*theXObject.get(), 
executionContext);
  +             return 
executionContext.getXObjectFactory().createString(executionContext.getNamespaceOfNode(*context));
        }
  -
  -     return executionContext.getXObjectFactory().createString(theNamespace 
== 0 ? XalanDOMString() : *theNamespace);
  -}
  -
  -
  -
  -const XalanDOMString*
  -FunctionNamespaceURI::getNamespaceFromNodeSet(
  -                                             const XObject&                  
theXObject,
  -                                             XPathExecutionContext&  
theContext)
  -{
  -     const NodeRefListBase&  theList = theXObject.nodeset();
  -
  -     if (theList.getLength() == 0)
  -     {
  -             return 0;
  -     }
  -     else
  -     {
  -             assert(theList.item(0) != 0);
  -
  -             return &theContext.getNamespaceOfNode(*theList.item(0));
  -     }
   }
   
   
  @@ -160,4 +139,3 @@
        return XALAN_STATIC_UCODE_STRING(
                "The namespace-uri() function takes zero arguments or one 
argument!");
   }
  -
  
  
  
  1.12      +0 -4      xml-xalan/c/src/XPath/FunctionNamespaceURI.hpp
  
  Index: FunctionNamespaceURI.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionNamespaceURI.hpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- FunctionNamespaceURI.hpp  2000/11/30 21:36:30     1.11
  +++ FunctionNamespaceURI.hpp  2000/12/04 20:48:15     1.12
  @@ -110,10 +110,6 @@
   
   private:
   
  -     static const XalanDOMString*
  -     getNamespaceFromNodeSet(const XObject&                  theXObject,
  -                                                     XPathExecutionContext&  
theContext);
  -
        const XalanDOMString
        getError() const;
   
  
  
  
  1.8       +26 -14    xml-xalan/c/src/XPath/FunctionNormalizeSpace.cpp
  
  Index: FunctionNormalizeSpace.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionNormalizeSpace.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- FunctionNormalizeSpace.cpp        2000/12/01 21:40:55     1.7
  +++ FunctionNormalizeSpace.cpp        2000/12/04 20:48:16     1.8
  @@ -59,6 +59,14 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
  +#include "XObjectFactory.hpp"
  +
  +
  +
   FunctionNormalizeSpace::FunctionNormalizeSpace()
   {
   }
  @@ -73,9 +81,9 @@
   
   XObjectPtr
   FunctionNormalizeSpace::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              /* 
context */,                  
  -             const XObjectPtr                                arg1)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              /* context */,          
        
  +             const XObjectPtr                arg1)
   {
        assert(arg1.null() == false);   
                
  @@ -86,24 +94,29 @@
   
   XObjectPtr
   FunctionNormalizeSpace::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              context)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              context)
   {
        if (context == 0)
        {
                executionContext.error("The normalize-space() function requires 
a non-null context node!",
                                                           context);
   
  -             return XObjectPtr();
  +             // Dummy return value...
  +             return XObjectPtr(0);
        }
        else
        {
  -             // The XPath standard says that if there
  -             // are no arguments, the default is to turn the contextNode
  -             // into a string-value, which really means using FunctionString,
  -             // but we don't need to do that, since our XObject classes
  -             // do the real work in turning themselves into strings.
  -             return normalize(executionContext, 
executionContext.createNodeSet(*context)->str());
  +             // The XPath standard says that if there are no arguments,
  +             // the default is to turn the context node into a string value.
  +             // DOMServices::getNodeData() will give us the data.
  +
  +             // Get a cached string...
  +             XPathExecutionContext::GetAndReleaseCachedString        
theData(executionContext);
  +
  +             DOMServices::getNodeData(*context, theData);
  +
  +             return normalize(executionContext, theData);
        }
   }
   
  @@ -218,8 +231,7 @@
   const XalanDOMString
   FunctionNormalizeSpace::getError() const
   {
  -     return XALAN_STATIC_UCODE_STRING(
  -             "The normalize-space() function takes zero arguments or one 
argument!");
  +     return XALAN_STATIC_UCODE_STRING("The normalize-space() function takes 
zero arguments or one argument!");
   }
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionNot.cpp
  
  Index: FunctionNot.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionNot.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionNot.cpp   2000/11/21 21:08:05     1.3
  +++ FunctionNot.cpp   2000/12/04 20:48:16     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionNot.hpp>
  +#include "FunctionNot.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +35 -24    xml-xalan/c/src/XPath/FunctionNumber.cpp
  
  Index: FunctionNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionNumber.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionNumber.cpp        2000/11/21 21:08:06     1.3
  +++ FunctionNumber.cpp        2000/12/04 20:48:16     1.4
  @@ -54,10 +54,18 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionNumber.hpp>
  +#include "FunctionNumber.hpp"
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
  +#include "XObjectFactory.hpp"
  +
  +
  +
   FunctionNumber::FunctionNumber()
   {
   }
  @@ -72,50 +80,53 @@
   
   XObjectPtr
   FunctionNumber::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              
context,                        
  -             const XObjectPtr                                arg1)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              /* context */,          
        
  +             const XObjectPtr                arg1)
   {
        assert(arg1.null() == false);   
  -     
  -     double  theValue = 0.0L;
   
  -     theValue = arg1->num();
  -
  -     return executionContext.getXObjectFactory().createNumber(theValue);
  +     if (arg1->getType() == XObject::eTypeNumber)
  +     {
  +             // Since XObjects are reference counted, just return the
  +             // argument.
  +             return arg1;
  +     }
  +     else
  +     {
  +             return 
executionContext.getXObjectFactory().createNumber(arg1->num());
  +     }
   }
   
   
   
   XObjectPtr
   FunctionNumber::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              context)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              context)
   {
  -     double  theValue = 0.0L;
  -
        if (context == 0)
        {
                executionContext.error("The number() function requires a 
non-null context node!");
  +
  +             // Dummy return value...
  +             return XObjectPtr(0);
        }
        else
        {
                // The XPath standard says that if there are no arguments,
                // the argument defaults to a node set with the context node
  -             // as the only member.
  -             // So we have to create an XNodeList with the context node as
  -             // the only member and call the num() function on it.  We shroud
  -             // the temporary XNodeList in an XObjectPtr because it can be
  -             // deleted once we've converted the context node to a number.
  +             // as the only member.  The number value of a node set is the
  +             // string value of the first node in the node set, converted to
  +             // a number.  DOMServices::getNodeData() will give us the data.
   
  -             // An XObject that contains the context node.
  -             XObjectPtr      
theXObject(executionContext.createNodeSet(*context));
  +             // Get a cached string...
  +             XPathExecutionContext::GetAndReleaseCachedString        
theData(executionContext);
   
  -             // Get the numeric value of the theXObject...
  -             theValue = theXObject->num();
  -     }
  +             DOMServices::getNodeData(*context, theData);
   
  -     return executionContext.getXObjectFactory().createNumber(theValue);
  +             return 
executionContext.getXObjectFactory().createNumber(DOMStringToDouble(theData));
  +     }
   }
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionPosition.cpp
  
  Index: FunctionPosition.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionPosition.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionPosition.cpp      2000/11/21 21:08:07     1.3
  +++ FunctionPosition.cpp      2000/12/04 20:48:16     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionPosition.hpp>
  +#include "FunctionPosition.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionRound.cpp
  
  Index: FunctionRound.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionRound.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionRound.cpp 2000/11/21 21:08:08     1.3
  +++ FunctionRound.cpp 2000/12/04 20:48:16     1.4
  @@ -54,11 +54,15 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionRound.hpp>
  +#include "FunctionRound.hpp"
   
   
   
   #include <PlatformSupport/DoubleSupport.hpp>
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionStartsWith.cpp
  
  Index: FunctionStartsWith.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionStartsWith.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionStartsWith.cpp    2000/11/21 21:08:10     1.3
  +++ FunctionStartsWith.cpp    2000/12/04 20:48:16     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionStartsWith.hpp>
  +#include "FunctionStartsWith.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.6       +27 -13    xml-xalan/c/src/XPath/FunctionString.cpp
  
  Index: FunctionString.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionString.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FunctionString.cpp        2000/11/21 22:02:11     1.5
  +++ FunctionString.cpp        2000/12/04 20:48:16     1.6
  @@ -54,10 +54,18 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionString.hpp>
  +#include "FunctionString.hpp"
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
  +#include "XObjectFactory.hpp"
  +
  +
  +
   FunctionString::FunctionString()
   {
   }
  @@ -72,9 +80,9 @@
   
   XObjectPtr
   FunctionString::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              /* 
context */,                  
  -             const XObjectPtr                                        arg1)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              /* context */,
  +             const XObjectPtr                arg1)
   {
        assert(arg1.null() == false);   
        
  @@ -85,23 +93,30 @@
   
   XObjectPtr
   FunctionString::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              context)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              context)
   {
        if (context == 0)
        {
                executionContext.error("The string() function requires a 
non-null context node!");
   
  -             return XObjectPtr();
  +             // Dummy return value...
  +             return XObjectPtr(0);
        }
        else
        {
                // The XPath standard says that if there are no arguments,
                // the argument defaults to a node set with the context node
  -             // as the only member.
  -             // So we have to create an XNodeList with the context node as
  -             // the only member and call the str() function on it.  
  -             return 
executionContext.getXObjectFactory().createString(executionContext.createNodeSet(*context)->str());
  +             // as the only member.  The string value of a node set is the
  +             // string value of the first node in the node set.
  +             // DOMServices::getNodeData() will give us the data.
  +
  +             // Get a cached string...
  +             XPathExecutionContext::GetAndReleaseCachedString        
theData(executionContext);
  +
  +             DOMServices::getNodeData(*context, theData);
  +
  +             return 
executionContext.getXObjectFactory().createString(theData);
        }
   }
   
  @@ -122,7 +137,6 @@
   const XalanDOMString
   FunctionString::getError() const
   {
  -     return XALAN_STATIC_UCODE_STRING(
  -             "The string() function takes zero or one argument!");
  +     return XALAN_STATIC_UCODE_STRING("The string() function takes zero or 
one argument!");
   }
   
  
  
  
  1.4       +29 -28    xml-xalan/c/src/XPath/FunctionStringLength.cpp
  
  Index: FunctionStringLength.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionStringLength.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionStringLength.cpp  2000/11/21 21:08:15     1.3
  +++ FunctionStringLength.cpp  2000/12/04 20:48:16     1.4
  @@ -54,10 +54,18 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionStringLength.hpp>
  +#include "FunctionStringLength.hpp"
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
  +#include "XObjectFactory.hpp"
  +
  +
  +
   FunctionStringLength::FunctionStringLength()
   {
   }
  @@ -72,49 +80,44 @@
   
   XObjectPtr
   FunctionStringLength::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              /* 
context */,                  
  -             const XObjectPtr                                arg1)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              /* context */,          
        
  +             const XObjectPtr                arg1)
   {
        assert(arg1.null() == false);   
   
  -     unsigned int    theLength = length(arg1->str());        
  -     
  -     return executionContext.getXObjectFactory().createNumber(theLength);
  +     return 
executionContext.getXObjectFactory().createNumber(length(arg1->str()));
   }
   
   
   
   XObjectPtr
   FunctionStringLength::execute(
  -             XPathExecutionContext&                  executionContext,
  -             XalanNode*                                              context)
  +             XPathExecutionContext&  executionContext,
  +             XalanNode*                              context)
   {
  -     unsigned int    theLength = 0;  
  -
        if (context == 0)
        {
                executionContext.error("The string-length() function requires a 
non-null context node!");
  +
  +             // Dummy return value...
  +             return XObjectPtr(0);
        }
        else
        {
  -             XalanDOMString  theValue;
  -
                // The XPath standard says that if there are no arguments,
                // the argument defaults to a node set with the context node
  -             // as the only member.
  -             // So we have to create an XNodeList with the context node as
  -             // the only member and call the str() function on it.  
  -
  -             // An XObject that contains the context node.
  -             XObjectPtr      
theXObject(executionContext.createNodeSet(*context));
  -
  -             // Get the value of the theXObject...
  -             theValue = theXObject->str();
  -             theLength = length(theValue);
  -     }
  +             // as the only member.  The string value of a node set is the
  +             // string value of the first node in the node set.
  +             // DOMServices::getNodeData() will give us the data.
  +
  +             // Get a cached string...
  +             XPathExecutionContext::GetAndReleaseCachedString        
theData(executionContext);
   
  -     return executionContext.getXObjectFactory().createNumber(theLength);
  +             DOMServices::getNodeData(*context, theData);
  +
  +             return 
executionContext.getXObjectFactory().createNumber(length(theData));
  +     }
   }
   
   
  @@ -134,7 +137,5 @@
   const XalanDOMString
   FunctionStringLength::getError() const
   {
  -     return XALAN_STATIC_UCODE_STRING(
  -             "The string-length() function takes zero or one argument!");
  +     return XALAN_STATIC_UCODE_STRING("The string-length() function takes 
zero or one argument!");
   }
  -
  
  
  
  1.7       +5 -1      xml-xalan/c/src/XPath/FunctionSubstring.cpp
  
  Index: FunctionSubstring.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionSubstring.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FunctionSubstring.cpp     2000/11/27 21:43:34     1.6
  +++ FunctionSubstring.cpp     2000/12/04 20:48:17     1.7
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionSubstring.hpp>
  +#include "FunctionSubstring.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.7       +5 -1      xml-xalan/c/src/XPath/FunctionSubstringAfter.cpp
  
  Index: FunctionSubstringAfter.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionSubstringAfter.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FunctionSubstringAfter.cpp        2000/11/27 21:43:36     1.6
  +++ FunctionSubstringAfter.cpp        2000/12/04 20:48:17     1.7
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionSubstringAfter.hpp>
  +#include "FunctionSubstringAfter.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.7       +5 -1      xml-xalan/c/src/XPath/FunctionSubstringBefore.cpp
  
  Index: FunctionSubstringBefore.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionSubstringBefore.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FunctionSubstringBefore.cpp       2000/11/27 21:43:37     1.6
  +++ FunctionSubstringBefore.cpp       2000/12/04 20:48:17     1.7
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionSubstringBefore.hpp>
  +#include "FunctionSubstringBefore.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionSum.cpp   2000/11/21 21:08:18     1.3
  +++ FunctionSum.cpp   2000/12/04 20:48:17     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionSum.hpp>
  +#include "FunctionSum.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.7       +5 -1      xml-xalan/c/src/XPath/FunctionTranslate.cpp
  
  Index: FunctionTranslate.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionTranslate.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FunctionTranslate.cpp     2000/12/01 22:20:47     1.6
  +++ FunctionTranslate.cpp     2000/12/04 20:48:17     1.7
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionTranslate.hpp>
  +#include "FunctionTranslate.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.4       +5 -1      xml-xalan/c/src/XPath/FunctionTrue.cpp
  
  Index: FunctionTrue.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionTrue.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FunctionTrue.cpp  2000/11/21 21:08:20     1.3
  +++ FunctionTrue.cpp  2000/12/04 20:48:17     1.4
  @@ -54,7 +54,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
  -#include <XPath/FunctionTrue.hpp>
  +#include "FunctionTrue.hpp"
  +
  +
  +
  +#include "XObjectFactory.hpp"
   
   
   
  
  
  
  1.19      +2 -16     xml-xalan/c/src/XPath/XNodeSet.cpp
  
  Index: XNodeSet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XNodeSet.cpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- XNodeSet.cpp      2000/11/02 01:46:00     1.18
  +++ XNodeSet.cpp      2000/12/04 20:48:17     1.19
  @@ -164,25 +164,11 @@
                const XalanNode* const  theNode = m_value->item(0);
                assert(theNode != 0);
   
  -             const XalanNode::NodeType       theType = 
theNode->getNodeType();
  -
  -             if (theType == XalanNode::COMMENT_NODE ||
  -                     theType == XalanNode::PROCESSING_INSTRUCTION_NODE)
  -             {
   #if defined(XALAN_NO_MUTABLE)
  -                     ((XNodeSet*)this)->m_cachedStringValue = 
theNode->getNodeValue();
  +             DOMServices::getNodeData(*theNode, 
((XNodeSet*)this)->m_cachedStringValue);
   #else
  -                     m_cachedStringValue = theNode->getNodeValue();
  +             DOMServices::getNodeData(*theNode, m_cachedStringValue);
   #endif
  -             }
  -             else
  -             {
  -#if defined(XALAN_NO_MUTABLE)
  -                     DOMServices::getNodeData(*theNode, 
((XNodeSet*)this)->m_cachedStringValue);
  -#else
  -                     DOMServices::getNodeData(*theNode, m_cachedStringValue);
  -#endif
  -             }
        }
   
        return m_cachedStringValue;
  
  
  
  1.37      +1 -9      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.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- XPath.cpp 2000/11/27 21:43:43     1.36
  +++ XPath.cpp 2000/12/04 20:48:17     1.37
  @@ -1095,7 +1095,7 @@
   
   const XObjectPtr
   XPath::variable(
  -                     XalanNode*                              context,
  +                     XalanNode*                              /* context */,
                        int                                             opPos,
                        XPathExecutionContext&  executionContext) const
   {
  @@ -1120,14 +1120,6 @@
                executionContext.error(TranscodeFromLocalCodePage("Could not 
get variable named ") + varName.str());
   
                throw;
  -     }
  -
  -     if(result.null() == true)
  -     {
  -             
executionContext.warn(TranscodeFromLocalCodePage("VariableReference given for 
variable out ") +
  -                                                             
TranscodeFromLocalCodePage("of context or without definition!  Name = ") +
  -                                                         varName.str(),
  -                                                       context);
        }
   
        return result;
  
  
  
  1.29      +17 -1     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.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- XPathExecutionContext.hpp 2000/11/21 21:08:35     1.28
  +++ XPathExecutionContext.hpp 2000/12/04 20:48:18     1.29
  @@ -507,11 +507,27 @@
                XalanDOMString&
                get() const
                {
  +                     assert(m_string != 0);
  +
  +                     return *m_string;
  +             }
  +
  +             operator XalanDOMString& () const
  +             {
  +                     assert(m_string != 0);
  +
                        return *m_string;
                }
   
        private:
   
  +             // Not implemented...
  +             GetAndReleaseCachedString&
  +             operator=(const GetAndReleaseCachedString&);
  +
  +             GetAndReleaseCachedString(const GetAndReleaseCachedString&);
  +
  +
                XPathExecutionContext&  m_executionContext;
   
                XalanDOMString* const   m_string;
  @@ -560,7 +576,7 @@
         * @return pointer to an XObject if the variable was found, 0 if it was 
not
         */
        virtual const XObjectPtr
  -     getVariable(const QName&        name) const = 0;
  +     getVariable(const QName&        name) = 0;
   
        /**
         * Retrieve the resolver for namespaces.
  
  
  
  1.27      +1 -1      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.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- XPathExecutionContextDefault.cpp  2000/11/30 19:40:58     1.26
  +++ XPathExecutionContextDefault.cpp  2000/12/04 20:48:18     1.27
  @@ -448,7 +448,7 @@
   
   
   const XObjectPtr
  -XPathExecutionContextDefault::getVariable(const QName&       name) const
  +XPathExecutionContextDefault::getVariable(const QName&       name)
   {
        return m_xobjectFactory.createUnknown(name.getLocalPart());
   }
  
  
  
  1.27      +1 -2      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.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- XPathExecutionContextDefault.hpp  2000/11/30 19:40:59     1.26
  +++ XPathExecutionContextDefault.hpp  2000/12/04 20:48:18     1.27
  @@ -239,8 +239,7 @@
                        MutableNodeRefList&             nodelist);
   
        virtual const XObjectPtr
  -     getVariable(
  -                     const QName&    name) const;
  +     getVariable(const QName&        name);
   
        virtual const PrefixResolver*
        getPrefixResolver() const;
  
  
  
  1.25      +14 -5     xml-xalan/c/src/XSLT/ElemLiteralResult.cpp
  
  Index: ElemLiteralResult.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemLiteralResult.cpp,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- ElemLiteralResult.cpp     2000/11/27 21:44:22     1.24
  +++ ElemLiteralResult.cpp     2000/12/04 20:48:30     1.25
  @@ -218,7 +218,7 @@
                        XalanNode*                                              
sourceNode,
                        const QName&                                    mode) 
const
   {
  -     executionContext.startElement(toCharArray(getElementName()));
  +     executionContext.startElement(c_wstr(getElementName()));
   
        ElemUse::execute(executionContext, sourceTree, sourceNode, mode);
   
  @@ -226,12 +226,16 @@
        {
                const AVTVectorType::size_type  nAttrs = m_avts.size();
   
  +             StylesheetExecutionContext::GetAndReleaseCachedString   
theGuard1(executionContext);
  +             StylesheetExecutionContext::GetAndReleaseCachedString   
theGuard2(executionContext);
  +
  +             XalanDOMString&         thePrefix = theGuard1.get();
  +             XalanDOMString&         theStringedValue = theGuard2.get();
  +
                for(AVTVectorType::size_type i = 0; i < nAttrs; i++)
                {
                        const AVT* const        avt = m_avts[i];
   
  -                     XalanDOMString          thePrefix;
  -
                        const XalanDOMString&   theName = avt->getName();
   
                        if (startsWith(theName, 
DOMServices::s_XMLNamespaceWithSeparator) == true)
  @@ -239,8 +243,10 @@
                                thePrefix = substring(theName, 
DOMServices::s_XMLNamespaceWithSeparatorLength);
                        }
   
  -                     XalanDOMString  theStringedValue;
  +                     StylesheetExecutionContext::GetAndReleaseCachedString   
theGuard2(executionContext);
   
  +                     XalanDOMString&         theStringedValue = 
theGuard2.get();
  +
                        avt->evaluate(theStringedValue, sourceNode, *this, 
executionContext);
   
                        if (isEmpty(thePrefix) == true ||
  @@ -254,6 +260,9 @@
                                                c_wstr(avt->getType()),
                                                length(theStringedValue) == 0 ? 
&theDummy : c_wstr(theStringedValue));
                        }
  +
  +                     clear(thePrefix);
  +                     clear(theStringedValue);
                }
        }
   
  @@ -261,7 +270,7 @@
   
        executeChildren(executionContext, sourceTree, sourceNode, mode);
   
  -     executionContext.endElement(toCharArray(getElementName()));
  +     executionContext.endElement(c_wstr(getElementName()));
   }
   
   
  
  
  
  1.8       +1 -1      xml-xalan/c/src/XSLT/ElemParam.cpp
  
  Index: ElemParam.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemParam.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ElemParam.cpp     2000/11/21 21:09:58     1.7
  +++ ElemParam.cpp     2000/12/04 20:48:33     1.8
  @@ -98,7 +98,7 @@
   {
        const XObjectPtr        obj = 
executionContext.getParamVariable(m_qname);
   
  -     if(obj.null() == true)
  +     if (obj.null() == true)
        {
                ElemVariable::execute(executionContext, sourceTree, sourceNode, 
mode);
        }
  
  
  
  1.11      +33 -15    xml-xalan/c/src/XSLT/ElemVariable.cpp
  
  Index: ElemVariable.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemVariable.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ElemVariable.cpp  2000/11/27 21:44:35     1.10
  +++ ElemVariable.cpp  2000/12/04 20:48:33     1.11
  @@ -155,14 +155,39 @@
   {
        ElemTemplateElement::execute(executionContext, sourceTree, sourceNode, 
mode);
   
  -     if(0 != m_selectPattern)
  +     const XObjectPtr        theValue(getValue(executionContext, sourceTree, 
sourceNode));
  +
  +     if (theValue.null() == false)
  +     {
  +             executionContext.pushVariable(
  +                             m_qname,
  +                             theValue,
  +                             getParentNodeElem());
  +     }
  +     else
        {
                executionContext.pushVariable(
                                m_qname,
  -                         getParentNodeElem(),
  -                             *m_selectPattern,
  -                             sourceNode,
  -                             *this);
  +                             this,
  +                             getParentNodeElem());
  +     }
  +}
  +
  +
  +
  +const XObjectPtr
  +ElemVariable::getValue(
  +                     StylesheetExecutionContext&             
executionContext,
  +                     XalanNode*                                              
sourceTree,
  +                     XalanNode*                                              
sourceNode) const
  +{
  +     if(m_selectPattern == 0)
  +     {
  +             return executionContext.createXResultTreeFrag(*this, 
sourceTree, sourceNode);
  +     }
  +     else
  +     {
  +             const XObjectPtr        
theValue(m_selectPattern->execute(sourceNode, *this, executionContext));
   
                if(0 != executionContext.getTraceListeners())
                {
  @@ -173,16 +198,9 @@
                                        *this,
                                        
StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("select")),
                                        *m_selectPattern,
  -                                     executionContext.getVariable(m_qname)));
  +                                     theValue));
                }
  -     }
  -     else
  -     {
  -             executionContext.pushVariable(
  -                             m_qname,
  -                         getParentNodeElem(),
  -                             *this,
  -                             sourceTree,
  -                             sourceNode);
  +
  +             return theValue;
        }
   }
  
  
  
  1.10      +7 -1      xml-xalan/c/src/XSLT/ElemVariable.hpp
  
  Index: ElemVariable.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemVariable.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ElemVariable.hpp  2000/11/27 21:44:37     1.9
  +++ ElemVariable.hpp  2000/12/04 20:48:33     1.10
  @@ -58,7 +58,7 @@
   #define XALAN_ELEMVARIABLE_HEADER_GUARD 
   
   /**
  - * $Id: ElemVariable.hpp,v 1.9 2000/11/27 21:44:37 dbertoni Exp $
  + * $Id: ElemVariable.hpp,v 1.10 2000/12/04 20:48:33 dbertoni Exp $
    * 
    * $State: Exp $
    * 
  @@ -150,6 +150,12 @@
                        XalanNode*                                              
sourceTree,
                        XalanNode*                                              
sourceNode,
                        const QName&                                    mode) 
const;
  +
  +     const XObjectPtr
  +     getValue(
  +                     StylesheetExecutionContext&             
executionContext,
  +                     XalanNode*                                              
sourceTree,
  +                     XalanNode*                                              
sourceNode) const;
   
   protected:
   
  
  
  
  1.21      +1 -0      xml-xalan/c/src/XSLT/FunctionDocument.cpp
  
  Index: FunctionDocument.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionDocument.cpp,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- FunctionDocument.cpp      2000/11/21 22:42:39     1.20
  +++ FunctionDocument.cpp      2000/12/04 20:48:33     1.21
  @@ -71,6 +71,7 @@
   
   
   
  +#include <XPath/XObjectFactory.hpp>
   #include <XPath/PrefixResolver.hpp>
   
   
  
  
  
  1.10      +13 -2     xml-xalan/c/src/XSLT/FunctionElementAvailable.cpp
  
  Index: FunctionElementAvailable.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionElementAvailable.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- FunctionElementAvailable.cpp      2000/11/27 21:44:46     1.9
  +++ FunctionElementAvailable.cpp      2000/12/04 20:48:33     1.10
  @@ -62,6 +62,10 @@
   
   
   
  +#include <XPath/XObjectFactory.hpp>
  +
  +
  +
   FunctionElementAvailable::FunctionElementAvailable()
   {
   }
  @@ -97,9 +101,16 @@
        }
        else
        {
  -             const XalanDOMString    elementName = indexOfNSSep == 
nameLength ? fullName : substring(fullName, indexOfNSSep + 1);
  +             if (indexOfNSSep == nameLength)
  +             {
  +                     return 
executionContext.getXObjectFactory().createBoolean(executionContext.elementAvailable(theNamespace,
 fullName));
  +             }
  +             else
  +             {
  +                     const XalanDOMString    elementName =  
substring(fullName, indexOfNSSep + 1);
   
  -             return 
executionContext.getXObjectFactory().createBoolean(executionContext.elementAvailable(theNamespace,
 elementName));
  +                     return 
executionContext.getXObjectFactory().createBoolean(executionContext.elementAvailable(theNamespace,
 elementName));
  +             }
        }
   }
   
  
  
  
  1.9       +4 -0      xml-xalan/c/src/XSLT/FunctionFormatNumber.cpp
  
  Index: FunctionFormatNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionFormatNumber.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FunctionFormatNumber.cpp  2000/11/21 21:10:08     1.8
  +++ FunctionFormatNumber.cpp  2000/12/04 20:48:33     1.9
  @@ -65,6 +65,10 @@
   
   
   
  +#include <XPath/XObjectFactory.hpp>
  +
  +
  +
   #include "Constants.hpp"
   
   
  
  
  
  1.9       +5 -1      xml-xalan/c/src/XSLT/FunctionFunctionAvailable.cpp
  
  Index: FunctionFunctionAvailable.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionFunctionAvailable.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FunctionFunctionAvailable.cpp     2000/11/21 21:10:09     1.8
  +++ FunctionFunctionAvailable.cpp     2000/12/04 20:48:34     1.9
  @@ -62,6 +62,10 @@
   
   
   
  +#include <XPath/XObjectFactory.hpp>
  +
  +
  +
   FunctionFunctionAvailable::FunctionFunctionAvailable()
   {
   }
  @@ -89,7 +93,7 @@
   
        const XalanDOMString    prefix = indexOfNSSep < nameLength ? 
substring(fullName, 0, indexOfNSSep) : XalanDOMString();
   
  -     const XalanDOMString    theNamespace = 
executionContext.getNamespaceForPrefix(prefix);
  +     const XalanDOMString&   theNamespace = 
executionContext.getNamespaceForPrefix(prefix);
   
        const XalanDOMString    functionName = indexOfNSSep == nameLength ? 
fullName : substring(fullName, indexOfNSSep + 1);
   
  
  
  
  1.10      +6 -2      xml-xalan/c/src/XSLT/FunctionGenerateID.cpp
  
  Index: FunctionGenerateID.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionGenerateID.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- FunctionGenerateID.cpp    2000/11/21 22:42:40     1.9
  +++ FunctionGenerateID.cpp    2000/12/04 20:48:34     1.10
  @@ -67,6 +67,7 @@
   
   
   #include <XPath/NodeRefListBase.hpp>
  +#include <XPath/XObjectFactory.hpp>
   
   
   
  @@ -89,6 +90,7 @@
   
   
   
  +// Append the suffix to the provided string.
   void
   getSuffix(
                const XalanNode*        theNode,
  @@ -153,13 +155,15 @@
   
                XalanDOMString&         theID = theGuard.get();
   
  +#if defined(XALAN_USE_XERCES_DOMSTRING)
                getSuffix(context, theID);
                assert(length(theID) != 0);
   
  -#if defined(XALAN_USE_XERCES_DOMSTRING)
                return 
executionContext.getXObjectFactory().createString(m_prefix + theID);
   #else
  -             insert(theID, 0, m_prefix);
  +             theID = m_prefix;
  +
  +             getSuffix(context, theID);
   
                return executionContext.getXObjectFactory().createString(theID);
   #endif
  
  
  
  1.18      +8 -3      xml-xalan/c/src/XSLT/FunctionKey.cpp
  
  Index: FunctionKey.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionKey.cpp,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- FunctionKey.cpp   2000/11/21 22:42:40     1.17
  +++ FunctionKey.cpp   2000/12/04 20:48:34     1.18
  @@ -78,6 +78,7 @@
   
   #include <XPath/MutableNodeRefList.hpp>
   #include <XPath/NodeRefListBase.hpp>
  +#include <XPath/XObjectFactory.hpp>
   
   
   
  @@ -135,7 +136,7 @@
   
                assert(executionContext.getPrefixResolver() != 0);
   
  -             const XalanDOMString    keyname = arg1->str();
  +             const XalanDOMString&   keyname = arg1->str();
   
                assert(arg2.null() == false);
   
  @@ -163,11 +164,13 @@
   
                                StringSetType   usedrefs;
   
  +                             XalanDOMString  ref;
  +
                                for(unsigned int i = 0; i < nRefs; i++)
                                {
                                        assert(theNodeSet.item(i) != 0);
   
  -                                     const XalanDOMString            ref = 
DOMServices::getNodeData(*theNodeSet.item(i));
  +                                     
DOMServices::getNodeData(*theNodeSet.item(i), ref);
   
                                        if(0 != length(ref))
                                        {
  @@ -184,12 +187,14 @@
                                                                                
        *theNodeRefList.get());
                                                }
                                        }
  +
  +                                     clear(ref);
                                }
                        }
                }
                else
                {
  -                     const XalanDOMString                    ref = 
arg2->str();
  +                     const XalanDOMString&   ref = arg2->str();
   
                                        
executionContext.getNodeSetByKey(docContext,
                                                                                
        keyname,
  
  
  
  1.15      +1 -0      xml-xalan/c/src/XSLT/FunctionSystemProperty.cpp
  
  Index: FunctionSystemProperty.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionSystemProperty.cpp,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- FunctionSystemProperty.cpp        2000/11/21 21:10:14     1.14
  +++ FunctionSystemProperty.cpp        2000/12/04 20:48:34     1.15
  @@ -69,6 +69,7 @@
   
   #include <XPath/MutableNodeRefList.hpp>
   #include <XPath/NodeRefListBase.hpp>
  +#include <XPath/XObjectFactory.hpp>
   
   
   
  
  
  
  1.11      +4 -0      xml-xalan/c/src/XSLT/FunctionUnparsedEntityURI.cpp
  
  Index: FunctionUnparsedEntityURI.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionUnparsedEntityURI.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- FunctionUnparsedEntityURI.cpp     2000/11/21 22:42:40     1.10
  +++ FunctionUnparsedEntityURI.cpp     2000/12/04 20:48:34     1.11
  @@ -63,6 +63,10 @@
   
   
   
  +#include <XPath/XObjectFactory.hpp>
  +
  +
  +
   FunctionUnparsedEntityURI::FunctionUnparsedEntityURI()
   {
   }
  
  
  
  1.14      +92 -87    xml-xalan/c/src/XSLT/KeyTable.cpp
  
  Index: KeyTable.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/KeyTable.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- KeyTable.cpp      2000/11/21 21:10:16     1.13
  +++ KeyTable.cpp      2000/12/04 20:48:35     1.14
  @@ -138,101 +138,39 @@
                        {
                                const KeyDeclaration&   kd = keyDeclarations[i];
   
  -//                           if (equals(kd.getName(), name))
  +                             if (executionContext.getInConstruction(kd) == 
true)                     
                                {
  -                                     if 
(executionContext.getInConstruction(kd) == true)                     
  -                                     {
  -                                             throw XSLTProcessorException(
  +                                     throw XSLTProcessorException(
                                                        
TranscodeFromLocalCodePage("The use of the key() function in the \"match\" or 
\"use\" attribute of xsl:key is illegal!"),
                                                        
TranscodeFromLocalCodePage("XSLTKeyIllegalKeyFunctionException"));
  -                                     }
  -                                     else
  -                                     {
  -                                             
executionContext.beginConstruction(kd);
  +                             }
  +                             else
  +                             {
  +                                     executionContext.beginConstruction(kd);
   
  -                                             // See if our node matches the 
given key declaration according to 
  -                                             // the match attribute on 
xsl:key.
  -                                             assert(kd.getMatchPattern() != 
0);
  +                                     // See if our node matches the given 
key declaration according to 
  +                                     // the match attribute on xsl:key.
  +                                     assert(kd.getMatchPattern() != 0);
   
  -                                             const double    score =
  +                                     const double    score =
                                                        
kd.getMatchPattern()->getMatchScore(testNode,
                                                                                
                                                resolver,
                                                                                
                                                executionContext);
   
  -                                             if(score == 
XPath::s_MatchScoreNone)
  -                                             {
  -                                                     
executionContext.endConstruction(kd);
  -                                             }
  -                                             else
  -                                             {
  -                                                     // Query from the node, 
according the the select pattern in the
  -                                                     // use attribute in 
xsl:key.
  -                                                     assert(kd.getUse() != 
0);
  -
  -                                                     const XObjectPtr        
xuse =
  -                                                             
kd.getUse()->execute(testNode, resolver, NodeRefList(), executionContext);
  -
  -                                                     const NodeRefListBase*  
nl = 0;
  -                                                     unsigned int nUseValues;
  -                                                     XalanDOMString          
exprResult;
  -                                                     if(xuse->getType() != 
xuse->eTypeNodeSet)
  -                                                     {
  -                                                             nUseValues = 1;
  -                                                             exprResult = 
xuse->str();
  -                                                     }
  -                                                     else
  -                                                     {
  -                                                             nl = 
&xuse->nodeset();
  -                                                             // Use each 
node in the node list as a key value that we'll be 
  -                                                             // able to use 
to look up the given node.
  -                                                             nUseValues = 
nl->getLength();
  -                                                     }  
  -                                                     // Use each node in the 
node list as a key value that we'll be 
  -                                                     // able to use to look 
up the given node.
  -                                                     for(unsigned int k = 0; 
k < nUseValues; k++)
  -                                                     {
  -                                                             // Use getExpr 
to get the string value of the given node. I hope 
  -                                                             // the string 
assumption is the right thing... I can't see how 
  -                                                             // it could 
work any other way.
  -                                                             if(0 != nl)
  -                                                             {
  -                                                                     
XalanNode* const        useNode = nl->item(k);
  -                                                                     
assert(useNode != 0);
  -
  -                                                                     
exprResult = DOMServices::getNodeData(*useNode);
  -                                                             }
  -
  -                                                             
MutableNodeRefList&             keyNodes =
  -                                                                             
m_keys[kd.getName()][exprResult];
  -
  -                                                             // See if the 
matched node is already in the 
  -                                                             // table set.  
If it is there, we're done, otherwise 
  -                                                             // add it.
  -                                                             bool foundit = 
false;
  -
  -                                                             const unsigned 
int      nKeyNodes = keyNodes.getLength(); //size();
  -
  -                                                             for(unsigned 
int j = 0; j < nKeyNodes; j++)
  -                                                             {
  -                                                                     
if(testNode == keyNodes.item(j))
  -                                                                     {
  -                                                                             
foundit = true;
  -                                                                             
break;
  -                                                                     }
  -                                                             } // end for j
  -
  -                                                             if(foundit == 
false)
  -                                                             {
  -                                                                     
keyNodes.addNode(testNode);
  -                                                             }
  -                                                     } // end for(int k = 0; 
k < nUseValues; k++)
  -
  -                                                     
executionContext.endConstruction(kd);
  -                                             } // if(score != 
kd.getMatchPattern().s_MatchScoreNone)
  -                                     } // if (kd.getInConstruction() == true)
  -                             } // if (equals(kd.getName(), name)
  -                     } // end for(int i = 0; i < nDeclarations; i++)
  +                                     if(score != XPath::s_MatchScoreNone)
  +                                     {
  +                                             processKeyDeclaration(
  +                                                     m_keys,
  +                                                     kd,
  +                                                     testNode,
  +                                                     resolver,
  +                                                     executionContext);
  +                                     }
   
  +                                     executionContext.endConstruction(kd);
  +                             } // if (kd.getInConstruction() == true)
  +                     } // end for(int i = 0; i < nDeclarations; ++i)
  +
                        nodeIndex++;
   
                        if(0 != attrs)
  @@ -270,7 +208,7 @@
   
                pos = nextNode;
       } // while(0 != pos)
  -} // end buildKeysTable method
  +} // end constructor
   
   
   
  @@ -289,7 +227,7 @@
   
        if (i != m_keys.end())
        {
  -             const NodeListMapType&                                  theMap 
= (*i).second;
  +             const NodeListMapType&  theMap = (*i).second;
   
                const NodeListMapType::const_iterator   j = theMap.find(ref);
   
  @@ -303,4 +241,71 @@
        // a list of nodes.  So this is just an empty one
        // to return when the ref is not found.
        return s_dummyList;
  +}
  +
  +
  +
  +void
  +KeyTable::addIfNotFound(
  +                     MutableNodeRefList&             theNodeList,
  +                     XalanNode*                              theNode)
  +{
  +     if (theNodeList.indexOf(theNode) == MutableNodeRefList::npos)
  +     {
  +             theNodeList.addNode(theNode);
  +     }
  +}
  +
  +
  +
  +void
  +KeyTable::processKeyDeclaration(
  +                     KeysMapType&                                    theKeys,
  +                     const KeyDeclaration&                   kd,
  +                     XalanNode*                                              
testNode,
  +                     const PrefixResolver&                   resolver,
  +                     StylesheetExecutionContext&             
executionContext)
  +{
  +     // Query from the node, according the the select pattern in the
  +     // use attribute in xsl:key.
  +     assert(kd.getUse() != 0);
  +
  +     const XObjectPtr        xuse =
  +                     kd.getUse()->execute(testNode, resolver, NodeRefList(), 
executionContext);
  +
  +     if(xuse->getType() != xuse->eTypeNodeSet)
  +     {
  +             addIfNotFound(
  +                     theKeys[kd.getName()][xuse->str()],
  +                     testNode);
  +     }
  +     else
  +     {
  +             const NodeRefListBase&  nl = xuse->nodeset();
  +
  +             // Use each node in the node list as a key value that we'll be 
  +             // able to use to look up the given node.
  +             const unsigned int      nUseValues = nl.getLength();
  +
  +             StylesheetExecutionContext::GetAndReleaseCachedString   
theGuard(executionContext);
  +
  +             XalanDOMString&         nodeData = theGuard.get();
  +
  +             // Use each node in the node list as a key value that we'll be 
  +             // able to use to look up the given node.
  +             for(unsigned int i = 0; i < nUseValues; ++i)
  +             {
  +                     // Get the string value of the node to use as the 
result of the
  +                     // expression.
  +                     assert(nl.item(i) != 0);
  +
  +                     DOMServices::getNodeData(*nl.item(i), nodeData);
  +
  +                     addIfNotFound(
  +                             theKeys[kd.getName()][nodeData],
  +                             testNode);
  +
  +                     clear(nodeData);
  +             }
  +     }  
   }
  
  
  
  1.10      +20 -1     xml-xalan/c/src/XSLT/KeyTable.hpp
  
  Index: KeyTable.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/KeyTable.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- KeyTable.hpp      2000/09/19 15:12:01     1.9
  +++ KeyTable.hpp      2000/12/04 20:48:35     1.10
  @@ -58,7 +58,7 @@
   #define XALAN_KEYTABLE_HEADER_GUARD 
   
   /**
  - * $Id: KeyTable.hpp,v 1.9 2000/09/19 15:12:01 dbertoni Exp $
  + * $Id: KeyTable.hpp,v 1.10 2000/12/04 20:48:35 dbertoni Exp $
    * 
    * $State: Exp $
    * 
  @@ -177,6 +177,25 @@
        }
   
   private:
  +
  +     /**
  +      * Helper function to add a node to the list if not found.
  +      * 
  +      * @param theNodeList the node list.
  +      * @param theNode the node to add.
  +      */
  +     static void
  +     addIfNotFound(
  +                     MutableNodeRefList&             theNodeList,
  +                     XalanNode*                              theNode);
  +
  +     static void
  +     processKeyDeclaration(
  +                     KeysMapType&                                    theKeys,
  +                     const KeyDeclaration&                   kd,
  +                     XalanNode*                                              
testNode,
  +                     const PrefixResolver&                   resolver,
  +                     StylesheetExecutionContext&             
executionContext);
   
        /**
         * The document key.  This table should only be used with contexts
  
  
  
  1.45      +33 -22    xml-xalan/c/src/XSLT/Stylesheet.cpp
  
  Index: Stylesheet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.cpp,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- Stylesheet.cpp    2000/12/01 21:02:54     1.44
  +++ Stylesheet.cpp    2000/12/04 20:48:35     1.45
  @@ -1063,10 +1063,36 @@
                        StylesheetExecutionContext&     executionContext,
                        const ParamVectorType&                  topLevelParams) 
const
   {
  -     ParamVectorType::size_type                      i = 0;
  +#if 1
  +     {
  +             // First, push any imports...
  +             const StylesheetVectorType::const_reverse_iterator      rend = 
m_imports.rend();
  +
  +             for(StylesheetVectorType::const_reverse_iterator i = 
m_imports.rbegin(); i != rend; ++i)
  +             {
  +                     const Stylesheet* const stylesheet = *i;
  +                     assert(stylesheet != 0);
  +
  +                     stylesheet->pushTopLevelVariables(executionContext, 
topLevelParams);
  +             }
  +     }
  +#else
  +     {
  +             // First, push any imports...
  +             const StylesheetVectorType::const_reverse_iterator      
nImports = m_imports.size();
  +
  +             for(StylesheetVectorType::size_type i = 0; i < nImports; ++i)
  +             {
  +                     const Stylesheet* const stylesheet = m_imports[i];
  +
  +                     stylesheet->pushTopLevelVariables(executionContext, 
topLevelParams);
  +             }
  +     }
  +#endif
  +
        const ParamVectorType::size_type        nVars = 
m_topLevelVariables.size();
   
  -     for(; i < nVars; i++)
  +     for(ParamVectorType::size_type i = 0; i < nVars; ++i)
        {
                ElemVariable* const     var = m_topLevelVariables[i];
   
  @@ -1087,12 +1113,10 @@
                                {
                                        isParam = true;
   
  -                                     const XObjectPtr        theXObject = 
arg.getXObject();
  -
  -                                     if (theXObject.null() == false)
  +                                     if (arg.getXObject().null() == false)
                                        {
                                                
executionContext.pushVariable(arg.getName(),
  -                                                                             
                          theXObject,
  +                                                                             
                          arg.getXObject(),
                                                                                
                          0);
                                        }
                                        else
  @@ -1111,25 +1135,12 @@
   
                if (isParam == false)
                {
  -                     XalanNode* const        doc = 
executionContext.getRootDocument();
  -                     assert(doc != 0);
  -
  -                     var->execute(executionContext,
  -                                              doc,
  -                                              doc,
  -                                              QNameByReference());
  +                     executionContext.pushVariable(var->getName(),
  +                                                                             
  var,
  +                                                                             
  var->getParentNodeElem());
                }
        }
   
  -     // Now, push any imports...
  -     const ParamVectorType::size_type        nImports = m_imports.size();
  -
  -     for(i = 0; i < nImports; i++)
  -     {
  -             const Stylesheet* const stylesheet = m_imports[i];
  -
  -             stylesheet->pushTopLevelVariables(executionContext, 
topLevelParams);
  -     }
   }
   
   
  
  
  
  1.39      +20 -4     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.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- StylesheetExecutionContext.hpp    2000/11/30 20:34:12     1.38
  +++ StylesheetExecutionContext.hpp    2000/12/04 20:48:35     1.39
  @@ -119,6 +119,7 @@
   
   
   class ElemTemplateElement;
  +class ElemVariable;
   class FormatterListener;
   class FormatterToDOM;
   class FormatterToHTML;
  @@ -592,16 +593,31 @@
                        XalanNode*                                      
sourceNode) = 0;
   
        /**
  +      * Push a named variable onto the variables stack.
  +      * The variable has already been evaluated.
  +      *
  +      * @param name    name of variable
  +      * @param val     pointer to XObject value
  +      * @param element element marker for variable
  +      */
  +     virtual void
  +     pushVariable(
  +                     const QName&                            name,
  +                     const XObjectPtr                        val,
  +                     const ElemTemplateElement*      element) = 0;
  +
  +     /**
         * Push a named variable onto the processor variable stack
  +      * The variable will be evaluated when first referenced.
         *
         * @param name    name of variable
  -      * @param var     pointer to XObject value
  +      * @param var     pointer to ElemVariable instance
         * @param element element marker for variable
         */
        virtual void
        pushVariable(
                        const QName&                            name,
  -                     const XObjectPtr                        var,
  +                     const ElemVariable*                     var,
                        const ElemTemplateElement*      element) = 0;
   
        /**
  @@ -655,7 +671,7 @@
         * @return pointer to XObject for variable
         */
        virtual const XObjectPtr
  -     getParamVariable(const QName&   theName) const = 0;
  +     getParamVariable(const QName&   theName) = 0;
   
        /**
         * Push a frame marker for an element.
  @@ -1438,7 +1454,7 @@
                        MutableNodeRefList&             nodelist) = 0;
   
        virtual const XObjectPtr
  -     getVariable(const QName&        name) const = 0;
  +     getVariable(const QName&        name) = 0;
   
        virtual const PrefixResolver*
        getPrefixResolver() const = 0;
  
  
  
  1.43      +31 -5     
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.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- StylesheetExecutionContextDefault.cpp     2000/11/27 21:44:52     1.42
  +++ StylesheetExecutionContextDefault.cpp     2000/12/04 20:48:35     1.43
  @@ -500,9 +500,20 @@
   void
   StylesheetExecutionContextDefault::pushVariable(
                        const QName&                            name,
  -                     const XObjectPtr                        var,
  +                     const XObjectPtr                        val,
                        const ElemTemplateElement*      element)
   {
  +     m_variablesStack.pushVariable(name, val, element);
  +}
  +
  +
  +
  +void
  +StylesheetExecutionContextDefault::pushVariable(
  +                     const QName&                            name,
  +                     const ElemVariable*                     var,
  +                     const ElemTemplateElement*      element)
  +{
        m_variablesStack.pushVariable(name, var, element);
   }
   
  @@ -673,9 +684,13 @@
   
   
   const XObjectPtr
  -StylesheetExecutionContextDefault::getParamVariable(const QName&     
theName) const
  +StylesheetExecutionContextDefault::getParamVariable(const QName&     theName)
   {
  -     return m_variablesStack.getParamVariable(theName);
  +     bool                            fFound;
  +
  +     const XObjectPtr        
theValue(m_variablesStack.getParamVariable(theName, *this, fFound));
  +
  +     return theValue;
   }
   
   
  @@ -1545,9 +1560,20 @@
   
   
   const XObjectPtr
  -StylesheetExecutionContextDefault::getVariable(const QName&          name) 
const
  +StylesheetExecutionContextDefault::getVariable(const QName&          name)
   {
  -     return m_variablesStack.getVariable(name);
  +     bool                            fFound;
  +
  +     const XObjectPtr        theValue(m_variablesStack.getVariable(name, 
*this, fFound));
  +
  +     if(fFound == false)
  +     {
  +             warn(
  +                     TranscodeFromLocalCodePage("Variable reference given 
for variable out of context or without definition!  Name = ") +
  +                     name.getLocalPart());
  +     }
  +
  +     return theValue;
   }
   
   
  
  
  
  1.40      +11 -5     
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.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- StylesheetExecutionContextDefault.hpp     2000/11/27 21:44:55     1.39
  +++ StylesheetExecutionContextDefault.hpp     2000/12/04 20:48:35     1.40
  @@ -62,7 +62,6 @@
   
   
   // Base class include file.
  -#include "Stylesheet.hpp"
   #include "StylesheetExecutionContext.hpp"
   
   
  @@ -79,10 +78,11 @@
   
   
   
  +#include <XSLT/Stylesheet.hpp>
   #include <XSLT/VariablesStack.hpp>
   
   
  -class Stylesheet;
  +
   class XPathProcessor;
   class XPathSupport;
   class XObjectFactory;
  @@ -264,8 +264,14 @@
   
        virtual void
        pushVariable(
  +                     const QName&                            name,
  +                     const XObjectPtr                        val,
  +                     const ElemTemplateElement*      element);
  +
  +     virtual void
  +     pushVariable(
                        const QName&                            name,
  -                     const XObjectPtr                        var,
  +                     const ElemVariable*                     var,
                        const ElemTemplateElement*      element);
   
        virtual void
  @@ -305,7 +311,7 @@
                        const ElemTemplateElement*      targetTemplate);
   
        virtual const XObjectPtr
  -     getParamVariable(const QName&   theName) const;
  +     getParamVariable(const QName&   theName);
   
        virtual void
        pushElementFrame(const ElemTemplateElement*             elem);
  @@ -678,7 +684,7 @@
                        MutableNodeRefList&             nodelist);
   
        virtual const XObjectPtr
  -     getVariable(const QName&        name) const;
  +     getVariable(const QName&        name);
   
        virtual const PrefixResolver*
        getPrefixResolver() const;
  
  
  
  1.9       +142 -64   xml-xalan/c/src/XSLT/VariablesStack.cpp
  
  Index: VariablesStack.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/VariablesStack.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- VariablesStack.cpp        2000/11/27 21:45:01     1.8
  +++ VariablesStack.cpp        2000/12/04 20:48:35     1.9
  @@ -66,11 +66,17 @@
   
   
   
  +#include "ElemVariable.hpp"
  +#include "StylesheetExecutionContext.hpp"
  +
  +
  +
   VariablesStack::VariablesStack() :
        m_stack(),
        m_globalStackFrameIndex(-1),
        m_globalStackFrameMarked(false),
  -     m_currentStackFrameIndex(0)
  +     m_currentStackFrameIndex(0),
  +     m_forceGlobalOnlySearch(false)
   {
        m_stack.reserve(eDefaultStackSize);
   }
  @@ -156,33 +162,6 @@
   
   
   
  -class PopPushStackEntry
  -{
  -public:
  -
  -     PopPushStackEntry(VariablesStack&       theVariablesStack) :
  -             m_variablesStack(theVariablesStack),
  -             m_stackEntry(theVariablesStack.back())
  -     {
  -             assert(m_stackEntry.getType() == 
VariablesStack::StackEntry::eContextMarker);
  -
  -             theVariablesStack.pop();
  -     }
  -
  -     ~PopPushStackEntry()
  -     {
  -             m_variablesStack.push(m_stackEntry);
  -     }
  -
  -private:
  -
  -     VariablesStack&                                         
m_variablesStack;
  -
  -     const VariablesStack::StackEntry        m_stackEntry;
  -};
  -
  -
  -
   class CommitPushElementFrame
   {
   public:
  @@ -212,9 +191,9 @@
   
   private:
   
  -     VariablesStack*                                                         
m_variableStack;
  +     VariablesStack*                                         m_variableStack;
   
  -     const ElemTemplateElement* const                        
m_targetTemplate;
  +     const ElemTemplateElement* const        m_targetTemplate;
   };
   
   
  @@ -261,9 +240,18 @@
   const void
   VariablesStack::PushParamFunctor::operator()(const 
VariablesStack::ParamsVectorType::value_type&     theEntry)
   {
  -     assert(theEntry.first != 0);
  +     assert(theEntry.m_qname != 0);
   
  -     m_variablesStack.push(VariablesStack::StackEntry(theEntry.first, 
theEntry.second));
  +     if (theEntry.m_value.null() == false)
  +     {
  +             
m_variablesStack.push(VariablesStack::StackEntry(theEntry.m_qname, 
theEntry.m_value));
  +     }
  +     else
  +     {
  +             assert(theEntry.m_variable != 0);
  +
  +             
m_variablesStack.push(VariablesStack::StackEntry(theEntry.m_qname, 
theEntry.m_variable));
  +     }
   }
   
   
  @@ -297,6 +285,22 @@
   void
   VariablesStack::pushVariable(
                        const QName&                            name,
  +                     const ElemVariable*                     var,
  +                     const ElemTemplateElement*      e)
  +{
  +     if(elementFrameAlreadyPushed(e) == false)
  +     {
  +             pushElementFrame(e);
  +     }
  +
  +     push(StackEntry(&name, var));
  +}
  +
  +
  +
  +void
  +VariablesStack::pushVariable(
  +                     const QName&                            name,
                        const XObjectPtr                        val,
                        const ElemTemplateElement*      e)
   {
  @@ -329,60 +333,113 @@
   
   
   
  +class SetAndRestoreForceGlobalSearch
  +{
  +public:
  +
  +     SetAndRestoreForceGlobalSearch(VariablesStack&  variablesStack) :
  +                     m_variablesStack(variablesStack),
  +                     
m_savedForceSearch(variablesStack.m_forceGlobalOnlySearch)
  +             {
  +                     variablesStack.m_forceGlobalOnlySearch = true;
  +             }
  +
  +     ~SetAndRestoreForceGlobalSearch()
  +             {
  +                     m_variablesStack.m_forceGlobalOnlySearch = 
m_savedForceSearch;
  +             }
  +
  +private:
  +
  +     VariablesStack&         m_variablesStack;
  +
  +     const bool                      m_savedForceSearch;
  +};
  +
  +
  +
   const XObjectPtr
   VariablesStack::findXObject(
  -                     const QName&    name,
  -                     bool                    fSearchGlobalSpace) const
  +                     const QName&                                    name,
  +                     StylesheetExecutionContext&             
executionContext,
  +                     bool                                                    
fSearchGlobalSpace,
  +                     bool&                                                   
fNameFound)
   {
  -     const StackEntry* const         theVariable =
  -             findVariable(name, fSearchGlobalSpace);
  +     StackEntry* const       theEntry =
  +             findEntry(name, fSearchGlobalSpace);
   
  -     if (theVariable == 0)
  +     if (theEntry == 0)
        {
  +             fNameFound = false;
  +
                return XObjectPtr();
        }
        else
        {
  -             assert(theVariable->getType() == StackEntry::eVariable);
  +             fNameFound = true;
  +
  +             assert(theEntry->getType() == StackEntry::eVariable);
  +
  +             XObjectPtr      theValue(theEntry->getValue());
  +
  +             if (theValue.null() == true)
  +             {
  +                     const ElemVariable* const       var = 
theEntry->getVariable();
  +
  +                     if (var != 0)
  +                     {
  +                             XalanNode* const        doc = 
executionContext.getRootDocument();
  +                             assert(doc != 0);
  +
  +                             SetAndRestoreForceGlobalSearch  theGuard(*this);
  +
  +                             theValue = var->getValue(executionContext, doc, 
doc);
  +                             assert(theValue.null() == false);
   
  -             return theVariable->getVariable();
  +                             theEntry->setValue(theValue);
  +                     }
  +             }
  +
  +             return theValue;
        }
   }
   
   
   
  -const VariablesStack::StackEntry*
  -VariablesStack::findVariable(
  +VariablesStack::StackEntry*
  +VariablesStack::findEntry(
                        const QName&    qname,
  -                     bool                    fSearchGlobalSpace) const
  +                     bool                    fSearchGlobalSpace)
   {
  -     const StackEntry*       theResult = 0;
  +     StackEntry*             theResult = 0;
   
  -     const unsigned int      nElems = getCurrentStackFrameIndex();
  -
  -     // There is guaranteed to be a context marker at
  -     // the bottom of the stack, so i should stop at
  -     // 1.
  -     for(unsigned int i = nElems - 1; i > 0; --i)
  +     if (m_forceGlobalOnlySearch == false)
        {
  -             const StackEntry&       theEntry =
  -                     m_stack[i];
  +             const unsigned int      nElems = getCurrentStackFrameIndex();
   
  -             if(theEntry.getType() == StackEntry::eVariable)
  +             // There is guaranteed to be a context marker at
  +             // the bottom of the stack, so i should stop at
  +             // 1.
  +             for(unsigned int i = nElems - 1; i > 0; --i)
                {
  -                     assert(theEntry.getName() != 0);
  +                     StackEntry&             theEntry = m_stack[i];
   
  -                     if(theEntry.getName()->equals(qname))
  +                     if(theEntry.getType() == StackEntry::eVariable)
                        {
  -                             theResult = &theEntry;
  +                             assert(theEntry.getName() != 0);
  +
  +                             if(theEntry.getName()->equals(qname))
  +                             {
  +                                     theResult = &theEntry;
   
  +                                     break;
  +                             }
  +                     }
  +                     else if(theEntry.getType() == 
StackEntry::eContextMarker)
  +                     {
                                break;
                        }
                }
  -             else if(theEntry.getType() == StackEntry::eContextMarker)
  -             {
  -                     break;
  -             }
        }
   
        if(0 == theResult && true == fSearchGlobalSpace && 
m_globalStackFrameIndex > 1)
  @@ -390,7 +447,7 @@
                // Look in the global space
                for(unsigned int i = m_globalStackFrameIndex - 1; i > 0; i--)
                {
  -                     const StackEntry&       theEntry = m_stack[i];
  +                     StackEntry&             theEntry = m_stack[i];
   
                        if(theEntry.getType() == StackEntry::eVariable)
                        {
  @@ -494,6 +551,20 @@
        m_type(eVariable),
        m_qname(name),
        m_value(val),
  +     m_variable(0),
  +     m_element(0)
  +{
  +}
  +
  +
  +
  +VariablesStack::StackEntry::StackEntry(
  +                     const QName*                    name,
  +                     const ElemVariable*             var) :
  +     m_type(eVariable),
  +     m_qname(name),
  +     m_value(),
  +     m_variable(var),
        m_element(0)
   {
   }
  @@ -504,6 +575,7 @@
        m_type(eElementFrameMarker),
        m_qname(0),
        m_value(),
  +     m_variable(0),
        m_element(elem)
   {
   }
  @@ -514,6 +586,7 @@
        m_type(theSource.m_type),
        m_qname(0),
        m_value(),
  +     m_variable(0),
        m_element(0)
   {
        // Use operator=() to do the work...
  @@ -539,15 +612,19 @@
   
                m_value = theRHS.m_value;
   
  +             m_variable = theRHS.m_variable;
  +
                m_element = 0;
        }
        else if (m_type == eElementFrameMarker)
        {
  -             m_element = theRHS.m_element;
  -
                m_qname = 0;
   
                m_value = XObjectPtr();
  +
  +             m_variable = 0;
  +
  +             m_element = theRHS.m_element;
        }
   
        return *this;
  @@ -573,8 +650,9 @@
                }
                else if (m_type == eVariable)
                {
  -                     // We only need to compare the variable pointer..
  -                     if (m_value == theRHS.m_value)
  +                     // We only need to compare the variable related 
members...
  +                     if (m_value == theRHS.m_value ||
  +                             m_variable == theRHS.m_variable)
                        {
                                fResult = true;
                        }
  
  
  
  1.7       +119 -23   xml-xalan/c/src/XSLT/VariablesStack.hpp
  
  Index: VariablesStack.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/VariablesStack.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- VariablesStack.hpp        2000/11/27 21:45:03     1.6
  +++ VariablesStack.hpp        2000/12/04 20:48:35     1.7
  @@ -80,6 +80,7 @@
   
   class Arg;
   class ElemTemplateElement;
  +class ElemVariable;
   class StylesheetExecutionContext;
   class XalanNode;
   
  @@ -139,10 +140,44 @@
        void
        popContextMarker();
   
  +     struct ParamsVectorEntry
  +     {
  +             ParamsVectorEntry() :
  +                     m_qname(0),
  +                     m_value(),
  +                     m_variable(0)
  +             {
  +             }
  +
  +             ParamsVectorEntry(
  +                             const QName*            qname,
  +                             const XObjectPtr        value) :
  +                     m_qname(qname),
  +                     m_value(value),
  +                     m_variable(0)
  +             {
  +             }
  +
  +             ParamsVectorEntry(
  +                             const QName*                    qname,
  +                             const ElemVariable*             variable) :
  +                     m_qname(qname),
  +                     m_value(),
  +                     m_variable(variable)
  +             {
  +             }
  +
  +             const QName*                    m_qname;
  +
  +             XObjectPtr                              m_value;
  +
  +             const ElemVariable*             m_variable;
  +     };
  +
   #if defined(XALAN_NO_NAMESPACES)
  -     typedef vector<pair<const QName*,  XObjectPtr> >                        
        ParamsVectorType;
  +     typedef vector<ParamsVectorEntry>               ParamsVectorType;
   #else
  -     typedef std::vector<std::pair<const QName*,  XObjectPtr> >      
ParamsVectorType;
  +     typedef std::vector<ParamsVectorEntry>  ParamsVectorType;
   #endif
   
        /**
  @@ -159,33 +194,60 @@
   
        /**
         * Given a name, return a string representing the value, but don't look
  -      * in the global space.
  +      * in the global space.  Since the variable may not yet have been
  +      * evaluated, this may return a null XObjectPtr.
         *
         * @param theName name of variable
  +      * @param exeuctionContext the current execution context
  +      * @param fNameFound set to true if the name was found, false if not.
         * @return pointer to XObject for variable
         */
        const XObjectPtr
  -     getParamVariable(const QName& qname) const
  +     getParamVariable(
  +                     const QName&                                    qname,
  +                     StylesheetExecutionContext&             
executionContext,
  +                     bool&                                                   
fNameFound)
        {
  -             return findXObject(qname, false);
  +             return findXObject(qname, executionContext, false, fNameFound);
        }
   
        /**
  -      * Given a name, find the corresponding XObject.
  +      * Given a name, find the corresponding XObject.  Since the variable may
  +      * not yet have been evaluated, this may return a null XObjectPtr.
         *
         * @param qname name of variable
  +      * @param exeuctionContext the current execution context
  +      * @param fNameFound set to true if the name was found, false if not.
         * @return pointer to the corresponding XObject
         */
        const XObjectPtr
  -     getVariable(const QName&        name) const
  +     getVariable(
  +                     const QName&                                    qname,
  +                     StylesheetExecutionContext&             
executionContext,
  +                     bool&                                                   
fNameFound)
        {
  -             return findXObject(name, true);
  +             return findXObject(qname, executionContext, true, fNameFound);
        }
   
        /**
         * Push a named variable onto the processor variable stack. Don't forget
  +      * to call startContext before pushing a series of arguments for a given
  +      * template.
  +      *
  +      * @param name    name of variable
  +      * @param val     pointer to ElemVariable
  +      * @param e       element marker for variable
  +      */
  +     void
  +     pushVariable(
  +                     const QName&                            name,
  +                     const ElemVariable*                     var,
  +                     const ElemTemplateElement*      e);
  +
  +     /**
  +      * Push a named variable onto the processor variable stack. Don't forget
         * to call startContext before pushing a series of arguments for a given
  -      * macro call.
  +      * template.
         *
         * @param name    name of variable
         * @param val     pointer to XObject value
  @@ -264,7 +326,7 @@
   
        private:
   
  -             VariablesStack&                                         
m_variablesStack;
  +             VariablesStack&         m_variablesStack;
        };
   
   private:
  @@ -310,9 +372,8 @@
   
        friend class CommitPushElementFrame;
        friend class EnsurePop;
  -     friend class PopPushStackEntry;
  -     friend class PushFunctor;
        friend class PushParamFunctor;
  +     friend class SetAndRestoreForceGlobalSearch;
   
        class StackEntry
        {
  @@ -334,13 +395,20 @@
                StackEntry();
   
                /**
  -              * Construct a variable.
  +              * Construct a variable that is already evaluated.
                 */
                StackEntry(
                        const QName*            name,
                        const XObjectPtr        val);
   
                /**
  +              * Construct a variable that has not been evaluated yet.
  +              */
  +             StackEntry(
  +                     const QName*                    name,
  +                     const ElemVariable*             var);
  +
  +             /**
                 * Construct an element frame marker.
                 */
                StackEntry(const ElemTemplateElement*   elem);
  @@ -384,12 +452,34 @@
                 * @return pointer to XObject
                 */
                const XObjectPtr
  -             getVariable() const
  +             getValue() const
                {
                        return m_value;
                }
   
                /**
  +              * Retrieve object's XObject pointer.  Valid only for variables
  +              * 
  +              * @return pointer to XObject
  +              */
  +             void
  +             setValue(const XObjectPtr&      theValue)
  +             {
  +                     m_value = theValue;
  +             }
  +
  +             /**
  +              * Retrieve object's XObject pointer.  Valid only for variables
  +              * 
  +              * @return pointer to XObject
  +              */
  +             const ElemVariable*
  +             getVariable() const
  +             {
  +                     return m_variable;
  +             }
  +
  +             /**
                 * Retrieve the ElemTemplateElem where frame begins.  Valid 
only for element frame markers
                 *
                 * @return ElemTemplateElement corresponding to marker
  @@ -415,6 +505,8 @@
   
                XObjectPtr                                      m_value;
   
  +             const ElemVariable*                     m_variable;
  +
                const ElemTemplateElement*      m_element;
        };
   
  @@ -429,27 +521,31 @@
   
        const XObjectPtr
        findXObject(
  -                     const QName&    name,
  -                     bool                    fSearchGlobalSpace) const;
  +                     const QName&                                    name,
  +                     StylesheetExecutionContext&             
executionContext,
  +                     bool                                                    
fSearchGlobalSpace,
  +                     bool&                                                   
fNameFound);
   
  -     const StackEntry*
  -     findVariable(
  +     StackEntry*
  +     findEntry(
                        const QName&    name,
  -                     bool                    fSearchGlobalSpace) const;
  +                     bool                    fSearchGlobalSpace);
  +
   
  +     VariableStackStackType  m_stack;
   
  -     VariableStackStackType                  m_stack;
  +     int                                             m_globalStackFrameIndex;
   
  -     int                                                             
m_globalStackFrameIndex;
  +     bool                                    m_globalStackFrameMarked;
   
  -     bool                                                    
m_globalStackFrameMarked;
  +     bool                                    m_forceGlobalOnlySearch;
   
        /**
         * This is the top of the stack frame from where a search 
         * for a variable or param should take place.  It may not 
         * be the real stack top.
         */
  -     unsigned int                                    
m_currentStackFrameIndex;       
  +     unsigned int                    m_currentStackFrameIndex;       
   };
   
   
  
  
  
  1.74      +3 -5      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.73
  retrieving revision 1.74
  diff -u -r1.73 -r1.74
  --- XSLTEngineImpl.cpp        2000/12/01 21:03:40     1.73
  +++ XSLTEngineImpl.cpp        2000/12/04 20:48:36     1.74
  @@ -2095,9 +2095,9 @@
                                                                  pfrag.get(),
                                                                  0);
   
  -     setMustFlushPendingStartDocument(true);
  +//   setMustFlushPendingStartDocument(true);
   
  -     flushPending();
  +//   flushPending();
   
        StylesheetExecutionContext::OutputContextPushPop        
theOutputContextPushPop(
                        executionContext,
  @@ -2571,9 +2571,7 @@
                                                                                
        const XObjectPtr        xobj =
                                                                                
                evalXPathStr(expression, contextNode, namespaceContext, 
executionContext);
   
  -                                                                             
        const XalanDOMString                    exprResult(xobj->str());
  -
  -                                                                             
        append(buffer, exprResult);
  +                                                                             
        append(buffer, xobj->str());
   
                                                                                
        clear(lookahead); // breaks out of inner while loop
                                                                                
break;
  
  
  

Reply via email to