Ben Griffin wrote:
I posted an earlier message up on 'c-users'; the problem there was to do with a bad cast, so I have cross-posted to c-dev.

There are cases where (and I really don't know how) a document is considered to be governed by a DTD when it's actually governed by a Schema; and sometimes the element declaration is recognised as being a SchemaElementDecl rather than a DTDElementDecl. IE, it is not true that if fGrammarType == Grammar::DTDGrammarType then the XMLAttDef* attDef is necessarily a DTDElementDecl.
I think what you mean is that an XMLElementDecl is always a DTDElementDecl, if the fGrammarType is Grammar::DTDGrammarType. We should figure out why this is happening, as that's the underlying bug.

Because of this, there's a crash occuring after the forced cast at:

//-----------------------------------------------------------------
//  Find this attribute within the parent element. We pass both
//  the uriID/name and the raw QName buffer, since we don't know
//  how the derived validator and its elements store attributes.
else {
    if(fGrammarType == Grammar::DTDGrammarType) {
      attDef = ((DTDElementDecl *)elemDecl)->getAttDef ( namePtr);
    }
}
//-----------------------------------------------------------------


The following code (using dynamic casts) works fine (doesn't crash) - the second cast (to SchemaElementDecl) IS being used in some cases.
//-----------------------------------------------------------------
//  Find this attribute within the parent element. We pass both
//  the uriID/name and the raw QName buffer, since we don't know
//  how the derived validator and its elements store attributes.
else {
    if(fGrammarType == Grammar::DTDGrammarType) {
DTDElementDecl* dtdelemDecl = dynamic_cast<DTDElementDecl *> (elemDecl);
        if (dtdelemDecl != NULL) {
            attDef = dtdelemDecl->getAttDef(namePtr);
        } else {
SchemaElementDecl* schelemDecl = dynamic_cast<SchemaElementDecl *> (elemDecl);
            if (schelemDecl != NULL) {
                attDef = schelemDecl->getAttDef(suffPtr, uriId);
            }
        }
    }
}
//-----------------------------------------------------------------
Xerces-C doesn't use dynamic cast as a matter of policy, so we'll need to figure out why the grammar type is wrong. This could cause problems in other parts of the code as well.


Alternatively, if the attDef Must be a DTDElementDecl when fGrammarType == Grammar::DTDGrammarType, then an error should be thrown.... I will try to find a minimal use case, rather than the current set which involves 24 grammars and several nested namespaces in the file being parsed.
That would be great, thanks!

Dave

Reply via email to