- parser.c: more work on increasing parsing ferformances
Daniel
diff --git a/ChangeLog b/ChangeLog
index 1c7dbb1..3dd6e76 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sun Feb 25 21:52:30 CET 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
+
+ * parser.c: more work on increasing parsing ferformances
+
Sun Feb 25 18:03:42 CET 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
* xmlmemory.h HTMLparser.c HTMLtree.c entities.c parser.c
diff --git a/parser.c b/parser.c
index 0077ea5..b6f6144 100644
--- a/parser.c
+++ b/parser.c
@@ -75,7 +75,7 @@
#endif
-#define XML_PARSER_BIG_BUFFER_SIZE 1000
+#define XML_PARSER_BIG_BUFFER_SIZE 300
#define XML_PARSER_BUFFER_SIZE 100
/*
@@ -254,6 +254,13 @@
#define NEXT xmlNextChar(ctxt)
+#define NEXT1 { \
+ ctxt->input->cur++; \
+ ctxt->nbChars++; \
+ if (*ctxt->input->cur == 0) \
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \
+ }
+
#define NEXTL(l) do { \
if (*(ctxt->input->cur) == '\n') { \
ctxt->input->line++; ctxt->input->col = 1; \
@@ -1589,6 +1596,7 @@
* *
************************************************************************/
+xmlChar *xmlParseNameComplex(xmlParserCtxtPtr ctxt);
/**
* xmlParseName:
* @ctxt: an XML parser context
@@ -1607,11 +1615,8 @@
xmlChar *
xmlParseName(xmlParserCtxtPtr ctxt) {
- xmlChar buf[XML_MAX_NAMELEN + 5];
const xmlChar *in;
xmlChar *ret;
- int len = 0, l;
- int c;
int count = 0;
GROW;
@@ -1636,7 +1641,20 @@
return(ret);
}
}
+ xmlParseNameComplex(ctxt);
+}
+xmlChar *
+xmlParseNameComplex(xmlParserCtxtPtr ctxt) {
+ xmlChar buf[XML_MAX_NAMELEN + 5];
+ int len = 0, l;
+ int c;
+ int count = 0;
+
+ /*
+ * Handler for more complex cases
+ */
+ GROW;
c = CUR_CHAR(l);
if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */
(!IS_LETTER(c) && (c != '_') &&
@@ -5932,7 +5950,7 @@
int i;
if (RAW != '<') return(NULL);
- NEXT;
+ NEXT1;
name = xmlParseName(ctxt);
if (name == NULL) {
@@ -5953,9 +5971,9 @@
SKIP_BLANKS;
GROW;
- while ((IS_CHAR(RAW)) &&
- (RAW != '>') &&
- ((RAW != '/') || (NXT(1) != '>'))) {
+ while ((RAW != '>') &&
+ ((RAW != '/') || (NXT(1) != '>')) &&
+ (IS_CHAR(RAW))) {
const xmlChar *q = CUR_PTR;
int cons = ctxt->input->consumed;
@@ -6097,7 +6115,7 @@
ctxt->wellFormed = 0;
ctxt->disableSAX = 1;
} else
- NEXT;
+ NEXT1;
/*
* [ WFC: Element Type Match ]
@@ -6276,6 +6294,7 @@
const xmlChar *test = CUR_PTR;
int cons = ctxt->input->consumed;
xmlChar tok = ctxt->token;
+ const xmlChar *cur = ctxt->input->cur;
/*
* Handle possible processed charrefs.
@@ -6286,14 +6305,14 @@
/*
* First case : a Processing Instruction.
*/
- else if ((RAW == '<') && (NXT(1) == '?')) {
+ else if ((*cur == '<') && (cur[1] == '?')) {
xmlParsePI(ctxt);
}
/*
* Second case : a CDSection
*/
- else if ((RAW == '<') && (NXT(1) == '!') &&
+ else if ((*cur == '<') && (NXT(1) == '!') &&
(NXT(2) == '[') && (NXT(3) == 'C') &&
(NXT(4) == 'D') && (NXT(5) == 'A') &&
(NXT(6) == 'T') && (NXT(7) == 'A') &&
@@ -6304,7 +6323,7 @@
/*
* Third case : a comment
*/
- else if ((RAW == '<') && (NXT(1) == '!') &&
+ else if ((*cur == '<') && (NXT(1) == '!') &&
(NXT(2) == '-') && (NXT(3) == '-')) {
xmlParseComment(ctxt);
ctxt->instate = XML_PARSER_CONTENT;
@@ -6313,7 +6332,7 @@
/*
* Fourth case : a sub-element.
*/
- else if (RAW == '<') {
+ else if (*cur == '<') {
xmlParseElement(ctxt);
}
@@ -6322,7 +6341,7 @@
* parsing returns it's Name, create the node
*/
- else if (RAW == '&') {
+ else if (*cur == '&') {
xmlParseReference(ctxt);
}
@@ -6444,7 +6463,7 @@
return;
}
if (RAW == '>') {
- NEXT;
+ NEXT1;
} else {
ctxt->errNo = XML_ERR_GT_REQUIRED;
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))