aboutsummaryrefslogtreecommitdiffstats
path: root/parser.c
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2005-07-20 13:46:00 +0000
committerDaniel Veillard <veillard@src.gnome.org>2005-07-20 13:46:00 +0000
commit0a119ebe61fd211b5dd11ecac83020481999a3b2 (patch)
tree9c7b4f9efb90e8ed9e1c4b56a5ecf6eca20e03e4 /parser.c
parent77005e6ff0426ae3cfefdcfb5796f29a8e83a83b (diff)
downloadandroid_external_libxml2-0a119ebe61fd211b5dd11ecac83020481999a3b2.tar.gz
android_external_libxml2-0a119ebe61fd211b5dd11ecac83020481999a3b2.tar.bz2
android_external_libxml2-0a119ebe61fd211b5dd11ecac83020481999a3b2.zip
an optimization of the char data inner loop, can gain up to 10% in pure
* parser.c: an optimization of the char data inner loop, can gain up to 10% in pure SAX2 parsing speed * xmlschemas.c: applied patch from Kupriyanov Anatolij fixing a bug in XML Schemas facet comparison #310893 Daniel
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c51
1 files changed, 43 insertions, 8 deletions
diff --git a/parser.c b/parser.c
index 009dcd36..67d5c469 100644
--- a/parser.c
+++ b/parser.c
@@ -3166,6 +3166,45 @@ xmlParsePubidLiteral(xmlParserCtxtPtr ctxt) {
}
void xmlParseCharDataComplex(xmlParserCtxtPtr ctxt, int cdata);
+
+/*
+ * used for the test in the inner loop of the char data testing
+ */
+static const unsigned char test_char_data[256] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x9, CR/LF separated */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x00, 0x27, /* & */
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3A, 0x3B, 0x00, 0x3D, 0x3E, 0x3F, /* < */
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x00, 0x5E, 0x5F, /* ] */
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* non-ascii */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
/**
* xmlParseCharData:
* @ctxt: an XML parser context
@@ -3237,14 +3276,10 @@ get_more_space:
get_more:
ccol = ctxt->input->col;
- while (((*in > ']') && (*in <= 0x7F)) ||
- ((*in > '&') && (*in < '<')) ||
- ((*in > '<') && (*in < ']')) ||
- ((*in >= 0x20) && (*in < '&')) ||
- (*in == 0x09)) {
- in++;
- ccol++;
- }
+ while (test_char_data[*in]) {
+ in++;
+ ccol++;
+ }
ctxt->input->col = ccol;
if (*in == 0xA) {
ctxt->input->line++; ctxt->input->col = 1;