mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-10-26 00:37:43 +03:00
Add xmlHaltParser() to stop the parser
The problem is doing it in a consistent and safe fashion It's more complex than just setting ctxt->instate = XML_PARSER_EOF Update the public function to reuse that new internal routine
This commit is contained in:
36
parser.c
36
parser.c
@@ -94,6 +94,8 @@ static xmlParserCtxtPtr
|
|||||||
xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID,
|
xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID,
|
||||||
const xmlChar *base, xmlParserCtxtPtr pctx);
|
const xmlChar *base, xmlParserCtxtPtr pctx);
|
||||||
|
|
||||||
|
static void xmlHaltParser(xmlParserCtxtPtr ctxt);
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* *
|
* *
|
||||||
* Arbitrary limits set in the parser. See XML_PARSE_HUGE *
|
* Arbitrary limits set in the parser. See XML_PARSE_HUGE *
|
||||||
@@ -12624,6 +12626,33 @@ xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data,
|
|||||||
}
|
}
|
||||||
#endif /* LIBXML_PUSH_ENABLED */
|
#endif /* LIBXML_PUSH_ENABLED */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xmlHaltParser:
|
||||||
|
* @ctxt: an XML parser context
|
||||||
|
*
|
||||||
|
* Blocks further parser processing don't override error
|
||||||
|
* for internal use
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
xmlHaltParser(xmlParserCtxtPtr ctxt) {
|
||||||
|
if (ctxt == NULL)
|
||||||
|
return;
|
||||||
|
ctxt->instate = XML_PARSER_EOF;
|
||||||
|
ctxt->disableSAX = 1;
|
||||||
|
if (ctxt->input != NULL) {
|
||||||
|
/*
|
||||||
|
* in case there was a specific allocation deallocate before
|
||||||
|
* overriding base
|
||||||
|
*/
|
||||||
|
if (ctxt->input->free != NULL) {
|
||||||
|
ctxt->input->free((xmlChar *) ctxt->input->base);
|
||||||
|
ctxt->input->free = NULL;
|
||||||
|
}
|
||||||
|
ctxt->input->cur = BAD_CAST"";
|
||||||
|
ctxt->input->base = ctxt->input->cur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xmlStopParser:
|
* xmlStopParser:
|
||||||
* @ctxt: an XML parser context
|
* @ctxt: an XML parser context
|
||||||
@@ -12634,13 +12663,8 @@ void
|
|||||||
xmlStopParser(xmlParserCtxtPtr ctxt) {
|
xmlStopParser(xmlParserCtxtPtr ctxt) {
|
||||||
if (ctxt == NULL)
|
if (ctxt == NULL)
|
||||||
return;
|
return;
|
||||||
ctxt->instate = XML_PARSER_EOF;
|
xmlHaltParser(ctxt);
|
||||||
ctxt->errNo = XML_ERR_USER_STOP;
|
ctxt->errNo = XML_ERR_USER_STOP;
|
||||||
ctxt->disableSAX = 1;
|
|
||||||
if (ctxt->input != NULL) {
|
|
||||||
ctxt->input->cur = BAD_CAST"";
|
|
||||||
ctxt->input->base = ctxt->input->cur;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user