diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp index 7502ab0647c310ed159a7d3e8accdffa2a8a3062..fc4c5e1758b4417e4b5739a7828d50d4df1366ef 100644 --- a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp +++ b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.39 2004/10/04 09:26:31 amassari + * Use an XMLStringPool+ValueStackOf(int) object to store the prefixes currently in scope, instead of a XMLBufMgr+ValueStack(XMLBuffer), that has a limitation of 32 items (jira#866) + * * Revision 1.38 2004/09/30 14:07:23 peiyongz * setInputBufferSize * @@ -324,6 +327,7 @@ SAX2XMLReaderImpl::SAX2XMLReaderImpl(MemoryManager* const manager , fAdvDHListSize(32) , fDocHandler(0) , fTempAttrVec(0) + , fPrefixesStorage(0) , fPrefixes(0) , fPrefixCounts(0) , fDTDHandler(0) @@ -389,7 +393,8 @@ void SAX2XMLReaderImpl::initialize() // default: schema is on setDoSchema(true); - fPrefixes = new (fMemoryManager) RefStackOf<XMLBuffer> (10, false, fMemoryManager) ; + fPrefixesStorage = new (fMemoryManager) XMLStringPool(109, fMemoryManager) ; + fPrefixes = new (fMemoryManager) ValueStackOf<unsigned int> (30, fMemoryManager) ; fTempAttrVec = new (fMemoryManager) RefVectorOf<XMLAttr> (10, false, fMemoryManager) ; fPrefixCounts = new (fMemoryManager) ValueStackOf<unsigned int>(10, fMemoryManager) ; } @@ -399,6 +404,7 @@ void SAX2XMLReaderImpl::cleanUp() { fMemoryManager->deallocate(fAdvDHList);//delete [] fAdvDHList; delete fScanner; + delete fPrefixesStorage; delete fPrefixes; delete fTempAttrVec; delete fPrefixCounts; @@ -903,16 +909,10 @@ void SAX2XMLReaderImpl::resetDocument() // Make sure our element depth flag gets set back to zero fElemDepth = 0; - // Pop any prefix buffers left over from previous uses - while (!fPrefixCounts->empty()) - { - unsigned int numPrefix = fPrefixCounts->pop(); - for (unsigned int i = 0; i < numPrefix; i++) - { - XMLBuffer * buf = fPrefixes->pop() ; - fStringBuffers.releaseBuffer(*buf) ; - } - } + // reset prefix counters and prefix map + fPrefixCounts->removeAllElements(); + fPrefixes->removeAllElements(); + fPrefixesStorage->flushAll(); } @@ -989,9 +989,8 @@ startElement( const XMLElementDecl& elemDecl if (nsPrefix == 0) nsPrefix = XMLUni::fgZeroLenString; fDocHandler->startPrefixMapping(nsPrefix, nsURI); - XMLBuffer &buf = fStringBuffers.bidOnBuffer(); - buf.set ( nsPrefix ) ; - fPrefixes->push(&buf) ; + unsigned int nPrefixId=fPrefixesStorage->addOrFind(nsPrefix); + fPrefixes->push(nPrefixId) ; numPrefix++; } nsURI = 0; @@ -1038,9 +1037,8 @@ startElement( const XMLElementDecl& elemDecl unsigned int numPrefix = fPrefixCounts->pop(); for (unsigned int i = 0; i < numPrefix; ++i) { - XMLBuffer * buf = fPrefixes->pop() ; - fDocHandler->endPrefixMapping( buf->getRawBuffer() ); - fStringBuffers.releaseBuffer(*buf) ; + unsigned int nPrefixId = fPrefixes->pop() ; + fDocHandler->endPrefixMapping( fPrefixesStorage->getValueForId(nPrefixId) ); } } else @@ -1100,9 +1098,8 @@ void SAX2XMLReaderImpl::endElement( const XMLElementDecl& elemDecl unsigned int numPrefix = fPrefixCounts->pop(); for (unsigned int i = 0; i < numPrefix; i++) { - XMLBuffer * buf = fPrefixes->pop() ; - fDocHandler->endPrefixMapping( buf->getRawBuffer() ); - fStringBuffers.releaseBuffer(*buf) ; + unsigned int nPrefixId = fPrefixes->pop() ; + fDocHandler->endPrefixMapping( fPrefixesStorage->getValueForId(nPrefixId) ); } } else diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp index 96b8a986bb210f23bb4fe084a35e4aeec3d08cb2..592975fedf060ddffb2ab4a7ee0805da55717629 100644 --- a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp +++ b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.27 2004/10/04 09:26:31 amassari + * Use an XMLStringPool+ValueStackOf(int) object to store the prefixes currently in scope, instead of a XMLBufMgr+ValueStack(XMLBuffer), that has a limitation of 32 items (jira#866) + * * Revision 1.26 2004/09/30 14:07:23 peiyongz * setInputBufferSize * @@ -1856,7 +1859,8 @@ private : VecAttributesImpl fAttrList ; ContentHandler* fDocHandler ; RefVectorOf<XMLAttr>* fTempAttrVec ; - RefStackOf<XMLBuffer> * fPrefixes ; + XMLStringPool* fPrefixesStorage ; + ValueStackOf<unsigned int>* fPrefixes ; ValueStackOf<unsigned int>* fPrefixCounts ; DTDHandler* fDTDHandler; EntityResolver* fEntityResolver;