another nasty regexp case fixed. added to regression suite Daniel

* xmlregexp.c: another nasty regexp case fixed.
* test/regexp/ranges2 result/regexp/ranges2: added to regression
  suite
Daniel

svn path=/trunk/; revision=3658
diff --git a/xmlregexp.c b/xmlregexp.c
index 1f1a1cc..2bce367 100644
--- a/xmlregexp.c
+++ b/xmlregexp.c
@@ -1610,7 +1610,7 @@
 		     /* ???? For some reason it seems we never reach that
 		        case, I suppose this got optimized out before when
 			building the automata */
-
+		    copy = xmlRegCopyAtom(ctxt, atom);
 		    copy = xmlRegCopyAtom(ctxt, atom);
 		    if (copy == NULL)
 		        return(-1);
@@ -1711,9 +1711,11 @@
 	    xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1);
 	    break;
 	case XML_REGEXP_QUANT_RANGE: 
+#if DV_test
 	    if (atom->min == 0) {
 		xmlFAGenerateEpsilonTransition(ctxt, from, to);
 	    }
+#endif
 	    break;
 	default:
 	    break;
@@ -3211,12 +3213,22 @@
 		     * this is a multiple input sequence
 		     * If there is a counter associated increment it now.
 		     * before potentially saving and rollback
+		     * do not increment if the counter is already over the
+		     * maximum limit in which case get to next transition
 		     */
 		    if (trans->counter >= 0) {
-			if (exec->counts == NULL) {
+			xmlRegCounterPtr counter;
+
+			if ((exec->counts == NULL) ||
+			    (exec->comp == NULL) ||
+			    (exec->comp->counters == NULL)) {
 			    exec->status = -1;
 			    goto error;
 			}
+			counter = &exec->comp->counters[trans->counter];
+			if (exec->counts[trans->counter] >= counter->max)
+			    continue; /* for loop on transitions */
+
 #ifdef DEBUG_REGEXP_EXEC
 			printf("Increasing count %d\n", trans->counter);
 #endif
@@ -3312,10 +3324,18 @@
 		    xmlFARegExecSave(exec);
 		}
 		if (trans->counter >= 0) {
-		    if (exec->counts == NULL) {
-		        exec->status = -1;
+		    xmlRegCounterPtr counter;
+
+                    /* make sure we don't go over the counter maximum value */
+		    if ((exec->counts == NULL) ||
+			(exec->comp == NULL) ||
+			(exec->comp->counters == NULL)) {
+			exec->status = -1;
 			goto error;
 		    }
+		    counter = &exec->comp->counters[trans->counter];
+		    if (exec->counts[trans->counter] >= counter->max)
+			continue; /* for loop on transitions */
 #ifdef DEBUG_REGEXP_EXEC
 		    printf("Increasing count %d\n", trans->counter);
 #endif