diff options
author | Daniel Veillard <veillard@src.gnome.org> | 2002-05-29 08:21:33 +0000 |
---|---|---|
committer | Daniel Veillard <veillard@src.gnome.org> | 2002-05-29 08:21:33 +0000 |
commit | 46de64e9c01af2dc20bd49482716746b33737f5e (patch) | |
tree | 27eb0d6d239c3dd0226ebae5457bc54a3b3dfe48 /parser.c | |
parent | c0801af9f83bdf00d69e540d4fa7ba1f5bda75e6 (diff) | |
download | android_external_libxml2-46de64e9c01af2dc20bd49482716746b33737f5e.tar.gz android_external_libxml2-46de64e9c01af2dc20bd49482716746b33737f5e.tar.bz2 android_external_libxml2-46de64e9c01af2dc20bd49482716746b33737f5e.zip |
performance patch from Peter Jacobi Daniel
* SAX.c parser.c tree.c include/libxml/tree.h: performance patch from
Peter Jacobi
Daniel
Diffstat (limited to 'parser.c')
-rw-r--r-- | parser.c | 83 |
1 files changed, 62 insertions, 21 deletions
@@ -281,18 +281,24 @@ static int spacePop(xmlParserCtxtPtr ctxt) { xmlPopInput(ctxt); \ } while (0) -#define SHRINK if (ctxt->input->cur - ctxt->input->base > INPUT_CHUNK) {\ - xmlParserInputShrink(ctxt->input); \ - if ((*ctxt->input->cur == 0) && \ - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ - xmlPopInput(ctxt); \ +#define SHRINK if (ctxt->input->cur - ctxt->input->base > INPUT_CHUNK) \ + xmlSHRINK (ctxt); + +static void xmlSHRINK (xmlParserCtxtPtr ctxt) { + xmlParserInputShrink(ctxt->input); + if ((*ctxt->input->cur == 0) && + (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) + xmlPopInput(ctxt); } -#define GROW if (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK) { \ - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); \ - if ((*ctxt->input->cur == 0) && \ - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ - xmlPopInput(ctxt); \ +#define GROW if (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK) \ + xmlGROW (ctxt); + +static void xmlGROW (xmlParserCtxtPtr ctxt) { + xmlParserInputGrow(ctxt->input, INPUT_CHUNK); + if ((*ctxt->input->cur == 0) && + (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) + xmlPopInput(ctxt); } #define SKIP_BLANKS xmlSkipBlankChars(ctxt) @@ -1746,6 +1752,46 @@ xmlParseName(xmlParserCtxtPtr ctxt) { return(xmlParseNameComplex(ctxt)); } +/** + * xmlParseNameAndCompare: + * @ctxt: an XML parser context + * + * parse an XML name and compares for match + * (specialized for endtag parsing) + * + * + * Returns NULL for an illegal name, (xmlChar*) 1 for success + * and the name for mismatch + */ + +xmlChar * +xmlParseNameAndCompare(xmlParserCtxtPtr ctxt, xmlChar const *other) { + const xmlChar *cmp = other; + const xmlChar *in; + xmlChar *ret; + int count = 0; + + GROW; + + in = ctxt->input->cur; + while (*in != 0 && *in == *cmp) { + ++in; + ++cmp; + } + if (*cmp == 0 && (*in == '>' || IS_BLANK (*in))) { + /* success */ + ctxt->input->cur = in; + return (xmlChar*) 1; + } + /* failure (or end of input buffer), check with full function */ + ret = xmlParseName (ctxt); + if (ret != 0 && xmlStrEqual (ret, other)) { + xmlFree (ret); + return (xmlChar*) 1; + } + return ret; +} + static xmlChar * xmlParseNameComplex(xmlParserCtxtPtr ctxt) { xmlChar buf[XML_MAX_NAMELEN + 5]; @@ -6556,7 +6602,7 @@ xmlParseEndTag(xmlParserCtxtPtr ctxt) { } SKIP(2); - name = xmlParseName(ctxt); + name = xmlParseNameAndCompare(ctxt,ctxt->name); /* * We should definitely be at the ending "S? '>'" part @@ -6578,20 +6624,17 @@ xmlParseEndTag(xmlParserCtxtPtr ctxt) { * start-tag. * */ - if ((name == NULL) || (ctxt->name == NULL) || - (!xmlStrEqual(name, ctxt->name))) { + if (name != (xmlChar*)1) { ctxt->errNo = XML_ERR_TAG_NAME_MISMATCH; if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) { - if ((name != NULL) && (ctxt->name != NULL)) { + if (name != NULL) { ctxt->sax->error(ctxt->userData, "Opening and ending tag mismatch: %s and %s\n", ctxt->name, name); - } else if (ctxt->name != NULL) { + xmlFree(name); + } else { ctxt->sax->error(ctxt->userData, "Ending tag error for: %s\n", ctxt->name); - } else { - ctxt->sax->error(ctxt->userData, - "Ending tag error: internal error ???\n"); } } @@ -6604,10 +6647,8 @@ xmlParseEndTag(xmlParserCtxtPtr ctxt) { */ if ((ctxt->sax != NULL) && (ctxt->sax->endElement != NULL) && (!ctxt->disableSAX)) - ctxt->sax->endElement(ctxt->userData, name); + ctxt->sax->endElement(ctxt->userData, ctxt->name); - if (name != NULL) - xmlFree(name); oldname = namePop(ctxt); spacePop(ctxt); if (oldname != NULL) { |