dbertoni    2002/07/24 16:20:48

  Modified:    c/src/XSLT XSLTEngineImpl.cpp XSLTEngineImpl.hpp
  Log:
  Use empty() instead of size().  Cache flag that indicates the presence of CDATA 
section elements for output.  Fixed bug where stack was not being popped properly.
  
  Revision  Changes    Path
  1.151     +72 -79    xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp
  
  Index: XSLTEngineImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp,v
  retrieving revision 1.150
  retrieving revision 1.151
  diff -u -r1.150 -r1.151
  --- XSLTEngineImpl.cpp        11 Jul 2002 05:15:13 -0000      1.150
  +++ XSLTEngineImpl.cpp        24 Jul 2002 23:20:48 -0000      1.151
  @@ -195,9 +195,10 @@
        m_resultNamespacesStack(),
        m_dummyAttributesList(),
        m_scratchString(),
  -     m_hasStripOrPreserveSpace(false),
        m_attributeNamesVisited(),
  -     m_attributeNamesVisitedEnd(m_attributeNamesVisited.end())
  +     m_attributeNamesVisitedEnd(m_attributeNamesVisited.end()),
  +     m_hasStripOrPreserveSpace(false),
  +     m_hasCDATASectionElements(false)
   {
        m_outputContextStack.pushContext();
   }
  @@ -231,9 +232,10 @@
   
        m_resultNamespacesStack.clear();
   
  -     m_hasStripOrPreserveSpace = false;
  -
        m_attributeNamesVisited.clear();
  +
  +     m_hasStripOrPreserveSpace = false;
  +     m_hasCDATASectionElements = false;
   }
   
   
  @@ -384,8 +386,10 @@
                        theFormatter->setPrefixResolver(this);
                }
   
  -             m_hasStripOrPreserveSpace = 
m_stylesheetRoot->getWhitespacePreservingElements().size() > 0 ||
  -                     m_stylesheetRoot->getWhitespaceStrippingElements().size() > 0;
  +             m_hasStripOrPreserveSpace = 
m_stylesheetRoot->getWhitespacePreservingElements().empty() == false ||
  +                     m_stylesheetRoot->getWhitespaceStrippingElements().empty() == 
false;
  +
  +             m_hasCDATASectionElements = 
m_stylesheetRoot->hasCDATASectionElements();
   
                m_stylesheetRoot->process(sourceTree, outputTarget, executionContext);
        }
  @@ -428,8 +432,10 @@
                        theFormatter->setPrefixResolver(this);
                }
   
  -             m_hasStripOrPreserveSpace = 
m_stylesheetRoot->getWhitespacePreservingElements().size() > 0 ||
  -                     m_stylesheetRoot->getWhitespaceStrippingElements().size() > 0;
  +             m_hasStripOrPreserveSpace = 
m_stylesheetRoot->getWhitespacePreservingElements().empty() == false ||
  +                     m_stylesheetRoot->getWhitespaceStrippingElements().empty() == 
false;
  +
  +             m_hasCDATASectionElements = 
m_stylesheetRoot->hasCDATASectionElements();
   
                m_stylesheetRoot->process(sourceTree, outputTarget, executionContext);
        }
  @@ -1572,6 +1578,7 @@
   {
        assert(getFormatterListener() != 0);
        assert(m_executionContext != 0);
  +     assert(m_cdataStack.empty() == true);
   
        if (getHasPendingStartDocument() == false)
        {
  @@ -1605,6 +1612,7 @@
   {
        assert(getFormatterListener() != 0);
        assert(m_executionContext != 0);
  +     assert(m_cdataStack.empty() == true);
   
        setMustFlushPendingStartDocument(true);
   
  @@ -1621,7 +1629,7 @@
   
        m_resultNamespacesStack.popContext();
   
  -     assert(m_resultNamespacesStack.size() == 0);
  +     assert(m_resultNamespacesStack.empty() == true);
   }
   
   
  @@ -1793,7 +1801,10 @@
                assert(getFormatterListener() != 0);
                assert(m_executionContext != 0);
   
  -             m_cdataStack.push_back(isCDataResultElem(thePendingElementName) ? true 
: false);
  +             if(m_hasCDATASectionElements == true)
  +             {
  +                     
m_cdataStack.push_back(isCDataResultElem(thePendingElementName));
  +             }
   
                AttributeListImpl&      thePendingAttributes =
                                getPendingAttributesImpl();
  @@ -1847,7 +1858,7 @@
   
        const unsigned int      nAtts = atts.getLength();
   
  -     assert(m_outputContextStack.size() > 0);
  +     assert(m_outputContextStack.empty() == false);
   
        AttributeListImpl&      thePendingAttributes =
                getPendingAttributesImpl();
  @@ -1888,8 +1899,10 @@
   
        m_resultNamespacesStack.popContext();
   
  -     if(m_stylesheetRoot->hasCDATASectionElements() == true)
  +     if(m_hasCDATASectionElements == true)
        {
  +             assert(m_cdataStack.empty() == false);
  +
                m_cdataStack.pop_back();
        }
   }
  @@ -1916,6 +1929,7 @@
   {
        assert(getFormatterListener() != 0);
        assert(ch != 0);
  +     assert(m_hasCDATASectionElements == 
m_stylesheetRoot->hasCDATASectionElements());
   
        doFlushPending();
   
  @@ -1945,6 +1959,7 @@
   XSLTEngineImpl::characters(const XalanNode&          node)
   {
        assert(getFormatterListener() != 0);
  +     assert(m_hasCDATASectionElements == 
m_stylesheetRoot->hasCDATASectionElements());
   
        doFlushPending();
   
  @@ -1975,6 +1990,7 @@
   {
        assert(getFormatterListener() != 0);
        assert(xobject.null() == false);
  +     assert(m_hasCDATASectionElements == 
m_stylesheetRoot->hasCDATASectionElements());
   
        doFlushPending();
   
  @@ -2164,30 +2180,14 @@
   
        flushPending();
   
  -     if(m_stylesheetRoot->hasCDATASectionElements() == true &&
  -        0 != m_cdataStack.size())
  -     {
  -             getFormatterListener()->cdata(ch, length);
  -
  -             if(getTraceListeners() > 0)
  -             {
  -                     GenerateEvent ge(GenerateEvent::EVENTTYPE_CDATA, ch, start,
  -                                     length);
  +     getFormatterListener()->cdata(ch, length);
   
  -                     fireGenerateEvent(ge);
  -             }
  -     }
  -     else
  +     if(getTraceListeners() > 0)
        {
  -             getFormatterListener()->characters(ch, length);
  -
  -             if(getTraceListeners() > 0)
  -             {
  -                     GenerateEvent ge(GenerateEvent::EVENTTYPE_CHARACTERS, ch,
  -                                     start, length);
  +             GenerateEvent ge(GenerateEvent::EVENTTYPE_CDATA, ch, start,
  +                                     length);
   
  -                     fireGenerateEvent(ge);
  -             }
  +             fireGenerateEvent(ge);
        }
   }
   
  @@ -2242,7 +2242,6 @@
        if(!overrideStrip)
        {
                stripWhiteSpace = isLiteral ? true : false;
  -             // stripWhiteSpace = isLiteral ? true : 
shouldStripSourceNode(*m_executionContext, node);
        }
   
        const bool      isIgnorableWhitespace = node.isIgnorableWhitespace();
  @@ -2690,68 +2689,62 @@
   XSLTEngineImpl::isCDataResultElem(const XalanDOMString&              elementName) 
const
   {
        assert(m_executionContext != 0);
  +     assert(m_hasCDATASectionElements == true);
   
  -     if(m_stylesheetRoot->hasCDATASectionElements() == false)
  -     {
  -             return false;
  -     }
  -     else
  -     {
  -             bool    fResult = false;
  +     bool    fResult = false;
   
  -             const XalanDOMString::size_type         indexOfNSSep = 
indexOf(elementName, XalanUnicode::charColon);
  +     const XalanDOMString::size_type         indexOfNSSep = indexOf(elementName, 
XalanUnicode::charColon);
   
  -             if(indexOfNSSep == length(elementName))
  -             {
  -                     const XalanDOMString* const             elemNS =
  +     if(indexOfNSSep == length(elementName))
  +     {
  +             const XalanDOMString* const             elemNS =
                                        getResultNamespaceForPrefix(s_emptyString);
   
  -                     if (elemNS != 0)
  -                     {
  -                             fResult = 
m_stylesheetRoot->isCDATASectionElementName(XalanQNameByReference(*elemNS, 
elementName));
  -                     }
  -                     else
  -                     {
  -                             fResult = 
m_stylesheetRoot->isCDATASectionElementName(XalanQNameByReference(s_emptyString, 
elementName));
  -                     }
  +             if (elemNS != 0)
  +             {
  +                     fResult = 
m_stylesheetRoot->isCDATASectionElementName(XalanQNameByReference(*elemNS, 
elementName));
                }
                else
                {
  -                     typedef StylesheetExecutionContext::GetAndReleaseCachedString  
 GetAndReleaseCachedString;
  +                     fResult = 
m_stylesheetRoot->isCDATASectionElementName(XalanQNameByReference(s_emptyString, 
elementName));
  +             }
  +     }
  +     else
  +     {
  +             typedef StylesheetExecutionContext::GetAndReleaseCachedString   
GetAndReleaseCachedString;
   
  -                     GetAndReleaseCachedString       
elemLocalNameGuard(*m_executionContext);
  -                     GetAndReleaseCachedString       
prefixGuard(*m_executionContext);
  +             GetAndReleaseCachedString       
elemLocalNameGuard(*m_executionContext);
  +             GetAndReleaseCachedString       prefixGuard(*m_executionContext);
   
  -                     XalanDOMString&         elemLocalName = 
elemLocalNameGuard.get();
  -                     XalanDOMString&         prefix = prefixGuard.get();
  +             XalanDOMString&         elemLocalName = elemLocalNameGuard.get();
  +             XalanDOMString&         prefix = prefixGuard.get();
   
  -                     substring(elementName, prefix, 0, indexOfNSSep);
  -                     substring(elementName, elemLocalName, indexOfNSSep + 1);
  +             substring(elementName, prefix, 0, indexOfNSSep);
  +             substring(elementName, elemLocalName, indexOfNSSep + 1);
   
  -                     if(equals(prefix, DOMServices::s_XMLString))
  -                     {
  -                             fResult =
  +             if(equals(prefix, DOMServices::s_XMLString))
  +             {
  +                     fResult =
                                        
m_stylesheetRoot->isCDATASectionElementName(XalanQNameByReference(DOMServices::s_XMLNamespaceURI,
 elemLocalName));
  +             }
  +             else
  +             {
  +                     const XalanDOMString* const             elemNS =
  +                             getResultNamespaceForPrefix(prefix);
  +
  +                     if(elemNS == 0)
  +                     {
  +                             error("Prefix must resolve to a namespace: " + prefix);
                        }
                        else
                        {
  -                             const XalanDOMString* const             elemNS =
  -                                     getResultNamespaceForPrefix(prefix);
  -
  -                             if(elemNS == 0)
  -                             {
  -                                     error("Prefix must resolve to a namespace: " + 
prefix);
  -                             }
  -                             else
  -                             {
  -                                     fResult =
  +                             fResult =
                                                
m_stylesheetRoot->isCDATASectionElementName(XalanQNameByReference(*elemNS, 
elemLocalName));
  -                             }
                        }
                }
  -
  -             return fResult;
        }
  +
  +     return fResult;
   }
        
   
  @@ -2993,7 +2986,7 @@
   
                const unsigned int      nAttrs = nnm->getLength();
   
  -             assert(m_outputContextStack.size() > 0);
  +             assert(m_outputContextStack.empty() == false);
   
                AttributeListImpl&      thePendingAttributes =
                                getPendingAttributesImpl();
  @@ -3162,8 +3155,8 @@
        {
                bool    strip = false;
   
  -             assert(m_stylesheetRoot->getWhitespacePreservingElements().size() > 0 
||
  -                        m_stylesheetRoot->getWhitespaceStrippingElements().size() > 
0);
  +             assert(m_stylesheetRoot->getWhitespacePreservingElements().empty() == 
false ||
  +                        m_stylesheetRoot->getWhitespaceStrippingElements().empty() 
== false);
   
                const XalanNode::NodeType       type = textNode.getNodeType();
   
  
  
  
  1.91      +26 -15    xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp
  
  Index: XSLTEngineImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -r1.90 -r1.91
  --- XSLTEngineImpl.hpp        11 Jul 2002 00:36:19 -0000      1.90
  +++ XSLTEngineImpl.hpp        24 Jul 2002 23:20:48 -0000      1.91
  @@ -468,7 +468,7 @@
                        const XalanDOMString&   aname,
                        const XalanDOMString&   value)
        {
  -             assert(m_outputContextStack.size() > 0);
  +             assert(m_outputContextStack.empty() == false);
   
                addResultAttribute(getPendingAttributesImpl(),
                                                   aname,
  @@ -931,16 +931,6 @@
        diag(const char*        s) const;
   
        /**
  -      * Tell if a given element name should output it's text 
  -      * as cdata.
  -      *
  -      * @param elementName name of element
  -      * @return true if it should output as cdata
  -      */
  -     bool
  -     isCDataResultElem(const XalanDOMString&         elementName) const;
  -
  -     /**
         * Retrieve the result namespace corresponding to a prefix.
         * 
         * @param prefix prefix for namespace
  @@ -1665,8 +1655,16 @@
        bool
        generateCDATASection() const
        {
  -             return 0 != m_cdataStack.size() &&
  -                        m_cdataStack.back() == true;
  +             if (m_hasCDATASectionElements == false)
  +             {
  +                     return false;
  +             }
  +             else
  +             {
  +                     assert(m_cdataStack.empty() == false);
  +
  +                     return m_cdataStack.back();
  +             }
        }
   
        void
  @@ -1677,6 +1675,16 @@
                flushPending();
        }
   
  +     /**
  +      * Tell if a given element name should output its text 
  +      * as cdata.
  +      *
  +      * @param elementName name of element
  +      * @return true if it should output as cdata
  +      */
  +     bool
  +     isCDataResultElem(const XalanDOMString&         elementName) const;
  +
        void
        fireCharacterGenerateEvent(
                        const XalanNode&        theNode,
  @@ -1732,11 +1740,14 @@
   
        XalanDOMString                                  m_scratchString;
   
  -     bool                                                    
m_hasStripOrPreserveSpace;
  -
        XalanDOMStringPointerSetType    m_attributeNamesVisited;
   
        const XalanDOMStringPointerSetType::iterator    m_attributeNamesVisitedEnd;
  +
  +     bool                                                    
m_hasStripOrPreserveSpace;
  +
  +     bool                                                    
m_hasCDATASectionElements;
  +
        static void
        installFunctions();
   
  
  
  

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

Reply via email to