fixed a very serious (looping) validation bug Daniel

* parser.c valid.c result/valid/rss.xml result/valid/rss.xml.err:
  fixed a very serious (looping) validation bug
Daniel
diff --git a/ChangeLog b/ChangeLog
index eb73e8e..5ccff72 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Oct 18 16:56:23 CEST 2001 Daniel Veillard <daniel@veillard.com>
+
+	* parser.c valid.c result/valid/rss.xml result/valid/rss.xml.err:
+	  fixed a very serious (looping) validation bug
+
 Wed Oct 17 11:56:25 EDT 2001 Daniel Veillard <daniel@veillard.com>
 
 	* include/libxml/globals.h include/libxml/threads.h threads.c
diff --git a/parser.c b/parser.c
index df21992..0a580f5 100644
--- a/parser.c
+++ b/parser.c
@@ -4443,12 +4443,54 @@
 	    ret->ocur = XML_ELEMENT_CONTENT_OPT;
 	NEXT;
     } else if (RAW == '*') {
-	if (ret != NULL)
+	if (ret != NULL) {
 	    ret->ocur = XML_ELEMENT_CONTENT_MULT;
+	    cur = ret;
+	    /*
+	     * Some normalization:
+	     * (a | b* | c?)* == (a | b | c)*
+	     */
+	    while (cur->type == XML_ELEMENT_CONTENT_OR) {
+		if ((cur->c1 != NULL) &&
+	            ((cur->c1->ocur == XML_ELEMENT_CONTENT_OPT) ||
+		     (cur->c1->ocur == XML_ELEMENT_CONTENT_MULT)))
+		    cur->c1->ocur = XML_ELEMENT_CONTENT_ONCE;
+		if ((cur->c2 != NULL) &&
+	            ((cur->c2->ocur == XML_ELEMENT_CONTENT_OPT) ||
+		     (cur->c2->ocur == XML_ELEMENT_CONTENT_MULT)))
+		    cur->c2->ocur = XML_ELEMENT_CONTENT_ONCE;
+		cur = cur->c2;
+	    }
+	}
 	NEXT;
     } else if (RAW == '+') {
-	if (ret != NULL)
+	if (ret != NULL) {
+	    int found = 0;
+
 	    ret->ocur = XML_ELEMENT_CONTENT_PLUS;
+	    /*
+	     * Some normalization:
+	     * (a | b*)+ == (a | b)*
+	     * (a | b?)+ == (a | b)*
+	     */
+	    while (cur->type == XML_ELEMENT_CONTENT_OR) {
+		if ((cur->c1 != NULL) &&
+	            ((cur->c1->ocur == XML_ELEMENT_CONTENT_OPT) ||
+		     (cur->c1->ocur == XML_ELEMENT_CONTENT_MULT))) {
+		    cur->c1->ocur = XML_ELEMENT_CONTENT_ONCE;
+		    found = 1;
+		}
+		if ((cur->c2 != NULL) &&
+	            ((cur->c2->ocur == XML_ELEMENT_CONTENT_OPT) ||
+		     (cur->c2->ocur == XML_ELEMENT_CONTENT_MULT))) {
+		    cur->c2->ocur = XML_ELEMENT_CONTENT_ONCE;
+		    found = 1;
+		}
+		cur = cur->c2;
+	    }
+	    if (found)
+		ret->ocur = XML_ELEMENT_CONTENT_MULT;
+	}
 	NEXT;
     }
     return(ret);
diff --git a/result/valid/rss.xml b/result/valid/rss.xml
index ee5145f..d3d1aad 100644
--- a/result/valid/rss.xml
+++ b/result/valid/rss.xml
@@ -17,15 +17,15 @@
   
   Based on RSS DTD originally created by
   Lars Marius Garshol - larsga@ifi.uio.no.
-  $Id: rss-0.91.dtd,v 1.1 1999/07/25 07:59:31 danda Exp $
+  $Id: rss.xml,v 1.1 2001/04/20 13:48:21 veillard Exp $
   
 --><!ELEMENT rss (channel)>
 <!ATTLIST rss version CDATA #REQUIRED>
-<!-- must be "0.91"> --><!ELEMENT channel (title | description | link | language | item+ | rating? | image? | textinput? | copyright? | pubDate? | lastBuildDate? | docs? | managingEditor? | webMaster? | skipHours? | skipDays?)*>
+<!-- must be "0.91"> --><!ELEMENT channel (title | description | link | language | item+ | rating | image | textinput | copyright | pubDate | lastBuildDate | docs | managingEditor | webMaster | skipHours | skipDays)*>
 <!ELEMENT title (#PCDATA)>
 <!ELEMENT description (#PCDATA)>
 <!ELEMENT link (#PCDATA)>
-<!ELEMENT image (title | url | link | width? | height? | description?)*>
+<!ELEMENT image (title | url | link | width | height | description)*>
 <!ELEMENT url (#PCDATA)>
 <!ELEMENT item (title | link | description)*>
 <!ELEMENT textinput (title | description | name | link)*>
diff --git a/valid.c b/valid.c
index a8b4b4c..c894ff6 100644
--- a/valid.c
+++ b/valid.c
@@ -199,6 +199,11 @@
 	case XML_HTML_DOCUMENT_NODE:
 	    xmlGenericError(xmlGenericErrorContext, "?html? ");
 	    break;
+#ifdef LIBXML_DOCB_ENABLED
+	case XML_DOCB_DOCUMENT_NODE:
+	    xmlGenericError(xmlGenericErrorContext, "?docb? ");
+	    break;
+#endif
 	case XML_DTD_NODE:
 	    xmlGenericError(xmlGenericErrorContext, "?dtd? ");
 	    break;
@@ -3395,6 +3400,8 @@
      * of handling epsilon transition in NFAs.
      */
     if ((CONT != NULL) &&
+	((CONT->parent == NULL) ||
+	 (CONT->parent->type != XML_ELEMENT_CONTENT_OR)) &&
 	((CONT->ocur == XML_ELEMENT_CONTENT_MULT) ||
 	 (CONT->ocur == XML_ELEMENT_CONTENT_OPT) ||
 	 ((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURENCE)))) {
@@ -3600,7 +3607,7 @@
 			break;
 		    }
 		    DEBUG_VALID_MSG("Mult branch succeeded, continuing");
-		    SET_OCCURENCE;
+		    /* SET_OCCURENCE; */
 		    goto cont;
 	    }
 	}