allows an extra argument to subset the tests big speedup for validation,

* runtest.c: allows an extra argument to subset the tests
* xmlregexp.c: big speedup for validation, basically avoided
  transition creation explosion when removing epsilon transition
Daniel
diff --git a/runtest.c b/runtest.c
index ac2d955..f6e9840 100644
--- a/runtest.c
+++ b/runtest.c
@@ -4169,33 +4169,56 @@
     return(err);
 }
 
+static int verbose = 0;
+
+static int
+runtest(int i) {
+    int ret = 0, res;
+    int old_errors, old_tests, old_leaks;
+
+    old_errors = nb_errors;
+    old_tests = nb_tests;
+    old_leaks = nb_leaks;
+    if (testDescriptions[i].desc != NULL)
+	printf("## %s\n", testDescriptions[i].desc);
+    res = launchTests(&testDescriptions[i]);
+    if (res != 0)
+	ret++;
+    if (verbose) {
+	if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
+	    printf("Ran %d tests, no errors\n", nb_tests - old_tests);
+	else
+	    printf("Ran %d tests, %d errors, %d leaks\n",
+		   nb_tests - old_tests,
+		   nb_errors - old_errors,
+		   nb_leaks - old_leaks);
+    }
+    return(ret);
+}
+
 int
 main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
-    int i = 0, res, ret = 0;
-    int verbose = 0;
-    int old_errors, old_tests, old_leaks;
+    int i, a, ret = 0;
+    int subset = 0;
 
     initializeLibxml2();
 
-    if ((argc >= 2) && (!strcmp(argv[1], "-v")))
-        verbose = 1;
-    for (i = 0; testDescriptions[i].func != NULL; i++) {
-        old_errors = nb_errors;
-        old_tests = nb_tests;
-        old_leaks = nb_leaks;
-        if (testDescriptions[i].desc != NULL)
-	    printf("## %s\n", testDescriptions[i].desc);
-	res = launchTests(&testDescriptions[i]);
-	if (res != 0)
-	    ret++;
-	if (verbose) {
-	    if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
-	        printf("Ran %d tests, no errors\n", nb_tests - old_tests);
-	    else
-	        printf("Ran %d tests, %d errors, %d leaks\n",
-		       nb_tests - old_tests,
-		       nb_errors - old_errors,
-		       nb_leaks - old_leaks);
+    
+    for (a = 1; a < argc;a++) {
+        if (!strcmp(argv[a], "-v"))
+	    verbose = 1;
+	else {
+	    for (i = 0; testDescriptions[i].func != NULL; i++) {
+	        if (strstr(testDescriptions[i].desc, argv[a])) {
+		    ret += runtest(i);
+		    subset++;
+		}
+	    }
+	}
+    }
+    if (subset == 0) {
+	for (i = 0; testDescriptions[i].func != NULL; i++) {
+	    ret += runtest(i);
 	}
     }
     if ((nb_errors == 0) && (nb_leaks == 0)) {