neilg 2003/12/07 16:10:47 Modified: c/src/xercesc/internal DGXMLScanner.cpp IGXMLScanner.cpp Log: fix duplicate attribute detection when namespaces are disabled Revision Changes Path 1.32 +70 -60 xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp Index: DGXMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- DGXMLScanner.cpp 24 Nov 2003 05:09:38 -0000 1.31 +++ DGXMLScanner.cpp 8 Dec 2003 00:10:47 -0000 1.32 @@ -1264,6 +1264,74 @@ // not validating of course it will not be at first, but we will // fault it into the pool (to avoid lots of redundant errors.) XMLAttDef* attDef = ((DTDElementDecl *)elemDecl)->getAttDef ( fAttNameBuf.getRawBuffer()); + XMLCh * namePtr = fAttNameBuf.getRawBuffer(); + + // Add this attribute to the attribute list that we use to + // pass them to the handler. We reuse its existing elements + // but expand it as required. + // Note that we want to this first since this will + // make a copy of the namePtr; we can then make use of + // that copy in the hashtable lookup that checks + // for duplicates. This will mean we may have to update + // the type of the XMLAttr later. + XMLAttr* curAtt; + if (attCount >= curAttListSize) + { + if (fDoNamespaces) { + curAtt = new (fMemoryManager) XMLAttr + ( + fEmptyNamespaceId + , fAttNameBuf.getRawBuffer() + , XMLUni::fgZeroLenString + , (attDef)?attDef->getType():XMLAttDef::CData + , true + , fMemoryManager + ); + } + else + { + curAtt = new (fMemoryManager) XMLAttr + ( + -1 + , fAttNameBuf.getRawBuffer() + , XMLUni::fgZeroLenString + , XMLUni::fgZeroLenString + , (attDef)?attDef->getType():XMLAttDef::CData + , true + , fMemoryManager + ); + } + fAttrList->addElement(curAtt); + } + else + { + curAtt = fAttrList->elementAt(attCount); + + if (fDoNamespaces) + { + curAtt->set + ( + fEmptyNamespaceId + , fAttNameBuf.getRawBuffer() + , XMLUni::fgZeroLenString + , (attDef)?attDef->getType():XMLAttDef::CData + ); + } + else + { + curAtt->set + ( + -1 + , fAttNameBuf.getRawBuffer() + , XMLUni::fgZeroLenString + , XMLUni::fgZeroLenString + , (attDef)?attDef->getType():XMLAttDef::CData + ); + } + curAtt->setSpecified(true); + } + // reset namePtr so it refers to newly-allocated memory + namePtr = (XMLCh *)curAtt->getName(); // now need to prepare for duplicate detection if(attDef) @@ -1289,7 +1357,6 @@ } else { - XMLCh * namePtr = fAttNameBuf.getRawBuffer(); unsigned int *curCountPtr = fUndeclaredAttrRegistry->get(namePtr); if(!curCountPtr) { @@ -1360,6 +1427,8 @@ return false; } } + // must set the newly-minted value on the XMLAttr: + curAtt->setValue(fAttValueBuf.getRawBuffer()); // Now that its all stretched out, lets look at its type and // determine if it has a valid value. It will output any needed @@ -1404,65 +1473,6 @@ } } - // Add this attribute to the attribute list that we use to - // pass them to the handler. We reuse its existing elements - // but expand it as required. - XMLAttr* curAtt; - if (attCount >= curAttListSize) - { - if (fDoNamespaces) { - curAtt = new (fMemoryManager) XMLAttr - ( - fEmptyNamespaceId - , fAttNameBuf.getRawBuffer() - , fAttValueBuf.getRawBuffer() - , (attDef)?attDef->getType():XMLAttDef::CData - , true - , fMemoryManager - ); - } - else - { - curAtt = new (fMemoryManager) XMLAttr - ( - -1 - , fAttNameBuf.getRawBuffer() - , XMLUni::fgZeroLenString - , fAttValueBuf.getRawBuffer() - , (attDef)?attDef->getType():XMLAttDef::CData - , true - , fMemoryManager - ); - } - fAttrList->addElement(curAtt); - } - else - { - curAtt = fAttrList->elementAt(attCount); - - if (fDoNamespaces) - { - curAtt->set - ( - fEmptyNamespaceId - , fAttNameBuf.getRawBuffer() - , fAttValueBuf.getRawBuffer() - , (attDef)?attDef->getType():XMLAttDef::CData - ); - } - else - { - curAtt->set - ( - -1 - , fAttNameBuf.getRawBuffer() - , XMLUni::fgZeroLenString - , fAttValueBuf.getRawBuffer() - , (attDef)?attDef->getType():XMLAttDef::CData - ); - } - curAtt->setSpecified(true); - } attCount++; // And jump back to the top of the loop 1.44 +43 -33 xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp Index: IGXMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- IGXMLScanner.cpp 3 Dec 2003 20:00:27 -0000 1.43 +++ IGXMLScanner.cpp 8 Dec 2003 00:10:47 -0000 1.44 @@ -1761,12 +1761,51 @@ return false; } } - // See if this attribute is declared for this element. If we are // not validating of course it will not be at first, but we will // fault it into the pool (to avoid lots of redundant errors.) XMLCh * namePtr = fAttNameBuf.getRawBuffer(); XMLAttDef* attDef = ((DTDElementDecl *)elemDecl)->getAttDef(namePtr); + + // Add this attribute to the attribute list that we use to + // pass them to the handler. We reuse its existing elements + // but expand it as required. + // Note that we want to this first since this will + // make a copy of the namePtr; we can then make use of + // that copy in the hashtable lookup that checks + // for duplicates. This will mean we may have to update + // the type of the XMLAttr later. + XMLAttr* curAtt; + if (attCount >= curAttListSize) + { + curAtt = new (fMemoryManager) XMLAttr + ( + -1 + , namePtr + , XMLUni::fgZeroLenString + , XMLUni::fgZeroLenString + , (attDef)?attDef->getType():XMLAttDef::CData + , true + , fMemoryManager + ); + fAttrList->addElement(curAtt); + } + else + { + curAtt = fAttrList->elementAt(attCount); + curAtt->set + ( + -1 + , namePtr + , XMLUni::fgZeroLenString + , XMLUni::fgZeroLenString + , (attDef)?attDef->getType():XMLAttDef::CData + ); + curAtt->setSpecified(true); + } + // reset namePtr so it refers to newly-allocated memory + namePtr = (XMLCh *)curAtt->getName(); + if (!attDef) { // If there is a validation handler, then we are validating @@ -1821,6 +1860,7 @@ ); } } + // Skip any whitespace before the value and then scan the att // value. This will come back normalized with entity refs and // char refs expanded. @@ -1858,6 +1898,8 @@ return false; } } + // must set the newly-minted value on the XMLAttr: + curAtt->setValue(fAttValueBuf.getRawBuffer()); // Now that its all stretched out, lets look at its type and // determine if it has a valid value. It will output any needed @@ -1878,39 +1920,7 @@ } } - // Add this attribute to the attribute list that we use to - // pass them to the handler. We reuse its existing elements - // but expand it as required. - XMLAttr* curAtt; - if (attCount >= curAttListSize) - { - curAtt = new (fMemoryManager) XMLAttr - ( - -1 - , namePtr - , XMLUni::fgZeroLenString - , fAttValueBuf.getRawBuffer() - , (attDef)?attDef->getType():XMLAttDef::CData - , true - , fMemoryManager - ); - fAttrList->addElement(curAtt); - } - else - { - curAtt = fAttrList->elementAt(attCount); - curAtt->set - ( - -1 - , namePtr - , XMLUni::fgZeroLenString - , fAttValueBuf.getRawBuffer() - , (attDef)?attDef->getType():XMLAttDef::CData - ); - curAtt->setSpecified(true); - } attCount++; - // And jump back to the top of the loop continue; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]