struct XMLReader_t *XMLReader_Create(struct XMLReader_t *r, int validating) { int i; if (!r) { r=malloc(sizeof(*r)); ASSERT_MEM_SETERR(r); r->dynamicalloc = 1; } memset(r, 0, sizeof *r); ASSERT_MEM_SETERR(XMLParser_Create(&r->parser)); XMLVector_Create(&r->atts, 0, sizeof(struct XMLReaderAttribute_t)); ASSERT_MEM_SETERR(r->atts); XMLVector_Create(&r->eventbuffer, 0, sizeof(union XMLReaderNode_t)); ASSERT_MEM_SETERR(r->eventbuffer); for (i=0; i<sizeof(r->buf)/sizeof(r->buf[0]); i++) { ASSERT_MEM_SETERR(XMLStringbuf_Init(&r->buf[i], 256, 256)); } _XMLParser_SetFlag(r->parser, XMLFLAG_USE_SIMPLEPULL, 1); if (validating) { ASSERT_MEM_SETERR(r->dtdv = XMLParser_CreateDTDValidator()); r->dtdv->UserData = r; r->parser->errorHandler = ErrorHandlerV; r->parser->startElementHandler = StartElementV; r->parser->endElementHandler = EndElementV; r->parser->charactersHandler = CharsV; r->parser->commentHandler = CommentV; r->parser->processingInstructionHandler = PiV; r->parser->endDocumentHandler = EndDocumentV; } else { r->parser->UserData = r; r->parser->errorHandler = ErrorHandlerN; r->parser->startElementHandler = StartElementN; r->parser->endElementHandler = EndElementN; r->parser->charactersHandler = CharsN; r->parser->commentHandler = CommentN; r->parser->processingInstructionHandler = PiN; } return r; }
int XMLAPI XMLParser_ParseValidateDTD(LPXMLDTDVALIDATOR dtd, LPXMLPARSER parser, LPFNINPUTSRC inputSrc, void *inputData, const XMLCH *encoding) { int ret; if (!dtd || !parser) return 0; if (!inputSrc) ret = (parser->ErrorCode==0); else { dtd->parser = parser; dtd->ErrorCode = dtd->ErrorColumn = dtd->ErrorLine = 0; /* must be set before FreeDTDValidator */ if (*dtd->ErrorString) dtd->ErrorString[0] = '\0'; if (dtd->ContextStack->length) _XMLVector_RemoveAll(dtd->ContextStack); if (dtd->cpNodesPool) { FreeDTDValidator(dtd, 1); if (dtd->ErrorCode) return 0; } dtd->ElementTable = NULL; dtd->cpNodesPool = NULL; dtd->idTable = NULL; /* save handlers: */ dtd->startElementHandler = parser->startElementHandler; dtd->endElementHandler = parser->endElementHandler; dtd->charactersHandler = parser->charactersHandler; dtd->ignorableWhitespaceHandler = parser->ignorableWhitespaceHandler; dtd->elementDeclHandler = parser->elementDeclHandler; dtd->endDTDHandler = parser->endDTDHandler; /* set the validating ones: */ parser->startElementHandler = dtd->startElementHandlerFilter; parser->endElementHandler = dtd->endElementHandlerFilter; parser->charactersHandler = dtd->charactersHandlerFilter; parser->ignorableWhitespaceHandler = dtd->ignorableWhitespaceHandlerFilter; parser->elementDeclHandler = DTDValidate_ElementDecl; parser->endDTDHandler = DTDValidate_EndDTD; _XMLParser_SetFlag(parser, XMLFLAG_REPORT_DTD_EXT, 1); parser->UserData = dtd; ret = XMLParser_Parse(parser, inputSrc, inputData, encoding); if (ret && _XMLParser_GetFlag(parser, XMLFLAG_USE_SIMPLEPULL)) return 1; } if (!ret) { /* Assign ElementTable and content particle pool 'cos validator will be responsible for freeing them and endDTD might not be called */ if (dtd->ElementTable!=parser->prt->cpNames) dtd->ElementTable = parser->prt->cpNames; if (dtd->cpNodesPool!=parser->prt->cpNodesPool) dtd->cpNodesPool = parser->prt->cpNodesPool; } else if (dtd->idTable) { dtd->idTable->userdata = dtd; XMLHTable_Destroy(dtd->idTable, CheckIDREFS, 0); dtd->idTable = NULL; ret = (parser->ErrorCode==0); } if (parser->prt->doctypeStr) { free(parser->prt->doctypeStr); parser->prt->doctypeStr = NULL; } _XMLParser_SetFlag(parser, XMLFLAG_REPORT_DTD_EXT, 0); /* restore handlers: */ parser->startElementHandler = dtd->startElementHandler; parser->endElementHandler = dtd->endElementHandler; parser->charactersHandler = dtd->charactersHandler; parser->ignorableWhitespaceHandler = dtd->ignorableWhitespaceHandler; parser->elementDeclHandler = dtd->elementDeclHandler; parser->endDTDHandler = dtd->endDTDHandler; return ret; }