- tree.c valid.c xmllint.c: Fixed a few postvalidation bugs
  and added a --dtdvalid option to xmllint used to test it
Daniel
diff --git a/xmllint.c b/xmllint.c
index 190632f..118a691 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -67,6 +67,7 @@
 static int nowrap = 0;
 static int valid = 0;
 static int postvalid = 0;
+static char * dtdvalid = NULL;
 static int repeat = 0;
 static int insert = 0;
 static int compress = 0;
@@ -562,10 +563,27 @@
     /*
      * A posteriori validation test
      */
-    if (postvalid) {
+    if (dtdvalid != NULL) {
+	xmlDtdPtr dtd;
+
+	dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid); 
+	if (dtd == NULL) {
+	    fprintf(stderr, "Could not parse DTD %s\n", dtdvalid);
+	} else {
+	    xmlValidCtxt cvp;
+	    cvp.userData = (void *) stderr;                                                 cvp.error    = (xmlValidityErrorFunc) fprintf;                                  cvp.warning  = (xmlValidityWarningFunc) fprintf;
+	    if (!xmlValidateDtd(&cvp, doc, dtd)) {
+		fprintf(stderr, "Document %s does not validate against %s\n",
+			filename, dtdvalid);
+	    }
+	    xmlFreeDtd(dtd);
+	}
+    } else if (postvalid) {
 	xmlValidCtxt cvp;
 	cvp.userData = (void *) stderr;                                                 cvp.error    = (xmlValidityErrorFunc) fprintf;                                  cvp.warning  = (xmlValidityWarningFunc) fprintf;
-	xmlValidateDocument(&cvp, doc);
+	if (!xmlValidateDocument(&cvp, doc)) {
+	    fprintf(stderr, "Document %s does not validate\n", filename);
+	}
     }
 
 #ifdef LIBXML_DEBUG_ENABLED
@@ -623,6 +641,11 @@
 	else if ((!strcmp(argv[i], "-postvalid")) ||
 	         (!strcmp(argv[i], "--postvalid")))
 	    postvalid++;
+	else if ((!strcmp(argv[i], "-dtdvalid")) ||
+	         (!strcmp(argv[i], "--dtdvalid"))) {
+	    i++;
+	    dtdvalid = argv[i];
+        }
 	else if ((!strcmp(argv[i], "-insert")) ||
 	         (!strcmp(argv[i], "--insert")))
 	    insert++;
@@ -696,6 +719,11 @@
 	    i++;
 	    continue;
         }
+	if ((!strcmp(argv[i], "-dtdvalid")) ||
+	         (!strcmp(argv[i], "--dtdvalid"))) {
+	    i++;
+	    continue;
+        }
 	if (argv[i][0] != '-') {
 	    if (repeat) {
 		for (count = 0;count < 100 * repeat;count++)
@@ -725,6 +753,7 @@
 	printf("\t--nowarp : do not put HTML doc wrapper\n");
 	printf("\t--valid : validate the document in addition to std well-formed check\n");
 	printf("\t--postvalid : do a posteriori validation, i.e after parsing\n");
+	printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n");
 	printf("\t--repeat : repeat 100 times, for timing or profiling\n");
 	printf("\t--insert : ad-hoc test for valid insertions\n");
 	printf("\t--compress : turn on gzip compression of output\n");