You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ga...@apache.org on 2004/07/13 22:49:28 UTC

cvs commit: xml-xerces/c/src/xercesc/parsers AbstractDOMParser.cpp

gareth      2004/07/13 13:49:28

  Modified:    c/src/xercesc/parsers AbstractDOMParser.cpp
  Log:
  Fixed bugzilla bug 23100. Thanks to Joanne Bogart.
  
  Revision  Changes    Path
  1.63      +19 -76    xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp
  
  Index: AbstractDOMParser.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp,v
  retrieving revision 1.62
  retrieving revision 1.63
  diff -u -r1.62 -r1.63
  --- AbstractDOMParser.cpp	13 Apr 2004 16:53:26 -0000	1.62
  +++ AbstractDOMParser.cpp	13 Jul 2004 20:49:28 -0000	1.63
  @@ -654,6 +654,8 @@
   
   void AbstractDOMParser::endEntityReference(const XMLEntityDecl&)
   {
  +    if (!fCreateEntityReferenceNodes) return;
  +
       DOMEntityReferenceImpl *erImpl = 0;
       DOMNode* firstChild = 0;
   
  @@ -664,69 +666,7 @@
   
       fCurrentParent = fNodeStack->pop();
   
  -    if (!fCreateEntityReferenceNodes && erImpl && firstChild) {
  -        DOMNode *kid, *next;
  -        fCurrentNode   = fCurrentParent->getLastChild();
  -
  -        for (kid = firstChild; kid != 0; kid = next)
  -        {
  -            // If kid and fCurrentNode are both Text nodes (but _not_ CDATASection,
  -            // which is a subclass of Text), they can be merged.
  -            if (kid->getNodeType() == DOMNode::TEXT_NODE   &&
  -                fCurrentNode &&
  -                fCurrentNode->getNodeType() == DOMNode::TEXT_NODE )
  -            {
  -                ((DOMTextImpl *) fCurrentNode)->appendData(((DOMTextImpl *) kid)->getData());
  -            }
  -            else {
  -                // append the child of erImpl to currentParent
  -                fCurrentNode = kid->cloneNode(true);
  -                fCurrentParent->appendChild(fCurrentNode);
  -
  -                if (erImpl->getBaseURI()) {
  -                    /**
  -                     * Record baseURI information for the Element (by adding xml:base attribute)
  -                     * or for the ProcessingInstruction (by setting a baseURI field)
  -                     */
  -                    if (fCurrentNode->getNodeType() == DOMNode::ELEMENT_NODE) {
  -                        // if an element already has xml:base attribute
  -                        // do nothing
  -                        const XMLCh baseString[] =
  -                        {
  -                            chLatin_b, chLatin_a, chLatin_s, chLatin_e, chNull
  -                        };
  -                        const XMLCh xmlBaseString[] =
  -                        {
  -                            chLatin_x, chLatin_m, chLatin_l, chColon, chLatin_b, chLatin_a, chLatin_s, chLatin_e, chNull
  -                        };
  -
  -                        if (fScanner -> getDoNamespaces() && (((DOMElement*)fCurrentNode)->getAttributeNodeNS(DOMNodeImpl::getXmlURIString(), baseString) != 0)) {
  -                            return;
  -                        } else if (((DOMElement*)fCurrentNode)->getAttributeNode(xmlBaseString) != 0) {
  -                            return;
  -                        }
  -
  -                        // retrive the baseURI from the entity decl
  -                        const XMLCh* baseURI = erImpl->getBaseURI();
  -                        if (baseURI != 0 && !XMLString::equals(baseURI,fDocument->getDocumentURI())) {
  -                            if (fScanner -> getDoNamespaces()) {
  -                                ((DOMElement*)fCurrentNode)->setAttributeNS(DOMNodeImpl::getXmlURIString(), baseString, baseURI);
  -                            } else {
  -                                ((DOMElement*)fCurrentNode)->setAttribute(xmlBaseString, baseURI);
  -                            }
  -                        }
  -                    }
  -                    else if (fCurrentNode->getNodeType() == DOMNode::PROCESSING_INSTRUCTION_NODE) {
  -                        ((DOMProcessingInstructionImpl*)fCurrentNode)->setBaseURI(erImpl->getBaseURI());
  -                    }
  -                }
  -            }
  -
  -            next = kid->getNextSibling();
  -        }
  -    }
  -    else
  -        fCurrentNode   = fCurrentParent;
  +    fCurrentNode   = fCurrentParent;
   
       if (erImpl)
           erImpl->setReadOnly(true, true);
  @@ -1039,27 +979,30 @@
           entity->setActualEncoding(fScanner->getReaderMgr()->getCurrentEncodingStr());
       fCurrentEntity = entity;
   
  -    DOMEntityReference *er = fDocument->createEntityReferenceByParser(entName);
   
  -    //set the readOnly flag to false before appending node, will be reset in endEntityReference
  -    DOMEntityReferenceImpl *erImpl = (DOMEntityReferenceImpl *) er;
  -    erImpl->setReadOnly(false, true);
  +    // Following line has been moved up so that erImpl is only declared
  +    // and used if create entity ref flag is true
  +    if (fCreateEntityReferenceNodes == true)    {
  +        DOMEntityReference *er = fDocument->createEntityReferenceByParser(entName);
  +
  +        //set the readOnly flag to false before appending node, will be reset 
  +        // in endEntityReference
  +        DOMEntityReferenceImpl *erImpl = (DOMEntityReferenceImpl *) er;
  +        erImpl->setReadOnly(false, true);
   
  -    if (fCreateEntityReferenceNodes == true)
  -    {
           fCurrentParent->appendChild(er);
  -    }
   
  -    fNodeStack->push(fCurrentParent);
  -    fCurrentParent = er;
  -    fCurrentNode = er;
  +        fNodeStack->push(fCurrentParent);
  +        fCurrentParent = er;
  +        fCurrentNode = er;
   
       // this entityRef needs to be stored in Entity map too.
       // We'd decide later whether the entity nodes should be created by a
       // separated method in parser or not. For now just stick it in if
       // the ref nodes are created
  -    if (entity)
  -        entity->setEntityRef(er);
  +        if (entity)
  +            entity->setEntityRef(er);
  +    }
   }
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org