15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error.c: module displaying/handling XML parser errors
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Daniel Veillard <daniel@veillard.com>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XMLCDECL xmlGenericErrorDefaultFunc	(void *ctx ATTRIBUTE_UNUSED,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 const char *msg,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 ...);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_GET_VAR_STR(msg, str) {				\
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int       size, prev_size = -1;				\
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int       chars;						\
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char      *larger;						\
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list   ap;						\
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)								\
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str = (char *) xmlMalloc(150);				\
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str != NULL) {						\
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)								\
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size = 150;							\
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)								\
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (size < 64000) {					\
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	va_start(ap, msg);					\
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  	chars = vsnprintf(str, size, msg, ap);			\
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	va_end(ap);						\
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((chars > -1) && (chars < size)) {			\
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (prev_size == chars) {				\
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;						\
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {						\
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev_size = chars;				\
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }							\
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}							\
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (chars > -1)						\
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    size += chars + 1;					\
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else							\
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    size += 100;					\
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((larger = (char *) xmlRealloc(str, size)) == NULL) {\
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;						\
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}							\
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	str = larger;						\
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }}								\
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Handling of out of context errors		*
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGenericErrorDefaultFunc:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an error context
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Default handler for out of context error messages.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XMLCDECL
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGenericErrorDefaultFunc(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlGenericErrorContext == NULL)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericErrorContext = (void *) stderr;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(args, msg);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vfprintf((FILE *)xmlGenericErrorContext, msg, args);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(args);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * initGenericErrorDefaultFunc:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @handler:  the handler
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set or reset (if NULL) the default handler for generic errors
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to the builtin error function.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)initGenericErrorDefaultFunc(xmlGenericErrorFunc * handler)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler == NULL)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError = xmlGenericErrorDefaultFunc;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError = (*handler);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetGenericErrorFunc:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  the new error handling context
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @handler:  the new handler function
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function to reset the handler and the error context for out of
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * context error messages.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This simply means that @handler will be called for subsequent
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error messages while not parsing nor validating. And @ctx will
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be passed as first argument to @handler
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * One can simply force messages to be emitted to another FILE * than
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stderr by setting @ctx to this file handle and @handler to NULL.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For multi-threaded applications, this must be set separately for each thread.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericErrorContext = ctx;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (handler != NULL)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError = handler;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError = xmlGenericErrorDefaultFunc;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetStructuredErrorFunc:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  the new error handling context
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @handler:  the new handler function
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function to reset the handler and the error context for out of
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * context structured error messages.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This simply means that @handler will be called for subsequent
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error messages while not parsing nor validating. And @ctx will
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be passed as first argument to @handler
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For multi-threaded applications, this must be set separately for each thread.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStructuredErrorContext = ctx;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlStructuredError = handler;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Handling of parsing errors			*
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserPrintFileInfo:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input:  an xmlParserInputPtr input
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Displays the associated file and line informations for the current input
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserPrintFileInfo(xmlParserInputPtr input) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (input != NULL) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (input->filename)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "%s:%d: ", input->filename,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    input->line);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Entity: line %d: ", input->line);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserPrintFileContext:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input:  an xmlParserInputPtr input
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Displays current context within the input content for error tracking
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserPrintFileContextInternal(xmlParserInputPtr input ,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericErrorFunc channel, void *data ) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur, *base;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int n, col;	/* GCC warns if signed, because compared with sizeof() */
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar  content[81]; /* space for 80 chars + line terminator */
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ctnt;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (input == NULL) return;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = input->cur;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = input->base;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* skip backwards over any end-of-lines */
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur--;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = 0;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* search backwards for beginning-of-line (to max buff size) */
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((n++ < (sizeof(content)-1)) && (cur > base) &&
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	   (*(cur) != '\n') && (*(cur) != '\r'))
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur--;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*(cur) == '\n') || (*(cur) == '\r')) cur++;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* calculate the error position in terms of the current position */
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    col = input->cur - cur;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* search forward for end-of-line (to max buff size) */
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = 0;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctnt = content;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* copy selected text to our buffer */
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((*cur != 0) && (*(cur) != '\n') &&
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    	   (*(cur) != '\r') && (n < sizeof(content)-1)) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*ctnt++ = *cur++;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	n++;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *ctnt = 0;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* print out the selected text */
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel(data ,"%s\n", content);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* create blank line with problem pointer */
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = 0;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctnt = content;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* (leave buffer space for pointer + line terminator) */
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((n<col) && (n++ < sizeof(content)-2) && (*ctnt != 0)) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*(ctnt) != '\t')
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *(ctnt) = ' ';
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctnt++;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *ctnt++ = '^';
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *ctnt = 0;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    channel(data ,"%s\n", content);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserPrintFileContext:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input:  an xmlParserInputPtr input
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Displays current context within the input content for error tracking
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserPrintFileContext(xmlParserInputPtr input) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   xmlParserPrintFileContextInternal(input, xmlGenericError,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     xmlGenericErrorContext);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReportError:
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: the error
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the parser context or NULL
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str: the formatted error message
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Report an erro with its context, replace the 4 old error/warning
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routines.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReportError(xmlErrorPtr err, xmlParserCtxtPtr ctxt, const char *str,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               xmlGenericErrorFunc channel, void *data)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *file = NULL;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int line = 0;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int code = -1;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int domain;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name = NULL;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlErrorLevel level;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input = NULL;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr cur = NULL;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err == NULL)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (channel == NULL) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	channel = xmlGenericError;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	data = xmlGenericErrorContext;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = err->file;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line = err->line;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = err->code;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    domain = err->domain;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    level = err->level;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node = err->node;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (code == XML_ERR_OK)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node != NULL) && (node->type == XML_ELEMENT_NODE))
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name = node->name;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Maintain the compatibility with the legacy error handling
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input = ctxt->input;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((input != NULL) && (input->filename == NULL) &&
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (ctxt->inputNr > 1)) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur = input;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            input = ctxt->inputTab[ctxt->inputNr - 2];
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (input != NULL) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (input->filename)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                channel(data, "%s:%d: ", input->filename, input->line);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else if ((line != 0) && (domain == XML_FROM_PARSER))
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                channel(data, "Entity: line %d: ", input->line);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (file != NULL)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "%s:%d: ", file, line);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if ((line != 0) && (domain == XML_FROM_PARSER))
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "Entity: line %d: ", line);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name != NULL) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        channel(data, "element %s: ", name);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (domain) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_PARSER:
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "parser ");
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_NAMESPACE:
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "namespace ");
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_DTD:
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_VALID:
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "validity ");
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_HTML:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "HTML parser ");
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_MEMORY:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "memory ");
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_OUTPUT:
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "output ");
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_IO:
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "I/O ");
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_XINCLUDE:
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "XInclude ");
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_XPATH:
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "XPath ");
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_XPOINTER:
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "parser ");
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_REGEXP:
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "regexp ");
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_MODULE:
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "module ");
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_SCHEMASV:
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "Schemas validity ");
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_SCHEMASP:
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "Schemas parser ");
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_RELAXNGP:
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "Relax-NG parser ");
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_RELAXNGV:
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "Relax-NG validity ");
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_CATALOG:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "Catalog ");
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_C14N:
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "C14N ");
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_XSLT:
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "XSLT ");
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_FROM_I18N:
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "encoding ");
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (level) {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ERR_NONE:
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, ": ");
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ERR_WARNING:
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "warning : ");
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ERR_ERROR:
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "error : ");
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ERR_FATAL:
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            channel(data, "error : ");
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str != NULL) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int len;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len = xmlStrlen((const xmlChar *)str);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((len > 0) && (str[len - 1] != '\n'))
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    channel(data, "%s\n", str);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    channel(data, "%s", str);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        channel(data, "%s\n", "out of memory error");
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlParserPrintFileContextInternal(input, channel, data);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur != NULL) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur->filename)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                channel(data, "%s:%d: \n", cur->filename, cur->line);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else if ((line != 0) && (domain == XML_FROM_PARSER))
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                channel(data, "Entity: line %d: \n", cur->line);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlParserPrintFileContextInternal(cur, channel, data);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) &&
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (err->int1 < 100) &&
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(err->int1 < xmlStrlen((const xmlChar *)err->str1))) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar buf[150];
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	channel(data, "%s\n", err->str1);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i=0;i < err->int1;i++)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     buf[i] = ' ';
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf[i++] = '^';
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf[i] = 0;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	channel(data, "%s\n", buf);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * __xmlRaiseError:
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @schannel: the structured callback channel
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @channel: the old callback channel
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: the callback data
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the parser context or NULL
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the parser context or NULL
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @domain: the domain for the error
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @code: the code for the error
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @level: the xmlErrorLevel for the error
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @file: the file source of the error (or NULL)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @line: the line of the error or 0 if N/A
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str1: extra string info
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str2: extra string info
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str3: extra string info
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @int1: extra int info
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @col: column number of the error or 0 if N/A
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Update the appropriate global or contextual error structure,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * then forward the error message down the parser or generic
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error callback handler
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XMLCDECL
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__xmlRaiseError(xmlStructuredErrorFunc schannel,
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              xmlGenericErrorFunc channel, void *data, void *ctx,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              void *nod, int domain, int code, xmlErrorLevel level,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const char *file, int line, const char *str1,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const char *str2, const char *str3, int int1, int col,
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      const char *msg, ...)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = NULL;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node = (xmlNodePtr) nod;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *str = NULL;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input = NULL;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlErrorPtr to = &xmlLastError;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr baseptr = NULL;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((xmlGetWarningsDefaultValue == 0) && (level == XML_ERR_WARNING))
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) ||
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) ||
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = (xmlParserCtxtPtr) ctx;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((schannel == NULL) && (ctxt != NULL) && (ctxt->sax != NULL) &&
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (ctxt->sax->initialized == XML_SAX2_MAGIC))
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schannel = ctxt->sax->serror;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Check if structured error handler set
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schannel == NULL) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schannel = xmlStructuredError;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * if user has defined handler, change data ptr to user's choice
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schannel != NULL)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    data = xmlStructuredErrorContext;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((domain == XML_FROM_VALID) &&
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((channel == xmlParserValidityError) ||
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (channel == xmlParserValidityWarning))) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = (xmlParserCtxtPtr) ctx;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((schannel == NULL) && (ctxt != NULL) && (ctxt->sax != NULL) &&
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (ctxt->sax->initialized == XML_SAX2_MAGIC))
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schannel = ctxt->sax->serror;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (code == XML_ERR_OK)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Formatting the message
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg == NULL) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        str = (char *) xmlStrdup(BAD_CAST "No error message provided");
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        XML_GET_VAR_STR(msg, str);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * specific processing if a parser context is provided
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (file == NULL) {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            input = ctxt->input;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((input != NULL) && (input->filename == NULL) &&
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (ctxt->inputNr > 1)) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                input = ctxt->inputTab[ctxt->inputNr - 2];
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (input != NULL) {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                file = input->filename;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                line = input->line;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                col = input->col;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        to = &ctxt->lastError;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((node != NULL) && (file == NULL)) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((node->doc != NULL) && (node->doc->URL != NULL)) {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    baseptr = node;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*	    file = (const char *) node->doc->URL; */
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     ((i < 10) && (node != NULL) && (node->type != XML_ELEMENT_NODE));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     i++)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     node = node->parent;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((baseptr == NULL) && (node != NULL) &&
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->doc != NULL) && (node->doc->URL != NULL))
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    baseptr = node;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((node != NULL) && (node->type == XML_ELEMENT_NODE))
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    line = node->line;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Save the information about the error
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlResetError(to);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->domain = domain;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->code = code;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->message = str;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->level = level;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file != NULL)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        to->file = (char *) xmlStrdup((const xmlChar *) file);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (baseptr != NULL) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * We check if the error is within an XInclude section and,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * if so, attempt to print out the href of the XInclude instead
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * of the usual "base" (doc->URL) for the node (bug 152623).
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlNodePtr prev = baseptr;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int inclcount = 0;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (prev != NULL) {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (prev->prev == NULL)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        prev = prev->parent;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        prev = prev->prev;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (prev->type == XML_XINCLUDE_START) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (--inclcount < 0)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        break;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (prev->type == XML_XINCLUDE_END)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    inclcount++;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prev != NULL) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (prev->type == XML_XINCLUDE_START) {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev->type = XML_ELEMENT_NODE;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		to->file = (char *) xmlGetProp(prev, BAD_CAST "href");
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev->type = XML_XINCLUDE_START;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		to->file = (char *) xmlGetProp(prev, BAD_CAST "href");
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    to->file = (char *) xmlStrdup(baseptr->doc->URL);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((to->file == NULL) && (node != NULL) && (node->doc != NULL)) {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    to->file = (char *) xmlStrdup(node->doc->URL);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->line = line;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str1 != NULL)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        to->str1 = (char *) xmlStrdup((const xmlChar *) str1);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str2 != NULL)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        to->str2 = (char *) xmlStrdup((const xmlChar *) str2);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str3 != NULL)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        to->str3 = (char *) xmlStrdup((const xmlChar *) str3);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->int1 = int1;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->int2 = col;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->node = node;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->ctxt = ctx;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (to != &xmlLastError)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlCopyError(to,&xmlLastError);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Find the callback channel if channel param is NULL
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (channel == NULL) &&
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (xmlStructuredError == NULL) && (ctxt->sax != NULL)) {
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (level == XML_ERR_WARNING)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    channel = ctxt->sax->warning;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    channel = ctxt->sax->error;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	data = ctxt->userData;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (channel == NULL) {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((schannel == NULL) && (xmlStructuredError != NULL)) {
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schannel = xmlStructuredError;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    data = xmlStructuredErrorContext;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    channel = xmlGenericError;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!data) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		data = xmlGenericErrorContext;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (schannel != NULL) {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        schannel(data, to);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (channel == NULL)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((channel == xmlParserError) ||
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (channel == xmlParserWarning) ||
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(channel == xmlParserValidityError) ||
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(channel == xmlParserValidityWarning))
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlReportError(to, ctxt, str, NULL, NULL);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((channel == (xmlGenericErrorFunc) fprintf) ||
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (channel == xmlGenericErrorDefaultFunc))
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlReportError(to, ctxt, str, channel, data);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	channel(data, "%s", str);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * __xmlSimpleError:
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @domain: where the error comes from
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @code: the error code
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the context node
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__xmlSimpleError(int domain, int code, xmlNodePtr node,
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const char *msg, const char *extra)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (code == XML_ERR_NO_MEMORY) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (extra)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, NULL, 0, 0,
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "Memory allocation failed : %s\n", extra);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain,
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL,
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    NULL, NULL, 0, 0, "Memory allocation failed\n");
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	__xmlRaiseError(NULL, NULL, NULL, NULL, node, domain,
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			code, XML_ERR_ERROR, NULL, 0, extra,
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			NULL, NULL, 0, 0, msg, extra);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserError:
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format an error messages, gives file, line, position and
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extra parameters.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XMLCDECL
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserError(void *ctx, const char *msg, ...)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input = NULL;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr cur = NULL;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char * str;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	input = ctxt->input;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((input != NULL) && (input->filename == NULL) &&
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (ctxt->inputNr > 1)) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = input;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    input = ctxt->inputTab[ctxt->inputNr - 2];
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParserPrintFileInfo(input);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "error: ");
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_GET_VAR_STR(msg, str);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "%s", str);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str != NULL)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(str);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParserPrintFileContext(input);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur != NULL) {
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlParserPrintFileInfo(cur);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext, "\n");
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlParserPrintFileContext(cur);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserWarning:
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format a warning messages, gives file, line, position and
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extra parameters.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XMLCDECL
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserWarning(void *ctx, const char *msg, ...)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input = NULL;
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr cur = NULL;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char * str;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	input = ctxt->input;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((input != NULL) && (input->filename == NULL) &&
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (ctxt->inputNr > 1)) {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = input;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    input = ctxt->inputTab[ctxt->inputNr - 2];
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParserPrintFileInfo(input);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "warning: ");
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_GET_VAR_STR(msg, str);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "%s", str);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str != NULL)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(str);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParserPrintFileContext(input);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur != NULL) {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlParserPrintFileInfo(cur);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext, "\n");
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlParserPrintFileContext(cur);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 			Handling of validation errors			*
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 									*
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserValidityError:
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format an validity error messages, gives file,
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * line, position and extra parameters.
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XMLCDECL
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserValidityError(void *ctx, const char *msg, ...)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input = NULL;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char * str;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len = xmlStrlen((const xmlChar *) msg);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static int had_info = 0;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((len > 1) && (msg[len - 2] != ':')) {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt != NULL) {
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    input = ctxt->input;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((input->filename == NULL) && (ctxt->inputNr > 1))
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		input = ctxt->inputTab[ctxt->inputNr - 2];
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (had_info == 0) {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlParserPrintFileInfo(input);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext, "validity error: ");
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	had_info = 0;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	had_info = 1;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_GET_VAR_STR(msg, str);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "%s", str);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str != NULL)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(str);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (input != NULL)) {
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParserPrintFileContext(input);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserValidityWarning:
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format a validity warning messages, gives file, line,
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * position and extra parameters.
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XMLCDECL
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlParserValidityWarning(void *ctx, const char *msg, ...)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input = NULL;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char * str;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len = xmlStrlen((const xmlChar *) msg);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (len != 0) && (msg[len - 1] != ':')) {
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	input = ctxt->input;
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((input->filename == NULL) && (ctxt->inputNr > 1))
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    input = ctxt->inputTab[ctxt->inputNr - 2];
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParserPrintFileInfo(input);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "validity warning: ");
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_GET_VAR_STR(msg, str);
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "%s", str);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str != NULL)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(str);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParserPrintFileContext(input);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Extended Error Handling				*
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetLastError:
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the last global error registered. This is per thread if compiled
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with thread support.
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns NULL if no error occured or a pointer to the error
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlErrorPtr
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetLastError(void)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlLastError.code == XML_ERR_OK)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (&xmlLastError);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlResetError:
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @err: pointer to the error.
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup the error.
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlResetError(xmlErrorPtr err)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err == NULL)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err->code == XML_ERR_OK)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err->message != NULL)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(err->message);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err->file != NULL)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(err->file);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err->str1 != NULL)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(err->str1);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err->str2 != NULL)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(err->str2);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err->str3 != NULL)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(err->str3);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(err, 0, sizeof(xmlError));
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    err->code = XML_ERR_OK;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlResetLastError:
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup the last global error registered. For parsing error
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this does not change the well-formedness result.
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlResetLastError(void)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlLastError.code == XML_ERR_OK)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlResetError(&xmlLastError);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtGetLastError:
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the last parsing error registered.
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns NULL if no error occured or a pointer to the error
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlErrorPtr
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtGetLastError(void *ctx)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->lastError.code == XML_ERR_OK)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (&ctxt->lastError);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCtxtResetLastError:
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup the last global error registered. For parsing error
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this does not change the well-formedness result.
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCtxtResetLastError(void *ctx)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->errNo = XML_ERR_OK;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->lastError.code == XML_ERR_OK)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlResetError(&ctxt->lastError);
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyError:
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @from:  a source error
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @to:  a target error
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Save the original error to the new place.
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error.
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyError(xmlErrorPtr from, xmlErrorPtr to) {
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *message, *file, *str1, *str2, *str3;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((from == NULL) || (to == NULL))
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message = (char *) xmlStrdup((xmlChar *) from->message);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = (char *) xmlStrdup ((xmlChar *) from->file);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str1 = (char *) xmlStrdup ((xmlChar *) from->str1);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str2 = (char *) xmlStrdup ((xmlChar *) from->str2);
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str3 = (char *) xmlStrdup ((xmlChar *) from->str3);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (to->message != NULL)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(to->message);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (to->file != NULL)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(to->file);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (to->str1 != NULL)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(to->str1);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (to->str2 != NULL)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(to->str2);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (to->str3 != NULL)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(to->str3);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->domain = from->domain;
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->code = from->code;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->level = from->level;
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->line = from->line;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->node = from->node;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->int1 = from->int1;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->int2 = from->int2;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->node = from->node;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->ctxt = from->ctxt;
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->message = message;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->file = file;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->str1 = str1;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->str2 = str2;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to->str3 = str3;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_error
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h"
990