mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-29 11:41:22 +03:00
html: Fix push-parsing of empty documents
Also simplify end-of-document handling in push parser. Align with pull parser.
This commit is contained in:
68
HTMLparser.c
68
HTMLparser.c
@ -4926,20 +4926,7 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
|
|||||||
in = ctxt->input;
|
in = ctxt->input;
|
||||||
if (in == NULL) break;
|
if (in == NULL) break;
|
||||||
avail = in->end - in->cur;
|
avail = in->end - in->cur;
|
||||||
if ((avail == 0) && (terminate)) {
|
cur = in->cur[0];
|
||||||
htmlAutoCloseOnEnd(ctxt);
|
|
||||||
if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) {
|
|
||||||
/*
|
|
||||||
* SAX: end of the document processing.
|
|
||||||
*/
|
|
||||||
ctxt->instate = XML_PARSER_EOF;
|
|
||||||
if ((ctxt->sax) && (ctxt->sax->endDocument != NULL))
|
|
||||||
ctxt->sax->endDocument(ctxt->userData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (avail < 1)
|
|
||||||
goto done;
|
|
||||||
cur = in->cur[0];
|
|
||||||
|
|
||||||
switch (ctxt->instate) {
|
switch (ctxt->instate) {
|
||||||
case XML_PARSER_EOF:
|
case XML_PARSER_EOF:
|
||||||
@ -5202,31 +5189,6 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
done:
|
done:
|
||||||
if ((avail == 0) && (terminate)) {
|
|
||||||
htmlAutoCloseOnEnd(ctxt);
|
|
||||||
if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) {
|
|
||||||
/*
|
|
||||||
* SAX: end of the document processing.
|
|
||||||
*/
|
|
||||||
ctxt->instate = XML_PARSER_EOF;
|
|
||||||
if ((ctxt->sax) && (ctxt->sax->endDocument != NULL))
|
|
||||||
ctxt->sax->endDocument(ctxt->userData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((!(ctxt->options & HTML_PARSE_NODEFDTD)) && (ctxt->myDoc != NULL) &&
|
|
||||||
((terminate) || (ctxt->instate == XML_PARSER_EOF) ||
|
|
||||||
(ctxt->instate == XML_PARSER_EPILOG))) {
|
|
||||||
xmlDtdPtr dtd;
|
|
||||||
dtd = xmlGetIntSubset(ctxt->myDoc);
|
|
||||||
if (dtd == NULL) {
|
|
||||||
ctxt->myDoc->intSubset =
|
|
||||||
xmlCreateIntSubset(ctxt->myDoc, BAD_CAST "html",
|
|
||||||
BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN",
|
|
||||||
BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd");
|
|
||||||
if (ctxt->myDoc->intSubset == NULL)
|
|
||||||
htmlErrMemory(ctxt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5272,14 +5234,32 @@ htmlParseChunk(htmlParserCtxtPtr ctxt, const char *chunk, int size,
|
|||||||
return (ctxt->errNo);
|
return (ctxt->errNo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
htmlParseTryOrFinish(ctxt, terminate);
|
htmlParseTryOrFinish(ctxt, terminate);
|
||||||
if (terminate) {
|
|
||||||
if (ctxt->instate != XML_PARSER_EOF) {
|
if ((terminate) && (ctxt->instate != XML_PARSER_EOF)) {
|
||||||
if ((ctxt->sax) && (ctxt->sax->endDocument != NULL))
|
htmlAutoCloseOnEnd(ctxt);
|
||||||
ctxt->sax->endDocument(ctxt->userData);
|
|
||||||
}
|
if ((ctxt->sax) && (ctxt->sax->endDocument != NULL))
|
||||||
|
ctxt->sax->endDocument(ctxt->userData);
|
||||||
|
|
||||||
|
if ((!(ctxt->options & HTML_PARSE_NODEFDTD)) &&
|
||||||
|
(ctxt->myDoc != NULL)) {
|
||||||
|
xmlDtdPtr dtd;
|
||||||
|
dtd = xmlGetIntSubset(ctxt->myDoc);
|
||||||
|
if (dtd == NULL) {
|
||||||
|
ctxt->myDoc->intSubset =
|
||||||
|
xmlCreateIntSubset(ctxt->myDoc, BAD_CAST "html",
|
||||||
|
BAD_CAST "-//W3C//DTD HTML 4.0 Transitional//EN",
|
||||||
|
BAD_CAST "http://www.w3.org/TR/REC-html40/loose.dtd");
|
||||||
|
if (ctxt->myDoc->intSubset == NULL)
|
||||||
|
htmlErrMemory(ctxt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ctxt->instate = XML_PARSER_EOF;
|
ctxt->instate = XML_PARSER_EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
return((xmlParserErrors) ctxt->errNo);
|
return((xmlParserErrors) ctxt->errNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user