applied patch from Chris Anderson to change back memcmp with CMPx() Daniel

* parser.c: applied patch from Chris Anderson to change back
  memcmp with CMPx()
Daniel
diff --git a/ChangeLog b/ChangeLog
index 8128534..b1f82d5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Oct 19 16:39:36 CEST 2003 Daniel Veillard <daniel@veillard.com>
+
+	* parser.c: applied patch from Chris Anderson to change back
+	  memcmp with CMPx()
+
 Sun Oct 19 16:24:19 CEST 2003 Daniel Veillard <daniel@veillard.com>
 
 	* HTMLparser.c: fixed to not send NULL to %s printing
diff --git a/parser.c b/parser.c
index ccec436..31b50a5 100644
--- a/parser.c
+++ b/parser.c
@@ -102,6 +102,7 @@
     NULL
 };
 
+
 /* DEPR void xmlParserHandleReference(xmlParserCtxtPtr ctxt); */
 xmlEntityPtr xmlParseStringPEReference(xmlParserCtxtPtr ctxt,
                                        const xmlChar **str);
@@ -1202,6 +1203,24 @@
 #define NXT(val) ctxt->input->cur[(val)]
 #define CUR_PTR ctxt->input->cur
 
+#define CMP4( s, c1, c2, c3, c4 ) \
+  ( ((unsigned char *) s)[ 0 ] == c1 && ((unsigned char *) s)[ 1 ] == c2 && \
+    ((unsigned char *) s)[ 2 ] == c3 && ((unsigned char *) s)[ 3 ] == c4 )
+#define CMP5( s, c1, c2, c3, c4, c5 ) \
+  ( CMP4( s, c1, c2, c3, c4 ) && ((unsigned char *) s)[ 4 ] == c5 )
+#define CMP6( s, c1, c2, c3, c4, c5, c6 ) \
+  ( CMP5( s, c1, c2, c3, c4, c5 ) && ((unsigned char *) s)[ 5 ] == c6 )
+#define CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) \
+  ( CMP6( s, c1, c2, c3, c4, c5, c6 ) && ((unsigned char *) s)[ 6 ] == c7 )
+#define CMP8( s, c1, c2, c3, c4, c5, c6, c7, c8 ) \
+  ( CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) && ((unsigned char *) s)[ 7 ] == c8 )
+#define CMP9( s, c1, c2, c3, c4, c5, c6, c7, c8, c9 ) \
+  ( CMP8( s, c1, c2, c3, c4, c5, c6, c7, c8 ) && \
+    ((unsigned char *) s)[ 8 ] == c9 )
+#define CMP10( s, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10 ) \
+  ( CMP9( s, c1, c2, c3, c4, c5, c6, c7, c8, c9 ) && \
+    ((unsigned char *) s)[ 9 ] == c10 )
+
 #define SKIP(val) do {							\
     ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val);			\
     if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt);	\
@@ -1774,8 +1793,8 @@
 		    }
 
 		    if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) &&
-			(memcmp(CUR_PTR, "<?xml", 5) == 0) && 
-				(IS_BLANK_CH(NXT(5)))) {
+			(CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l' )) &&
+			(IS_BLANK_CH(NXT(5)))) {
 			xmlParseTextDecl(ctxt);
 		    }
 		} else {
@@ -3718,7 +3737,7 @@
     SHRINK;
 
     *publicID = NULL;
-    if (memcmp(CUR_PTR, "SYSTEM", 6) == 0) {
+    if (CMP6(CUR_PTR, 'S', 'Y', 'S', 'T', 'E', 'M')) {
         SKIP(6);
 	if (!IS_BLANK_CH(CUR)) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
@@ -3729,7 +3748,7 @@
 	if (URI == NULL) {
 	    xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL);
         }
-    } else if (memcmp(CUR_PTR, "PUBLIC", 6) == 0) {
+    } else if (CMP6(CUR_PTR, 'P', 'U', 'B', 'L', 'I', 'C')) {
         SKIP(6);
 	if (!IS_BLANK_CH(CUR)) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
@@ -4137,7 +4156,7 @@
     xmlChar *Pubid;
     xmlChar *Systemid;
     
-    if (memcmp(CUR_PTR, "<!NOTATION", 10) == 0) {
+    if (CMP10(CUR_PTR, '<', '!', 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) {
 	xmlParserInputPtr input = ctxt->input;
 	SHRINK;
 	SKIP(10);
@@ -4216,7 +4235,7 @@
     int skipped;
     
     GROW;
-    if (memcmp(CUR_PTR, "<!ENTITY", 8) == 0) {
+    if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) {
 	xmlParserInputPtr input = ctxt->input;
 	SHRINK;
 	SKIP(8);
@@ -4354,7 +4373,7 @@
 				   "Space required before 'NDATA'\n");
 		}
 		SKIP_BLANKS;
-		if (memcmp(CUR_PTR, "NDATA", 5) == 0) {
+		if (CMP5(CUR_PTR, 'N', 'D', 'A', 'T', 'A')) {
 		    SKIP(5);
 		    if (!IS_BLANK_CH(CUR)) {
 			xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
@@ -4471,16 +4490,16 @@
     xmlChar *ret;
 
     *value = NULL;
-    if (memcmp(CUR_PTR, "#REQUIRED", 9) == 0) {
+    if (CMP9(CUR_PTR, '#', 'R', 'E', 'Q', 'U', 'I', 'R', 'E', 'D')) {
 	SKIP(9);
 	return(XML_ATTRIBUTE_REQUIRED);
     }
-    if (memcmp(CUR_PTR, "#IMPLIED", 8) == 0) {
+    if (CMP8(CUR_PTR, '#', 'I', 'M', 'P', 'L', 'I', 'E', 'D')) {
 	SKIP(8);
 	return(XML_ATTRIBUTE_IMPLIED);
     }
     val = XML_ATTRIBUTE_NONE;
-    if (memcmp(CUR_PTR, "#FIXED", 6) == 0) {
+    if (CMP6(CUR_PTR, '#', 'F', 'I', 'X', 'E', 'D')) {
 	SKIP(6);
 	val = XML_ATTRIBUTE_FIXED;
 	if (!IS_BLANK_CH(CUR)) {
@@ -4622,7 +4641,7 @@
 
 int
 xmlParseEnumeratedType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) {
-    if (memcmp(CUR_PTR, "NOTATION", 8) == 0) {
+    if (CMP8(CUR_PTR, 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) {
 	SKIP(8);
 	if (!IS_BLANK_CH(CUR)) {
 	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
@@ -4687,28 +4706,28 @@
 int 
 xmlParseAttributeType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) {
     SHRINK;
-    if (memcmp(CUR_PTR, "CDATA", 5) == 0) {
+    if (CMP5(CUR_PTR, 'C', 'D', 'A', 'T', 'A')) {
 	SKIP(5);
 	return(XML_ATTRIBUTE_CDATA);
-     } else if (memcmp(CUR_PTR, "IDREFS", 6) == 0) {
+     } else if (CMP6(CUR_PTR, 'I', 'D', 'R', 'E', 'F', 'S')) {
 	SKIP(6);
 	return(XML_ATTRIBUTE_IDREFS);
-     } else if (memcmp(CUR_PTR, "IDREF", 5) == 0) {
+     } else if (CMP5(CUR_PTR, 'I', 'D', 'R', 'E', 'F')) {
 	SKIP(5);
 	return(XML_ATTRIBUTE_IDREF);
      } else if ((RAW == 'I') && (NXT(1) == 'D')) {
         SKIP(2);
 	return(XML_ATTRIBUTE_ID);
-     } else if (memcmp(CUR_PTR, "ENTITY", 6) == 0) {
+     } else if (CMP6(CUR_PTR, 'E', 'N', 'T', 'I', 'T', 'Y')) {
 	SKIP(6);
 	return(XML_ATTRIBUTE_ENTITY);
-     } else if (memcmp(CUR_PTR, "ENTITIES", 8) == 0) {
+     } else if (CMP8(CUR_PTR, 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S')) {
 	SKIP(8);
 	return(XML_ATTRIBUTE_ENTITIES);
-     } else if (memcmp(CUR_PTR, "NMTOKENS", 8) == 0) {
+     } else if (CMP8(CUR_PTR, 'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S')) {
 	SKIP(8);
 	return(XML_ATTRIBUTE_NMTOKENS);
-     } else if (memcmp(CUR_PTR, "NMTOKEN", 7) == 0) {
+     } else if (CMP7(CUR_PTR, 'N', 'M', 'T', 'O', 'K', 'E', 'N')) {
 	SKIP(7);
 	return(XML_ATTRIBUTE_NMTOKEN);
      }
@@ -4732,7 +4751,7 @@
     const xmlChar *attrName;
     xmlEnumerationPtr tree;
 
-    if (memcmp(CUR_PTR, "<!ATTLIST", 9) == 0) {
+    if (CMP9(CUR_PTR, '<', '!', 'A', 'T', 'T', 'L', 'I', 'S', 'T')) {
 	xmlParserInputPtr input = ctxt->input;
 
 	SKIP(9);
@@ -4877,7 +4896,7 @@
     const xmlChar *elem = NULL;
 
     GROW;
-    if (memcmp(CUR_PTR, "#PCDATA", 7) == 0) {
+    if (CMP7(CUR_PTR, '#', 'P', 'C', 'D', 'A', 'T', 'A')) {
 	SKIP(7);
 	SKIP_BLANKS;
 	SHRINK;
@@ -5259,7 +5278,7 @@
     NEXT;
     GROW;
     SKIP_BLANKS;
-    if (memcmp(CUR_PTR, "#PCDATA", 7) == 0) {
+    if (CMP7(CUR_PTR, '#', 'P', 'C', 'D', 'A', 'T', 'A')) {
         tree = xmlParseElementMixedContentDecl(ctxt, inputid);
 	res = XML_ELEMENT_TYPE_MIXED;
     } else {
@@ -5291,7 +5310,7 @@
     xmlElementContentPtr content  = NULL;
 
     GROW;
-    if (memcmp(CUR_PTR, "<!ELEMENT", 9) == 0) {
+    if (CMP9(CUR_PTR, '<', '!', 'E', 'L', 'E', 'M', 'E', 'N', 'T')) {
 	xmlParserInputPtr input = ctxt->input;
 
 	SKIP(9);
@@ -5313,7 +5332,7 @@
 			   "Space required after the element name\n");
 	}
         SKIP_BLANKS;
-	if (memcmp(CUR_PTR, "EMPTY", 5) == 0) {
+	if (CMP5(CUR_PTR, 'E', 'M', 'P', 'T', 'Y')) {
 	    SKIP(5);
 	    /*
 	     * Element must always be empty.
@@ -5387,7 +5406,7 @@
 xmlParseConditionalSections(xmlParserCtxtPtr ctxt) {
     SKIP(3);
     SKIP_BLANKS;
-    if (memcmp(CUR_PTR, "INCLUDE", 7) == 0) {
+    if (CMP7(CUR_PTR, 'I', 'N', 'C', 'L', 'U', 'D', 'E')) {
 	SKIP(7);
 	SKIP_BLANKS;
 	if (RAW != '[') {
@@ -5438,7 +5457,7 @@
 		    "Leaving INCLUDE Conditional Section\n");
 	}
 
-    } else if (memcmp(CUR_PTR, "IGNORE", 6) == 0) {
+    } else if (CMP6(CUR_PTR, 'I', 'G', 'N', 'O', 'R', 'E')) {
 	int state;
 	xmlParserInputState instate;
 	int depth = 0;
@@ -5577,7 +5596,7 @@
     /*
      * We know that '<?xml' is here.
      */
-    if ((memcmp(CUR_PTR, "<?xml", 5) == 0) && (IS_BLANK_CH(NXT(5)))) {
+    if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) {
 	SKIP(5);
     } else {
 	xmlFatalErr(ctxt, XML_ERR_XMLDECL_NOT_STARTED, NULL);
@@ -5646,7 +5665,7 @@
                        const xmlChar *SystemID) {
     xmlDetectSAX2(ctxt);
     GROW;
-    if (memcmp(CUR_PTR, "<?xml", 5) == 0) {
+    if (CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) {
 	xmlParseTextDecl(ctxt);
 	if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) {
 	    /*
@@ -6003,8 +6022,8 @@
 		    input = xmlNewEntityInputStream(ctxt, ent);
 		    xmlPushInput(ctxt, input);
 		    if ((ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) &&
-			(memcmp(CUR_PTR, "<?xml", 5) == 0) &&
-				(IS_BLANK_CH(NXT(5)))) {
+			(CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) &&
+			(IS_BLANK_CH(NXT(5)))) {
 			xmlParseTextDecl(ctxt);
 			if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) {
 			    /*
@@ -6460,7 +6479,7 @@
                         input = xmlNewEntityInputStream(ctxt, entity);
                         xmlPushInput(ctxt, input);
                         if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) &&
-			    (memcmp(CUR_PTR, "<?xml", 5) == 0) &&
+			    (CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) &&
 			    (IS_BLANK_CH(NXT(5)))) {
                             xmlParseTextDecl(ctxt);
                             if (ctxt->errNo ==
@@ -8011,7 +8030,7 @@
     int count = 0;
 
     /* Check 2.6.0 was NXT(0) not RAW */
-    if (memcmp(CUR_PTR, "<![CDATA[", 9) == 0) {
+    if (CMP9(CUR_PTR, '<', '!', '[', 'C', 'D', 'A', 'T', 'A', '[')) {
 	SKIP(9);
     } else
         return;
@@ -8111,7 +8130,7 @@
 	 * Second case : a CDSection
 	 */
 	/* 2.6.0 test was *cur not RAW */
-	else if (memcmp(CUR_PTR, "<![CDATA[", 9) == 0) {
+	else if (CMP9(CUR_PTR, '<', '!', '[', 'C', 'D', 'A', 'T', 'A', '[')) {
 	    xmlParseCDSect(ctxt);
 	}
 
@@ -8390,7 +8409,7 @@
 xmlParseVersionInfo(xmlParserCtxtPtr ctxt) {
     xmlChar *version = NULL;
 
-    if (memcmp(CUR_PTR, "version", 7) == 0) {
+    if (CMP7(CUR_PTR, 'v', 'e', 'r', 's', 'i', 'o', 'n')) {
 	SKIP(7);
 	SKIP_BLANKS;
 	if (RAW != '=') {
@@ -8496,7 +8515,7 @@
     xmlChar *encoding = NULL;
 
     SKIP_BLANKS;
-    if (memcmp(CUR_PTR, "encoding", 8) == 0) {
+    if (CMP8(CUR_PTR, 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g')) {
 	SKIP(8);
 	SKIP_BLANKS;
 	if (RAW != '=') {
@@ -8594,7 +8613,7 @@
     int standalone = -1;
 
     SKIP_BLANKS;
-    if (memcmp(CUR_PTR, "standalone", 10) == 0) {
+    if (CMP10(CUR_PTR, 's', 't', 'a', 'n', 'd', 'a', 'l', 'o', 'n', 'e')) {
 	SKIP(10);
         SKIP_BLANKS;
 	if (RAW != '=') {
@@ -8743,7 +8762,7 @@
 void
 xmlParseMisc(xmlParserCtxtPtr ctxt) {
     while (((RAW == '<') && (NXT(1) == '?')) ||
-           (memcmp(CUR_PTR, "<!--", 4) == 0) ||
+           (CMP4(CUR_PTR, '<', '!', '-', '-')) ||
            IS_BLANK_CH(CUR)) {
         if ((RAW == '<') && (NXT(1) == '?')) {
 	    xmlParsePI(ctxt);
@@ -8815,7 +8834,7 @@
      * Check for the XMLDecl in the Prolog.
      */
     GROW;
-    if ((memcmp(CUR_PTR, "<?xml", 5) == 0) && (IS_BLANK_CH(NXT(5)))) {
+    if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) {
 
 	/*
 	 * Note that we will switch encoding on the fly.
@@ -8846,7 +8865,7 @@
      * (doctypedecl Misc*)?
      */
     GROW;
-    if (memcmp(CUR_PTR, "<!DOCTYPE", 9) == 0) {
+    if (CMP9(CUR_PTR, '<', '!', 'D', 'O', 'C', 'T', 'Y', 'P', 'E')) {
 
 	ctxt->inSubset = 1;
 	xmlParseDocTypeDecl(ctxt);
@@ -8972,7 +8991,7 @@
      * Check for the XMLDecl in the Prolog.
      */
     GROW;
-    if ((memcmp(CUR_PTR, "<?xml", 5) == 0) && (IS_BLANK_CH(NXT(5)))) {
+    if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) {
 
 	/*
 	 * Note that we will switch encoding on the fly.
@@ -10593,7 +10612,7 @@
     /*
      * Parse a possible text declaration first
      */
-    if ((memcmp(CUR_PTR, "<?xml", 5) == 0) && (IS_BLANK_CH(NXT(5)))) {
+    if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) {
 	xmlParseTextDecl(ctxt);
     }
 
@@ -10791,7 +10810,7 @@
     /*
      * Parse a possible text declaration first
      */
-    if ((memcmp(CUR_PTR, "<?xml", 5) == 0) && (IS_BLANK_CH(NXT(5)))) {
+    if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) {
 	xmlParseTextDecl(ctxt);
     }