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);
}