enhanced xmlRegStateAddTrans to check if transition is already present

* xmlregexp.c: enhanced xmlRegStateAddTrans to check if transition
  is already present and, if so, to ignore the request to add it.
  This has a very dramatic effect on memory requirements as well
  as efficiency.  It also fixes bug 141762.
diff --git a/xmlregexp.c b/xmlregexp.c
index 0befd12..12ecd83 100644
--- a/xmlregexp.c
+++ b/xmlregexp.c
@@ -1182,6 +1182,9 @@
 xmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state,
 	            xmlRegAtomPtr atom, xmlRegStatePtr target,
 		    int counter, int count) {
+
+    int nrtrans;
+
     if (state == NULL) {
 	ERROR("add state: state is NULL");
 	return;
@@ -1190,6 +1193,25 @@
 	ERROR("add state: target is NULL");
 	return;
     }
+    /*
+     * Other routines follow the philosophy 'When in doubt, add a transition'
+     * so we check here whether such a transition is already present and, if
+     * so, silently ignore this request.
+     */
+
+    for (nrtrans=0; nrtrans<state->nbTrans; nrtrans++) {
+        if ((state->trans[nrtrans].atom == atom) &&
+            (state->trans[nrtrans].to == target->no) &&
+            (state->trans[nrtrans].counter == counter) &&
+            (state->trans[nrtrans].count == count)) {
+#ifdef DEBUG_REGEXP_GRAPH
+            printf("Ignoring duplicate transition from %d to %d\n",
+                    state->no, target->no);
+#endif
+            return;
+        }
+    }
+
     if (state->maxTrans == 0) {
 	state->maxTrans = 4;
 	state->trans = (xmlRegTrans *) xmlMalloc(state->maxTrans *