dbertoni    2002/11/02 19:41:07

  Modified:    c/src/XSLT AVT.cpp ElemApplyImport.cpp
                        ElemApplyTemplates.cpp ElemApplyTemplates.hpp
                        ElemAttributeSet.cpp ElemAttributeSet.hpp
                        ElemCallTemplate.cpp ElemCallTemplate.hpp
                        ElemDecimalFormat.cpp ElemDecimalFormat.hpp
                        ElemExtensionCall.cpp ElemForEach.cpp
                        ElemNumber.cpp ElemNumber.hpp ElemPI.cpp
                        ElemParam.cpp ElemParam.hpp ElemTemplate.cpp
                        ElemTemplate.hpp ElemTemplateElement.cpp
                        ElemTemplateElement.hpp ElemUse.hpp
                        ElemVariable.cpp ElemVariable.hpp ElemWithParam.cpp
                        ElemWithParam.hpp Stylesheet.cpp Stylesheet.hpp
                        StylesheetConstructionContext.hpp
                        StylesheetConstructionContextDefault.cpp
                        StylesheetConstructionContextDefault.hpp
                        StylesheetExecutionContext.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp
                        StylesheetHandler.cpp StylesheetHandler.hpp
                        StylesheetRoot.cpp
  Log:
  Huge cleanup and move to more block allocation of stylesheet objects.
  
  Revision  Changes    Path
  1.19      +0 -7      xml-xalan/c/src/XSLT/AVT.cpp
  
  Index: AVT.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/AVT.cpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- AVT.cpp   31 Oct 2002 07:15:56 -0000      1.18
  +++ AVT.cpp   3 Nov 2002 03:41:05 -0000       1.19
  @@ -254,13 +254,6 @@
                                                        // expression.
                                                        clear(buffer);
   
  -                                                     const XPath* const      
xpath =
  -                                                             
constructionContext.createXPath(
  -                                                                             
        locator,
  -                                                                             
        exprBuffer,
  -                                                                             
        resolver);
  -                                                     assert(xpath != 0);
  -
                                                        assert(m_partsSize + 1 
< nTokens);
   
                                                        m_parts[m_partsSize++] =
  
  
  
  1.18      +1 -1      xml-xalan/c/src/XSLT/ElemApplyImport.cpp
  
  Index: ElemApplyImport.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemApplyImport.cpp,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- ElemApplyImport.cpp       24 Sep 2002 01:42:34 -0000      1.17
  +++ ElemApplyImport.cpp       3 Nov 2002 03:41:05 -0000       1.18
  @@ -126,7 +126,7 @@
   
        if (executionContext.getCurrentTemplate() == 0)
        {
  -             executionContext.error("There is no current template", 
sourceNode, this);
  +             executionContext.error("There is no current template", 
sourceNode, getLocator());
        }
   
        ElemTemplateElement::execute(executionContext);
  
  
  
  1.26      +42 -32    xml-xalan/c/src/XSLT/ElemApplyTemplates.cpp
  
  Index: ElemApplyTemplates.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemApplyTemplates.cpp,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- ElemApplyTemplates.cpp    24 Sep 2002 01:42:34 -0000      1.25
  +++ ElemApplyTemplates.cpp    3 Nov 2002 03:41:05 -0000       1.26
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights 
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -62,6 +62,10 @@
   
   
   
  +#include <XPath/XalanQNameByValue.hpp>
  +
  +
  +
   #include "Constants.hpp"
   #include "Stylesheet.hpp"
   #include "StylesheetRoot.hpp"
  @@ -71,6 +75,10 @@
   
   
   
  +static const XalanQNameByValue       s_defaultMode;
  +
  +
  +
   ElemApplyTemplates::ElemApplyTemplates(
                        StylesheetConstructionContext&  constructionContext,
                        Stylesheet&                                             
stylesheetTree,
  @@ -83,7 +91,7 @@
                                columnNumber,
                                
StylesheetConstructionContext::ELEMNAME_APPLY_TEMPLATES),
        m_isDefaultTemplate(false),
  -     m_mode()
  +     m_mode(0)
   {
        const unsigned  int nAttrs = atts.getLength();
   
  @@ -97,7 +105,7 @@
                }
                else if (equals(aname, Constants::ATTRNAME_MODE))
                {
  -                     m_mode = XalanQNameByValue(atts.getValue(i), 
getStylesheet().getNamespaces());
  +                     m_mode = 
constructionContext.createXalanQName(atts.getValue(i), 
getStylesheet().getNamespaces(), getLocator());
                }
                else if (!isAttrOK(aname, atts, i, constructionContext))
                {
  @@ -116,7 +124,19 @@
                        *this);
        }
   
  -     assert(m_selectPattern != 0);
  +     if (m_mode == 0)
  +     {
  +             m_mode = &s_defaultMode;
  +     }
  +     else if (m_mode->isValid() == false)
  +     {
  +             constructionContext.error(
  +                             "xsl:apply-templates has an illegal 'mode' 
attribute",
  +                             0,
  +                             this);
  +     }
  +
  +     assert(m_selectPattern != 0 && m_mode != 0);
   }
   
   
  @@ -138,7 +158,7 @@
   void
   ElemApplyTemplates::execute(StylesheetExecutionContext&              
executionContext) const
   {
  -     assert(m_selectPattern != 0);
  +     assert(m_selectPattern != 0 && m_mode != 0);
   
        if(0 != executionContext.getTraceListeners())
        {
  @@ -147,50 +167,40 @@
        }
   
        XalanNode* const        sourceNode = executionContext.getCurrentNode();
  +     assert(sourceNode != 0);
   
  -     if (sourceNode == 0)
  -     {
  -             executionContext.error(
  -                     "There is no current node in 
ElemApplyTemplates::execute()",
  -                     sourceNode,
  -                     this);
  -     }
  -    else
  -     {
  -             // Dragons here.  Push the params & stack frame, but then 
execute the
  -             // select statement inside transformSelectedChildren, which 
must be
  -             // executed in the stack frame before the new stack frame.  
Because of
  -             // depth-first searching, this gets worse.
  -             StylesheetExecutionContext::ParamsPushPop       thePushPop(
  +     // Push the params & stack frame, but then execute the select
  +     // expression inside transformSelectedChildren, which must be
  +     // executed in the stack frame before the new stack frame.
  +     StylesheetExecutionContext::ParamsPushPop       thePushPop(
                        executionContext,
                        *this,
                        sourceNode,
                        this);
   
  -             const XalanQName* const         currentMode = 
executionContext.getCurrentMode();
  -             assert(currentMode != 0);
  +     const XalanQName* const         currentMode = 
executionContext.getCurrentMode();
  +     assert(currentMode != 0);
   
  -             if (m_isDefaultTemplate == false &&
  -                     !m_mode.equals(*currentMode))
  -             {
  -                     executionContext.setCurrentMode(&m_mode);
  +     if (m_isDefaultTemplate == false &&
  +             !m_mode->equals(*currentMode))
  +     {
  +             executionContext.setCurrentMode(m_mode);
   
  -                     transformSelectedChildren(
  +             transformSelectedChildren(
                                executionContext,
                                0,
                                sourceNode,
                                thePushPop.getStackFrameIndex());
   
  -                     executionContext.setCurrentMode(currentMode);
  -             }
  -             else
  -             {
  -                     transformSelectedChildren(
  +             executionContext.setCurrentMode(currentMode);
  +     }
  +     else
  +     {
  +             transformSelectedChildren(
                                executionContext,
                                0,
                                sourceNode,
                                thePushPop.getStackFrameIndex());
  -             }
        }
   }
   
  
  
  
  1.12      +4 -4      xml-xalan/c/src/XSLT/ElemApplyTemplates.hpp
  
  Index: ElemApplyTemplates.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemApplyTemplates.hpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ElemApplyTemplates.hpp    13 Aug 2001 17:08:52 -0000      1.11
  +++ ElemApplyTemplates.hpp    3 Nov 2002 03:41:05 -0000       1.12
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights 
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -75,7 +75,7 @@
   
   
   
  -#include <XPath/XalanQNameByValue.hpp>
  +class XalanQName;
   
   
   
  @@ -141,7 +141,7 @@
   
        bool                            m_isDefaultTemplate;
   
  -     XalanQNameByValue       m_mode;
  +     const XalanQName*       m_mode;
   };
   
   
  
  
  
  1.22      +7 -4      xml-xalan/c/src/XSLT/ElemAttributeSet.cpp
  
  Index: ElemAttributeSet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemAttributeSet.cpp,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- ElemAttributeSet.cpp      24 Sep 2002 01:42:34 -0000      1.21
  +++ ElemAttributeSet.cpp      3 Nov 2002 03:41:05 -0000       1.22
  @@ -80,7 +80,7 @@
                        lineNumber,
                        columnNumber,
                        StylesheetConstructionContext::ELEMNAME_ATTRIBUTE_SET),
  -     m_QName()
  +     m_qname(0)
   {
        const unsigned int      nAttrs = atts.getLength();
   
  @@ -90,7 +90,10 @@
   
                if(equals(aname, Constants::ATTRNAME_NAME))
                {
  -                     m_QName.set(atts.getValue(i), 
stylesheetTree.getNamespaces());
  +                     m_qname = constructionContext.createXalanQName(
  +                             atts.getValue(i),
  +                             stylesheetTree.getNamespaces(),
  +                             getLocator());
   
                        stylesheetTree.addAttributeSet(this);
                }
  @@ -104,14 +107,14 @@
                }
        }
   
  -     if(m_QName.isEmpty() == true)
  +     if(m_qname == 0)
        {
                constructionContext.error(
                        "xsl:attribute-set must have a 'name' attribute",
                        0,
                        this);
        }
  -     else if (isValidNCName(m_QName.getLocalPart()) == false)
  +     else if (m_qname->isValid() == false)
        {
                constructionContext.error(
                        "xsl:attribute-set has an invalid 'name' attribute",
  
  
  
  1.14      +4 -6      xml-xalan/c/src/XSLT/ElemAttributeSet.hpp
  
  Index: ElemAttributeSet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemAttributeSet.hpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- ElemAttributeSet.hpp      8 Nov 2001 01:08:48 -0000       1.13
  +++ ElemAttributeSet.hpp      3 Nov 2002 03:41:05 -0000       1.14
  @@ -69,10 +69,6 @@
   
   
   
  -#include <XPath/XalanQNameByValue.hpp>
  -
  -
  -
   class ElemAttributeSet : public ElemUse
   {
   public:
  @@ -104,7 +100,9 @@
        const XalanQName&
        getQName() const
        {
  -             return m_QName;
  +             assert(m_qname != 0);
  +
  +             return *m_qname;
        }
   
   
  @@ -123,7 +121,7 @@
   
   private:
   
  -     XalanQNameByValue       m_QName;
  +     const XalanQName*       m_qname;
   };
   
   
  
  
  
  1.25      +17 -21    xml-xalan/c/src/XSLT/ElemCallTemplate.cpp
  
  Index: ElemCallTemplate.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemCallTemplate.cpp,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- ElemCallTemplate.cpp      24 Sep 2002 01:42:34 -0000      1.24
  +++ ElemCallTemplate.cpp      3 Nov 2002 03:41:05 -0000       1.25
  @@ -87,7 +87,7 @@
                                                lineNumber,
                                                columnNumber,
                                                
StylesheetConstructionContext::ELEMNAME_CALL_TEMPLATE),
  -     m_templateName(),
  +     m_templateName(0),
        m_template(0)
   {
        const unsigned int      nAttrs = atts.getLength();
  @@ -98,7 +98,10 @@
   
                if(equals(aname, Constants::ATTRNAME_NAME))
                {
  -                     m_templateName.set(atts.getValue(i), 
getStylesheet().getNamespaces());        
  +                     m_templateName = constructionContext.createXalanQName(
  +                                     atts.getValue(i),
  +                                     getStylesheet().getNamespaces(),
  +                                     getLocator());
                }
                else if(!isAttrOK(aname, atts, i, constructionContext))
                {
  @@ -109,14 +112,14 @@
                }
        }
   
  -     if (m_templateName.isEmpty() == true)
  +     if (m_templateName == 0)
        {
                constructionContext.error(
                        "xsl:call-template must have a 'name' attribute",
                        0,
                        this);
        }
  -     else if (isValidNCName(m_templateName.getLocalPart()) == false)
  +     else if (m_templateName->isValid() == false)
        {
                constructionContext.error(
                        "xsl:call-template has an invalid 'name' attribute",
  @@ -126,7 +129,7 @@
   }
   
   
  -     
  +
   ElemCallTemplate::~ElemCallTemplate()
   {
   }
  @@ -167,10 +170,9 @@
                        StylesheetConstructionContext&  constructionContext,
                        const NamespacesHandler&                
theParentHandler)
   {
  -     assert(m_templateName.isEmpty() == false);
  +     assert(m_templateName != 0);
   
  -     m_template =
  -             
getStylesheet().getStylesheetRoot().findNamedTemplate(m_templateName);
  +     m_template = 
getStylesheet().getStylesheetRoot().findNamedTemplate(*m_templateName);
   
        if(m_template == 0)
        {
  @@ -189,18 +191,12 @@
   bool
   ElemCallTemplate::childTypeAllowed(int       xslToken) const
   {
  -     bool    fResult = false;
  -     
  -     switch(xslToken)
  -     {
  -     // char-instructions 
  -     case StylesheetConstructionContext::ELEMNAME_WITH_PARAM:
  -             fResult = true;
  -             break;
  -             
  -     default:
  -             break;
  +     if (xslToken == StylesheetConstructionContext::ELEMNAME_WITH_PARAM)
  +     {
  +             return true;
  +     }
  +     else
  +     {
  +             return false;
        }
  -     
  -     return fResult;
   }
  
  
  
  1.15      +1 -5      xml-xalan/c/src/XSLT/ElemCallTemplate.hpp
  
  Index: ElemCallTemplate.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemCallTemplate.hpp,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- ElemCallTemplate.hpp      13 Aug 2001 17:08:53 -0000      1.14
  +++ ElemCallTemplate.hpp      3 Nov 2002 03:41:05 -0000       1.15
  @@ -64,10 +64,6 @@
   
   
   
  -#include <XPath/XalanQNameByValue.hpp>
  -
  -
  -
   // Base class header file.
   #include "ElemTemplateElement.hpp"
   
  @@ -133,7 +129,7 @@
        operator=(const ElemCallTemplate&);
   
        // Data members...
  -     XalanQNameByValue               m_templateName;
  +     const XalanQName*               m_templateName;
   
        const ElemTemplate*             m_template;
   };
  
  
  
  1.12      +14 -3     xml-xalan/c/src/XSLT/ElemDecimalFormat.cpp
  
  Index: ElemDecimalFormat.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemDecimalFormat.cpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ElemDecimalFormat.cpp     24 Sep 2002 01:42:34 -0000      1.11
  +++ ElemDecimalFormat.cpp     3 Nov 2002 03:41:05 -0000       1.12
  @@ -66,12 +66,20 @@
   
   
   
  +#include <XPath/XalanQNameByValue.hpp>
  +
  +
  +
   #include "Constants.hpp"
   #include "Stylesheet.hpp"
   #include "StylesheetConstructionContext.hpp"
   
   
   
  +static const XalanQNameByValue       s_empty;
  +
  +
  +
   ElemDecimalFormat::ElemDecimalFormat(
                        StylesheetConstructionContext&  constructionContext,
                        Stylesheet&                                     
stylesheetTree,
  @@ -86,7 +94,7 @@
        m_countMatchPattern(0),
        m_fromMatchPattern(0),
        m_valueExpr(0),
  -     m_qname(),
  +     m_qname(&s_empty),
        m_decimalFormatSymbols()
   {
        m_decimalFormatSymbols.setInfinity(XalanDOMString());
  @@ -102,7 +110,10 @@
                {
                        assert(atts.getValue(i) != 0);
   
  -                     m_qname.set(atts.getValue(i), 
getStylesheet().getNamespaces());
  +                     m_qname = constructionContext.createXalanQName(
  +                                             atts.getValue(i),
  +                                             getStylesheet().getNamespaces(),
  +                                             getLocator());
                }
                else if(equals(aname, Constants::ATTRNAME_DECIMALSEPARATOR))
                {
  @@ -273,7 +284,7 @@
   
        // Look for duplicate decimal-format names
        const XalanDecimalFormatSymbols* const  theOther =
  -                     stylesheetTree.getDecimalFormatSymbols(m_qname);
  +                     stylesheetTree.getDecimalFormatSymbols(*m_qname);
   
        if (theOther != 0 && *theOther != m_decimalFormatSymbols)
        {
  
  
  
  1.10      +4 -6      xml-xalan/c/src/XSLT/ElemDecimalFormat.hpp
  
  Index: ElemDecimalFormat.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemDecimalFormat.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ElemDecimalFormat.hpp     26 Nov 2001 23:27:03 -0000      1.9
  +++ ElemDecimalFormat.hpp     3 Nov 2002 03:41:05 -0000       1.10
  @@ -73,10 +73,6 @@
   
   
   
  -#include <XPath/XalanQNameByValue.hpp>
  -
  -
  -
   class XPath;
   
   
  @@ -120,7 +116,9 @@
        const XalanQName&
        getQName() const
        {
  -             return m_qname;
  +             assert(m_qname != 0);
  +
  +             return *m_qname;
        }
   
   private:
  @@ -129,7 +127,7 @@
        const XPath*                            m_fromMatchPattern;
        const XPath*                            m_valueExpr;
   
  -     XalanQNameByValue                       m_qname;
  +     const XalanQName*                       m_qname;
   
        XalanDecimalFormatSymbols       m_decimalFormatSymbols;
   };
  
  
  
  1.13      +4 -1      xml-xalan/c/src/XSLT/ElemExtensionCall.cpp
  
  Index: ElemExtensionCall.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemExtensionCall.cpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- ElemExtensionCall.cpp     24 Sep 2002 01:42:34 -0000      1.12
  +++ ElemExtensionCall.cpp     3 Nov 2002 03:41:05 -0000       1.13
  @@ -99,7 +99,10 @@
   void
   ElemExtensionCall::execute(StylesheetExecutionContext&               
executionContext) const
   {
  -     executionContext.warn("Xalan C++ does not yet handle extensions!");
  +     executionContext.warn(
  +             "Xalan C++ does not yet handle extensions!",
  +             0,
  +             getLocator());
   
        for (const ElemTemplateElement* child = getFirstChildElem(); child != 
0; child = child->getNextSiblingElem())
        {
  
  
  
  1.28      +9 -1      xml-xalan/c/src/XSLT/ElemForEach.cpp
  
  Index: ElemForEach.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemForEach.cpp,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- ElemForEach.cpp   24 Sep 2002 01:42:34 -0000      1.27
  +++ ElemForEach.cpp   3 Nov 2002 03:41:05 -0000       1.28
  @@ -209,7 +209,7 @@
                        executionContext.error(
                                "There is no current node in 
ElemForEach::execute()",
                                sourceNode, 
  -                             this);
  +                             getLocator());
                }
        }
   }
  @@ -418,6 +418,14 @@
   
        if (theXObject.null() == false)
        {
  +             if (theXObject->getType() != XObject::eTypeNodeSet)
  +             {
  +                     executionContext.error(
  +                             "xsl:for-each 'select' must evaluate to a 
node-set",
  +                             sourceNodeContext,
  +                             getLocator());
  +             }
  +
                const NodeRefListBase&  sourceNodes = theXObject->nodeset();
   
                if(0 != executionContext.getTraceListeners())
  
  
  
  1.68      +4 -8      xml-xalan/c/src/XSLT/ElemNumber.cpp
  
  Index: ElemNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.cpp,v
  retrieving revision 1.67
  retrieving revision 1.68
  diff -u -r1.67 -r1.68
  --- ElemNumber.cpp    31 Oct 2002 07:15:56 -0000      1.67
  +++ ElemNumber.cpp    3 Nov 2002 03:41:05 -0000       1.68
  @@ -243,8 +243,7 @@
                        StylesheetExecutionContext&             
executionContext,
                        const XPath*                                    
fromMatchPattern,
                        const XPath*                                    
countMatchPattern,
  -                     XalanNode*                                              
context,
  -                     const XalanElement*                             /* 
namespaceContext */) const
  +                     XalanNode*                                              
context) const
   {
        XalanNode*      contextCopy = context;
   
  @@ -283,8 +282,7 @@
                        StylesheetExecutionContext&             
executionContext,
                        const XPath*                                    
fromMatchPattern,
                        const XPath*                                    
countMatchPattern,
  -                     XalanNode*                                              
context,
  -                     const XalanElement*                             /* 
namespaceContext */) const
  +                     XalanNode*                                              
context) const
   {  
        XalanNode*      contextCopy = context;
   
  @@ -730,8 +728,7 @@
                                executionContext,
                                m_fromMatchPattern,
                                countMatchPattern,
  -                             sourceNode,
  -                             this);
  +                             sourceNode);
        }
        else
        {
  @@ -739,8 +736,7 @@
                                executionContext,
                                m_fromMatchPattern,
                                countMatchPattern,
  -                             sourceNode,
  -                             this);
  +                             sourceNode);
        }
   
        return target;
  
  
  
  1.42      +17 -15    xml-xalan/c/src/XSLT/ElemNumber.hpp
  
  Index: ElemNumber.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.hpp,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- ElemNumber.hpp    24 Sep 2002 06:57:42 -0000      1.41
  +++ ElemNumber.hpp    3 Nov 2002 03:41:05 -0000       1.42
  @@ -179,35 +179,37 @@
         * Given a 'from' pattern (ala xsl:number), a match pattern 
         * and a context, find the first ancestor that matches the 
         * pattern (including the context handed in).
  +      *
  +      * @param executionContext The current execution context
         * @param matchPatternString The match pattern.
  -      * @param node The node that "." expresses.
  -      * @param namespaceContext The context in which namespaces in the 
  -      * queries are supposed to be expanded.
  +      * @param matchPatternString The count match pattern.
  +      * @param node The context node
  +      * @return A pointer to the matched node.
         */
        XalanNode*
        findAncestor(
                        StylesheetExecutionContext&             
executionContext,
                        const XPath*                                    
fromMatchPattern,
                        const XPath*                                    
countMatchPattern,
  -                     XalanNode*                                              
context,
  -                     const XalanElement*                             
namespaceContext) const;
  +                     XalanNode*                                              
context) const;
   
        /**
  -     * Given a 'from' pattern (ala xsl:number), a match pattern 
  -     * and a context, find the first ancestor that matches the 
  -     * pattern (including the context handed in).
  -     * @param matchPatternString The match pattern.
  -     * @param node The node that "." expresses.
  -     * @param namespaceContext The context in which namespaces in the 
  -     * queries are supposed to be expanded.
  -     */
  +      * Given a 'from' pattern (ala xsl:number), a match pattern 
  +      * and a context, find the first ancestor that matches the 
  +      * pattern (including the context handed in).
  +      *
  +      * @param executionContext The current execution context
  +      * @param matchPatternString The match pattern.
  +      * @param matchPatternString The count match pattern.
  +      * @param node The context node
  +      * @return A pointer to the matched node.
  +      */
        XalanNode*
        findPrecedingOrAncestorOrSelf(
                        StylesheetExecutionContext&             
executionContext,
                        const XPath*                                    
fromMatchPattern,
                        const XPath*                                    
countMatchPattern,
  -                     XalanNode*                                              
context,
  -                     const XalanElement*                             
namespaceContext) const;
  +                     XalanNode*                                              
context) const;
   
        /**
         * Get the count match pattern, or a default value.
  
  
  
  1.25      +2 -2      xml-xalan/c/src/XSLT/ElemPI.cpp
  
  Index: ElemPI.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemPI.cpp,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- ElemPI.cpp        31 Oct 2002 07:15:56 -0000      1.24
  +++ ElemPI.cpp        3 Nov 2002 03:41:05 -0000       1.25
  @@ -143,11 +143,11 @@
   
        if(equalsIgnoreCaseASCII(piName, Constants::ATTRVAL_OUTPUT_METHOD_XML))
        {
  -             executionContext.error("processing-instruction name can not be 
'xml'", 0, this);
  +             executionContext.error("processing-instruction name can not be 
'xml'", 0, getLocator());
        }
        else if(!isValidNCName(piName))
        {
  -             executionContext.error("processing-instruction name must be a 
valid NCName", 0, this);
  +             executionContext.error("processing-instruction name must be a 
valid NCName", 0, getLocator());
        }
   
        StylesheetExecutionContext::SetAndRestoreCopyTextNodesOnly      
theSetAndRestore(executionContext, true);
  
  
  
  1.15      +4 -2      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.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- ElemParam.cpp     24 Sep 2002 05:59:38 -0000      1.14
  +++ ElemParam.cpp     3 Nov 2002 03:41:05 -0000       1.15
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights 
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -99,7 +99,9 @@
   void
   ElemParam::execute(StylesheetExecutionContext&               
executionContext) const
   {
  -     const XObjectPtr        obj = 
executionContext.getParamVariable(m_qname);
  +     assert(m_qname != 0);
  +
  +     const XObjectPtr        obj = 
executionContext.getParamVariable(*m_qname);
   
        if (obj.null() == true)
        {
  
  
  
  1.10      +1 -1      xml-xalan/c/src/XSLT/ElemParam.hpp
  
  Index: ElemParam.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemParam.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ElemParam.hpp     9 Mar 2001 16:19:59 -0000       1.9
  +++ ElemParam.hpp     3 Nov 2002 03:41:05 -0000       1.10
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights 
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  
  
  
  1.27      +45 -6     xml-xalan/c/src/XSLT/ElemTemplate.cpp
  
  Index: ElemTemplate.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplate.cpp,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- ElemTemplate.cpp  24 Sep 2002 05:59:38 -0000      1.26
  +++ ElemTemplate.cpp  3 Nov 2002 03:41:05 -0000       1.27
  @@ -71,12 +71,20 @@
   
   
   
  +#include <XPath/XalanQNameByValue.hpp>
  +
  +
  +
   #include "Constants.hpp"
   #include "Stylesheet.hpp"
   #include "StylesheetConstructionContext.hpp"
   
   
   
  +static const XalanQNameByValue       s_empty;
  +
  +
  +
   ElemTemplate::ElemTemplate(
                        StylesheetConstructionContext&  constructionContext,
                        Stylesheet&                                             
stylesheetTree,
  @@ -89,8 +97,8 @@
                                                columnNumber,
                                                
StylesheetConstructionContext::ELEMNAME_TEMPLATE),
        m_matchPattern(0),
  -     m_name(),
  -     m_mode(),
  +     m_name(&s_empty),
  +     m_mode(&s_empty),
        m_priority(XPath::getMatchScoreValue(XPath::eMatchScoreNone))
   {
        const unsigned int      nAttrs = atts.getLength();
  @@ -105,7 +113,10 @@
                }
                else if (equals(aname, Constants::ATTRNAME_NAME))
                {
  -                     m_name = XalanQNameByValue(atts.getValue(i), 
getStylesheet().getNamespaces());
  +                     m_name = constructionContext.createXalanQName(
  +                                             atts.getValue(i),
  +                                             getStylesheet().getNamespaces(),
  +                                             getLocator());
                }
                else if (equals(aname, Constants::ATTRNAME_PRIORITY))
                {
  @@ -115,7 +126,10 @@
                }
                else if (equals(aname, Constants::ATTRNAME_MODE))
                {
  -                     m_mode = XalanQNameByValue(atts.getValue(i), 
getStylesheet().getNamespaces());
  +                     m_mode = constructionContext.createXalanQName(
  +                                             atts.getValue(i),
  +                                             getStylesheet().getNamespaces(),
  +                                             getLocator());
                }
                else if(!(isAttrOK(aname, atts, i, constructionContext) || 
                                 processSpaceAttr(aname, atts, i, 
constructionContext)))
  @@ -127,7 +141,7 @@
                }
        }
   
  -     const bool      isEmptyName = m_name.isEmpty();
  +     const bool      isEmptyName = m_name->isEmpty();
   
        if(0 == m_matchPattern && isEmptyName == true)
        {
  @@ -136,19 +150,44 @@
                                0,
                                this);
        }
  -     else if (isEmptyName == false && isValidNCName(m_name.getLocalPart()) 
== false)
  +     else if (isEmptyName == false && m_name->isValid() == false)
        {
                constructionContext.error(
                        "xsl:template has an invalid 'name' attribute",
                        0,
                        this);
        }
  +     else if (m_mode->isEmpty() == false && m_mode->isValid() == false)
  +     {
  +             constructionContext.error(
  +                     "xsl:template has an invalid 'mode' attribute",
  +                     0,
  +                     this);
  +     }
   }
   
   
   
   ElemTemplate::~ElemTemplate()
   {
  +}
  +
  +
  +
  +void
  +ElemTemplate::addToStylesheet(
  +                     StylesheetConstructionContext&  constructionContext,
  +                     Stylesheet&                                             
theStylesheet)
  +{
  +     theStylesheet.addTemplate(this, constructionContext); 
  +}
  +
  +
  +
  +const XalanQName&
  +ElemTemplate::getNameAttribute() const
  +{ 
  +     return *m_name;
   }
   
   
  
  
  
  1.14      +13 -18    xml-xalan/c/src/XSLT/ElemTemplate.hpp
  
  Index: ElemTemplate.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplate.hpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- ElemTemplate.hpp  16 Apr 2002 05:45:50 -0000      1.13
  +++ ElemTemplate.hpp  3 Nov 2002 03:41:05 -0000       1.14
  @@ -71,10 +71,6 @@
   
   
   
  -#include <XPath/XalanQNameByValue.hpp>
  -
  -
  -
   class XPath;
   
   
  @@ -103,17 +99,6 @@
        ~ElemTemplate();
   
        /**
  -      * Retrieve the qualified name of element
  -      * 
  -      * @return QName for element
  -      */
  -     const XalanQName&
  -     getName() const
  -     {
  -             return m_name;
  -     }
  -
  -     /**
         * Retrieve the mode of element
         * 
         * @return QName for mode
  @@ -121,7 +106,9 @@
        const XalanQName&
        getMode() const
        {
  -             return m_mode;
  +             assert(m_mode != 0);
  +
  +             return *m_mode;
        }
   
        /**
  @@ -146,6 +133,14 @@
                return m_priority;
        }
   
  +     virtual const XalanQName&
  +     getNameAttribute() const;
  +
  +     virtual void
  +     addToStylesheet(
  +                     StylesheetConstructionContext&  constructionContext,
  +                     Stylesheet&                                             
theStylesheet);
  +
        virtual const XalanDOMString&
        getElementName() const;
   
  @@ -172,8 +167,8 @@
        // Data members...
        const XPath*            m_matchPattern;
   
  -     XalanQNameByValue       m_name;
  -     XalanQNameByValue       m_mode;
  +     const XalanQName*       m_name;
  +     const XalanQName*       m_mode;
   
        double                          m_priority;
   };
  
  
  
  1.82      +47 -71    xml-xalan/c/src/XSLT/ElemTemplateElement.cpp
  
  Index: ElemTemplateElement.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.cpp,v
  retrieving revision 1.81
  retrieving revision 1.82
  diff -u -r1.81 -r1.82
  --- ElemTemplateElement.cpp   27 Sep 2002 23:32:23 -0000      1.81
  +++ ElemTemplateElement.cpp   3 Nov 2002 03:41:05 -0000       1.82
  @@ -113,6 +113,8 @@
   
   const XalanEmptyNamedNodeMap ElemTemplateElement::s_fakeAttributes;
   
  +const XalanQNameByReference                  
ElemTemplateElement::s_emptyQName(s_emptyString, s_emptyString);
  +
   
   
   ElemTemplateElement::ElemTemplateElement(
  @@ -323,6 +325,27 @@
   
   
   
  +const XalanQName&
  +ElemTemplateElement::getNameAttribute() const
  +{
  +     return s_emptyQName;
  +}
  +
  +
  +
  +void
  +ElemTemplateElement::addToStylesheet(
  +                     StylesheetConstructionContext&  constructionContext,
  +                     Stylesheet&                                             
/* theStylesheet */)
  +{
  +     constructionContext.error(
  +             "An illegal call to addToStylesheet() was made during 
compilation of the stylesheet.",
  +             0,
  +             this);
  +}
  +
  +
  +
   XalanDOMString&
   ElemTemplateElement::doChildrenToString(
                        StylesheetExecutionContext&             
executionContext, 
  @@ -532,6 +555,8 @@
   ElemTemplateElement::appendChildElem(ElemTemplateElement*    newChild)
   {
        assert(newChild != 0);
  +     assert(newChild->getXSLToken() != 
StylesheetConstructionContext::ELEMNAME_TEXT);
  +     assert(newChild->getXSLToken() != 
StylesheetConstructionContext::ELEMNAME_UNDEFINED);
   
        if (newChild->isWhitespace() == false &&
                childTypeAllowed(newChild->getXSLToken()) == false)
  @@ -865,8 +890,7 @@
   #endif
   ElemTemplateElement::cloneNode(bool          /* deep */) const
   {
  -     //should not be called
  -     assert(false);  
  +     throw XalanDOMException(XalanDOMException::NOT_SUPPORTED_ERR);
   
        return 0;
   }
  @@ -875,84 +899,37 @@
   
   XalanNode*
   ElemTemplateElement::insertBefore(
  -                     XalanNode*      newChild,
  -                     XalanNode*      refChild)
  +                     XalanNode*      /* newChild */,
  +                     XalanNode*      /* refChild */)
   {
  -#if defined(XALAN_OLD_STYLE_CASTS) || !defined(XALAN_RTTI_AVAILABLE)
  -     return insertBeforeElem((ElemTemplateElement*)newChild,
  -                                                     
(ElemTemplateElement*)refChild);
  -#else
  -     return insertBeforeElem(dynamic_cast<ElemTemplateElement*>(newChild),
  -                                                     
dynamic_cast<ElemTemplateElement*>(refChild));
  -#endif
  +     throw XalanDOMException(XalanDOMException::NO_MODIFICATION_ALLOWED_ERR);
  +
  +     // Dummy return value...
  +     return 0;
   }
   
   
   
   XalanNode*
   ElemTemplateElement::replaceChild(
  -                     XalanNode*      newChild,
  -                     XalanNode*      oldChild)
  +                     XalanNode*      /* newChild */,
  +                     XalanNode*      /* oldChild */)
   {
  -#if defined(XALAN_OLD_STYLE_CASTS) || !defined(XALAN_RTTI_AVAILABLE)
  -     return replaceChildElem((ElemTemplateElement*)newChild,
  -                                                     
(ElemTemplateElement*)oldChild);
  -#else
  -     return replaceChildElem(dynamic_cast<ElemTemplateElement*>(newChild),
  -                                                     
dynamic_cast<ElemTemplateElement*>(oldChild));
  -#endif
  +     throw XalanDOMException(XalanDOMException::NO_MODIFICATION_ALLOWED_ERR);
  +
  +     // Dummy return value...
  +     return 0;
   }
   
   
   
   XalanNode*
  -ElemTemplateElement::removeChild(XalanNode*          oldChild)
  +ElemTemplateElement::removeChild(XalanNode*          /* oldChild */)
   {
  -     assert(oldChild != 0);
  +     throw XalanDOMException(XalanDOMException::NO_MODIFICATION_ALLOWED_ERR);
   
  -     XalanNode*                              ret = 0;
  -
  -     // first try the common, easy cases
  -     if (oldChild == 0 || oldChild->getParentNode() != this)
  -     {
  -             throw XalanDOMException(XalanDOMException::NOT_FOUND_ERR);
  -     }
  -     else
  -     {
  -             ElemTemplateElement*    pTest = m_firstChild;
  -             assert(pTest != 0);
  -
  -             if (pTest == oldChild)
  -             {
  -                     ElemTemplateElement* const      nextChild =
  -                             pTest->getNextSiblingElem();
  -
  -                     if (nextChild != 0)
  -                     {
  -                             nextChild->setPreviousSiblingElem(0);
  -                     }
  -
  -                     pTest->setNextSiblingElem(0);
  -                     m_firstChild = nextChild;
  -
  -                     ret = pTest;
  -             }
  -             else
  -             {
  -                     // now we walk this singly-linked list, peeling one 
ahead, since we need be
  -                     // able to patch up the list
  -
  -                     while (pTest->getNextSibling() != 0 && 
pTest->getNextSibling() != oldChild)
  -                             pTest = pTest->getNextSiblingElem();
  -
  -                     ret = pTest->getNextSibling();
  -
  -                     if (pTest->getNextSibling() != 0)
  -                             
pTest->setNextSiblingElem(pTest->getNextSiblingElem()->getNextSiblingElem());
  -             }
  -     }
  -
  -     return ret;
  +     // Dummy return value...
  +     return 0;
   }
   
   
  @@ -963,13 +940,12 @@
    */
   
   XalanNode*
  -ElemTemplateElement::appendChild(XalanNode*          oldChild)
  +ElemTemplateElement::appendChild(XalanNode*          /* oldChild */)
   {
  -#if defined(XALAN_OLD_STYLE_CASTS) || !defined(XALAN_RTTI_AVAILABLE)
  -     return appendChildElem((ElemTemplateElement*)oldChild);
  -#else
  -     return appendChildElem(dynamic_cast<ElemTemplateElement*>(oldChild));
  -#endif
  +     throw XalanDOMException(XalanDOMException::NO_MODIFICATION_ALLOWED_ERR);
  +
  +     // Dummy return value...
  +     return 0;
   }
   
   
  
  
  
  1.49      +38 -2     xml-xalan/c/src/XSLT/ElemTemplateElement.hpp
  
  Index: ElemTemplateElement.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.hpp,v
  retrieving revision 1.48
  retrieving revision 1.49
  diff -u -r1.48 -r1.49
  --- ElemTemplateElement.hpp   27 Sep 2002 23:32:23 -0000      1.48
  +++ ElemTemplateElement.hpp   3 Nov 2002 03:41:05 -0000       1.49
  @@ -82,6 +82,10 @@
   
   
   
  +#include <XPath/XalanQNameByReference.hpp>
  +
  +
  +
   #include <XSLT/NamespacesHandler.hpp>
   
   
  @@ -100,6 +104,8 @@
   {
   public:
   
  +     typedef XalanElement::NodeType  NodeType;
  +
        /**
         * Construct a template element instance.
         * 
  @@ -121,7 +127,7 @@
         * Special constructor used by dummy elements which do not exist in the
         * final stylesheet.
         * 
  -      * @param constructionContext  context when object constructed
  +      * @param constructionContext  The current construction context
         * @param stylesheetTree           owning stylesheet
         * @param xslToken                         an integer representing the 
type of instance.
         */
  @@ -310,9 +316,37 @@
        virtual bool
        isWhitespace() const;
   
  +     /** 
  +      * Get a string for the name of the element.  Useful for debugging 
purposes,
  +      * and error reporting.
  +      * 
  +      * @return A string containing the name of the element.
  +      */
        virtual const XalanDOMString&
        getElementName() const = 0;
   
  +     /** 
  +      * Get the QName associated with any name attribute of this element.
  +      * If the element has no name attribute, this will be an empty QName.
  +      * 
  +      * @return A string containing the name of the element.
  +      */
  +     virtual const XalanQName&
  +     getNameAttribute() const;
  +
  +     /** 
  +      * Called during compilation when an instance is not parented by
  +      * another element, and thus, is a child of the stylesheet..
  +      * 
  +      * @param constructionContext  The current construction context
  +      * @param theStylesheet The owning stylesheet
  +      * @return nothing
  +      */
  +     virtual void
  +     addToStylesheet(
  +                     StylesheetConstructionContext&  constructionContext,
  +                     Stylesheet&                                             
theStylesheet);
  +
   #if defined(XALAN_NO_NAMESPACES)
        typedef map<XalanDOMString,
                                XalanDOMString,
  @@ -821,7 +855,7 @@
                const ElemTextLiteral*  m_textLiteralChild;
        };
   
  -     XalanNodeListSurrogate  m_surrogateChildren;
  +     const XalanNodeListSurrogate    m_surrogateChildren;
   
        const XalanDOMString&   m_baseIndentifier;
   
  @@ -836,6 +870,8 @@
        LocatorProxy                    m_locatorProxy;
   
        static const XalanEmptyNamedNodeMap     s_fakeAttributes;
  +
  +     static const XalanQNameByReference              s_emptyQName;
   
        // Not implemented...
        ElemTemplateElement(const ElemTemplateElement&);
  
  
  
  1.19      +0 -4      xml-xalan/c/src/XSLT/ElemUse.hpp
  
  Index: ElemUse.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemUse.hpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- ElemUse.hpp       31 Oct 2002 07:15:56 -0000      1.18
  +++ ElemUse.hpp       3 Nov 2002 03:41:05 -0000       1.19
  @@ -69,10 +69,6 @@
   
   
   
  -#include <XPath/XalanQNameByValue.hpp>
  -
  -
  -
   #include "Constants.hpp"
   
   
  
  
  
  1.28      +88 -19    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.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- ElemVariable.cpp  24 Sep 2002 05:59:38 -0000      1.27
  +++ ElemVariable.cpp  3 Nov 2002 03:41:05 -0000       1.28
  @@ -84,12 +84,13 @@
                        const AttributeList&                    atts,
                        int                                                     
        lineNumber,
                        int                                                     
        columnNumber) :
  -     ElemTemplateElement(constructionContext,
  -                                             stylesheetTree,
  -                                             lineNumber,
  -                                             columnNumber,
  -                                             
StylesheetConstructionContext::ELEMNAME_VARIABLE),
  -     m_qname(),
  +     ParentType(
  +             constructionContext,
  +             stylesheetTree,
  +             lineNumber,
  +             columnNumber,
  +             StylesheetConstructionContext::ELEMNAME_VARIABLE),
  +     m_qname(0),
        m_selectPattern(0),
        m_isTopLevel(false),
        m_value(0),
  @@ -107,12 +108,13 @@
                        int                                                     
        lineNumber,
                        int                                                     
        columnNumber,
                        int                                                     
        xslToken) :
  -     ElemTemplateElement(constructionContext,
  -                                             stylesheetTree,
  -                                             lineNumber,
  -                                             columnNumber,
  -                                             xslToken),
  -     m_qname(),
  +     ParentType(
  +             constructionContext,
  +             stylesheetTree,
  +             lineNumber,
  +             columnNumber,
  +             xslToken),
  +     m_qname(0),
        m_selectPattern(0),
        m_isTopLevel(false),
        m_value(0),
  @@ -147,7 +149,10 @@
                }
                else if (equals(aname, Constants::ATTRNAME_NAME))
                {
  -                     m_qname = XalanQNameByValue(atts.getValue(i), 
stylesheetTree.getNamespaces());
  +                     m_qname = constructionContext.createXalanQName(
  +                                             atts.getValue(i),
  +                                             stylesheetTree.getNamespaces(),
  +                                             getLocator());
                }
                else if(!(isAttrOK(aname, atts, i, constructionContext) || 
                                 processSpaceAttr(aname, atts, i, 
constructionContext)))
  @@ -159,13 +164,60 @@
                }
        }
   
  -     if(m_qname.isEmpty())
  +     if(m_qname == 0)
        {
                constructionContext.error(
                        "xsl:variable must have a 'name' attribute",
                        0,
                        this);
        }
  +     else if (m_qname->isValid() == false)
  +     {
  +             constructionContext.error(
  +                     "xsl:variable has an invalid 'name' attribute",
  +                     0,
  +                     this);
  +     }
  +}
  +
  +
  +
  +const XalanQName&
  +ElemVariable::getNameAttribute() const
  +{
  +     assert(m_qname != 0);
  +
  +     return *m_qname;
  +}
  +
  +
  +
  +void
  +ElemVariable::addToStylesheet(
  +                     StylesheetConstructionContext&  constructionContext,
  +                     Stylesheet&                                             
theStylesheet)
  +{
  +     // Processing a top-level element only...
  +     if (&theStylesheet != &getStylesheet())
  +     {
  +             constructionContext.error(
  +                     "The ElemVariable instance was added to wrong 
stylesheet.",
  +                     0,
  +                     this);
  +     }
  +     else if (getParentNode() != 0)
  +     {
  +             constructionContext.error(
  +                     "The ElemVariable instance is already parented and 
cannot be a top-level element.",
  +                     0,
  +                     this);
  +     }
  +     else
  +     {
  +             theStylesheet.setTopLevelVariable(this);
  +
  +             m_isTopLevel = true;
  +     }
   }
   
   
  @@ -179,23 +231,40 @@
   
   
   void
  -ElemVariable::execute(StylesheetExecutionContext&            
executionContext) const
  +ElemVariable::setParentNodeElem(ElemTemplateElement* theParent)
  +{
  +     if (m_isTopLevel == true)
  +     {
  +             throw 
XalanDOMException(XalanDOMException::HIERARCHY_REQUEST_ERR);
  +     }
  +     else
  +     {
  +             ParentType::setParentNodeElem(theParent);
  +     }
  +}
  +
  +
  +
  +void
  +ElemVariable::execute(StylesheetExecutionContext&    executionContext) const
   {
  -     ElemTemplateElement::execute(executionContext);
  +     assert(m_qname != 0);
  +
  +     ParentType::execute(executionContext);
   
        const XObjectPtr        theValue(getValue(executionContext, 
executionContext.getCurrentNode()));
   
        if (theValue.null() == false)
        {
                executionContext.pushVariable(
  -                             m_qname,
  +                             *m_qname,
                                theValue,
                                getParentNodeElem());
        }
        else
        {
                executionContext.pushVariable(
  -                             m_qname,
  +                             *m_qname,
                                this,
                                getParentNodeElem());
        }
  @@ -212,7 +281,7 @@
        {
                if (getFirstChild() == 0)
                {
  -                     return 
executionContext.getXObjectFactory().createString(XalanDOMString());
  +                     return 
executionContext.getXObjectFactory().createStringReference(s_emptyString);
                }
                else
                {
  
  
  
  1.18      +15 -25    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.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- ElemVariable.hpp  24 Sep 2002 01:42:35 -0000      1.17
  +++ ElemVariable.hpp  3 Nov 2002 03:41:05 -0000       1.18
  @@ -74,7 +74,6 @@
   
   
   
  -#include <XPath/XalanQNameByValue.hpp>
   #include <XPath/XObject.hpp>
   
   
  @@ -91,6 +90,8 @@
   {
   public:
   
  +     typedef ElemTemplateElement             ParentType;
  +
        /**
         * Construct an object corresponding to an "xsl:variable" element
         * 
  @@ -121,30 +122,16 @@
                return m_isTopLevel;
        }
   
  -     /**
  -      * Sets whether this is a top level variable.
  -      * 
  -      * @param bTopLevel value of flag to set
  -      */
  -     void
  -     setTopLevel(bool bTopLevel)
  -     {
  -             m_isTopLevel = bTopLevel;
  -     }
  -
  -     /**
  -      * Retrieve the object name.
  -      * 
  -      * @return qualified name of object
  -      */
  -     const XalanQName&
  -     getName() const
  -     { 
  -             return m_qname;
  -     }
  -
        // These methods are inherited from ElemTemplateElement ...
        
  +     virtual const XalanQName&
  +     getNameAttribute() const;
  +
  +     virtual void
  +     addToStylesheet(
  +                     StylesheetConstructionContext&  constructionContext,
  +                     Stylesheet&                                             
theStylesheet);
  +
        virtual const XalanDOMString&
        getElementName() const;
   
  @@ -156,6 +143,9 @@
                        StylesheetExecutionContext&             
executionContext,
                        XalanNode*                                              
sourceNode) const;
   
  +     virtual void
  +     setParentNodeElem(ElemTemplateElement*          theParent);
  +
   protected:
   
        /**
  @@ -189,7 +179,7 @@
                        const AttributeList&                    atts);
   
   
  -     XalanQNameByValue       m_qname;
  +     const XalanQName*       m_qname;
   
   private:
   
  
  
  
  1.13      +13 -3     xml-xalan/c/src/XSLT/ElemWithParam.cpp
  
  Index: ElemWithParam.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemWithParam.cpp,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- ElemWithParam.cpp 24 Sep 2002 01:42:35 -0000      1.12
  +++ ElemWithParam.cpp 3 Nov 2002 03:41:05 -0000       1.13
  @@ -84,7 +84,7 @@
                                                columnNumber,
                                                
StylesheetConstructionContext::ELEMNAME_WITH_PARAM),
        m_selectPattern(0),
  -     m_qname()
  +     m_qname(0)
   {
        const unsigned int      nAttrs = atts.getLength();
   
  @@ -98,7 +98,10 @@
                }
                else if(equals(aname, Constants::ATTRNAME_NAME))
                {
  -                     m_qname = XalanQNameByValue(atts.getValue(i), 
stylesheetTree.getNamespaces());
  +                     m_qname = constructionContext.createXalanQName(
  +                                             atts.getValue(i),
  +                                             stylesheetTree.getNamespaces(),
  +                                             getLocator());
                }
                else if(!isAttrOK(aname, atts, i, constructionContext))
                {
  @@ -109,10 +112,17 @@
                }
        }
   
  -     if(m_qname.isEmpty() == true)
  +     if(m_qname == 0)
        {
                constructionContext.error(
                        "xsl:with-param must have a 'name' attribute",
  +                     0,
  +                     this);
  +     }
  +     else if (m_qname->isValid() == false)
  +     {
  +             constructionContext.error(
  +                     "xsl:with-param has an invalid 'name' attribute",
                        0,
                        this);
        }
  
  
  
  1.10      +4 -6      xml-xalan/c/src/XSLT/ElemWithParam.hpp
  
  Index: ElemWithParam.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemWithParam.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ElemWithParam.hpp 10 Jul 2002 05:09:48 -0000      1.9
  +++ ElemWithParam.hpp 3 Nov 2002 03:41:05 -0000       1.10
  @@ -69,10 +69,6 @@
   
   
   
  -#include <XPath/XalanQNameByValue.hpp>
  -
  -
  -
   class XPath;
   
   
  @@ -108,7 +104,9 @@
        const XalanQName&
        getQName() const
        {
  -             return m_qname;
  +             assert(m_qname != 0);
  +
  +             return *m_qname;
        }
   
        /**
  @@ -136,7 +134,7 @@
        // Data members...
        const XPath*            m_selectPattern;
   
  -     XalanQNameByValue       m_qname;
  +     const XalanQName*       m_qname;
   };
   
   
  
  
  
  1.84      +47 -15    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.83
  retrieving revision 1.84
  diff -u -r1.83 -r1.84
  --- Stylesheet.cpp    31 Oct 2002 08:12:04 -0000      1.83
  +++ Stylesheet.cpp    3 Nov 2002 03:41:05 -0000       1.84
  @@ -230,8 +230,9 @@
   
   void
   Stylesheet::processKeyElement(
  -                     ElemTemplateElement*                    nsContext,
  +                     const PrefixResolver&                   nsContext,
                        const AttributeList&                    atts,
  +                     const Locator*                                  locator,
                        StylesheetConstructionContext&  constructionContext)
   {
        const XalanDOMChar*     nameAttr = 0;
  @@ -254,7 +255,7 @@
                                        constructionContext.createMatchPattern(
                                                0,
                                                
XalanDOMString(atts.getValue(i)),
  -                                             *nsContext);
  +                                             nsContext);
                }
                else if(equals(aname, Constants::ATTRNAME_USE))
                {
  @@ -262,37 +263,54 @@
                                        constructionContext.createXPath(
                                                0,
                                                atts.getValue(i),
  -                                             *nsContext);
  +                                             nsContext);
                }
                else if (isAttrOK(aname, atts, i, constructionContext) == false)
                {
  -                     constructionContext.error("xsl:key has an illegal 
attribute");
  +                     constructionContext.error(
  +                             "xsl:key has an illegal attribute",
  +                             0,
  +                             locator);
                }
        }
   
        if(0 == nameAttr)
        {
  -             constructionContext.error("xsl:key requires a 'name' 
attribute");
  +             constructionContext.error(
  +                     "xsl:key requires a 'name' attribute",
  +                     0,
  +                     locator);
        }
   
        if(0 == matchAttr)
        {
  -             constructionContext.error("xsl:key requires a 'match' 
attribute");
  +             constructionContext.error(
  +                     "xsl:key requires a 'match' attribute",
  +                     0,
  +                     locator);
        }
   
        if(0 == useAttr)
        {
  -             constructionContext.error("xsl:key requires a 'use' attribute");
  +             constructionContext.error(
  +                     "xsl:key requires a 'use' attribute",
  +                     0,
  +                     locator);
        }
   
  -     const XalanQNameByValue         theQName(nameAttr, m_namespaces, 
constructionContext.getLocatorFromStack());
  +     const XalanQName* const         theQName =
  +             constructionContext.createXalanQName(nameAttr, m_namespaces, 
locator);
  +     assert(theQName != 0);
   
  -     if (theQName.isValid() == false)
  +     if (theQName->isValid() == false)
        {
  -             constructionContext.error("xsl:key has an invalid 'name' 
attribute");
  +             constructionContext.error(
  +                     "xsl:key has an invalid 'name' attribute",
  +                     0,
  +                     locator);
        }
   
  -     m_keyDeclarations.push_back(KeyDeclaration(theQName, *matchAttr, 
*useAttr));
  +     m_keyDeclarations.push_back(KeyDeclaration(*theQName, *matchAttr, 
*useAttr));
   }
   
   
  @@ -599,7 +617,21 @@
   {
        assert(theTemplate != 0);
   
  -     if(0 == m_firstTemplate)
  +     if (m_isWrapperless == true)
  +     {
  +             if (m_wrapperlessTemplate != 0)
  +             {
  +                     constructionContext.error(
  +                             "The stylesheet already has a wrapperless 
template",
  +                             0,
  +                             theTemplate);
  +             }
  +             else
  +             {
  +                     m_wrapperlessTemplate = theTemplate;
  +             }
  +     }
  +     else if(0 == m_firstTemplate)
        {
                m_firstTemplate = theTemplate;
        }
  @@ -624,7 +656,7 @@
   
        // If it's a named template, then we need to
        // and it to the map of named templates.
  -     const XalanQName&       theName = theTemplate->getName();
  +     const XalanQName&       theName = theTemplate->getNameAttribute();
   
        if(theName.isEmpty() == false)
        {
  @@ -1260,7 +1292,7 @@
                        {
                                const ParamVectorType::value_type&      arg = 
topLevelParams[k];
   
  -                             if(arg.getName().equals(var->getName()))
  +                             
if(arg.getName().equals(var->getNameAttribute()))
                                {
                                        isParam = true;
   
  @@ -1288,7 +1320,7 @@
   
                if (isParam == false)
                {
  -                     executionContext.pushVariable(var->getName(),
  +                     executionContext.pushVariable(var->getNameAttribute(),
                                                                                
  var,
                                                                                
  var->getParentNodeElem());
                }
  
  
  
  1.52      +7 -30     xml-xalan/c/src/XSLT/Stylesheet.hpp
  
  Index: Stylesheet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.hpp,v
  retrieving revision 1.51
  retrieving revision 1.52
  diff -u -r1.51 -r1.52
  --- Stylesheet.hpp    31 Oct 2002 08:12:04 -0000      1.51
  +++ Stylesheet.hpp    3 Nov 2002 03:41:05 -0000       1.52
  @@ -562,17 +562,6 @@
        }
   
        /**
  -      * Set the manufactured template to use if there is no wrapper.
  -      * 
  -      * @param templ template to use
  -      */
  -     void
  -     setWrapperlessTemplate(ElemTemplate*    templ)
  -     {
  -             m_wrapperlessTemplate = templ;
  -     }
  -
  -     /**
         * whether there is a wrapper template
         * 
         * @return true is there is a wrapper
  @@ -608,27 +597,16 @@
        /**
         * Process the xsl:key element.
         * 
  -      * @param nsContext               element providing context for 
namespaces
  -      * @param atts                            attribute list for element
  -      * @param constructionContext context for evaluation
  -      */
  -     /*
  -      * (Notes to myself)
  -      * What we need to do is:
  -      * 1) As this function is called, build a table of KeyDeclarations.
  -      * 2) During either XML processing, or upon request, walk the XML 
  -      * document tree, and build a hash table:
  -      * a) keyed by name,
  -      * b) each with a value of a hashtable, keyed by the value returned by 
  -      *        the use attribute,
  -      * c) each with a value that is a nodelist.
  -      * Thus, for a given key or keyref, look up hashtable by name, 
  -      * look up the nodelist by the given reference.
  +      * @param nsContext The PrefixResolver instance for namespace prefixes.
  +      * @param atts The attribute list for element.
  +      * #param locator The Locator instance for error reporting, if any.  
May be 0.    
  +      * @param constructionContext The current construction context.
         */
        void
        processKeyElement(
  -                     ElemTemplateElement*                    nsContext,
  +                     const PrefixResolver&                   nsContext,
                        const AttributeList&                    atts,
  +                     const Locator*                                  locator,
                        StylesheetConstructionContext&  constructionContext);
   
        /**
  @@ -903,8 +881,7 @@
        }
   
        /**
  -      * Set a top level variable, to be serialized with the rest of the
  -      * stylesheet.
  +      * Set a top level variable.
         *
         * @param var top-level variable declared with "xsl:variable" or
         *                        xsl:param-variable.
  
  
  
  1.18      +42 -5     xml-xalan/c/src/XSLT/StylesheetConstructionContext.hpp
  
  Index: StylesheetConstructionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetConstructionContext.hpp,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- StylesheetConstructionContext.hpp 31 Oct 2002 07:15:56 -0000      1.17
  +++ StylesheetConstructionContext.hpp 3 Nov 2002 03:41:05 -0000       1.18
  @@ -417,26 +417,47 @@
        /**
         * Given an name, determine if it is the xml:space attribute
         *
  -      * @param name a name
  +      * @param theAttributeName The name to check
  +      * @param theStylesheet The current Stylesheet instance
  +      * @param theLocator The Locator for error reporting.  May be 0.
  +      *
         * @return true if the string is the xml:space attribute name
         */
        virtual bool
        isXMLSpaceAttribute(
                        const XalanDOMChar*             theAttributeName,
                        const Stylesheet&               theStylesheet,
  -                     const Locator*                  theLocator) = 0;
  +                     const Locator*                  theLocator = 0) = 0;
   
        /**
         * Given an name, determine if it is the xsl:use-attribute-sets 
attribute
         *
  -      * @param name a name
  +      * @param theAttributeName The name to check
  +      * @param theStylesheet The current Stylesheet instance
  +      * @param theLocator The Locator for error reporting.  May be 0.
  +      *
         * @return true if the string is the xsl:use-attribute-sets attribute 
name
         */
        virtual bool
        isXSLUseAttributeSetsAttribute(
                        const XalanDOMChar*             theAttributeName,
                        const Stylesheet&               theStylesheet,
  -                     const Locator*                  theLocator) = 0;
  +                     const Locator*                  theLocator = 0) = 0;
  +
  +     /**
  +      * Given an name, determine if it is a valid QName
  +      *
  +      * @param theName The name to check
  +      * @param theStylesheet The current Stylesheet instance
  +      * @param theLocator The Locator for error reporting.  May be 0.
  +      *
  +      * @return true if the string is a valid QName.
  +      */
  +     virtual bool
  +     isValidQName(
  +                     const XalanDOMChar*             theName,
  +                     const Stylesheet&               theStylesheet,
  +                     const Locator*                  theLocator = 0) = 0;
   
        /**
         * Given an XSL tag name, return an integer token that corresponds to
  @@ -570,8 +591,24 @@
         * @return A pointer to the new instance
         */
        virtual const XalanQName*
  -     createXalanQNameByValue(
  +     createXalanQName(
                        const XalanDOMString&           qname,
  +                     const NamespacesStackType&      namespaces,
  +                     const Locator*                          locator = 0,
  +                     bool                                            
fUseDefault = false) = 0;
  +
  +     /**
  +      * Create a XalanQName-derived instance.
  +      *
  +      * @param qname The qname string
  +      * @param namespaces The stack of namespaces
  +      * @param Locator The current Locator, if any
  +      * @param fUseDefault If true, a qname without a prefix will use the 
default namespace
  +      * @return A pointer to the new instance
  +      */
  +     virtual const XalanQName*
  +     createXalanQName(
  +                     const XalanDOMChar*                     qname,
                        const NamespacesStackType&      namespaces,
                        const Locator*                          locator = 0,
                        bool                                            
fUseDefault = false) = 0;
  
  
  
  1.28      +29 -1     
xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.cpp
  
  Index: StylesheetConstructionContextDefault.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.cpp,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- StylesheetConstructionContextDefault.cpp  1 Nov 2002 16:51:26 -0000       
1.27
  +++ StylesheetConstructionContextDefault.cpp  3 Nov 2002 03:41:05 -0000       
1.28
  @@ -606,6 +606,21 @@
   
   
   
  +bool
  +StylesheetConstructionContextDefault::isValidQName(
  +                     const XalanDOMChar*             theName,
  +                     const Stylesheet&               theStylesheet,
  +                     const Locator*                  theLocator)
  +{
  +     assert(theName != 0);
  +
  +     m_scratchQName.set(theName, theStylesheet.getNamespaces(), theLocator, 
false);
  +
  +     return m_scratchQName.isValid();
  +}
  +
  +
  +
   int
   StylesheetConstructionContextDefault::getElementToken(const XalanDOMString&  
        name) const
   {
  @@ -784,8 +799,21 @@
   
   
   const XalanQName*
  -StylesheetConstructionContextDefault::createXalanQNameByValue(
  +StylesheetConstructionContextDefault::createXalanQName(
                        const XalanDOMString&           qname,
  +                     const NamespacesStackType&      namespaces,
  +                     const Locator*                          locator,
  +                     bool                                            
fUseDefault)
  +{
  +     return  m_xalanQNameByValueAllocator.create(qname, namespaces, locator, 
fUseDefault);
  +
  +}
  +
  +
  +
  +const XalanQName*
  +StylesheetConstructionContextDefault::createXalanQName(
  +                     const XalanDOMChar*                     qname,
                        const NamespacesStackType&      namespaces,
                        const Locator*                          locator,
                        bool                                            
fUseDefault)
  
  
  
  1.27      +16 -3     
xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.hpp
  
  Index: StylesheetConstructionContextDefault.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.hpp,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- StylesheetConstructionContextDefault.hpp  1 Nov 2002 01:36:28 -0000       
1.26
  +++ StylesheetConstructionContextDefault.hpp  3 Nov 2002 03:41:05 -0000       
1.27
  @@ -333,13 +333,19 @@
        isXMLSpaceAttribute(
                        const XalanDOMChar*             theAttributeName,
                        const Stylesheet&               theStylesheet,
  -                     const Locator*                  theLocator);
  +                     const Locator*                  theLocator = 0);
   
        virtual bool
        isXSLUseAttributeSetsAttribute(
                        const XalanDOMChar*             theAttributeName,
                        const Stylesheet&               theStylesheet,
  -                     const Locator*                  theLocator);
  +                     const Locator*                  theLocator = 0);
  +
  +     virtual bool
  +     isValidQName(
  +                     const XalanDOMChar*             theName,
  +                     const Stylesheet&               theStylesheet,
  +                     const Locator*                  theLocator = 0);
   
        virtual int
        getElementToken(const XalanDOMString&   name) const;
  @@ -396,8 +402,15 @@
        allocateAVTPartPointerVector(size_type  theLength);
   
        virtual const XalanQName*
  -     createXalanQNameByValue(
  +     createXalanQName(
                        const XalanDOMString&           qname,
  +                     const NamespacesStackType&      namespaces,
  +                     const Locator*                          locator = 0,
  +                     bool                                            
fUseDefault = false);
  +
  +     virtual const XalanQName*
  +     createXalanQName(
  +                     const XalanDOMChar*                     qname,
                        const NamespacesStackType&      namespaces,
                        const Locator*                          locator = 0,
                        bool                                            
fUseDefault = false);
  
  
  
  1.79      +83 -40    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.78
  retrieving revision 1.79
  diff -u -r1.78 -r1.79
  --- StylesheetExecutionContext.hpp    21 Sep 2002 01:24:41 -0000      1.78
  +++ StylesheetExecutionContext.hpp    3 Nov 2002 03:41:05 -0000       1.79
  @@ -164,6 +164,85 @@
        // These interfaces are new...
   
        /**
  +      * Report an error and throw an exception.
  +      * 
  +      * @param msg The text of the message.
  +      * @param styleNode The stylesheet node were the error occurred.
  +      * @param sourceNode The source node where the error occurred.  May be 
0.
  +      */
  +     virtual void
  +     error(
  +                     const XalanDOMString&           msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const = 0;
  +
  +     /**
  +      * Report an error and throw an exception.
  +      * 
  +      * @param msg The text of the message.
  +      * @param styleNode The stylesheet node were the error occurred.
  +      * @param sourceNode The source node where the error occurred.  May be 
0.
  +      */
  +     virtual void
  +     error(
  +                     const char*                                     msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const = 0;
  +
  +     /**
  +      * Report a  warning.
  +      * 
  +      * @param msg The text of the message.
  +      * @param styleNode The stylesheet node were the warning occurred.
  +      * @param sourceNode The source node where the warning occurred.  May 
be 0.
  +      */
  +     virtual void
  +     warn(
  +                     const XalanDOMString&           msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const = 0;
  +
  +     /**
  +      * Report a  warning.
  +      * 
  +      * @param msg The text of the message.
  +      * @param styleNode The stylesheet node were the warning occurred.
  +      * @param sourceNode The source node where the warning occurred.  May 
be 0.
  +      */
  +     virtual void
  +     warn(
  +                     const char*                                     msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const = 0;
  +
  +     /**
  +      * Report a  message.
  +      * 
  +      * @param msg The text of the message.
  +      * @param styleNode The stylesheet node were the message occurred.
  +      * @param sourceNode The source node where the message occurred.  May 
be 0.
  +      */
  +     virtual void
  +     message(
  +                     const XalanDOMString&           msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const = 0;
  +
  +
  +     /**
  +      * Report a  message.
  +      * 
  +      * @param msg The text of the message.
  +      * @param styleNode The stylesheet node were the message occurred.
  +      * @param sourceNode The source node where the message occurred.  May 
be 0.
  +      */
  +     virtual void
  +     message(
  +                     const char*                                     msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const = 0;
  +
  +     /**
         * Determine whether conflicts should be reported.
         * 
         * @return true if conflicts should not be warned
  @@ -1882,24 +1961,12 @@
        virtual void
        error(
                        const XalanDOMString&   msg,
  -                     const XalanNode*                sourceNode = 0,
  -                     const XalanNode*                styleNode = 0) const = 
0;
  -
  -     virtual void
  -     error(
  -                     const XalanDOMString&   msg,
                        const XalanNode*                sourceNode,
                        const Locator*                  locator) const = 0;
   
        virtual void
        error(
                        const char*                     msg,
  -                     const XalanNode*        sourceNode = 0,
  -                     const XalanNode*        styleNode = 0) const = 0;
  -
  -     virtual void
  -     error(
  -                     const char*                     msg,
                        const XalanNode*        sourceNode,
                        const Locator*          locator) const = 0;
   
  @@ -1907,49 +1974,25 @@
        warn(
                        const XalanDOMString&   msg,
                        const XalanNode*                sourceNode = 0,
  -                     const XalanNode*                styleNode = 0) const = 
0;
  -
  -     virtual void
  -     warn(
  -                     const XalanDOMString&   msg,
  -                     const XalanNode*                sourceNode,
  -                     const Locator*                  locator) const = 0;
  +                     const Locator*                  locator = 0) const = 0;
   
        virtual void
        warn(
                        const char*                     msg,
                        const XalanNode*        sourceNode = 0,
  -                     const XalanNode*        styleNode = 0) const = 0;
  -
  -     virtual void
  -     warn(
  -                     const char*                     msg,
  -                     const XalanNode*        sourceNode,
  -                     const Locator*          locator) const = 0;
  +                     const Locator*          locator = 0) const = 0;
   
        virtual void
        message(
                        const XalanDOMString&   msg,
                        const XalanNode*                sourceNode = 0,
  -                     const XalanNode*                styleNode = 0) const = 
0;
  -
  -     virtual void
  -     message(
  -                     const XalanDOMString&   msg,
  -                     const XalanNode*        sourceNode,
  -                     const Locator*          locator) const = 0;
  +                     const Locator*                  locator = 0) const = 0;
   
        virtual void
        message(
                        const char*                     msg,
                        const XalanNode*        sourceNode = 0,
  -                     const XalanNode*        styleNode = 0) const = 0;
  -
  -     virtual void
  -     message(
  -                     const char*                     msg,
  -                     const XalanNode*        sourceNode,
  -                     const Locator*          locator) const = 0;
  +                     const Locator*          locator = 0) const = 0;
   };
   
   
  
  
  
  1.104     +49 -24    
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.103
  retrieving revision 1.104
  diff -u -r1.103 -r1.104
  --- StylesheetExecutionContextDefault.cpp     25 Sep 2002 01:36:53 -0000      
1.103
  +++ StylesheetExecutionContextDefault.cpp     3 Nov 2002 03:41:05 -0000       
1.104
  @@ -2166,13 +2166,13 @@
   
   void
   StylesheetExecutionContextDefault::error(
  -                     const XalanDOMString&   msg,
  -                     const XalanNode*                sourceNode,
  -                     const XalanNode*                styleNode) const
  +                     const XalanDOMString&           msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode) 
const
   {
        assert(m_xsltProcessor != 0);
   
  -     m_xsltProcessor->error(msg, sourceNode, styleNode);
  +     m_xsltProcessor->error(msg, sourceNode != 0 ? sourceNode : 
getCurrentNode(), &styleNode);
   }
   
   
  @@ -2185,6 +2185,11 @@
   {
        assert(m_xsltProcessor != 0);
   
  +     if (sourceNode == 0)
  +     {
  +             sourceNode = getCurrentNode();
  +     }
  +
        if (locator != 0)
        {
                m_xsltProcessor->error(msg, *locator, sourceNode);
  @@ -2199,11 +2204,11 @@
   
   void
   StylesheetExecutionContextDefault::error(
  -                     const char*                     msg,
  -                     const XalanNode*        sourceNode,
  -                     const XalanNode*        styleNode) const
  +                     const char*                                     msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode) 
const
   {
  -     error(TranscodeFromLocalCodePage(msg), sourceNode, styleNode);
  +     error(TranscodeFromLocalCodePage(msg), styleNode, sourceNode);
   }
   
   
  @@ -2221,13 +2226,18 @@
   
   void
   StylesheetExecutionContextDefault::warn(
  -                     const XalanDOMString&   msg,
  -                     const XalanNode*                sourceNode,
  -                     const XalanNode*                styleNode) const
  +                     const XalanDOMString&           msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode) 
const
   {
        assert(m_xsltProcessor != 0);
   
  -     m_xsltProcessor->warn(msg, sourceNode, styleNode);
  +     if (sourceNode == 0)
  +     {
  +             sourceNode = getCurrentNode();
  +     }
  +
  +     m_xsltProcessor->warn(msg, sourceNode, &styleNode);
   }
   
   
  @@ -2240,6 +2250,11 @@
   {
        assert(m_xsltProcessor != 0);
   
  +     if (sourceNode == 0)
  +     {
  +             sourceNode = getCurrentNode();
  +     }
  +
        if (locator != 0)
        {
                m_xsltProcessor->warn(msg, *locator, sourceNode);
  @@ -2254,11 +2269,11 @@
   
   void
   StylesheetExecutionContextDefault::warn(
  -                     const char*                     msg,
  -                     const XalanNode*        sourceNode,
  -                     const XalanNode*        styleNode) const
  +                     const char*                                     msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode) 
const
   {
  -     warn(TranscodeFromLocalCodePage(msg), sourceNode, styleNode);
  +     warn(TranscodeFromLocalCodePage(msg), styleNode, sourceNode);
   }
   
   
  @@ -2276,13 +2291,18 @@
   
   void
   StylesheetExecutionContextDefault::message(
  -                     const XalanDOMString&   msg,
  -                     const XalanNode*                sourceNode,
  -                     const XalanNode*                styleNode) const
  +                     const XalanDOMString&           msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode) 
const
   {
        assert(m_xsltProcessor != 0);
   
  -     m_xsltProcessor->message(msg, sourceNode, styleNode);
  +     if (sourceNode == 0)
  +     {
  +             sourceNode = getCurrentNode();
  +     }
  +
  +     m_xsltProcessor->message(msg, sourceNode, &styleNode);
   }
   
   
  @@ -2295,6 +2315,11 @@
   {
        assert(m_xsltProcessor != 0);
   
  +     if (sourceNode == 0)
  +     {
  +             sourceNode = getCurrentNode();
  +     }
  +
        if (locator != 0)
        {
                m_xsltProcessor->message(msg, *locator, sourceNode);
  @@ -2309,11 +2334,11 @@
   
   void
   StylesheetExecutionContextDefault::message(
  -                     const char*                     msg,
  -                     const XalanNode*        sourceNode,
  -                     const XalanNode*        styleNode) const
  +                     const char*                                     msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode) 
const
   {
  -     message(TranscodeFromLocalCodePage(msg), sourceNode, styleNode);
  +     message(TranscodeFromLocalCodePage(msg), styleNode, sourceNode);
   }
   
   
  
  
  
  1.84      +36 -36    
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.83
  retrieving revision 1.84
  diff -u -r1.83 -r1.84
  --- StylesheetExecutionContextDefault.hpp     21 Sep 2002 01:24:41 -0000      
1.83
  +++ StylesheetExecutionContextDefault.hpp     3 Nov 2002 03:41:06 -0000       
1.84
  @@ -280,6 +280,42 @@
   
        // These interfaces are inherited from StylesheetExecutionContext...
   
  +     virtual void
  +     error(
  +                     const XalanDOMString&           msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const;
  +
  +     virtual void
  +     error(
  +                     const char*                                     msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const;
  +
  +     virtual void
  +     warn(
  +                     const XalanDOMString&           msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const;
  +
  +     virtual void
  +     warn(
  +                     const char*                                     msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const;
  +
  +     virtual void
  +     message(
  +                     const XalanDOMString&           msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const;
  +
  +     virtual void
  +     message(
  +                     const char*                                     msg,
  +                     const ElemTemplateElement&      styleNode,
  +                     const XalanNode*                        sourceNode = 0) 
const;
  +
        virtual bool
        getQuietConflictWarnings() const;
   
  @@ -939,68 +975,32 @@
        virtual void
        error(
                        const XalanDOMString&   msg,
  -                     const XalanNode*                sourceNode = 0,
  -                     const XalanNode*                styleNode = 0) const;
  -
  -     virtual void
  -     error(
  -                     const XalanDOMString&   msg,
                        const XalanNode*                sourceNode,
                        const Locator*                  locator) const;
   
        virtual void
        error(
                        const char*                     msg,
  -                     const XalanNode*        sourceNode = 0,
  -                     const XalanNode*        styleNode = 0) const;
  -
  -     virtual void
  -     error(
  -                     const char*                     msg,
                        const XalanNode*        sourceNode,
                        const Locator*          locator) const;
   
        virtual void
        warn(
                        const XalanDOMString&   msg,
  -                     const XalanNode*                sourceNode = 0,
  -                     const XalanNode*                styleNode = 0) const;
  -
  -     virtual void
  -     warn(
  -                     const XalanDOMString&   msg,
                        const XalanNode*                sourceNode,
                        const Locator*                  locator) const;
   
        virtual void
        warn(
                        const char*                     msg,
  -                     const XalanNode*        sourceNode = 0,
  -                     const XalanNode*        styleNode = 0) const;
  -
  -     virtual void
  -     warn(
  -                     const char*                     msg,
                        const XalanNode*        sourceNode,
                        const Locator*          locator) const;
   
        virtual void
        message(
                        const XalanDOMString&   msg,
  -                     const XalanNode*                sourceNode = 0,
  -                     const XalanNode*                styleNode = 0) const;
  -
  -     virtual void
  -     message(
  -                     const XalanDOMString&   msg,
                        const XalanNode*        sourceNode,
                        const Locator*          locator) const;
  -
  -     virtual void
  -     message(
  -                     const char*                     msg,
  -                     const XalanNode*        sourceNode = 0,
  -                     const XalanNode*        styleNode = 0) const;
   
        virtual void
        message(
  
  
  
  1.93      +222 -177  xml-xalan/c/src/XSLT/StylesheetHandler.cpp
  
  Index: StylesheetHandler.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.cpp,v
  retrieving revision 1.92
  retrieving revision 1.93
  diff -u -r1.92 -r1.93
  --- StylesheetHandler.cpp     31 Oct 2002 07:15:56 -0000      1.92
  +++ StylesheetHandler.cpp     3 Nov 2002 03:41:06 -0000       1.93
  @@ -129,6 +129,10 @@
   
   
   
  +typedef StylesheetConstructionContext::GetAndReleaseCachedString     
GetAndReleaseCachedString;
  +
  +
  +
   StylesheetHandler::StylesheetHandler(
                        Stylesheet&                                             
stylesheetTree,
                        StylesheetConstructionContext&  constructionContext) :
  @@ -137,10 +141,9 @@
        m_constructionContext(constructionContext),
        m_elemStack(),
        m_elemStackParentedElements(),
  -     m_strayElements(),
        m_whiteSpaceElems(),
        m_pTemplate(0),
  -     m_lastPopped(0),        
  +     m_lastPopped(),
        m_inTemplate(false),
        m_foundStylesheet(false),
        m_foundNotImport(false),
  @@ -148,11 +151,6 @@
        m_accumulateText(),
        m_includeBase(stylesheetTree.getBaseIdentifier()),
        m_inExtensionElementStack(),
  -     m_inLXSLTScript(false),
  -     m_LXSLTScriptBody(),
  -     m_LXSLTScriptLang(),
  -     m_LXSLTScriptSrcURL(),
  -     m_pLXSLTExtensionNSH(0),
        m_locatorsPushed(0),
        m_globalVariableNames(),
        m_inScopeVariableNamesStack()
  @@ -200,18 +198,11 @@
                         m_whiteSpaceElems.end(),
                         DeleteFunctor<ElemTextLiteral>());
   
  -     // Clean up the stray elements.
  -     for_each(m_strayElements.begin(),
  -                      m_strayElements.end(),
  -                      DeleteFunctor<ElemTemplateElement>());
  -
        // Clean up any template that's left over...
        if (m_pTemplate != m_stylesheet.getWrapperlessTemplate())
        {
                delete m_pTemplate;
        }
  -
  -     m_elemStackParentedElements.clear();
   }
   
   
  @@ -224,12 +215,16 @@
   }
   
   
  -void StylesheetHandler::startDocument()
  +
  +void
  +StylesheetHandler::startDocument()
   {
   }
   
   
  -void StylesheetHandler::endDocument()
  +
  +void
  +StylesheetHandler::endDocument()
   {
        m_constructionContext.popLocatorStack();
   
  @@ -409,7 +404,7 @@
   
                        if(!m_inTemplate)
                        {
  -                             processTopLevelElement(name, 
m_elementLocalName, ns, atts, xslToken, locator, fPreserveSpace, 
fSpaceAttrProcessed);
  +                             processTopLevelElement(name, atts, xslToken, 
locator, fPreserveSpace, fSpaceAttrProcessed);
                        }
                        else
                        {
  @@ -526,7 +521,7 @@
             
                                case 
StylesheetConstructionContext::ELEMNAME_VARIABLE:
                                        {
  -                                             XalanAutoPtr<ElemVariable>      
newVar(
  +                                             
XalanAutoPtr<ElemTemplateElement>       newVar(
                                                        new ElemVariable(
                                                                        
m_constructionContext,
                                                                        
m_stylesheet,
  @@ -534,7 +529,7 @@
                                                                        
lineNumber,
                                                                        
columnNumber));
   
  -                                             
checkForOrAddVariableName(newVar->getName(), locator);
  +                                             
checkForOrAddVariableName(newVar->getNameAttribute(), locator);
   
                                                elem = newVar.release();
                                        }
  @@ -571,7 +566,11 @@
                                        {
                                                ElemTemplateElement* const      
parent = m_elemStack.back();
   
  -                                             
if(StylesheetConstructionContext::ELEMNAME_CHOOSE == parent->getXSLToken())
  +                                             
if(StylesheetConstructionContext::ELEMNAME_CHOOSE != parent->getXSLToken())
  +                                             {
  +                                                     error("xsl:when not 
parented by xsl:choose.", locator);
  +                                             }
  +                                             else
                                                {
                                                        ElemTemplateElement* 
const      lastChild = parent->getLastChildElem();
   
  @@ -585,13 +584,9 @@
                                                        }
                                                        else
                                                        {
  -                                                             
error("(StylesheetHandler) misplaced xsl:when.", locator);
  +                                                             
error("Misplaced xsl:when", locator);
                                                        }
                                                }
  -                                             else
  -                                             {
  -                                                     
error("(StylesheetHandler) xsl:when not parented by xsl:choose.", locator);
  -                                             }
                                        }
                                        break;
             
  @@ -599,7 +594,11 @@
                                        {
                                                ElemTemplateElement* parent = 
m_elemStack.back();
   
  -                                             
if(StylesheetConstructionContext::ELEMNAME_CHOOSE == parent->getXSLToken())
  +                                             
if(StylesheetConstructionContext::ELEMNAME_CHOOSE != parent->getXSLToken())
  +                                             {
  +                                                     error("xsl:otherwise 
not parented by xsl:choose.", locator);
  +                                             }
  +                                             else
                                                {
                                                        ElemTemplateElement* 
lastChild = parent->getLastChildElem();
   
  @@ -616,10 +615,6 @@
                                                                
error("Misplaced xsl:otherwise.", locator);
                                                        }
                                                }
  -                                             else
  -                                             {
  -                                                     error("xsl:otherwise 
not parented by xsl:choose.", locator);
  -                                             }
                                        }
                                        break;
   
  @@ -636,8 +631,6 @@
                                        break;
   
                                case 
StylesheetConstructionContext::ELEMNAME_TEXT:
  -                               // Just push the element on the stack to 
signal
  -                               // that space should be preserved.
                                        m_elemStack.push_back(new 
ElemText(m_constructionContext,
                                                                                
        m_stylesheet,
                                                                                
        atts, lineNumber, columnNumber));
  @@ -684,25 +677,21 @@
                                case 
StylesheetConstructionContext::ELEMNAME_PRESERVE_SPACE:
                                case 
StylesheetConstructionContext::ELEMNAME_STRIP_SPACE:
                                        {
  -                                             const XalanDOMString    
msg(XalanDOMString(name) + " is not allowed inside a template.");
  -
  -                                             error(msg, locator);
  +                                             error(name, 
XALAN_STATIC_UCODE_STRING(" is not allowed inside a template."), locator);
                                        }
                                        break;
   
                                default:
                                        {
  -                                             const XalanDOMString    
msg("Unknown XSL element: " + m_elementLocalName);
  -
                                                // If this stylesheet is 
declared to be of a higher version than the one
                                                // supported, don't flag an 
error.
                                                
if(m_constructionContext.getXSLTVersionSupported() < 
m_stylesheet.getXSLTVerDeclared())
                                                {
  -                                                     
m_constructionContext.warn(msg);
  +                                                     warn(name, 
XALAN_STATIC_UCODE_STRING(" is an unknown XSL element."), locator);
                                                }
                                                else
                                                {
  -                                                     error(msg, locator);
  +                                                     error(name, 
XALAN_STATIC_UCODE_STRING(" is an unknown XSL element."), locator);
                                                }
                                        }
                                }
  @@ -858,11 +847,11 @@
   
        m_inScopeVariableNamesStack.push_back(QNameSetVectorType::value_type());
   
  -     m_stylesheet.setWrapperlessTemplate(m_pTemplate);
  -
        m_foundStylesheet = true;
        m_stylesheet.setWrapperless(true);
   
  +     m_pTemplate->addToStylesheet(m_constructionContext, m_stylesheet);
  +
        // This attempts to optimize for a literal result element with
        // the name HTML, so we don't have to switch on-the-fly.
        if(equalsIgnoreCaseASCII(name, Constants::ELEMNAME_HTML_STRING) == true)
  @@ -920,8 +909,6 @@
   void
   StylesheetHandler::processTopLevelElement(
                        const XalanDOMChar*             name,
  -                     const XalanDOMString&   localName,
  -                     const XalanDOMString&   ns,
                        const AttributeList&    atts,
                        int                                             
xslToken,
                        const Locator*                  locator,
  @@ -954,17 +941,10 @@
                
m_inScopeVariableNamesStack.push_back(QNameSetVectorType::value_type());
                break;
   
  -     case StylesheetConstructionContext::ELEMNAME_EXTENSION:
  -             if(!equalsIgnoreCaseASCII(ns, 
m_constructionContext.getXalanXSLNameSpaceURL()))
  -             {
  -                     m_constructionContext.warn("Old syntax: the functions 
instruction should use a url of " + 
m_constructionContext.getXalanXSLNameSpaceURL());
  -             }
  -             break;
  -
        case StylesheetConstructionContext::ELEMNAME_VARIABLE:
        case StylesheetConstructionContext::ELEMNAME_PARAM:
                {
  -                     ElemVariable* varelem = 
(StylesheetConstructionContext::ELEMNAME_PARAM == xslToken) 
  +                     ElemTemplateElement* const      elem = 
(StylesheetConstructionContext::ELEMNAME_PARAM == xslToken) 
                                                                           ? 
new ElemParam(m_constructionContext,
                                                                                
                           m_stylesheet,
                                                                                
                           atts, 
  @@ -974,19 +954,17 @@
                                                                                
                                        atts, 
                                                                                
                                        lineNumber, columnNumber);
   
  -                     XalanAutoPtr<ElemVariable>      newVar(varelem);
  +                     XalanAutoPtr<ElemTemplateElement>       newVar(elem);
   
  -                     checkForOrAddVariableName(varelem->getName(), locator);
  +                     checkForOrAddVariableName(elem->getNameAttribute(), 
locator);
   
  -                     m_elemStack.push_back(varelem);
  +                     m_elemStack.push_back(elem);
                        m_inTemplate = true; // fake it out
                        
m_inScopeVariableNamesStack.push_back(QNameSetVectorType::value_type());
  -                     m_stylesheet.setTopLevelVariable(varelem);
  -                     m_elemStackParentedElements.insert(varelem);
  +                     elem->addToStylesheet(m_constructionContext, 
m_stylesheet);
  +                     m_elemStackParentedElements.insert(elem);
   
                        newVar.release();
  -
  -                     varelem->setTopLevel(true);
                }
        break;
   
  @@ -997,9 +975,11 @@
   
        case StylesheetConstructionContext::ELEMNAME_KEY:
                {
  -                     ElemEmpty nsContext(m_constructionContext, 
m_stylesheet, lineNumber, columnNumber);
  -
  -                     m_stylesheet.processKeyElement(&nsContext, atts, 
m_constructionContext);
  +                     m_stylesheet.processKeyElement(
  +                             
XalanQName::PrefixResolverProxy(m_stylesheet.getNamespaces(), 
m_stylesheet.getURI()),
  +                             atts,
  +                             locator,
  +                             m_constructionContext);
                }
                break;
   
  @@ -1066,9 +1046,7 @@
        case StylesheetConstructionContext::ELEMNAME_APPLY_IMPORTS:
                if (inExtensionElement() == false)
                {
  -                     const XalanDOMString    msg("(StylesheetHandler) " + 
XalanDOMString(name) + " not allowed inside a stylesheet.");
  -                             
  -                     error(msg, locator);
  +                     error(name, XALAN_STATIC_UCODE_STRING(" is not allowed 
inside a stylesheet."), locator);
                }
                break;
   
  @@ -1079,9 +1057,7 @@
        default:
                if (inExtensionElement() == false)
                {
  -                     const XalanDOMString    msg("Unknown XSL element: " + 
localName);
  -
  -                     error(msg, locator);
  +                     error(name, XALAN_STATIC_UCODE_STRING(" is an unknown 
XSL element"), locator);
                }
                break;
        }
  @@ -1113,11 +1089,13 @@
                }
                else if(equals(aname, 
Constants::ATTRNAME_EXTENSIONELEMENTPREFIXES))
                {
  +                     const GetAndReleaseCachedString         
theGuard(m_constructionContext);
  +
  +                     XalanDOMString&         prefix = theGuard.get();
  +
                        StringTokenizer tokenizer(atts.getValue(i),
                                                                          
Constants::DEFAULT_WHITESPACE_SEPARATOR_STRING);
   
  -                     XalanDOMString  prefix;
  -
                        while(tokenizer.hasMoreTokens() == true)
                        {
                                tokenizer.nextToken(prefix);
  @@ -1150,13 +1128,7 @@
                {
                        if(false == m_stylesheet.isWrapperless())
                        {
  -                             const XalanDOMString    msg(
  -                                     "(StylesheetHandler) " +
  -                                     XalanDOMString(name) + 
  -                                     " has an illegal attribute: " +
  -                                     aname);
  -
  -                             error(msg, locator);
  +                             illegalAttributeError(name, aname, locator);
                        }
                }
   
  @@ -1237,8 +1209,6 @@
                        const Locator*                  locator,
                        int                                             
xslToken)
   {
  -     ElemEmpty nsNode(m_constructionContext, m_stylesheet, 
getLineNumber(locator), getColumnNumber(locator));
  -
        const unsigned int      nAttrs = atts.getLength();
   
        bool foundIt = false;
  @@ -1256,17 +1226,24 @@
                        StringTokenizer         tokenizer(atts.getValue(i),
                                                                                
  Constants::DEFAULT_WHITESPACE_SEPARATOR_STRING);
   
  +                     const GetAndReleaseCachedString         
theGuard(m_constructionContext);
  +
  +                     XalanDOMString&         wildcardName = theGuard.get();
  +
                        while(tokenizer.hasMoreTokens())
                        {
                                // Use only the root, at least for right now.
  -                             const XalanDOMString    wildcardName = 
tokenizer.nextToken();
  +                             tokenizer.nextToken(wildcardName);
   
                                /**
                                 * Creating a match pattern is too much 
overhead, but it's a reasonably 
                                 * easy and safe way to do this right now.
                                 */
                                const XPath* const      matchPat =
  -                                             
m_constructionContext.createMatchPattern(0, wildcardName, nsNode);
  +                                             
m_constructionContext.createMatchPattern(
  +                                                             0,
  +                                                             wildcardName,
  +                                                             
XalanQName::PrefixResolverProxy(m_stylesheet.getNamespaces(), 
m_stylesheet.getURI()));
   
                                if(isPreserveSpace == true)
                                {
  @@ -1280,18 +1257,13 @@
                }
                else if(!isAttrOK(aname, atts, i))
                {
  -                     const XalanDOMString    msg(XalanDOMString(name) + " 
has an illegal attribute: " + aname);
  -
  -                     error(msg, locator);
  +                     illegalAttributeError(name, aname, locator);
                }
        }
   
        if(!foundIt && inExtensionElement() == false)
        {
  -             const XalanDOMString    msg("(StylesheetHandler) " + 
XalanDOMString(name) +
  -                     " requires a " + Constants::ATTRNAME_ELEMENTS + " 
attribute.");
  -
  -             error(msg, locator);
  +             error("xsl:strip-space or xsl:preserve-space requires an 
elements attribute", locator);
        }
   }
   
  @@ -1335,25 +1307,11 @@
        {
                if (e.getExceptionCode() == 
XalanDOMException::HIERARCHY_REQUEST_ERR)
                {
  -                     // $$$ ToDo: There is a bug in the version of gcc that
  -                     // we're using when the optimizer is enabled.  
Constructing
  -                     // this error message from the parameter results in an 
internal
  -                     // compiler error, so I'm using a local variable 
instead.
  -#if defined(__GNUC__)
  -                     const ElemTemplateElement* const        localElem = 
elem;
  -
  -                     XalanDOMString  theMessage(localElem->getElementName());
  -
  -#else
  -                     XalanDOMString  theMessage(elem->getElementName());
  -#endif
  -
  -                     append(theMessage, " is not allowed at this position in 
the stylesheet");
  -
  -                     error(theMessage, locator);
  +                     error(
  +                             elem->getElementName(),
  +                             XALAN_STATIC_UCODE_STRING(" is not allowed at 
this position in the stylesheet"),
  +                             locator);
                }
  -
  -             throw;
        }
   
        m_elemStackParentedElements.insert(elem);
  @@ -1378,6 +1336,8 @@
                m_elemStackParentedElements.erase(m_elemStack.back());
                m_elemStack.pop_back();
        }
  +
  +     m_lastPopped = 0;
   }
   
   
  @@ -1427,9 +1387,17 @@
                                error("Imports can only occur as the first 
elements in the stylesheet.", locator);
                        }
   
  -                     const XalanDOMString    saved_XSLNameSpaceURL = 
m_stylesheet.getXSLTNamespaceURI();
  +                     const GetAndReleaseCachedString         
theGuard1(m_constructionContext);
   
  -                     const XalanDOMString    href(atts.getValue(i));
  +                     XalanDOMString&         saved_XSLNameSpaceURL = 
theGuard1.get();
  +
  +                     saved_XSLNameSpaceURL = 
m_stylesheet.getXSLTNamespaceURI();
  +
  +                     const GetAndReleaseCachedString         
theGuard2(m_constructionContext);
  +
  +                     XalanDOMString&         href = theGuard2.get();
  +
  +                     href = atts.getValue(i);
   
                        Stylesheet::URLStackType&       includeStack = 
m_stylesheet.getIncludeStack();
                        assert(includeStack.empty() == false);
  @@ -1441,9 +1409,11 @@
   
                        if(stackContains(importStack, hrefUrl))
                        {
  -                             const XalanDOMString    msg(hrefUrl + " is 
directly or indirectly importing itself.");
  +                             // Just reuse the href string...
  +                             href = hrefUrl;
  +                             href += XALAN_STATIC_UCODE_STRING(" is directly 
or indirectly importing itself.");
   
  -                             error(msg, locator);
  +                             error(href, locator);
                        }
   
                        importStack.push_back(hrefUrl);
  @@ -1469,21 +1439,18 @@
                }
                else if(!isAttrOK(aname, atts, i))
                {
  -                     const XalanDOMString    msg(XalanDOMString(name) + " 
has an illegal attribute: " + aname);
  -
  -                     error(msg, locator);
  +                     illegalAttributeError(name, aname, locator);
                }
        }
   
        if(!foundIt)
        {
  -             const XalanDOMString    msg("Could not find href attribute for 
" + XalanDOMString(name));
  -
  -             error(msg, locator);
  +             error("xsl:import requires an href attribute", locator);
        }
   }
   
   
  +
   void
   StylesheetHandler::processInclude(
                        const XalanDOMChar*             name,
  @@ -1525,27 +1492,21 @@
                }
                else if(!isAttrOK(aname, atts, i))
                {
  -                     const XalanDOMString    msg(XalanDOMString(name) + " 
has an illegal attribute: " + aname);
  -
  -                     error(msg, locator);
  +                     illegalAttributeError(name, aname, locator);
                }
        }
   
        if(!foundIt)
        {
  -             const XalanDOMString    msg("Could not find href attribute for 
" + XalanDOMString(name));
  -
  -             error(msg, locator);
  +             error("xsl:include requires an href attribute", locator);
        }
   }
   
   
   
   void
  -StylesheetHandler::endElement(const XMLCh* const name)
  +StylesheetHandler::endElement(const XMLCh* const /* name */)
   {
  -     const Locator* const    locator = 
m_constructionContext.getLocatorFromStack();
  -
   #if !defined(XALAN_NO_NAMESPACES)
        using std::for_each;
   #endif
  @@ -1564,8 +1525,11 @@
        assert(m_elemStack.empty() == false);
   
        m_lastPopped = m_elemStack.back();
  +
  +     assert(m_lastPopped != 0);
  +
        m_elemStack.pop_back();
  -     m_elemStackParentedElements.erase(m_lastPopped);
  +     m_elemStackParentedElements.erase(m_lastPopped.get());
        m_lastPopped->finishedConstruction();
   
        const int tok = m_lastPopped->getXSLToken();
  @@ -1580,19 +1544,13 @@
        if(StylesheetConstructionContext::ELEMNAME_TEMPLATE == tok)
        {
                m_inTemplate = false;
  -             m_stylesheet.addTemplate(m_pTemplate, m_constructionContext);
  +             m_pTemplate->addToStylesheet(m_constructionContext, 
m_stylesheet);
                m_pTemplate = 0;
        }
        else if((StylesheetConstructionContext::ELEMNAME_PARAM == tok) ||
                         StylesheetConstructionContext::ELEMNAME_VARIABLE == 
tok)
        {
  -#if defined(XALAN_OLD_STYLE_CASTS)
  -             const ElemVariable* const       var = (const 
ElemVariable*)m_lastPopped;
  -#else
  -             const ElemVariable* const       var = static_cast<const 
ElemVariable*>(m_lastPopped);
  -#endif
  -
  -             if(var->isTopLevel() == true)
  +             if(m_lastPopped->getParentNode() == 0)
                {
                        // Top-level param or variable
                        m_inTemplate = false;
  @@ -1602,40 +1560,6 @@
        {
                m_inTemplate = false;
        }
  -     else if (tok == StylesheetConstructionContext::ELEMNAME_UNDEFINED ||
  -                      tok == StylesheetConstructionContext::ELEMNAME_TEXT)
  -     {
  -             // These are stray elements, so stuff them away
  -             // to be deleted when we're finished...
  -             m_strayElements.push_back(m_lastPopped);
  -     }
  -
  -     // BEGIN SANJIVA CODE
  -     if (m_inLXSLTScript) 
  -     {
  -             if (isEmpty(m_LXSLTScriptLang)) 
  -             {
  -                     const XalanDOMString    msg(XalanDOMString(name) + " 
attribute \'lang\' is missing");
  -
  -                     error(msg, locator);
  -             }
  -             if (m_pLXSLTExtensionNSH == 0) 
  -             {
  -                     const XalanDOMString    msg("(StylesheetHandler) 
misplaced " + XalanDOMString(name) + " element?? Missing container element " + 
"'component'");
  -
  -                     error(msg, locator);
  -             }
  -
  -             m_pLXSLTExtensionNSH->setScript(m_LXSLTScriptLang, 
m_LXSLTScriptSrcURL, m_LXSLTScriptBody);
  -             
  -             // reset state
  -             m_inLXSLTScript = false;
  -             clear(m_LXSLTScriptLang);
  -             clear(m_LXSLTScriptSrcURL);
  -             clear(m_LXSLTScriptBody);
  -             m_pLXSLTExtensionNSH = 0;
  -     }
  -     // END SANJIVA CODE
   
        assert(m_inExtensionElementStack.empty() == false);
   
  @@ -1813,7 +1737,7 @@
                                const bool      isLastPoppedXSLText = 
(m_lastPopped != 0) &&
                                                
(StylesheetConstructionContext::ELEMNAME_TEXT == m_lastPopped->getXSLToken());
   
  -                             if(isPrevCharData && ! isLastPoppedXSLText)
  +                             if(isPrevCharData == true && 
isLastPoppedXSLText == false)
                                {
                                        appendChildElementToParent(
                                                parent,
  @@ -1833,11 +1757,6 @@
                        }
                }
        }
  -     else if (m_inLXSLTScript)
  -     {
  -             append(m_LXSLTScriptBody, chars);
  -     }
  -
        // TODO: Flag error if text inside of stylesheet
   }
   
  @@ -1911,12 +1830,116 @@
   
   
   
  +void
  +StylesheetHandler::error(
  +                     const XalanDOMChar*             theMessage1,
  +                     const XalanDOMChar*             theMessage2,
  +                     const Locator*                  theLocator) const
  +{
  +     const GetAndReleaseCachedString         theGuard(m_constructionContext);
  +
  +     XalanDOMString&         msg = theGuard.get();
  +
  +     msg = theMessage1;
  +     msg += theMessage2;
  +
  +     error(msg, theLocator);
  +}
  +
  +
  +
  +
  +void
  +StylesheetHandler::error(
  +                     const XalanDOMChar*             theMessage1,
  +                     const XalanDOMString&   theMessage2,
  +                     const Locator*                  theLocator) const
  +{
  +     error(theMessage1, theMessage2.c_str(), theLocator);
  +}
  +
  +
  +
  +void
  +StylesheetHandler::error(
  +                     const XalanDOMString&   theMessage1,
  +                     const XalanDOMChar*             theMessage2,
  +                     const Locator*                  theLocator) const
  +{
  +     error(theMessage1.c_str(), theMessage2, theLocator);
  +}
  +
  +
  +
  +
  +void
  +StylesheetHandler::error(
  +                     const XalanDOMString&   theMessage1,
  +                     const XalanDOMString&   theMessage2,
  +                     const Locator*                  theLocator) const
  +{
  +     error(theMessage1.c_str(), theMessage2.c_str(), theLocator);
  +}
  +
  +
  +
  +void
  +StylesheetHandler::warn(
  +                     const XalanDOMChar*             theMessage1,
  +                     const XalanDOMString&   theMessage2,
  +                     const Locator*                  theLocator) const
  +{
  +     warn(theMessage1, theMessage2.c_str(), theLocator);
  +}
  +
  +
  +
  +
  +void
  +StylesheetHandler::warn(
  +                     const XalanDOMChar*             theMessage1,
  +                     const XalanDOMChar*             theMessage2,
  +                     const Locator*                  theLocator) const
  +{
  +     const GetAndReleaseCachedString         theGuard(m_constructionContext);
  +
  +     XalanDOMString&         msg = theGuard.get();
  +
  +     msg = theMessage1;
  +     msg += theMessage2;
  +
  +     m_constructionContext.warn(msg, 0, theLocator);
  +}
  +
  +
  +
  +void
  +StylesheetHandler::illegalAttributeError(
  +                     const XalanDOMChar*             theElementName,
  +                     const XalanDOMChar*             theAttributeName,
  +                     const Locator*                  theLocator) const
  +
  +{
  +     const GetAndReleaseCachedString         theGuard(m_constructionContext);
  +
  +     XalanDOMString&         msg = theGuard.get();
  +
  +     msg = theElementName;
  +     msg += XALAN_STATIC_UCODE_STRING(" has an illegal attribute '");
  +     msg += theAttributeName;
  +     msg += XALAN_STATIC_UCODE_STRING("'");
  +
  +     error(msg, theLocator);
  +}
  +
  +
  +
   
StylesheetHandler::PushPopIncludeState::PushPopIncludeState(StylesheetHandler&  
     theHandler) :
        m_handler(theHandler),
        m_elemStack(theHandler.m_elemStack),
        m_elemStackParentedElements(theHandler.m_elemStackParentedElements),
        m_pTemplate(theHandler.m_pTemplate),
  -     m_lastPopped(theHandler.m_lastPopped),
  +     m_lastPopped(),
        m_inTemplate(theHandler.m_inTemplate),
        m_foundStylesheet(theHandler.m_foundStylesheet),
        m_XSLNameSpaceURL(theHandler.m_stylesheet.getXSLTNamespaceURI()),
  @@ -1927,9 +1950,12 @@
        m_inExtensionElementStack()
   {
        clear(m_handler.m_accumulateText);
  +
        m_handler.m_elemStack.clear();
        m_handler.m_pTemplate = 0;
  -     m_handler.m_lastPopped = 0;
  +
  +     m_lastPopped.swap(theHandler.m_lastPopped);
  +
        m_handler.m_inTemplate = false;
        m_handler.m_foundStylesheet = false;
        m_handler.m_foundNotImport = false;
  @@ -1961,7 +1987,9 @@
        m_handler.m_elemStack = m_elemStack;
        m_handler.m_elemStackParentedElements = m_elemStackParentedElements;
        m_handler.m_pTemplate = m_pTemplate;
  -     m_handler.m_lastPopped = m_lastPopped;
  +
  +     m_lastPopped.swap(m_handler.m_lastPopped);
  +
        m_handler.m_inTemplate = m_inTemplate;
        m_handler.m_foundStylesheet = m_foundStylesheet;
        m_handler.m_stylesheet.setXSLTNamespaceURI(m_XSLNameSpaceURL);
  @@ -1978,7 +2006,24 @@
   
   
   
  -const XalanDOMString                 StylesheetHandler::s_emptyString;
  +void
  +StylesheetHandler::LastPoppedHolder::cleanup()
  +{
  +     if (m_lastPopped != 0)
  +     {
  +             const int tok = m_lastPopped->getXSLToken();
  +
  +             if (tok == StylesheetConstructionContext::ELEMNAME_UNDEFINED ||
  +                     tok == StylesheetConstructionContext::ELEMNAME_TEXT)
  +             {
  +                     delete m_lastPopped;
  +             }
  +     }
  +}
  +
  +
  +
  +const XalanDOMString StylesheetHandler::s_emptyString;
   
   
   
  
  
  
  1.37      +133 -20   xml-xalan/c/src/XSLT/StylesheetHandler.hpp
  
  Index: StylesheetHandler.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.hpp,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- StylesheetHandler.hpp     31 Oct 2002 07:15:56 -0000      1.36
  +++ StylesheetHandler.hpp     3 Nov 2002 03:41:06 -0000       1.37
  @@ -457,6 +457,48 @@
                        const Locator*  theLocator) const;
   
        void
  +     illegalAttributeError(
  +                     const XalanDOMChar*             theElementName,
  +                     const XalanDOMChar*             theAttributeName,
  +                     const Locator*                  theLocator) const;
  +
  +     void
  +     error(
  +                     const XalanDOMChar*             theMessage1,
  +                     const XalanDOMChar*             theMessage2,
  +                     const Locator*                  theLocator) const;
  +
  +     void
  +     error(
  +                     const XalanDOMChar*             theMessage1,
  +                     const XalanDOMString&   theMessage2,
  +                     const Locator*                  theLocator) const;
  +
  +     void
  +     error(
  +                     const XalanDOMString&   theMessage1,
  +                     const XalanDOMChar*             theMessage2,
  +                     const Locator*                  theLocator) const;
  +
  +     void
  +     error(
  +                     const XalanDOMString&   theMessage1,
  +                     const XalanDOMString&   theMessage2,
  +                     const Locator*                  theLocator) const;
  +
  +     void
  +     warn(
  +                     const XalanDOMChar*             theMessage1,
  +                     const XalanDOMChar*             theMessage2,
  +                     const Locator*                  theLocator) const;
  +
  +     void
  +     warn(
  +                     const XalanDOMChar*             theMessage1,
  +                     const XalanDOMString&   theMessage2,
  +                     const Locator*                  theLocator) const;
  +
  +     void
        error(
                        const XalanDOMString&   theMessage,
                        const Locator*                  theLocator) const;
  @@ -477,8 +519,6 @@
        void
        processTopLevelElement(
                        const XalanDOMChar*             name,
  -                     const XalanDOMString&   localName,
  -                     const XalanDOMString&   ns,
                        const AttributeList&    atts,
                        int                                             
xslToken,
                        const Locator*                  locator,
  @@ -556,27 +596,107 @@
        ElemTemplateSetType             m_elemStackParentedElements;
   
        /**
  -      * The stack of stray elements, to be delete when finished.
  -      */
  -     ElemTemplateStackType   m_strayElements;
  -
  -     /**
         * Need to keep a stack of found whitespace elements so that 
         * whitespace elements next to non-whitespace elements can 
         * be merged.  For instance: &lt;out> &lt;![CDATA[test]]> &lt;/out>
         */
  -     ElemTextLiteralStackType m_whiteSpaceElems;
  +     ElemTextLiteralStackType        m_whiteSpaceElems;
   
        /**
         * The current template.
         */
        ElemTemplate* m_pTemplate;
  -     
  +
  +     class LastPoppedHolder
  +     {
  +     public:
  +
  +             LastPoppedHolder() :
  +                     m_lastPopped(0)
  +             {
  +             }
  +
  +             ~LastPoppedHolder()
  +             {
  +                     cleanup();
  +             }
  +
  +             ElemTemplateElement*
  +             operator->() const
  +             {
  +                     return m_lastPopped;
  +             }
  +
  +             bool
  +             operator==(ElemTemplateElement*         theRHS)
  +             {
  +                     return m_lastPopped == theRHS;
  +             }
  +
  +             bool
  +             operator!=(ElemTemplateElement*         theRHS)
  +             {
  +                     return m_lastPopped != theRHS;
  +             }
  +
  +             void
  +             operator=(ElemTemplateElement*  theRHS)
  +             {
  +                     if (theRHS != m_lastPopped)
  +                     {
  +                             cleanup();
  +
  +                             m_lastPopped = theRHS;
  +                     }
  +             }
  +
  +             void
  +             swap(LastPoppedHolder&  theOther)
  +             {
  +                     ElemTemplateElement* const      theTemp = m_lastPopped;
  +
  +                     m_lastPopped = theOther.m_lastPopped;
  +
  +                     theOther.m_lastPopped = theTemp;
  +             }
  +
  +             ElemTemplateElement*
  +             get() const
  +             {
  +                     return m_lastPopped;
  +             }
  +
  +     private:
  +
  +             void
  +             set(ElemTemplateElement*        theNewElement)
  +             {
  +                     if (theNewElement != m_lastPopped)
  +                     {
  +                             cleanup();
  +
  +                             m_lastPopped = theNewElement;
  +                     }
  +             }
  +
  +             // Not implemented...
  +             LastPoppedHolder&
  +             operator=(const LastPoppedHolder&);
  +
  +             LastPoppedHolder(const LastPoppedHolder&);
  +
  +             // Helper functions...
  +             void
  +             cleanup();
  +
  +             // Data members...
  +             ElemTemplateElement*    m_lastPopped;
  +     };
  +
        /**
  -      * The last element popped from the stack.  I'm not totally clear 
  -      * anymore as to why this is needed.
  +      * Manages the last element popped from the stack.
         */
  -     ElemTemplateElement* m_lastPopped;
  +     LastPoppedHolder        m_lastPopped;
        
        /**
         * True if the process is in a template context.
  @@ -610,13 +730,6 @@
   
        BoolStackType   m_preserveSpaceStack;
   
  -     bool                                    m_inLXSLTScript;
  -
  -     XalanDOMString                  m_LXSLTScriptBody;
  -     XalanDOMString                  m_LXSLTScriptLang;
  -     XalanDOMString                  m_LXSLTScriptSrcURL;
  -     ExtensionNSHandler*             m_pLXSLTExtensionNSH;
  -
        // Note that these variables must not be saved by
        // PushPopIncludeState...
        unsigned long   m_locatorsPushed;
  @@ -661,7 +774,7 @@
   
                ElemTemplate* const                                     
m_pTemplate;
   
  -             ElemTemplateElement* const                      m_lastPopped;   
        
  +             LastPoppedHolder                                        
m_lastPopped;           
   
                const bool                                                      
m_inTemplate;           
   
  
  
  
  1.66      +1 -1      xml-xalan/c/src/XSLT/StylesheetRoot.cpp
  
  Index: StylesheetRoot.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetRoot.cpp,v
  retrieving revision 1.65
  retrieving revision 1.66
  diff -u -r1.65 -r1.66
  --- StylesheetRoot.cpp        31 Oct 2002 07:15:56 -0000      1.65
  +++ StylesheetRoot.cpp        3 Nov 2002 03:41:06 -0000       1.66
  @@ -552,7 +552,7 @@
                                --theTokenCount;
   
                                m_cdataSectionElems.push_back(
  -                                     
constructionContext.createXalanQNameByValue(theToken, getNamespaces(), 
theLocator, true));
  +                                     
constructionContext.createXalanQName(theToken, getNamespaces(), theLocator, 
true));
                        }
   
                        assert(theTokenizer.hasMoreTokens() == false);
  
  
  

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

Reply via email to