diff --git a/HTMLparser.c b/HTMLparser.c
index 7e91384b..76934ce9 100644
--- a/HTMLparser.c
+++ b/HTMLparser.c
@@ -299,7 +299,7 @@ htmlNodeInfoPop(htmlParserCtxtPtr ctxt)
#define GROW if ((ctxt->progressive == 0) && \
(ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK)
+ xmlParserGrow(ctxt)
#define SKIP_BLANKS htmlSkipBlankChars(ctxt)
@@ -473,7 +473,7 @@ htmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) {
if ((c & 0x40) == 0)
goto encoding_error;
if (cur[1] == 0) {
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
if ((cur[1] & 0xc0) != 0x80)
@@ -481,14 +481,14 @@ htmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) {
if ((c & 0xe0) == 0xe0) {
if (cur[2] == 0) {
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
if ((cur[2] & 0xc0) != 0x80)
goto encoding_error;
if ((c & 0xf0) == 0xf0) {
if (cur[3] == 0) {
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
if (((c & 0xf8) != 0xf0) ||
@@ -588,17 +588,12 @@ htmlSkipBlankChars(xmlParserCtxtPtr ctxt) {
int res = 0;
while (IS_BLANK_CH(*(ctxt->input->cur))) {
- if ((*ctxt->input->cur == 0) &&
- (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) {
- xmlPopInput(ctxt);
- } else {
- if (*(ctxt->input->cur) == '\n') {
- ctxt->input->line++; ctxt->input->col = 1;
- } else ctxt->input->col++;
- ctxt->input->cur++;
- if (*ctxt->input->cur == 0)
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
- }
+ if (*(ctxt->input->cur) == '\n') {
+ ctxt->input->line++; ctxt->input->col = 1;
+ } else ctxt->input->col++;
+ ctxt->input->cur++;
+ if (*ctxt->input->cur == 0)
+ xmlParserGrow(ctxt);
if (res < INT_MAX)
res++;
}
diff --git a/include/private/parser.h b/include/private/parser.h
index 43945f9e..22e1314a 100644
--- a/include/private/parser.h
+++ b/include/private/parser.h
@@ -23,5 +23,7 @@ XML_HIDDEN void
__xmlErrEncoding(xmlParserCtxtPtr ctxt, xmlParserErrors xmlerr,
const char *msg, const xmlChar *str1,
const xmlChar *str2) LIBXML_ATTR_FORMAT(3,0);
+XML_HIDDEN int
+xmlParserGrow(xmlParserCtxtPtr ctxt);
#endif /* XML_PARSER_H_PRIVATE__ */
diff --git a/parser.c b/parser.c
index c5b80e52..6a957fed 100644
--- a/parser.c
+++ b/parser.c
@@ -2049,7 +2049,7 @@ static int spacePop(xmlParserCtxtPtr ctxt) {
#define SKIP(val) do { \
ctxt->input->cur += (val),ctxt->input->col+=(val); \
if (*ctxt->input->cur == 0) \
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \
+ xmlParserGrow(ctxt); \
} while (0)
#define SKIPL(val) do { \
@@ -2061,7 +2061,7 @@ static int spacePop(xmlParserCtxtPtr ctxt) {
ctxt->input->cur++; \
} \
if (*ctxt->input->cur == 0) \
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \
+ xmlParserGrow(ctxt); \
} while (0)
#define SHRINK if ((ctxt->progressive == 0) && \
@@ -2075,54 +2075,12 @@ static void xmlSHRINK (xmlParserCtxtPtr ctxt) {
((ctxt->input->buf->encoder) || (ctxt->input->buf->readcallback)))
xmlParserInputShrink(ctxt->input);
if (*ctxt->input->cur == 0)
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
}
#define GROW if ((ctxt->progressive == 0) && \
(ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \
- xmlGROW (ctxt);
-
-static void xmlGROW (xmlParserCtxtPtr ctxt) {
- xmlParserInputPtr in = ctxt->input;
- xmlParserInputBufferPtr buf = in->buf;
- ptrdiff_t curEnd = in->end - in->cur;
- ptrdiff_t curBase = in->cur - in->base;
- int ret;
-
- if (buf == NULL)
- return;
- /* Don't grow memory buffers. */
- if ((buf->encoder == NULL) && (buf->readcallback == NULL))
- return;
-
- if (((curEnd > XML_MAX_LOOKUP_LIMIT) ||
- (curBase > XML_MAX_LOOKUP_LIMIT)) &&
- ((ctxt->options & XML_PARSE_HUGE) == 0)) {
- xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup");
- xmlHaltParser(ctxt);
- return;
- }
-
- if (xmlBufUse(buf->buffer) > (unsigned int) curBase + INPUT_CHUNK)
- return;
-
- ret = xmlParserInputBufferGrow(buf, INPUT_CHUNK);
-
- in->base = xmlBufContent(buf->buffer);
- if (in->base == NULL) {
- in->base = BAD_CAST "";
- in->cur = in->base;
- in->end = in->base;
- xmlErrMemory(ctxt, NULL);
- return;
- }
- in->cur = in->base + curBase;
- in->end = xmlBufEnd(buf->buffer);
-
- /* TODO: Get error code from xmlParserInputBufferGrow */
- if (ret < 0)
- xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Growing input buffer");
-}
+ xmlParserGrow(ctxt);
#define SKIP_BLANKS xmlSkipBlankChars(ctxt)
@@ -2132,7 +2090,7 @@ static void xmlGROW (xmlParserCtxtPtr ctxt) {
ctxt->input->col++; \
ctxt->input->cur++; \
if (*ctxt->input->cur == 0) \
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \
+ xmlParserGrow(ctxt); \
}
#define NEXTL(l) do { \
@@ -2185,7 +2143,7 @@ xmlSkipBlankChars(xmlParserCtxtPtr ctxt) {
res++;
if (*cur == 0) {
ctxt->input->cur = cur;
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
}
@@ -2279,7 +2237,7 @@ xmlPopInput(xmlParserCtxtPtr ctxt) {
input->entity->flags &= ~XML_ENT_EXPANDING;
xmlFreeInputStream(input);
if (*ctxt->input->cur == 0)
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
return(CUR);
}
diff --git a/parserInternals.c b/parserInternals.c
index f55700e5..1c3fb812 100644
--- a/parserInternals.c
+++ b/parserInternals.c
@@ -272,6 +272,57 @@ xmlParserInputRead(xmlParserInputPtr in ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUS
return(-1);
}
+/**
+ * xmlParserGrow:
+ * @ctxt: an XML parser context
+ */
+int
+xmlParserGrow(xmlParserCtxtPtr ctxt) {
+ xmlParserInputPtr in = ctxt->input;
+ xmlParserInputBufferPtr buf = in->buf;
+ ptrdiff_t curEnd = in->end - in->cur;
+ ptrdiff_t curBase = in->cur - in->base;
+ int ret;
+
+ if (buf == NULL)
+ return(0);
+ /* Don't grow memory buffers. */
+ if ((buf->encoder == NULL) && (buf->readcallback == NULL))
+ return(0);
+
+ if (((curEnd > XML_MAX_LOOKUP_LIMIT) ||
+ (curBase > XML_MAX_LOOKUP_LIMIT)) &&
+ ((ctxt->options & XML_PARSE_HUGE) == 0)) {
+ xmlErrInternal(ctxt, "Huge input lookup", NULL);
+ ctxt->instate = XML_PARSER_EOF;
+ return(-1);
+ }
+
+ if (curEnd >= INPUT_CHUNK)
+ return(0);
+
+ ret = xmlParserInputBufferGrow(buf, INPUT_CHUNK);
+
+ in->base = xmlBufContent(buf->buffer);
+ if (in->base == NULL) {
+ in->base = BAD_CAST "";
+ in->cur = in->base;
+ in->end = in->base;
+ xmlErrMemory(ctxt, NULL);
+ return(-1);
+ }
+ in->cur = in->base + curBase;
+ in->end = xmlBufEnd(buf->buffer);
+
+ /* TODO: Get error code from xmlParserInputBufferGrow */
+ if (ret < 0) {
+ xmlErrInternal(ctxt, "Growing input buffer", NULL);
+ ctxt->instate = XML_PARSER_EOF;
+ }
+
+ return(ret);
+}
+
/**
* xmlParserInputGrow:
* @in: an XML parser input
@@ -406,8 +457,7 @@ xmlNextChar(xmlParserCtxtPtr ctxt)
return;
}
- if ((ctxt->input->cur >= ctxt->input->end) &&
- (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) {
+ if ((ctxt->input->cur >= ctxt->input->end) && (xmlParserGrow(ctxt) <= 0)) {
return;
}
@@ -444,7 +494,7 @@ xmlNextChar(xmlParserCtxtPtr ctxt)
if (c == 0xC0)
goto encoding_error;
if (cur[1] == 0) {
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
if ((cur[1] & 0xc0) != 0x80)
@@ -453,14 +503,14 @@ xmlNextChar(xmlParserCtxtPtr ctxt)
unsigned int val;
if (cur[2] == 0) {
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
if ((cur[2] & 0xc0) != 0x80)
goto encoding_error;
if ((c & 0xf0) == 0xf0) {
if (cur[3] == 0) {
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
if (((c & 0xf8) != 0xf0) ||
@@ -506,7 +556,7 @@ xmlNextChar(xmlParserCtxtPtr ctxt)
ctxt->input->cur++;
}
if (*ctxt->input->cur == 0)
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
return;
encoding_error:
/*
@@ -585,21 +635,21 @@ xmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) {
if (((c & 0x40) == 0) || (c == 0xC0))
goto encoding_error;
if (cur[1] == 0) {
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
if ((cur[1] & 0xc0) != 0x80)
goto encoding_error;
if ((c & 0xe0) == 0xe0) {
if (cur[2] == 0) {
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
if ((cur[2] & 0xc0) != 0x80)
goto encoding_error;
if ((c & 0xf0) == 0xf0) {
if (cur[3] == 0) {
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
cur = ctxt->input->cur;
}
if (((c & 0xf8) != 0xf0) ||
@@ -639,7 +689,7 @@ xmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) {
/* 1-byte code */
*len = 1;
if (*ctxt->input->cur == 0)
- xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+ xmlParserGrow(ctxt);
if ((*ctxt->input->cur == 0) &&
(ctxt->input->end > ctxt->input->cur)) {
xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR,