mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-01-11 05:17:37 +03:00
686d6b6ab1
- changed the way Windows socket stuff get included - removed an indetermination xmLDecl/PI(xml...) - xmlNewNs wasn't checking for double definition - fixed a problem with dist-hook duplicates - fixed the loading of external entities APIs, now xmlLoadExternalEntity() is used everywhere - now the xhtml spec validates with the xhtml DTD. - error.c: fixed crashes in case of no input stream - added the xhtml spec and dtds to the validation tests and results Daniel
214 lines
5.0 KiB
C
214 lines
5.0 KiB
C
/*
|
|
* error.c: module displaying/handling XML parser errors
|
|
*
|
|
* See Copyright for the status of this software.
|
|
*
|
|
* Daniel Veillard <Daniel.Veillard@w3.org>
|
|
*/
|
|
|
|
#ifdef WIN32
|
|
#include "win32config.h"
|
|
#else
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include "parser.h"
|
|
|
|
/**
|
|
* xmlParserPrintFileInfo:
|
|
* @input: an xmlParserInputPtr input
|
|
*
|
|
* Displays the associated file and line informations for the current input
|
|
*/
|
|
|
|
void
|
|
xmlParserPrintFileInfo(xmlParserInputPtr input) {
|
|
if (input != NULL) {
|
|
if (input->filename)
|
|
fprintf(stderr, "%s:%d: ", input->filename,
|
|
input->line);
|
|
else
|
|
fprintf(stderr, "Entity: line %d: ", input->line);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* xmlParserPrintFileContext:
|
|
* @input: an xmlParserInputPtr input
|
|
*
|
|
* Displays current context within the input content for error tracking
|
|
*/
|
|
|
|
void
|
|
xmlParserPrintFileContext(xmlParserInputPtr input) {
|
|
const xmlChar *cur, *base;
|
|
int n;
|
|
|
|
if (input == NULL) return;
|
|
cur = input->cur;
|
|
base = 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 = input->cur;
|
|
while ((*cur == '\n') || (*cur == '\r'))
|
|
cur--;
|
|
n = 0;
|
|
while ((cur != base) && (n++ < 80)) {
|
|
fprintf(stderr, " ");
|
|
base++;
|
|
}
|
|
fprintf(stderr,"^\n");
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
xmlParserInputPtr cur = NULL;
|
|
va_list args;
|
|
|
|
input = ctxt->input;
|
|
if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
|
|
cur = input;
|
|
input = ctxt->inputTab[ctxt->inputNr - 2];
|
|
}
|
|
|
|
xmlParserPrintFileInfo(input);
|
|
|
|
fprintf(stderr, "error: ");
|
|
va_start(args, msg);
|
|
vfprintf(stderr, msg, args);
|
|
va_end(args);
|
|
|
|
xmlParserPrintFileContext(input);
|
|
if (cur != NULL) {
|
|
xmlParserPrintFileInfo(cur);
|
|
fprintf(stderr, "\n");
|
|
xmlParserPrintFileContext(cur);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* xmlParserWarning:
|
|
* @ctx: an XML parser context
|
|
* @msg: the message to display/transmit
|
|
* @...: extra parameters for the message display
|
|
*
|
|
* Display and format a warning messages, gives file, line, position and
|
|
* extra parameters.
|
|
*/
|
|
void
|
|
xmlParserWarning(void *ctx, const char *msg, ...)
|
|
{
|
|
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
|
|
xmlParserInputPtr input;
|
|
xmlParserInputPtr cur = NULL;
|
|
va_list args;
|
|
|
|
input = ctxt->input;
|
|
if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
|
|
cur = input;
|
|
input = ctxt->inputTab[ctxt->inputNr - 2];
|
|
}
|
|
|
|
|
|
xmlParserPrintFileInfo(input);
|
|
|
|
fprintf(stderr, "warning: ");
|
|
va_start(args, msg);
|
|
vfprintf(stderr, msg, args);
|
|
va_end(args);
|
|
|
|
xmlParserPrintFileContext(input);
|
|
if (cur != NULL) {
|
|
xmlParserPrintFileInfo(cur);
|
|
fprintf(stderr, "\n");
|
|
xmlParserPrintFileContext(cur);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
|