diff --git a/xmllint.c b/xmllint.c
index d740b76..d2a3398 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -81,6 +81,8 @@
 #include <libxml/xmlsave.h>
 #endif
 
+#define ERR_STREAM stderr
+
 #ifndef XML_XML_DEFAULT_CATALOG
 #define XML_XML_DEFAULT_CATALOG "file://" SYSCONFDIR "/xml/catalog"
 #endif
@@ -221,7 +223,7 @@
 	return;
     while (*path != 0) {
 	if (nbpaths >= MAX_PATHS) {
-	    fprintf(stderr, "MAX_PATHS reached: too many paths\n");
+	    fprintf(ERR_STREAM, "MAX_PATHS reached: too many paths\n");
 	    return;
 	}
 	cur = path;
@@ -276,7 +278,7 @@
 		ctxt->sax->error = err;
 	    if (load_trace) {
 		fprintf \
-			(stderr,
+			(ERR_STREAM,
 			 "Loaded URL=\"%s\" ID=\"%s\"\n",
 			 URL ? URL : "(null)",
 			 ID ? ID : "(null)");
@@ -299,7 +301,7 @@
 		    ctxt->sax->error = err;
 		if (load_trace) {
 		    fprintf \
-			(stderr,
+			(ERR_STREAM,
 			 "Loaded URL=\"%s\" ID=\"%s\"\n",
 			 newURL,
 			 ID ? ID : "(null)");
@@ -330,7 +332,7 @@
 static void
 OOM(void)
 {
-    fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem);
+    fprintf(ERR_STREAM, "Ran out of memory needs > %d bytes\n", maxmem);
     progresult = XMLLINT_ERR_MEM;
 }
 
@@ -442,10 +444,10 @@
     msec += (end.tv_usec - begin.tv_usec) / 1000;
 
     va_start(ap, fmt);
-    vfprintf(stderr, fmt, ap);
+    vfprintf(ERR_STREAM, fmt, ap);
     va_end(ap);
 
-    fprintf(stderr, " took %ld ms\n", msec);
+    fprintf(ERR_STREAM, " took %ld ms\n", msec);
 }
 #else
 /*
@@ -473,9 +475,9 @@
     msec = ((end - begin) * 1000) / CLOCKS_PER_SEC;
 
     va_start(ap, fmt);
-    vfprintf(stderr, fmt, ap);
+    vfprintf(ERR_STREAM, fmt, ap);
     va_end(ap);
-    fprintf(stderr, " took %ld ms\n", msec);
+    fprintf(ERR_STREAM, " took %ld ms\n", msec);
 }
 #endif
 /************************************************************************
@@ -497,7 +499,7 @@
     memset(&buffer[sizeof(buffer)-4], 0, 4);
     result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer);
     if (result) {
-	fprintf(stderr, "%s", result);
+	fprintf(ERR_STREAM, "%s", result);
 	xmlFree(result);
     }
     buffer[0] = 0;
@@ -513,7 +515,7 @@
 static void
 xmlHTMLPrintFileInfo(xmlParserInputPtr input) {
     int len;
-    fprintf(stderr, "<p>");
+    fprintf(ERR_STREAM, "<p>");
 
     len = strlen(buffer);
     if (input != NULL) {
@@ -541,7 +543,7 @@
     int n;
 
     if (input == NULL) return;
-    fprintf(stderr, "<pre>\n");
+    fprintf(ERR_STREAM, "<pre>\n");
     cur = input->cur;
     base = input->base;
     while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
@@ -573,7 +575,7 @@
     len = strlen(buffer);
     snprintf(&buffer[len], sizeof(buffer) - len, "^\n");
     xmlHTMLEncodeSend();
-    fprintf(stderr, "</pre>");
+    fprintf(ERR_STREAM, "</pre>");
 }
 
 /**
@@ -601,13 +603,13 @@
 
     xmlHTMLPrintFileInfo(input);
 
-    fprintf(stderr, "<b>error</b>: ");
+    fprintf(ERR_STREAM, "<b>error</b>: ");
     va_start(args, msg);
     len = strlen(buffer);
     vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
     va_end(args);
     xmlHTMLEncodeSend();
-    fprintf(stderr, "</p>\n");
+    fprintf(ERR_STREAM, "</p>\n");
 
     xmlHTMLPrintFileContext(input);
     xmlHTMLEncodeSend();
@@ -639,13 +641,13 @@
 
     xmlHTMLPrintFileInfo(input);
 
-    fprintf(stderr, "<b>warning</b>: ");
+    fprintf(ERR_STREAM, "<b>warning</b>: ");
     va_start(args, msg);
     len = strlen(buffer);
     vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
     va_end(args);
     xmlHTMLEncodeSend();
-    fprintf(stderr, "</p>\n");
+    fprintf(ERR_STREAM, "</p>\n");
 
     xmlHTMLPrintFileContext(input);
     xmlHTMLEncodeSend();
@@ -675,13 +677,13 @@
 
     xmlHTMLPrintFileInfo(input);
 
-    fprintf(stderr, "<b>validity error</b>: ");
+    fprintf(ERR_STREAM, "<b>validity error</b>: ");
     len = strlen(buffer);
     va_start(args, msg);
     vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
     va_end(args);
     xmlHTMLEncodeSend();
-    fprintf(stderr, "</p>\n");
+    fprintf(ERR_STREAM, "</p>\n");
 
     xmlHTMLPrintFileContext(input);
     xmlHTMLEncodeSend();
@@ -712,13 +714,13 @@
 
     xmlHTMLPrintFileInfo(input);
 
-    fprintf(stderr, "<b>validity warning</b>: ");
+    fprintf(ERR_STREAM, "<b>validity warning</b>: ");
     va_start(args, msg);
     len = strlen(buffer);
     vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
     va_end(args);
     xmlHTMLEncodeSend();
-    fprintf(stderr, "</p>\n");
+    fprintf(ERR_STREAM, "</p>\n");
 
     xmlHTMLPrintFileContext(input);
     xmlHTMLEncodeSend();
@@ -1629,13 +1631,13 @@
 	if (repeat == 0) {
 	    if (ret == 0) {
 	        if (!quiet) {
-	            fprintf(stderr, "%s validates\n", filename);
+	            fprintf(ERR_STREAM, "%s validates\n", filename);
 	        }
 	    } else if (ret > 0) {
-		fprintf(stderr, "%s fails to validate\n", filename);
+		fprintf(ERR_STREAM, "%s fails to validate\n", filename);
 		progresult = XMLLINT_ERR_VALID;
 	    } else {
-		fprintf(stderr, "%s validation generated an internal error\n",
+		fprintf(ERR_STREAM, "%s validation generated an internal error\n",
 		       filename);
 		progresult = XMLLINT_ERR_VALID;
 	    }
@@ -1663,7 +1665,7 @@
             xmlCtxtReadFile(ctxt, filename, NULL, options);
 
 	if (ctxt->myDoc != NULL) {
-	    fprintf(stderr, "SAX generated a doc !\n");
+	    fprintf(ERR_STREAM, "SAX generated a doc !\n");
 	    xmlFreeDoc(ctxt->myDoc);
 	    ctxt->myDoc = NULL;
 	}
@@ -1731,7 +1733,7 @@
 		                    xmlTextReaderConstLocalName(reader),
 				    xmlTextReaderConstNamespaceUri(reader));
 		if (ret < 0) {
-		    fprintf(stderr, "xmlStreamPush() failure\n");
+		    fprintf(ERR_STREAM, "xmlStreamPush() failure\n");
                     xmlFreeStreamCtxt(patstream);
 		    patstream = NULL;
 		} else if (ret != match) {
@@ -1741,13 +1743,13 @@
 		                       xmlTextReaderCurrentNode(reader));
 		    }
 #endif
-		    fprintf(stderr,
+		    fprintf(ERR_STREAM,
 		            "xmlPatternMatch and xmlStreamPush disagree\n");
                     if (path != NULL)
-                        fprintf(stderr, "  pattern %s node %s\n",
+                        fprintf(ERR_STREAM, "  pattern %s node %s\n",
                                 pattern, path);
                     else
-		        fprintf(stderr, "  pattern %s node %s\n",
+		        fprintf(ERR_STREAM, "  pattern %s node %s\n",
 			    pattern, xmlTextReaderConstName(reader));
 		}
 
@@ -1756,7 +1758,7 @@
 	        ((type == XML_READER_TYPE_ELEMENT) && (empty))) {
 	        ret = xmlStreamPop(patstream);
 		if (ret < 0) {
-		    fprintf(stderr, "xmlStreamPop() failure\n");
+		    fprintf(ERR_STREAM, "xmlStreamPop() failure\n");
                     xmlFreeStreamCtxt(patstream);
 		    patstream = NULL;
 		}
@@ -1784,7 +1786,7 @@
 	base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
 	if (base == (void *) MAP_FAILED) {
 	    close(fd);
-	    fprintf(stderr, "mmap failure for file %s\n", filename);
+	    fprintf(ERR_STREAM, "mmap failure for file %s\n", filename);
 	    progresult = XMLLINT_ERR_RDFILE;
 	    return;
 	}
@@ -1803,7 +1805,7 @@
 	if (patstream != NULL) {
 	    ret = xmlStreamPush(patstream, NULL, NULL);
 	    if (ret < 0) {
-		fprintf(stderr, "xmlStreamPush() failure\n");
+		fprintf(ERR_STREAM, "xmlStreamPush() failure\n");
 		xmlFreeStreamCtxt(patstream);
 		patstream = NULL;
             }
@@ -1829,7 +1831,7 @@
 	    }
 	    ret = xmlTextReaderRelaxNGValidate(reader, relaxng);
 	    if (ret < 0) {
-		fprintf(stderr,
+		fprintf(ERR_STREAM,
 			"Relax-NG schema %s failed to compile\n", relaxng);
 		progresult = XMLLINT_ERR_SCHEMACOMP;
 		relaxng = NULL;
@@ -1844,7 +1846,7 @@
 	    }
 	    ret = xmlTextReaderSchemaValidate(reader, schema);
 	    if (ret < 0) {
-		fprintf(stderr,
+		fprintf(ERR_STREAM,
 			"XSD schema %s failed to compile\n", schema);
 		progresult = XMLLINT_ERR_SCHEMACOMP;
 		schema = NULL;
@@ -1888,7 +1890,7 @@
 #ifdef LIBXML_VALID_ENABLED
 	if (valid) {
 	    if (xmlTextReaderIsValid(reader) != 1) {
-		fprintf(stderr,
+		fprintf(ERR_STREAM,
 			"Document %s does not validate\n", filename);
 		progresult = XMLLINT_ERR_VALID;
 	    }
@@ -1897,11 +1899,11 @@
 #ifdef LIBXML_SCHEMAS_ENABLED
 	if ((relaxng != NULL) || (schema != NULL)) {
 	    if (xmlTextReaderIsValid(reader) != 1) {
-		fprintf(stderr, "%s fails to validate\n", filename);
+		fprintf(ERR_STREAM, "%s fails to validate\n", filename);
 		progresult = XMLLINT_ERR_VALID;
 	    } else {
 	        if (!quiet) {
-	            fprintf(stderr, "%s validates\n", filename);
+	            fprintf(ERR_STREAM, "%s validates\n", filename);
 	        }
 	    }
 	}
@@ -1911,11 +1913,11 @@
 	 */
 	xmlFreeTextReader(reader);
 	if (ret != 0) {
-	    fprintf(stderr, "%s : failed to parse\n", filename);
+	    fprintf(ERR_STREAM, "%s : failed to parse\n", filename);
 	    progresult = XMLLINT_ERR_UNCLASS;
 	}
     } else {
-	fprintf(stderr, "Unable to open %s\n", filename);
+	fprintf(ERR_STREAM, "Unable to open %s\n", filename);
 	progresult = XMLLINT_ERR_UNCLASS;
     }
 #ifdef LIBXML_PATTERN_ENABLED
@@ -1944,7 +1946,7 @@
 
     root = xmlDocGetRootElement(doc);
     if (root == NULL ) {
-        fprintf(stderr,
+        fprintf(ERR_STREAM,
                 "Document does not have a root element");
         progresult = XMLLINT_ERR_UNCLASS;
         return;
@@ -1960,7 +1962,7 @@
         patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict,
 	                             0, &namespaces[0]);
 	if (patternc == NULL) {
-	    fprintf(stderr,
+	    fprintf(ERR_STREAM,
 		    "Pattern %s failed to compile\n", pattern);
             progresult = XMLLINT_ERR_SCHEMAPAT;
 	    pattern = NULL;
@@ -1971,7 +1973,7 @@
 	if (patstream != NULL) {
 	    ret = xmlStreamPush(patstream, NULL, NULL);
 	    if (ret < 0) {
-		fprintf(stderr, "xmlStreamPush() failure\n");
+		fprintf(ERR_STREAM, "xmlStreamPush() failure\n");
 		xmlFreeStreamCtxt(patstream);
 		patstream = NULL;
             }
@@ -1998,11 +2000,11 @@
 	}
 	xmlFreeTextReader(reader);
 	if (ret != 0) {
-	    fprintf(stderr, "failed to walk through the doc\n");
+	    fprintf(ERR_STREAM, "failed to walk through the doc\n");
 	    progresult = XMLLINT_ERR_UNCLASS;
 	}
     } else {
-	fprintf(stderr, "Failed to crate a reader from the document\n");
+	fprintf(ERR_STREAM, "Failed to crate a reader from the document\n");
 	progresult = XMLLINT_ERR_UNCLASS;
     }
 #ifdef LIBXML_PATTERN_ENABLED
@@ -2032,13 +2034,13 @@
             if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr <= 0)) {
                 progresult = XMLLINT_ERR_XPATH_EMPTY;
                 if (!quiet) {
-                    fprintf(stderr, "XPath set is empty\n");
+                    fprintf(ERR_STREAM, "XPath set is empty\n");
                 }
                 break;
             }
             buf = xmlOutputBufferCreateFile(stdout, NULL);
             if (buf == NULL) {
-                fprintf(stderr, "Out of memory for XPath\n");
+                fprintf(ERR_STREAM, "Out of memory for XPath\n");
                 progresult = XMLLINT_ERR_MEM;
                 return;
             }
@@ -2077,11 +2079,11 @@
 	    printf("%s\n", (const char *) cur->stringval);
 	    break;
         case XPATH_UNDEFINED:
-	    fprintf(stderr, "XPath Object is uninitialized\n");
+	    fprintf(ERR_STREAM, "XPath Object is uninitialized\n");
             progresult = XMLLINT_ERR_XPATH;
 	    break;
 	default:
-	    fprintf(stderr, "XPath object of unexpected type\n");
+	    fprintf(ERR_STREAM, "XPath object of unexpected type\n");
             progresult = XMLLINT_ERR_XPATH;
 	    break;
     }
@@ -2093,7 +2095,7 @@
 
     ctxt = xmlXPathNewContext(doc);
     if (ctxt == NULL) {
-        fprintf(stderr, "Out of memory for XPath\n");
+        fprintf(ERR_STREAM, "Out of memory for XPath\n");
         progresult = XMLLINT_ERR_MEM;
         return;
     }
@@ -2102,7 +2104,7 @@
     xmlXPathFreeContext(ctxt);
 
     if (res == NULL) {
-        fprintf(stderr, "XPath evaluation failure\n");
+        fprintf(ERR_STREAM, "XPath evaluation failure\n");
         progresult = XMLLINT_ERR_XPATH;
         return;
     }
@@ -2151,7 +2153,7 @@
         } else {
 	    f = fopen(filename, "rb");
             if (f == NULL) {
-                fprintf(stderr, "Can't open %s\n", filename);
+                fprintf(ERR_STREAM, "Can't open %s\n", filename);
                 progresult = XMLLINT_ERR_UNCLASS;
                 return;
             }
@@ -2189,7 +2191,7 @@
 	base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
 	if (base == (void *) MAP_FAILED) {
 	    close(fd);
-	    fprintf(stderr, "mmap failure for file %s\n", filename);
+	    fprintf(ERR_STREAM, "mmap failure for file %s\n", filename);
 	    progresult = XMLLINT_ERR_RDFILE;
 	    return;
 	}
@@ -2226,7 +2228,7 @@
 	    } else {
 		f = fopen(filename, "rb");
                 if (f == NULL) {
-                    fprintf(stderr, "Can't open %s\n", filename);
+                    fprintf(ERR_STREAM, "Can't open %s\n", filename);
                     progresult = XMLLINT_ERR_UNCLASS;
                     return;
                 }
@@ -2315,7 +2317,7 @@
 	    base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
 	    if (base == (void *) MAP_FAILED) {
 	        close(fd);
-	        fprintf(stderr, "mmap failure for file %s\n", filename);
+	        fprintf(ERR_STREAM, "mmap failure for file %s\n", filename);
 		progresult = XMLLINT_ERR_RDFILE;
 	        return;
 	    }
@@ -2325,7 +2327,7 @@
 
                 ctxt = xmlNewParserCtxt();
                 if (ctxt == NULL) {
-                    fprintf(stderr, "out of memory\n");
+                    fprintf(ERR_STREAM, "out of memory\n");
                     progresult = XMLLINT_ERR_MEM;
                     return;
                 }
@@ -2381,7 +2383,7 @@
 
                 ctxt = xmlNewParserCtxt();
                 if (ctxt == NULL) {
-                    fprintf(stderr, "out of memory\n");
+                    fprintf(ERR_STREAM, "out of memory\n");
                     progresult = XMLLINT_ERR_MEM;
                     return;
                 }
@@ -2499,14 +2501,14 @@
 	    if (node != NULL) {
 		nb = xmlValidGetValidElements(node->last, NULL, list, 256);
 		if (nb < 0) {
-		    fprintf(stderr, "could not get valid list of elements\n");
+		    fprintf(ERR_STREAM, "could not get valid list of elements\n");
 		} else if (nb == 0) {
-		    fprintf(stderr, "No element can be inserted under root\n");
+		    fprintf(ERR_STREAM, "No element can be inserted under root\n");
 		} else {
-		    fprintf(stderr, "%d element types can be inserted under root:\n",
+		    fprintf(ERR_STREAM, "%d element types can be inserted under root:\n",
 		           nb);
 		    for (i = 0;i < nb;i++) {
-			 fprintf(stderr, "%s\n", (char *) list[i]);
+			 fprintf(ERR_STREAM, "%s\n", (char *) list[i]);
 		    }
 		}
 	    }
@@ -2564,7 +2566,7 @@
 			if (output != NULL)
 			    fclose(out);
 		    } else {
-			fprintf(stderr, "failed to open %s\n", output);
+			fprintf(ERR_STREAM, "failed to open %s\n", output);
 			progresult = XMLLINT_ERR_OUT;
 		    }
 		}
@@ -2581,11 +2583,11 @@
 		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_0, NULL, 1, &result);
 		if (size >= 0) {
 		    if (write(1, result, size) == -1) {
-		        fprintf(stderr, "Can't write data\n");
+		        fprintf(ERR_STREAM, "Can't write data\n");
 		    }
 		    xmlFree(result);
 		} else {
-		    fprintf(stderr, "Failed to canonicalize\n");
+		    fprintf(ERR_STREAM, "Failed to canonicalize\n");
 		    progresult = XMLLINT_ERR_OUT;
 		}
 	    } else if (canonical_11) {
@@ -2595,11 +2597,11 @@
 		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_1, NULL, 1, &result);
 		if (size >= 0) {
 		    if (write(1, result, size) == -1) {
-		        fprintf(stderr, "Can't write data\n");
+		        fprintf(ERR_STREAM, "Can't write data\n");
 		    }
 		    xmlFree(result);
 		} else {
-		    fprintf(stderr, "Failed to canonicalize\n");
+		    fprintf(ERR_STREAM, "Failed to canonicalize\n");
 		    progresult = XMLLINT_ERR_OUT;
 		}
 	    } else
@@ -2610,11 +2612,11 @@
 		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_EXCLUSIVE_1_0, NULL, 1, &result);
 		if (size >= 0) {
 		    if (write(1, result, size) == -1) {
-		        fprintf(stderr, "Can't write data\n");
+		        fprintf(ERR_STREAM, "Can't write data\n");
 		    }
 		    xmlFree(result);
 		} else {
-		    fprintf(stderr, "Failed to canonicalize\n");
+		    fprintf(ERR_STREAM, "Failed to canonicalize\n");
 		    progresult = XMLLINT_ERR_OUT;
 		}
 	    } else
@@ -2637,11 +2639,11 @@
 			xmlDocDumpMemory(doc, &result, &len);
 		}
 		if (result == NULL) {
-		    fprintf(stderr, "Failed to save\n");
+		    fprintf(ERR_STREAM, "Failed to save\n");
 		    progresult = XMLLINT_ERR_OUT;
 		} else {
 		    if (write(1, result, len) == -1) {
-		        fprintf(stderr, "Can't write data\n");
+		        fprintf(ERR_STREAM, "Can't write data\n");
 		    }
 		    xmlFree(result);
 		}
@@ -2661,14 +2663,14 @@
 			                     encoding);
 		    }
 		    if (ret < 0) {
-			fprintf(stderr, "failed save to %s\n",
+			fprintf(ERR_STREAM, "failed save to %s\n",
 				output ? output : "-");
 			progresult = XMLLINT_ERR_OUT;
 		    }
 		} else if (format == 1) {
 		    ret = xmlSaveFormatFile(output ? output : "-", doc, 1);
 		    if (ret < 0) {
-			fprintf(stderr, "failed save to %s\n",
+			fprintf(ERR_STREAM, "failed save to %s\n",
 				output ? output : "-");
 			progresult = XMLLINT_ERR_OUT;
 		    }
@@ -2686,7 +2688,7 @@
 			if (output != NULL)
 			    fclose(out);
 		    } else {
-			fprintf(stderr, "failed to open %s\n", output);
+			fprintf(ERR_STREAM, "failed to open %s\n", output);
 			progresult = XMLLINT_ERR_OUT;
 		    }
 		}
@@ -2711,7 +2713,7 @@
 
 		if (ctxt != NULL) {
 		    if (xmlSaveDoc(ctxt, doc) < 0) {
-			fprintf(stderr, "failed save to %s\n",
+			fprintf(ERR_STREAM, "failed save to %s\n",
 				output ? output : "-");
 			progresult = XMLLINT_ERR_OUT;
 		    }
@@ -2737,7 +2739,7 @@
 		if (output != NULL)
 		    fclose(out);
 	    } else {
-		fprintf(stderr, "failed to open %s\n", output);
+		fprintf(ERR_STREAM, "failed to open %s\n", output);
 		progresult = XMLLINT_ERR_OUT;
 	    }
 	}
@@ -2764,17 +2766,17 @@
 	}
 	if (dtd == NULL) {
 	    if (dtdvalid != NULL)
-		fprintf(stderr,
+		fprintf(ERR_STREAM,
 			"Could not parse DTD %s\n", dtdvalid);
 	    else
-		fprintf(stderr,
+		fprintf(ERR_STREAM,
 			"Could not parse DTD %s\n", dtdvalidfpi);
 	    progresult = XMLLINT_ERR_DTD;
 	} else {
 	    xmlValidCtxtPtr cvp;
 
 	    if ((cvp = xmlNewValidCtxt()) == NULL) {
-		fprintf(stderr,
+		fprintf(ERR_STREAM,
 			"Couldn't allocate validation context\n");
                 progresult = XMLLINT_ERR_MEM;
                 xmlFreeDtd(dtd);
@@ -2786,11 +2788,11 @@
 	    }
 	    if (!xmlValidateDtd(cvp, doc, dtd)) {
 		if (dtdvalid != NULL)
-		    fprintf(stderr,
+		    fprintf(ERR_STREAM,
 			    "Document %s does not validate against %s\n",
 			    filename, dtdvalid);
 		else
-		    fprintf(stderr,
+		    fprintf(ERR_STREAM,
 			    "Document %s does not validate against %s\n",
 			    filename, dtdvalidfpi);
 		progresult = XMLLINT_ERR_VALID;
@@ -2805,7 +2807,7 @@
 	xmlValidCtxtPtr cvp;
 
 	if ((cvp = xmlNewValidCtxt()) == NULL) {
-	    fprintf(stderr,
+	    fprintf(ERR_STREAM,
 		    "Couldn't allocate validation context\n");
             progresult = XMLLINT_ERR_MEM;
             xmlFreeDoc(doc);
@@ -2816,7 +2818,7 @@
 	    startTimer();
 	}
 	if (!xmlValidateDocument(cvp, doc)) {
-	    fprintf(stderr,
+	    fprintf(ERR_STREAM,
 		    "Document %s does not validate\n", filename);
 	    progresult = XMLLINT_ERR_VALID;
 	}
@@ -2851,13 +2853,13 @@
 	ret = xmlSchematronValidateDoc(ctxt, doc);
 	if (ret == 0) {
 	    if (!quiet) {
-	        fprintf(stderr, "%s validates\n", filename);
+	        fprintf(ERR_STREAM, "%s validates\n", filename);
 	    }
 	} else if (ret > 0) {
-	    fprintf(stderr, "%s fails to validate\n", filename);
+	    fprintf(ERR_STREAM, "%s fails to validate\n", filename);
 	    progresult = XMLLINT_ERR_VALID;
 	} else {
-	    fprintf(stderr, "%s validation generated an internal error\n",
+	    fprintf(ERR_STREAM, "%s validation generated an internal error\n",
 		   filename);
 	    progresult = XMLLINT_ERR_VALID;
 	}
@@ -2885,13 +2887,13 @@
 	ret = xmlRelaxNGValidateDoc(ctxt, doc);
 	if (ret == 0) {
 	    if (!quiet) {
-	        fprintf(stderr, "%s validates\n", filename);
+	        fprintf(ERR_STREAM, "%s validates\n", filename);
 	    }
 	} else if (ret > 0) {
-	    fprintf(stderr, "%s fails to validate\n", filename);
+	    fprintf(ERR_STREAM, "%s fails to validate\n", filename);
 	    progresult = XMLLINT_ERR_VALID;
 	} else {
-	    fprintf(stderr, "%s validation generated an internal error\n",
+	    fprintf(ERR_STREAM, "%s validation generated an internal error\n",
 		   filename);
 	    progresult = XMLLINT_ERR_VALID;
 	}
@@ -2916,13 +2918,13 @@
 	ret = xmlSchemaValidateDoc(ctxt, doc);
 	if (ret == 0) {
 	    if (!quiet) {
-	        fprintf(stderr, "%s validates\n", filename);
+	        fprintf(ERR_STREAM, "%s validates\n", filename);
 	    }
 	} else if (ret > 0) {
-	    fprintf(stderr, "%s fails to validate\n", filename);
+	    fprintf(ERR_STREAM, "%s fails to validate\n", filename);
 	    progresult = XMLLINT_ERR_VALID;
 	} else {
-	    fprintf(stderr, "%s validation generated an internal error\n",
+	    fprintf(ERR_STREAM, "%s validation generated an internal error\n",
 		   filename);
 	    progresult = XMLLINT_ERR_VALID;
 	}
@@ -2936,7 +2938,7 @@
 #ifdef LIBXML_DEBUG_ENABLED
 #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
     if ((debugent) && (!html))
-	xmlDebugDumpEntities(stderr, doc);
+	xmlDebugDumpEntities(ERR_STREAM, doc);
 #endif
 #endif
 
@@ -2959,40 +2961,40 @@
  ************************************************************************/
 
 static void showVersion(const char *name) {
-    fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion);
-    fprintf(stderr, "   compiled with: ");
-    if (xmlHasFeature(XML_WITH_THREAD)) fprintf(stderr, "Threads ");
-    if (xmlHasFeature(XML_WITH_TREE)) fprintf(stderr, "Tree ");
-    if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(stderr, "Output ");
-    if (xmlHasFeature(XML_WITH_PUSH)) fprintf(stderr, "Push ");
-    if (xmlHasFeature(XML_WITH_READER)) fprintf(stderr, "Reader ");
-    if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(stderr, "Patterns ");
-    if (xmlHasFeature(XML_WITH_WRITER)) fprintf(stderr, "Writer ");
-    if (xmlHasFeature(XML_WITH_SAX1)) fprintf(stderr, "SAXv1 ");
-    if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP ");
-    if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP ");
-    if (xmlHasFeature(XML_WITH_VALID)) fprintf(stderr, "DTDValid ");
-    if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML ");
-    if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy ");
-    if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N ");
-    if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog ");
-    if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath ");
-    if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer ");
-    if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude ");
-    if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv ");
-    if (xmlHasFeature(XML_WITH_ICU)) fprintf(stderr, "ICU ");
-    if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X ");
-    if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode ");
-    if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps ");
-    if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata ");
-    if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr ");
-    if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas ");
-    if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron ");
-    if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules ");
-    if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug ");
-    if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(stderr, "Zlib ");
-    if (xmlHasFeature(XML_WITH_LZMA)) fprintf(stderr, "Lzma ");
-    fprintf(stderr, "\n");
+    fprintf(ERR_STREAM, "%s: using libxml version %s\n", name, xmlParserVersion);
+    fprintf(ERR_STREAM, "   compiled with: ");
+    if (xmlHasFeature(XML_WITH_THREAD)) fprintf(ERR_STREAM, "Threads ");
+    if (xmlHasFeature(XML_WITH_TREE)) fprintf(ERR_STREAM, "Tree ");
+    if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(ERR_STREAM, "Output ");
+    if (xmlHasFeature(XML_WITH_PUSH)) fprintf(ERR_STREAM, "Push ");
+    if (xmlHasFeature(XML_WITH_READER)) fprintf(ERR_STREAM, "Reader ");
+    if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(ERR_STREAM, "Patterns ");
+    if (xmlHasFeature(XML_WITH_WRITER)) fprintf(ERR_STREAM, "Writer ");
+    if (xmlHasFeature(XML_WITH_SAX1)) fprintf(ERR_STREAM, "SAXv1 ");
+    if (xmlHasFeature(XML_WITH_FTP)) fprintf(ERR_STREAM, "FTP ");
+    if (xmlHasFeature(XML_WITH_HTTP)) fprintf(ERR_STREAM, "HTTP ");
+    if (xmlHasFeature(XML_WITH_VALID)) fprintf(ERR_STREAM, "DTDValid ");
+    if (xmlHasFeature(XML_WITH_HTML)) fprintf(ERR_STREAM, "HTML ");
+    if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(ERR_STREAM, "Legacy ");
+    if (xmlHasFeature(XML_WITH_C14N)) fprintf(ERR_STREAM, "C14N ");
+    if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(ERR_STREAM, "Catalog ");
+    if (xmlHasFeature(XML_WITH_XPATH)) fprintf(ERR_STREAM, "XPath ");
+    if (xmlHasFeature(XML_WITH_XPTR)) fprintf(ERR_STREAM, "XPointer ");
+    if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(ERR_STREAM, "XInclude ");
+    if (xmlHasFeature(XML_WITH_ICONV)) fprintf(ERR_STREAM, "Iconv ");
+    if (xmlHasFeature(XML_WITH_ICU)) fprintf(ERR_STREAM, "ICU ");
+    if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(ERR_STREAM, "ISO8859X ");
+    if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(ERR_STREAM, "Unicode ");
+    if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(ERR_STREAM, "Regexps ");
+    if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(ERR_STREAM, "Automata ");
+    if (xmlHasFeature(XML_WITH_EXPR)) fprintf(ERR_STREAM, "Expr ");
+    if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(ERR_STREAM, "Schemas ");
+    if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(ERR_STREAM, "Schematron ");
+    if (xmlHasFeature(XML_WITH_MODULES)) fprintf(ERR_STREAM, "Modules ");
+    if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(ERR_STREAM, "Debug ");
+    if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(ERR_STREAM, "Zlib ");
+    if (xmlHasFeature(XML_WITH_LZMA)) fprintf(ERR_STREAM, "Lzma ");
+    fprintf(ERR_STREAM, "\n");
 }
 
 static void usage(FILE *f, const char *name) {
@@ -3124,11 +3126,11 @@
     errno = 0;
     val = strtoul(str, &strEnd, 10);
     if (errno == EINVAL || *strEnd != 0) {
-        fprintf(stderr, "%s: invalid integer: %s\n", ctxt, str);
+        fprintf(ERR_STREAM, "%s: invalid integer: %s\n", ctxt, str);
         exit(XMLLINT_ERR_UNCLASS);
     }
     if (errno != 0 || val < min || val > max) {
-        fprintf(stderr, "%s: integer out of range: %s\n", ctxt, str);
+        fprintf(ERR_STREAM, "%s: integer out of range: %s\n", ctxt, str);
         exit(XMLLINT_ERR_UNCLASS);
     }
 
@@ -3142,7 +3144,7 @@
     int version = 0;
 
     if (argc <= 1) {
-	usage(stderr, argv[0]);
+	usage(ERR_STREAM, argv[0]);
 	return(XMLLINT_ERR_UNCLASS);
     }
 
@@ -3155,7 +3157,7 @@
 	    (!strcmp(argv[i], "--maxmem"))) {
             i++;
             if (i >= argc) {
-                fprintf(stderr, "maxmem: missing integer value\n");
+                fprintf(ERR_STREAM, "maxmem: missing integer value\n");
                 return(XMLLINT_ERR_UNCLASS);
             }
             errno = 0;
@@ -3493,13 +3495,13 @@
 	           (!strcmp(argv[i], "--max-ampl"))) {
             i++;
             if (i >= argc) {
-                fprintf(stderr, "max-ampl: missing integer value\n");
+                fprintf(ERR_STREAM, "max-ampl: missing integer value\n");
                 return(XMLLINT_ERR_UNCLASS);
             }
             maxAmpl = parseInteger("max-ampl", argv[i], 1, UINT_MAX);
 	} else {
-	    fprintf(stderr, "Unknown option %s\n", argv[i]);
-	    usage(stderr, argv[0]);
+	    fprintf(ERR_STREAM, "Unknown option %s\n", argv[i]);
+	    usage(ERR_STREAM, argv[0]);
 	    return(XMLLINT_ERR_UNCLASS);
 	}
     }
@@ -3513,7 +3515,7 @@
 	    if (catal != NULL) {
 		xmlLoadCatalogs(catal);
 	    } else {
-		fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n");
+		fprintf(ERR_STREAM, "Variable $SGML_CATALOG_FILES not set\n");
 	    }
 	}
     }
@@ -3536,14 +3538,14 @@
     if ((noblanks != 0) || (format == 1))
         options |= XML_PARSE_NOBLANKS;
     if ((htmlout) && (!nowrap)) {
-	fprintf(stderr,
+	fprintf(ERR_STREAM,
          "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n");
-	fprintf(stderr,
+	fprintf(ERR_STREAM,
 		"\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n");
-	fprintf(stderr,
+	fprintf(ERR_STREAM,
 	 "<html><head><title>%s output</title></head>\n",
 		argv[0]);
-	fprintf(stderr,
+	fprintf(ERR_STREAM,
 	 "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n",
 		argv[0]);
     }
@@ -3568,7 +3570,7 @@
         }
 	wxschematron = xmlSchematronParse(ctxt);
 	if (wxschematron == NULL) {
-	    fprintf(stderr,
+	    fprintf(ERR_STREAM,
 		    "Schematron schema %s failed to compile\n", schematron);
             progresult = XMLLINT_ERR_SCHEMACOMP;
 	    schematron = NULL;
@@ -3599,7 +3601,7 @@
         }
 	relaxngschemas = xmlRelaxNGParse(ctxt);
 	if (relaxngschemas == NULL) {
-	    fprintf(stderr,
+	    fprintf(ERR_STREAM,
 		    "Relax-NG schema %s failed to compile\n", relaxng);
             progresult = XMLLINT_ERR_SCHEMACOMP;
 	    relaxng = NULL;
@@ -3625,7 +3627,7 @@
         }
 	wxschemas = xmlSchemaParse(ctxt);
 	if (wxschemas == NULL) {
-	    fprintf(stderr,
+	    fprintf(ERR_STREAM,
 		    "WXS schema %s failed to compile\n", schema);
             progresult = XMLLINT_ERR_SCHEMACOMP;
 	    schema = NULL;
@@ -3640,7 +3642,7 @@
     if ((pattern != NULL) && (walker == 0)) {
         patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
 	if (patternc == NULL) {
-	    fprintf(stderr,
+	    fprintf(ERR_STREAM,
 		    "Pattern %s failed to compile\n", pattern);
             progresult = XMLLINT_ERR_SCHEMAPAT;
 	    pattern = NULL;
@@ -3772,10 +3774,10 @@
     if (generate)
 	parseAndPrintFile(NULL, NULL);
     if ((htmlout) && (!nowrap)) {
-	fprintf(stderr, "</body></html>\n");
+	fprintf(ERR_STREAM, "</body></html>\n");
     }
     if ((files == 0) && (!generate) && (version == 0)) {
-	usage(stderr, argv[0]);
+	usage(ERR_STREAM, argv[0]);
         progresult = XMLLINT_ERR_UNCLASS;
     }
 #ifdef LIBXML_SCHEMATRON_ENABLED
