patched a bug in parsing production 1 and 2 of xmlschemas regexp that

* xmlregexp.c: patched a bug in parsing production 1 and 2 of
  xmlschemas regexp that William pointed out while working on
  #134120
* test/regexp/branch result/regexp/branch: added a specific
  regression test
Daniel
diff --git a/xmlregexp.c b/xmlregexp.c
index 057458b..d1e6f38 100644
--- a/xmlregexp.c
+++ b/xmlregexp.c
@@ -1214,14 +1214,15 @@
 #ifdef DEBUG_REGEXP_GRAPH
     printf("Add trans from %d to %d ", state->no, target->no);
     if (count == REGEXP_ALL_COUNTER)
-	printf("all transition");
+	printf("all transition\n");
     else if (count >= 0)
-	printf("count based %d", count);
+	printf("count based %d\n", count);
     else if (counter >= 0)
-	printf("counted %d", counter);
+	printf("counted %d\n", counter);
     else if (atom == NULL)
-	printf("epsilon transition");
-    printf("\n");
+	printf("epsilon transition\n");
+    else if (atom != NULL) 
+        xmlRegPrintAtom(stdout, atom);
 #endif
 
     state->trans[state->nbTrans].atom = atom;
@@ -3862,50 +3863,33 @@
 /**
  * xmlFAParseBranch:
  * @ctxt:  a regexp parser context
- * @first:  is taht the first
  *
  * [2]   branch   ::=   piece*
  8
  */
 static int
-xmlFAParseBranch(xmlRegParserCtxtPtr ctxt, int first) {
+xmlFAParseBranch(xmlRegParserCtxtPtr ctxt) {
     xmlRegStatePtr previous;
-    xmlRegAtomPtr prevatom = NULL;
     int ret;
 
     previous = ctxt->state;
     ret = xmlFAParsePiece(ctxt);
     if (ret != 0) {
-	if (first) {
-	    if (xmlFAGenerateTransitions(ctxt, previous, NULL, ctxt->atom) < 0)
-	        return(-1);
-	    previous = ctxt->state;
-	} else {
-	    prevatom = ctxt->atom;
-	}
+	if (xmlFAGenerateTransitions(ctxt, previous, NULL, ctxt->atom) < 0)
+	    return(-1);
+	previous = ctxt->state;
 	ctxt->atom = NULL;
     }
     while ((ret != 0) && (ctxt->error == 0)) {
 	ret = xmlFAParsePiece(ctxt);
 	if (ret != 0) {
-	    if (first) {
-		if (xmlFAGenerateTransitions(ctxt, previous, NULL,
-		                             ctxt->atom) < 0)
+	    if (xmlFAGenerateTransitions(ctxt, previous, NULL,
+					 ctxt->atom) < 0)
 		    return(-1);
-	    } else {
-		if (xmlFAGenerateTransitions(ctxt, previous, NULL,
-		                             prevatom) < 0)
-		    return(-1);
-		prevatom = ctxt->atom;
-	    }
 	    previous = ctxt->state;
 	    ctxt->atom = NULL;
 	}
     }
-    if (!first) {
-	if (xmlFAGenerateTransitions(ctxt, previous, ctxt->end, prevatom) < 0)
-	    return(-1);
-    }
     return(0);
 }
 
@@ -3918,12 +3902,21 @@
  */
 static void
 xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top) {
-    xmlRegStatePtr start, end, oldend;
+    xmlRegStatePtr start, end, oldend, oldstart;
 
     oldend = ctxt->end;
 
+    oldstart = ctxt->state;
+    /* if not top start should have been generated by an epsilon trans */
     start = ctxt->state;
-    xmlFAParseBranch(ctxt, (ctxt->end == NULL));
+    ctxt->end = NULL;
+    xmlFAParseBranch(ctxt);
+    if (top) {
+#ifdef DEBUG_REGEXP_GRAPH
+	printf("State %d is final\n", ctxt->state->no);
+#endif
+	ctxt->state->type = XML_REGEXP_FINAL_STATE;
+    }
     if (CUR != '|') {
 	ctxt->end = ctxt->state;
 	return;
@@ -3932,11 +3925,21 @@
     while ((CUR == '|') && (ctxt->error == 0)) {
 	NEXT;
 	ctxt->state = start;
-	ctxt->end = end;
-	xmlFAParseBranch(ctxt, 0);
+	ctxt->end = NULL;
+	xmlFAParseBranch(ctxt);
+	if (top) {
+	    ctxt->state->type = XML_REGEXP_FINAL_STATE;
+#ifdef DEBUG_REGEXP_GRAPH
+	    printf("State %d is final\n", ctxt->state->no);
+#endif
+	} else {
+	    xmlFAGenerateEpsilonTransition(ctxt, ctxt->state, end);
+	}
     }
-    if (!top)
-	ctxt->end = oldend;
+    if (!top) {
+	ctxt->state = end;
+	ctxt->end = end;
+    }
 }
 
 /************************************************************************