Index: XMLScanner.hpp =================================================================== RCS file: /home/cvspublic/xml-xerces/c/src/xercesc/internal/XMLScanner.hpp,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- XMLScanner.hpp 28 Sep 2004 02:14:13 -0000 1.39 +++ XMLScanner.hpp 28 Sep 2004 21:27:38 -0000 1.40 @@ -731,6 +734,13 @@ void resetUIntPool(); void recreateUIntPool(); + inline + void setAttrDupChkRegistry + ( + const unsigned int &attrNumber + , bool &toUseHashTable + ); + // ----------------------------------------------------------------------- // Data members // @@ -986,6 +996,7 @@ XMLUInt32 fScannerId; XMLUInt32 fSequenceId; RefVectorOf<XMLAttr>* fAttrList; + RefHash2KeysTableOf<XMLAttr>* fAttrDupChkRegistry; XMLDocumentHandler* fDocHandler; DocTypeHandler* fDocTypeHandler; XMLEntityHandler* fEntityHandler; @@ -1521,6 +1532,29 @@ fEntityDeclPoolRetrieved = false; } +inline void XMLScanner::setAttrDupChkRegistry(const unsigned int &attrNumber + , bool &toUseHashTable) +{ + // once the attribute exceed 20, we use hash table to check duplication + if (attrNumber > 20) + { + toUseHashTable = true; + + if (!fAttrDupChkRegistry) + { + fAttrDupChkRegistry = new (fMemoryManager) RefHash2KeysTableOf<XMLAttr> + ( + 2*attrNumber+1, false, new (fMemoryManager)HashXMLCh(), fMemoryManager + ); + } + else + { + fAttrDupChkRegistry->removeAll(); + } + } + +} + XERCES_CPP_NAMESPACE_END #endif Index: XMLScanner.cpp =================================================================== RCS file: /home/cvspublic/xml-xerces/c/src/xercesc/internal/XMLScanner.cpp,v retrieving revision 1.70 retrieving revision 1.71 diff -u -r1.70 -r1.71 --- XMLScanner.cpp 28 Sep 2004 02:14:13 -0000 1.70 +++ XMLScanner.cpp 28 Sep 2004 21:27:38 -0000 1.71 @@ -157,6 +157,7 @@ , fScannerId(0) , fSequenceId(0) , fAttrList(0) + , fAttrDupChkRegistry(0) , fDocHandler(0) , fDocTypeHandler(0) , fEntityHandler(0) @@ -237,6 +238,7 @@ , fScannerId(0) , fSequenceId(0) , fAttrList(0) + , fAttrDupChkRegistry(0) , fDocHandler(docHandler) , fDocTypeHandler(docTypeHandler) , fEntityHandler(entityHandler) @@ -279,6 +281,7 @@ XMLScanner::~XMLScanner() { delete fAttrList; + delete fAttrDupChkRegistry; delete fValidationContext; fMemoryManager->deallocate(fRootElemName);//delete [] fRootElemName; fMemoryManager->deallocate(fExternalSchemaLocation);//delete [] fExternalSchemaLocation; Index: WFXMLScanner.cpp =================================================================== RCS file: /home/cvspublic/xml-xerces/c/src/xercesc/internal/WFXMLScanner.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- WFXMLScanner.cpp 8 Sep 2004 13:56:13 -0000 1.24 +++ WFXMLScanner.cpp 28 Sep 2004 21:27:38 -0000 1.25 @@ -1457,6 +1457,13 @@ } if(attCount) { + + // + // Decide if to use hash table to do duplicate checking + // + bool toUseHashTable = false; + setAttrDupChkRegistry(attCount, toUseHashTable); + // check for duplicate namespace attributes: // by checking for qualified names with the same local part and with prefixes // which have been bound to namespace names that are identical. @@ -1464,17 +1471,35 @@ XMLAttr* curAtt; for (unsigned int attrIndex=0; attrIndex < attCount-1; attrIndex++) { loopAttr = fAttrList->elementAt(attrIndex); - for (unsigned int curAttrIndex = attrIndex+1; curAttrIndex < attCount; curAttrIndex++) { - curAtt = fAttrList->elementAt(curAttrIndex); - if (curAtt->getURIId() == loopAttr->getURIId() && - XMLString::equals(curAtt->getName(), loopAttr->getName())) { - emitError - ( - XMLErrs::AttrAlreadyUsedInSTag + + if (!toUseHashTable) + { + for (unsigned int curAttrIndex = attrIndex+1; curAttrIndex < attCount; curAttrIndex++) { + curAtt = fAttrList->elementAt(curAttrIndex); + if (curAtt->getURIId() == loopAttr->getURIId() && + XMLString::equals(curAtt->getName(), loopAttr->getName())) { + emitError + ( + XMLErrs::AttrAlreadyUsedInSTag , curAtt->getName() , elemDecl->getFullName() + ); + } + } + } + else + { + if (fAttrDupChkRegistry->containsKey((void*)loopAttr->getName(), loopAttr->getURIId())) + { + emitError + ( + XMLErrs::AttrAlreadyUsedInSTag + , loopAttr->getName() + , elemDecl->getFullName() ); } + + fAttrDupChkRegistry->put((void*)loopAttr->getName(), loopAttr->getURIId(), loopAttr); } } } Index: DGXMLScanner.cpp =================================================================== RCS file: /home/cvspublic/xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp,v retrieving revision 1.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- DGXMLScanner.cpp 20 Sep 2004 15:00:49 -0000 1.53 +++ DGXMLScanner.cpp 28 Sep 2004 21:27:38 -0000 1.54 @@ -2378,6 +2378,13 @@ void DGXMLScanner::scanAttrListforNameSpaces(RefVectorOf<XMLAttr>* theAttrList, int attCount, XMLElementDecl* elemDecl) { + + // + // Decide if to use hash table to do duplicate checking + // + bool toUseHashTable = false; + setAttrDupChkRegistry((unsigned int&)attCount, toUseHashTable); + // Make an initial pass through the list and find any xmlns attributes or // schema attributes. // When we find one, send it off to be used to update the element stack's @@ -2412,17 +2419,35 @@ // by checking for qualified names with the same local part and with prefixes // which have been bound to namespace names that are identical. XMLAttr* loopAttr; - for (int attrIndex=0; attrIndex < index; attrIndex++) { - loopAttr = theAttrList->elementAt(attrIndex); - if (loopAttr->getURIId() == curAttr->getURIId() && - XMLString::equals(loopAttr->getName(), curAttr->getName())) { + + if (!toUseHashTable) + { + for (int attrIndex=0; attrIndex < index; attrIndex++) { + loopAttr = theAttrList->elementAt(attrIndex); + if (loopAttr->getURIId() == curAttr->getURIId() && + XMLString::equals(loopAttr->getName(), curAttr->getName())) { + emitError + ( + XMLErrs::AttrAlreadyUsedInSTag + , curAttr->getName() + , elemDecl->getFullName() + ); + } + } + } + else + { + if (fAttrDupChkRegistry->containsKey((void*)curAttr->getName(), curAttr->getURIId())) + { emitError - ( + ( XMLErrs::AttrAlreadyUsedInSTag , curAttr->getName() , elemDecl->getFullName() - ); + ); } + + fAttrDupChkRegistry->put((void*)curAttr->getName(), curAttr->getURIId(), curAttr); } } } Index: IGXMLScanner2.cpp =================================================================== RCS file: /home/cvspublic/xml-xerces/c/src/xercesc/internal/IGXMLScanner2.cpp,v retrieving revision 1.71 retrieving revision 1.72 diff -u -r1.71 -r1.72 --- IGXMLScanner2.cpp 26 Sep 2004 18:23:50 -0000 1.71 +++ IGXMLScanner2.cpp 28 Sep 2004 21:27:38 -0000 1.72 @@ -110,6 +110,15 @@ XMLBufBid bbNormal(&fBufMgr); XMLBuffer& normBuf = bbNormal.getBuffer(); + // + // Decide if to use hash table to do duplicate checking + // + bool toUseHashTable = false; + if (fGrammarType == Grammar::DTDGrammarType) + { + setAttrDupChkRegistry(attCount, toUseHashTable); + } + // Loop through our explicitly provided attributes, which are in the raw // scanned form, and build up XMLAttr objects. unsigned int index; @@ -617,16 +626,32 @@ // by checking for qualified names with the same local part and with prefixes // which have been bound to namespace names that are identical. if (fGrammarType == Grammar::DTDGrammarType) { - for (unsigned int attrIndex=0; attrIndex < retCount; attrIndex++) { - curAttr = toFill.elementAt(attrIndex); - if (uriId == curAttr->getURIId() && - XMLString::equals(suffPtr, curAttr->getName())) { + if (!toUseHashTable) + { + for (unsigned int attrIndex=0; attrIndex < retCount; attrIndex++) { + curAttr = toFill.elementAt(attrIndex); + if (uriId == curAttr->getURIId() && + XMLString::equals(suffPtr, curAttr->getName())) { + emitError + ( + + XMLErrs::AttrAlreadyUsedInSTag + , curAttr->getName() + , elemDecl->getFullName() + ); + } + } + } + else + { + if (fAttrDupChkRegistry->containsKey((void*)suffPtr, uriId)) + { emitError - ( + ( XMLErrs::AttrAlreadyUsedInSTag , curAttr->getName() , elemDecl->getFullName() - ); + ); } } } @@ -658,6 +683,12 @@ ); curAttr->setSpecified(true); } + + if (toUseHashTable) + { + fAttrDupChkRegistry->put((void*)suffPtr, uriId, curAttr); + } + if(psviAttr) psviAttr->setValue(curAttr->getValue());
--- xerces-c-src_2_5_0/src/xercesc/internal/XMLScanner.hpp.orig 2003-12-31 10:40:00.000000000 -0500 +++ xerces-c-src_2_5_0/src/xercesc/internal/XMLScanner.hpp 2005-03-15 20:39:50.553194368 -0500 @@ -738,6 +738,13 @@ void resetUIntPool(); void recreateUIntPool(); + inline + void setAttrDupChkRegistry + ( + const unsigned int &attrNumber + , bool &toUseHashTable + ); + // ----------------------------------------------------------------------- // Data members // @@ -985,6 +992,7 @@ XMLUInt32 fScannerId; XMLUInt32 fSequenceId; RefVectorOf<XMLAttr>* fAttrList; + RefHash2KeysTableOf<XMLAttr>* fAttrDupChkRegistry; XMLDocumentHandler* fDocHandler; DocTypeHandler* fDocTypeHandler; XMLEntityHandler* fEntityHandler; @@ -1490,6 +1498,29 @@ fEntityDeclPoolRetrieved = false; } +inline void XMLScanner::setAttrDupChkRegistry(const unsigned int &attrNumber + , bool &toUseHashTable) +{ + // once the attribute exceed 20, we use hash table to check duplication + if (attrNumber > 20) + { + toUseHashTable = true; + + if (!fAttrDupChkRegistry) + { + fAttrDupChkRegistry = new (fMemoryManager) RefHash2KeysTableOf<XMLAttr> + ( + 2*attrNumber+1, false, new (fMemoryManager)HashXMLCh(), fMemoryManager + ); + } + else + { + fAttrDupChkRegistry->removeAll(); + } + } + +} + XERCES_CPP_NAMESPACE_END #endif --- xerces-c-src_2_5_0/src/xercesc/internal/XMLScanner.cpp.orig 2004-01-29 06:46:30.000000000 -0500 +++ xerces-c-src_2_5_0/src/xercesc/internal/XMLScanner.cpp 2005-03-15 20:39:50.540196344 -0500 @@ -194,6 +194,7 @@ , fScannerId(0) , fSequenceId(0) , fAttrList(0) + , fAttrDupChkRegistry(0) , fDocHandler(0) , fDocTypeHandler(0) , fEntityHandler(0) @@ -271,6 +272,7 @@ , fScannerId(0) , fSequenceId(0) , fAttrList(0) + , fAttrDupChkRegistry(0) , fDocHandler(docHandler) , fDocTypeHandler(docTypeHandler) , fEntityHandler(entityHandler) @@ -313,6 +315,7 @@ XMLScanner::~XMLScanner() { delete fAttrList; + delete fAttrDupChkRegistry; delete fValidationContext; fMemoryManager->deallocate(fRootElemName);//delete [] fRootElemName; fMemoryManager->deallocate(fExternalSchemaLocation);//delete [] fExternalSchemaLocation; --- xerces-c-src_2_5_0/src/xercesc/internal/WFXMLScanner.cpp.orig 2005-03-15 20:39:50.532197560 -0500 +++ xerces-c-src_2_5_0/src/xercesc/internal/WFXMLScanner.cpp 2005-03-15 21:31:48.348217480 -0500 @@ -1496,26 +1496,53 @@ ); } - // check for duplicate namespace attributes: - // by checking for qualified names with the same local part and with prefixes - // which have been bound to namespace names that are identical. - XMLAttr* loopAttr; - XMLAttr* curAtt; - for (unsigned int attrIndex=0; attrIndex < attCount-1; attrIndex++) { - loopAttr = fAttrList->elementAt(attrIndex); - for (unsigned int curAttrIndex = attrIndex+1; curAttrIndex < attCount; curAttrIndex++) { - curAtt = fAttrList->elementAt(curAttrIndex); - if (curAtt->getURIId() == loopAttr->getURIId() && - XMLString::equals(curAtt->getName(), loopAttr->getName())) { - emitError - ( + if (attCount) { + + // + // Decide if to use hash table to do duplicate checking + // + bool toUseHashTable = false; + setAttrDupChkRegistry(attCount, toUseHashTable); + + // check for duplicate namespace attributes: + // by checking for qualified names with the same local part and with prefixes + // which have been bound to namespace names that are identical. + XMLAttr* loopAttr; + XMLAttr* curAtt; + for (unsigned int attrIndex=0; attrIndex < attCount-1; attrIndex++) { + loopAttr = fAttrList->elementAt(attrIndex); + + if (!toUseHashTable) + { + for (unsigned int curAttrIndex = attrIndex+1; curAttrIndex < attCount; curAttrIndex++) { + curAtt = fAttrList->elementAt(curAttrIndex); + if (curAtt->getURIId() == loopAttr->getURIId() && + XMLString::equals(curAtt->getName(), loopAttr->getName())) { + emitError + ( + XMLErrs::AttrAlreadyUsedInSTag + , curAtt->getName() + , elemDecl->getFullName() + ); + } + } + } + else + { + if (fAttrDupChkRegistry->containsKey((void*)loopAttr->getName(), loopAttr->getURIId())) + { + emitError + ( XMLErrs::AttrAlreadyUsedInSTag - , curAtt->getName() - , elemDecl->getFullName() - ); + , loopAttr->getName() + , elemDecl->getFullName() + ); + } + + fAttrDupChkRegistry->put((void*)loopAttr->getName(), loopAttr->getURIId(), loopAttr); } - } - } + } + } // Resolve the qualified name to a URI. unsigned int uriId = resolvePrefix --- xerces-c-src_2_5_0/src/xercesc/internal/DGXMLScanner.cpp.orig 2004-02-03 11:43:14.000000000 -0500 +++ xerces-c-src_2_5_0/src/xercesc/internal/DGXMLScanner.cpp 2005-03-15 20:39:50.547195280 -0500 @@ -2387,6 +2387,13 @@ void DGXMLScanner::scanAttrListforNameSpaces(RefVectorOf<XMLAttr>* theAttrList, int attCount, XMLElementDecl* elemDecl) { + + // + // Decide if to use hash table to do duplicate checking + // + bool toUseHashTable = false; + setAttrDupChkRegistry((unsigned int&)attCount, toUseHashTable); + // Make an initial pass through the list and find any xmlns attributes or // schema attributes. // When we find one, send it off to be used to update the element stack's @@ -2421,17 +2428,35 @@ // by checking for qualified names with the same local part and with prefixes // which have been bound to namespace names that are identical. XMLAttr* loopAttr; - for (int attrIndex=0; attrIndex < index; attrIndex++) { - loopAttr = theAttrList->elementAt(attrIndex); - if (loopAttr->getURIId() == curAttr->getURIId() && - XMLString::equals(loopAttr->getName(), curAttr->getName())) { + + if (!toUseHashTable) + { + for (int attrIndex=0; attrIndex < index; attrIndex++) { + loopAttr = theAttrList->elementAt(attrIndex); + if (loopAttr->getURIId() == curAttr->getURIId() && + XMLString::equals(loopAttr->getName(), curAttr->getName())) { + emitError + ( + XMLErrs::AttrAlreadyUsedInSTag + , curAttr->getName() + , elemDecl->getFullName() + ); + } + } + } + else + { + if (fAttrDupChkRegistry->containsKey((void*)curAttr->getName(), curAttr->getURIId())) + { emitError - ( + ( XMLErrs::AttrAlreadyUsedInSTag , curAttr->getName() , elemDecl->getFullName() - ); + ); } + + fAttrDupChkRegistry->put((void*)curAttr->getName(), curAttr->getURIId(), curAttr); } } } --- xerces-c-src_2_5_0/src/xercesc/internal/IGXMLScanner2.cpp.orig 2004-01-29 06:46:30.000000000 -0500 +++ xerces-c-src_2_5_0/src/xercesc/internal/IGXMLScanner2.cpp 2005-03-15 20:39:50.561193152 -0500 @@ -151,6 +151,15 @@ XMLBufBid bbNormal(&fBufMgr); XMLBuffer& normBuf = bbNormal.getBuffer(); + // + // Decide if to use hash table to do duplicate checking + // + bool toUseHashTable = false; + if (fGrammarType == Grammar::DTDGrammarType) + { + setAttrDupChkRegistry(attCount, toUseHashTable); + } + // Loop through our explicitly provided attributes, which are in the raw // scanned form, and build up XMLAttr objects. unsigned int index; @@ -687,16 +696,32 @@ // by checking for qualified names with the same local part and with prefixes // which have been bound to namespace names that are identical. if (fGrammarType == Grammar::DTDGrammarType) { - for (unsigned int attrIndex=0; attrIndex < retCount; attrIndex++) { - curAttr = toFill.elementAt(attrIndex); - if (uriId == curAttr->getURIId() && - XMLString::equals(suffPtr, curAttr->getName())) { + if (!toUseHashTable) + { + for (unsigned int attrIndex=0; attrIndex < retCount; attrIndex++) { + curAttr = toFill.elementAt(attrIndex); + if (uriId == curAttr->getURIId() && + XMLString::equals(suffPtr, curAttr->getName())) { + emitError + ( + + XMLErrs::AttrAlreadyUsedInSTag + , curAttr->getName() + , elemDecl->getFullName() + ); + } + } + } + else + { + if (fAttrDupChkRegistry->containsKey((void*)suffPtr, uriId)) + { emitError - ( + ( XMLErrs::AttrAlreadyUsedInSTag , curAttr->getName() , elemDecl->getFullName() - ); + ); } } } @@ -732,6 +757,12 @@ ); curAttr->setSpecified(true); } + + if (toUseHashTable) + { + fAttrDupChkRegistry->put((void*)suffPtr, uriId, curAttr); + } + if(psviAttr) psviAttr->setValue(curAttr->getValue());
--- xerces-c-src2_4_0/src/xercesc/internal/XMLScanner.hpp.orig 2003-11-28 16:18:32.000000000 -0500 +++ xerces-c-src2_4_0/src/xercesc/internal/XMLScanner.hpp 2005-03-15 20:53:57.418451280 -0500 @@ -734,6 +734,13 @@ void resetUIntPool(); void recreateUIntPool(); + inline + void setAttrDupChkRegistry + ( + const unsigned int &attrNumber + , bool &toUseHashTable + ); + // ----------------------------------------------------------------------- // Data members // @@ -981,6 +988,7 @@ XMLUInt32 fScannerId; XMLUInt32 fSequenceId; RefVectorOf<XMLAttr>* fAttrList; + RefHash2KeysTableOf<XMLAttr>* fAttrDupChkRegistry; XMLDocumentHandler* fDocHandler; DocTypeHandler* fDocTypeHandler; XMLEntityHandler* fEntityHandler; @@ -1486,6 +1494,29 @@ fEntityDeclPoolRetrieved = false; } +inline void XMLScanner::setAttrDupChkRegistry(const unsigned int &attrNumber + , bool &toUseHashTable) +{ + // once the attribute exceed 20, we use hash table to check duplication + if (attrNumber > 20) + { + toUseHashTable = true; + + if (!fAttrDupChkRegistry) + { + fAttrDupChkRegistry = new (fMemoryManager) RefHash2KeysTableOf<XMLAttr> + ( + 2*attrNumber+1, false, new (fMemoryManager)HashXMLCh(), fMemoryManager + ); + } + else + { + fAttrDupChkRegistry->removeAll(); + } + } + +} + XERCES_CPP_NAMESPACE_END #endif --- xerces-c-src2_4_0/src/xercesc/internal/XMLScanner.cpp.orig 2003-11-27 01:10:31.000000000 -0500 +++ xerces-c-src2_4_0/src/xercesc/internal/XMLScanner.cpp 2005-03-15 20:53:57.404453408 -0500 @@ -194,6 +194,7 @@ , fScannerId(0) , fSequenceId(0) , fAttrList(0) + , fAttrDupChkRegistry(0) , fDocHandler(0) , fDocTypeHandler(0) , fEntityHandler(0) @@ -270,6 +271,7 @@ , fScannerId(0) , fSequenceId(0) , fAttrList(0) + , fAttrDupChkRegistry(0) , fDocHandler(docHandler) , fDocTypeHandler(docTypeHandler) , fEntityHandler(entityHandler) @@ -317,6 +319,7 @@ XMLScanner::~XMLScanner() { delete fAttrList; + delete fAttrDupChkRegistry; delete fValidationContext; fMemoryManager->deallocate(fRootElemName);//delete [] fRootElemName; fMemoryManager->deallocate(fExternalSchemaLocation);//delete [] fExternalSchemaLocation; --- xerces-c-src2_4_0/src/xercesc/internal/WFXMLScanner.cpp.orig 2003-11-01 15:24:22.000000000 -0500 +++ xerces-c-src2_4_0/src/xercesc/internal/WFXMLScanner.cpp 2005-03-15 21:53:44.144186088 -0500 @@ -1433,23 +1433,6 @@ } } - // check for duplicate namespace attributes: - // by checking for qualified names with the same local part and with prefixes - // which have been bound to namespace names that are identical. - XMLAttr* loopAttr; - for (unsigned int attrIndex=0; attrIndex < attCount; attrIndex++) { - loopAttr = fAttrList->elementAt(attrIndex); - if (curAtt->getURIId() == loopAttr->getURIId() && - XMLString::equals(curAtt->getName(), loopAttr->getName())) { - emitError - ( - XMLErrs::AttrAlreadyUsedInSTag - , curAtt->getName() - , elemDecl->getFullName() - ); - } - } - // increment attribute count attCount++; @@ -1513,6 +1496,54 @@ ); } + if (attCount) { + + // + // Decide if to use hash table to do duplicate checking + // + bool toUseHashTable = false; + setAttrDupChkRegistry(attCount, toUseHashTable); + + // check for duplicate namespace attributes: + // by checking for qualified names with the same local part and with prefixes + // which have been bound to namespace names that are identical. + XMLAttr* loopAttr; + XMLAttr* curAtt; + for (unsigned int attrIndex=0; attrIndex < attCount-1; attrIndex++) { + loopAttr = fAttrList->elementAt(attrIndex); + + if (!toUseHashTable) + { + for (unsigned int curAttrIndex = attrIndex+1; curAttrIndex < attCount; curAttrIndex++) { + curAtt = fAttrList->elementAt(curAttrIndex); + if (curAtt->getURIId() == loopAttr->getURIId() && + XMLString::equals(curAtt->getName(), loopAttr->getName())) { + emitError + ( + XMLErrs::AttrAlreadyUsedInSTag + , curAtt->getName() + , elemDecl->getFullName() + ); + } + } + } + else + { + if (fAttrDupChkRegistry->containsKey((void*)loopAttr->getName(), loopAttr->getURIId())) + { + emitError + ( + XMLErrs::AttrAlreadyUsedInSTag + , loopAttr->getName() + , elemDecl->getFullName() + ); + } + + fAttrDupChkRegistry->put((void*)loopAttr->getName(), loopAttr->getURIId(), loopAttr); + } + } + } + // Resolve the qualified name to a URI. unsigned int uriId = resolvePrefix ( --- xerces-c-src2_4_0/src/xercesc/internal/DGXMLScanner.cpp.orig 2003-11-24 00:09:38.000000000 -0500 +++ xerces-c-src2_4_0/src/xercesc/internal/DGXMLScanner.cpp 2005-03-15 20:53:57.411452344 -0500 @@ -2355,6 +2355,13 @@ void DGXMLScanner::scanAttrListforNameSpaces(RefVectorOf<XMLAttr>* theAttrList, int attCount, XMLElementDecl* elemDecl) { + + // + // Decide if to use hash table to do duplicate checking + // + bool toUseHashTable = false; + setAttrDupChkRegistry((unsigned int&)attCount, toUseHashTable); + // Make an initial pass through the list and find any xmlns attributes or // schema attributes. // When we find one, send it off to be used to update the element stack's @@ -2389,17 +2396,35 @@ // by checking for qualified names with the same local part and with prefixes // which have been bound to namespace names that are identical. XMLAttr* loopAttr; - for (int attrIndex=0; attrIndex < index; attrIndex++) { - loopAttr = theAttrList->elementAt(attrIndex); - if (loopAttr->getURIId() == curAttr->getURIId() && - XMLString::equals(loopAttr->getName(), curAttr->getName())) { + + if (!toUseHashTable) + { + for (int attrIndex=0; attrIndex < index; attrIndex++) { + loopAttr = theAttrList->elementAt(attrIndex); + if (loopAttr->getURIId() == curAttr->getURIId() && + XMLString::equals(loopAttr->getName(), curAttr->getName())) { + emitError + ( + XMLErrs::AttrAlreadyUsedInSTag + , curAttr->getName() + , elemDecl->getFullName() + ); + } + } + } + else + { + if (fAttrDupChkRegistry->containsKey((void*)curAttr->getName(), curAttr->getURIId())) + { emitError - ( + ( XMLErrs::AttrAlreadyUsedInSTag , curAttr->getName() , elemDecl->getFullName() - ); + ); } + + fAttrDupChkRegistry->put((void*)curAttr->getName(), curAttr->getURIId(), curAttr); } } } --- xerces-c-src2_4_0/src/xercesc/internal/IGXMLScanner2.cpp.orig 2003-11-28 15:20:54.000000000 -0500 +++ xerces-c-src2_4_0/src/xercesc/internal/IGXMLScanner2.cpp 2005-03-15 21:37:28.431516960 -0500 @@ -157,6 +157,15 @@ XMLBufBid bbNormal(&fBufMgr); XMLBuffer& normBuf = bbNormal.getBuffer(); + // + // Decide if to use hash table to do duplicate checking + // + bool toUseHashTable = false; + if (fGrammarType == Grammar::DTDGrammarType) + { + setAttrDupChkRegistry(attCount, toUseHashTable); + } + // Loop through our explicitly provided attributes, which are in the raw // scanned form, and build up XMLAttr objects. unsigned int index; @@ -661,16 +670,32 @@ // by checking for qualified names with the same local part and with prefixes // which have been bound to namespace names that are identical. if (fGrammarType == Grammar::DTDGrammarType) { - for (unsigned int attrIndex=0; attrIndex < retCount; attrIndex++) { - curAttr = toFill.elementAt(attrIndex); - if (uriId == curAttr->getURIId() && - XMLString::equals(suffPtr, curAttr->getName())) { + if (!toUseHashTable) + { + for (unsigned int attrIndex=0; attrIndex < retCount; attrIndex++) { + curAttr = toFill.elementAt(attrIndex); + if (uriId == curAttr->getURIId() && + XMLString::equals(suffPtr, curAttr->getName())) { + emitError + ( + + XMLErrs::AttrAlreadyUsedInSTag + , curAttr->getName() + , elemDecl->getFullName() + ); + } + } + } + else + { + if (fAttrDupChkRegistry->containsKey((void*)suffPtr, uriId)) + { emitError - ( + ( XMLErrs::AttrAlreadyUsedInSTag , curAttr->getName() , elemDecl->getFullName() - ); + ); } } } @@ -707,6 +732,12 @@ curAttr->setSpecified(true); } + + if (toUseHashTable) + { + fAttrDupChkRegistry->put((void*)suffPtr, uriId, curAttr); + } + // Bump the count of attrs in the list retCount++; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]