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]