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