knoaman 2002/12/10 08:36:48 Modified: c/src/xercesc/validators/schema TraverseSchema.hpp TraverseSchema.cpp Log: Schema Errata E1-20. Revision Changes Path 1.17 +3 -2 xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.hpp Index: TraverseSchema.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.hpp,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- TraverseSchema.hpp 4 Nov 2002 14:49:42 -0000 1.16 +++ TraverseSchema.hpp 10 Dec 2002 16:36:48 -0000 1.17 @@ -755,6 +755,7 @@ ValueVectorOf<unsigned int>* fCurrentGroupStack; ValueVectorOf<unsigned int>* fIC_NamespaceDepth; ValueVectorOf<SchemaElementDecl*>* fIC_Elements; + ValueVectorOf<const DOMElement*>* fDeclStack; GeneralAttributeCheck fAttributeCheck; RefHash2KeysTableOf<XMLCh>* fGlobalDeclarations; RefHash2KeysTableOf<XMLCh>* fNotationRegistry; @@ -762,7 +763,7 @@ RefHash2KeysTableOf<IdentityConstraint>* fIdentityConstraintNames; RefHash2KeysTableOf<SchemaElementDecl>* fSubstitutionGroups; RefHash2KeysTableOf<ElemVector>* fValidSubstitutionGroups; - RefHashTableOf<ValueVectorOf<DOMElement*> >* fIC_NodeListNS; + RefHashTableOf<ValueVectorOf<DOMElement*> >* fIC_NodeListNS; RefHashTableOf<ElemVector>* fIC_ElementsNS; RefHashTableOf<ValueVectorOf<unsigned int> >* fIC_NamespaceDepthNS; XSDDOMParser* fParser; 1.38 +18 -13 xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp Index: TraverseSchema.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp,v retrieving revision 1.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- TraverseSchema.cpp 10 Dec 2002 02:15:56 -0000 1.37 +++ TraverseSchema.cpp 10 Dec 2002 16:36:48 -0000 1.38 @@ -215,6 +215,7 @@ , fCurrentGroupStack(0) , fIC_NamespaceDepth(0) , fIC_Elements(0) + , fDeclStack(0) , fGlobalDeclarations(0) , fNotationRegistry(0) , fRedefineComponents(0) @@ -1489,7 +1490,7 @@ XercesAttGroupInfo* saveAttGroupInfo = fCurrentAttGroupInfo; XercesAttGroupInfo* attGroupInfo = new XercesAttGroupInfo(); - fAttGroupRegistry->put((void*) fStringPool->getValueForId(fStringPool->addOrFind(name)), attGroupInfo); + fDeclStack->addElement(elem); fCurrentAttGroupInfo = attGroupInfo; for (; content !=0; content = XUtil::getNextSiblingElement(content)) { @@ -1525,8 +1526,14 @@ } // ------------------------------------------------------------------ + // Pop declaration + // ------------------------------------------------------------------ + fDeclStack->removeElementAt(fDeclStack->size() - 1); + + // ------------------------------------------------------------------ // Restore old attGroupInfo // ------------------------------------------------------------------ + fAttGroupRegistry->put((void*) fStringPool->getValueForId(fStringPool->addOrFind(name)), attGroupInfo); fCurrentAttGroupInfo = saveAttGroupInfo; // ------------------------------------------------------------------ @@ -6482,17 +6489,6 @@ } else { - // circular check - DOMNode* parentElem = elem->getParentNode(); - - if (XMLString::equals(parentElem->getLocalName(), SchemaSymbols::fgELT_ATTRIBUTEGROUP) - && XMLString::equals(((DOMElement*) parentElem)->getAttribute(SchemaSymbols::fgATT_NAME), localPart) - && !XMLString::equals(parentElem->getParentNode()->getLocalName(), SchemaSymbols::fgELT_REDEFINE)) { - - reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::NoCircularAttGroup); - return 0; - } - attGroupInfo = fAttGroupRegistry->get(localPart); } @@ -6504,6 +6500,13 @@ if (attGroupElem != 0) { + // circular attribute check + if (fDeclStack->containsElement(attGroupElem)) { + + reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::NoCircularDefinition, refName); + return 0; + } + attGroupInfo = traverseAttributeGroupDecl(attGroupElem, typeInfo, true); if (attGroupInfo && fCurrentAttGroupInfo) { @@ -7718,6 +7721,7 @@ fSchemaInfoList = new RefHash2KeysTableOf<SchemaInfo>(29); fPreprocessedNodes = new RefHashTableOf<SchemaInfo>(29, false, new HashPtr()); fLocator = new XSDLocator(); + fDeclStack = new ValueVectorOf<const DOMElement*>(16); } void TraverseSchema::cleanUp() { @@ -7730,6 +7734,7 @@ delete fRedefineComponents; delete fIdentityConstraintNames; delete fSubstitutionGroups; + delete fDeclStack; delete fIC_ElementsNS; delete fIC_NamespaceDepthNS; delete fIC_NodeListNS;
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]