Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}