Huge commit: 1.5.0, XML validation, Xpath, bugfixes, examples .... Daniel
diff --git a/error.c b/error.c
index 6d1f57d..4fbdd98 100644
--- a/error.c
+++ b/error.c
@@ -10,35 +10,24 @@
 #include <stdarg.h>
 #include "parser.h"
 
-/**
- * xmlParserError:
- * @ctx:  an XML parser context
- * @msg:  the message to display/transmit
- * @...:  extra parameters for the message display
- * 
- * Display and format an error messages, gives file, line, position and
- * extra parameters.
- */
-void
-xmlParserError(void *ctx, const char *msg, ...)
-{
-    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+static void
+xmlParserPrintFileInfo(xmlParserInputPtr input) {
+    if (input != NULL) {
+	if (input->filename)
+	    fprintf(stderr, "%s:%d: ", input->filename,
+		    input->line);
+	else
+	    fprintf(stderr, "line %d: ", input->line);
+    }
+}
+
+static void
+xmlParserPrintFileContext(xmlParserInputPtr input) {
     const CHAR *cur, *base;
-    va_list args;
     int n;
 
-    va_start(args, msg);
-    if (ctxt->input->filename)
-        fprintf(stderr, "%s:%d: ", ctxt->input->filename,
-	        ctxt->input->line);
-    else
-        fprintf(stderr, "line %d: ", ctxt->input->line);
-        
-    fprintf(stderr, "error: ");
-    vfprintf(stderr, msg, args);
-    va_end(args);
-    cur = ctxt->input->cur;
-    base = ctxt->input->base;
+    cur = input->cur;
+    base = input->base;
     while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
 	cur--;
     }
@@ -53,7 +42,7 @@
 	n++;
     }
     fprintf(stderr, "\n");
-    cur = ctxt->input->cur;
+    cur = input->cur;
     while ((*cur == '\n') || (*cur == '\r'))
 	cur--;
     n = 0;
@@ -65,6 +54,36 @@
 }
 
 /**
+ * xmlParserError:
+ * @ctx:  an XML parser context
+ * @msg:  the message to display/transmit
+ * @...:  extra parameters for the message display
+ * 
+ * Display and format an error messages, gives file, line, position and
+ * extra parameters.
+ */
+void
+xmlParserError(void *ctx, const char *msg, ...)
+{
+    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+    xmlParserInputPtr input;
+    va_list args;
+
+    input = ctxt->input;
+    if ((input->filename == NULL) && (ctxt->inputNr > 1))
+        input = ctxt->inputTab[ctxt->inputNr - 2];
+        
+    xmlParserPrintFileInfo(input);
+
+    fprintf(stderr, "error: ");
+    va_start(args, msg);
+    vfprintf(stderr, msg, args);
+    va_end(args);
+
+    xmlParserPrintFileContext(input);
+}
+
+/**
  * xmlParserWarning:
  * @ctx:  an XML parser context
  * @msg:  the message to display/transmit
@@ -77,44 +96,80 @@
 xmlParserWarning(void *ctx, const char *msg, ...)
 {
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
-    const CHAR *cur, *base;
+    xmlParserInputPtr input;
     va_list args;
-    int n;
 
-    va_start(args, msg);
-    if (ctxt->input->filename)
-        fprintf(stderr, "%s:%d: ", ctxt->input->filename,
-	        ctxt->input->line);
-    else
-        fprintf(stderr, "line %d: ", ctxt->input->line);
+    input = ctxt->input;
+    if ((input->filename == NULL) && (ctxt->inputNr > 1))
+        input = ctxt->inputTab[ctxt->inputNr - 2];
+
+    xmlParserPrintFileInfo(input);
         
     fprintf(stderr, "warning: ");
+    va_start(args, msg);
     vfprintf(stderr, msg, args);
     va_end(args);
-    cur = ctxt->input->cur;
-    base = ctxt->input->base;
-    while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
-	cur--;
-    }
-    n = 0;
-    while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
-        cur--;
-    if ((*cur == '\n') || (*cur == '\r')) cur++;
-    base = cur;
-    n = 0;
-    while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
-        fprintf(stderr, "%c", (unsigned char) *cur++);
-	n++;
-    }
-    fprintf(stderr, "\n");
-    cur = ctxt->input->cur;
-    while ((*cur == '\n') || (*cur == '\r'))
-	cur--;
-    n = 0;
-    while ((cur != base) && (n++ < 80)) {
-        fprintf(stderr, " ");
-        base++;
-    }
-    fprintf(stderr,"^\n");
+
+    xmlParserPrintFileContext(input);
+}
+
+/**
+ * xmlParserValidityError:
+ * @ctx:  an XML parser context
+ * @msg:  the message to display/transmit
+ * @...:  extra parameters for the message display
+ * 
+ * Display and format an validity error messages, gives file,
+ * line, position and extra parameters.
+ */
+void
+xmlParserValidityError(void *ctx, const char *msg, ...)
+{
+    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+    xmlParserInputPtr input;
+    va_list args;
+
+    input = ctxt->input;
+    if ((input->filename == NULL) && (ctxt->inputNr > 1))
+        input = ctxt->inputTab[ctxt->inputNr - 2];
+        
+    xmlParserPrintFileInfo(input);
+
+    fprintf(stderr, "validity error: ");
+    va_start(args, msg);
+    vfprintf(stderr, msg, args);
+    va_end(args);
+
+    xmlParserPrintFileContext(input);
+}
+
+/**
+ * xmlParserValidityWarning:
+ * @ctx:  an XML parser context
+ * @msg:  the message to display/transmit
+ * @...:  extra parameters for the message display
+ * 
+ * Display and format a validity warning messages, gives file, line,
+ * position and extra parameters.
+ */
+void
+xmlParserValidityWarning(void *ctx, const char *msg, ...)
+{
+    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+    xmlParserInputPtr input;
+    va_list args;
+
+    input = ctxt->input;
+    if ((input->filename == NULL) && (ctxt->inputNr > 1))
+        input = ctxt->inputTab[ctxt->inputNr - 2];
+
+    xmlParserPrintFileInfo(input);
+        
+    fprintf(stderr, "validity warning: ");
+    va_start(args, msg);
+    vfprintf(stderr, msg, args);
+    va_end(args);
+
+    xmlParserPrintFileContext(input);
 }