1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error.c: module displaying/handling XML parser errors 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Daniel Veillard <daniel@veillard.com> 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdarg.h> 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid XMLCDECL xmlGenericErrorDefaultFunc (void *ctx ATTRIBUTE_UNUSED, 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ...); 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_GET_VAR_STR(msg, str) { \ 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size, prev_size = -1; \ 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int chars; \ 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *larger; \ 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project va_list ap; \ 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project \ 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (char *) xmlMalloc(150); \ 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != NULL) { \ 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project \ 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = 150; \ 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project \ 3460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while (size < 64000) { \ 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project va_start(ap, msg); \ 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project chars = vsnprintf(str, size, msg, ap); \ 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project va_end(ap); \ 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((chars > -1) && (chars < size)) { \ 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev_size == chars) { \ 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; \ 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { \ 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev_size = chars; \ 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } \ 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } \ 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (chars > -1) \ 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size += chars + 1; \ 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else \ 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size += 100; \ 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((larger = (char *) xmlRealloc(str, size)) == NULL) {\ 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; \ 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } \ 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = larger; \ 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project }} \ 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handling of out of context errors * 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGenericErrorDefaultFunc: 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: an error context 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message to display/transmit 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @...: extra parameters for the message display 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Default handler for out of context error messages. 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid XMLCDECL 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGenericErrorDefaultFunc(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) { 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project va_list args; 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlGenericErrorContext == NULL) 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorContext = (void *) stderr; 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project va_start(args, msg); 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vfprintf((FILE *)xmlGenericErrorContext, msg, args); 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project va_end(args); 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * initGenericErrorDefaultFunc: 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @handler: the handler 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set or reset (if NULL) the default handler for generic errors 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to the builtin error function. 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectinitGenericErrorDefaultFunc(xmlGenericErrorFunc * handler) 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler == NULL) 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError = xmlGenericErrorDefaultFunc; 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError = (*handler); 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSetGenericErrorFunc: 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the new error handling context 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @handler: the new handler function 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function to reset the handler and the error context for out of 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context error messages. 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This simply means that @handler will be called for subsequent 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error messages while not parsing nor validating. And @ctx will 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be passed as first argument to @handler 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * One can simply force messages to be emitted to another FILE * than 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * stderr by setting @ctx to this file handle and @handler to NULL. 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For multi-threaded applications, this must be set separately for each thread. 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) { 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorContext = ctx; 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (handler != NULL) 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError = handler; 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError = xmlGenericErrorDefaultFunc; 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSetStructuredErrorFunc: 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the new error handling context 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @handler: the new handler function 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function to reset the handler and the error context for out of 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * context structured error messages. 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This simply means that @handler will be called for subsequent 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error messages while not parsing nor validating. And @ctx will 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be passed as first argument to @handler 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For multi-threaded applications, this must be set separately for each thread. 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) { 135df143a5041f03a22808b59c76698770b74692815Selim Gurun xmlStructuredErrorContext = ctx; 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredError = handler; 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handling of parsing errors * 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserPrintFileInfo: 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: an xmlParserInputPtr input 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Displays the associated file and line informations for the current input 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserPrintFileInfo(xmlParserInputPtr input) { 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input != NULL) { 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->filename) 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "%s:%d: ", input->filename, 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input->line); 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Entity: line %d: ", input->line); 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserPrintFileContext: 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: an xmlParserInputPtr input 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Displays current context within the input content for error tracking 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserPrintFileContextInternal(xmlParserInputPtr input , 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel, void *data ) { 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur, *base; 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int n, col; /* GCC warns if signed, because compared with sizeof() */ 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar content[81]; /* space for 80 chars + line terminator */ 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ctnt; 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) return; 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = input->cur; 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = input->base; 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* skip backwards over any end-of-lines */ 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) { 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur--; 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n = 0; 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* search backwards for beginning-of-line (to max buff size) */ 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((n++ < (sizeof(content)-1)) && (cur > base) && 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*(cur) != '\n') && (*(cur) != '\r')) 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur--; 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((*(cur) == '\n') || (*(cur) == '\r')) cur++; 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* calculate the error position in terms of the current position */ 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project col = input->cur - cur; 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* search forward for end-of-line (to max buff size) */ 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n = 0; 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctnt = content; 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* copy selected text to our buffer */ 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*cur != 0) && (*(cur) != '\n') && 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*(cur) != '\r') && (n < sizeof(content)-1)) { 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ctnt++ = *cur++; 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n++; 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ctnt = 0; 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* print out the selected text */ 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data ,"%s\n", content); 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* create blank line with problem pointer */ 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project n = 0; 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctnt = content; 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* (leave buffer space for pointer + line terminator) */ 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((n<col) && (n++ < sizeof(content)-2) && (*ctnt != 0)) { 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*(ctnt) != '\t') 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *(ctnt) = ' '; 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctnt++; 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ctnt++ = '^'; 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *ctnt = 0; 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data ,"%s\n", content); 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserPrintFileContext: 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: an xmlParserInputPtr input 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Displays current context within the input content for error tracking 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserPrintFileContext(xmlParserInputPtr input) { 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileContextInternal(input, xmlGenericError, 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorContext); 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlReportError: 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the parser context or NULL 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str: the formatted error message 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Report an erro with its context, replace the 4 old error/warning 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * routines. 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlReportError(xmlErrorPtr err, xmlParserCtxtPtr ctxt, const char *str, 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel, void *data) 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *file = NULL; 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int line = 0; 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int code = -1; 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int domain; 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name = NULL; 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrorLevel level; 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input = NULL; 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr cur = NULL; 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err == NULL) 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (channel == NULL) { 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = xmlGenericError; 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = xmlGenericErrorContext; 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project file = err->file; 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project line = err->line; 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project code = err->code; 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project domain = err->domain; 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project level = err->level; 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = err->node; 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (code == XML_ERR_OK) 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = node->name; 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Maintain the compatibility with the legacy error handling 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->input; 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((input != NULL) && (input->filename == NULL) && 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->inputNr > 1)) { 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = input; 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->inputTab[ctxt->inputNr - 2]; 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input != NULL) { 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input->filename) 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "%s:%d: ", input->filename, input->line); 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((line != 0) && (domain == XML_FROM_PARSER)) 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "Entity: line %d: ", input->line); 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (file != NULL) 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "%s:%d: ", file, line); 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((line != 0) && (domain == XML_FROM_PARSER)) 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "Entity: line %d: ", line); 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "element %s: ", name); 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (domain) { 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_PARSER: 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "parser "); 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_NAMESPACE: 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "namespace "); 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_DTD: 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_VALID: 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "validity "); 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_HTML: 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "HTML parser "); 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_MEMORY: 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "memory "); 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_OUTPUT: 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "output "); 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_IO: 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "I/O "); 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_XINCLUDE: 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "XInclude "); 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_XPATH: 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "XPath "); 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_XPOINTER: 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "parser "); 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_REGEXP: 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "regexp "); 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_MODULE: 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "module "); 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_SCHEMASV: 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "Schemas validity "); 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_SCHEMASP: 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "Schemas parser "); 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_RELAXNGP: 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "Relax-NG parser "); 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_RELAXNGV: 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "Relax-NG validity "); 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_CATALOG: 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "Catalog "); 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_C14N: 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "C14N "); 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_XSLT: 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "XSLT "); 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_FROM_I18N: 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "encoding "); 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (level) { 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ERR_NONE: 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, ": "); 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ERR_WARNING: 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "warning : "); 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ERR_ERROR: 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "error : "); 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_ERR_FATAL: 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "error : "); 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != NULL) { 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len; 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len = xmlStrlen((const xmlChar *)str); 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((len > 0) && (str[len - 1] != '\n')) 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "%s\n", str); 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "%s", str); 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "%s\n", "out of memory error"); 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileContextInternal(input, channel, data); 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->filename) 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "%s:%d: \n", cur->filename, cur->line); 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((line != 0) && (domain == XML_FROM_PARSER)) 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "Entity: line %d: \n", cur->line); 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileContextInternal(cur, channel, data); 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) && 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (err->int1 < 100) && 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (err->int1 < xmlStrlen((const xmlChar *)err->str1))) { 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar buf[150]; 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "%s\n", err->str1); 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i=0;i < err->int1;i++) 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[i] = ' '; 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[i++] = '^'; 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[i] = 0; 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "%s\n", buf); 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * __xmlRaiseError: 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schannel: the structured callback channel 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @channel: the old callback channel 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: the callback data 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the parser context or NULL 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the parser context or NULL 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @domain: the domain for the error 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @code: the code for the error 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @level: the xmlErrorLevel for the error 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @file: the file source of the error (or NULL) 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @line: the line of the error or 0 if N/A 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra string info 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra string info 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: extra string info 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @int1: extra int info 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @col: column number of the error or 0 if N/A 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message to display/transmit 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @...: extra parameters for the message display 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Update the appropriate global or contextual error structure, 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * then forward the error message down the parser or generic 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error callback handler 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid XMLCDECL 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlRaiseError(xmlStructuredErrorFunc schannel, 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel, void *data, void *ctx, 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *nod, int domain, int code, xmlErrorLevel level, 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *file, int line, const char *str1, 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *str2, const char *str3, int int1, int col, 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, ...) 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt = NULL; 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node = (xmlNodePtr) nod; 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *str = NULL; 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input = NULL; 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlErrorPtr to = &xmlLastError; 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr baseptr = NULL; 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 455df143a5041f03a22808b59c76698770b74692815Selim Gurun if (code == XML_ERR_OK) 456df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlGetWarningsDefaultValue == 0) && (level == XML_ERR_WARNING)) 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) || 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) || 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) { 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = (xmlParserCtxtPtr) ctx; 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((schannel == NULL) && (ctxt != NULL) && (ctxt->sax != NULL) && 464df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->sax->initialized == XML_SAX2_MAGIC) && 465df143a5041f03a22808b59c76698770b74692815Selim Gurun (ctxt->sax->serror != NULL)) { 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->sax->serror; 467df143a5041f03a22808b59c76698770b74692815Selim Gurun data = ctxt->userData; 468df143a5041f03a22808b59c76698770b74692815Selim Gurun } 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if structured error handler set 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schannel == NULL) { 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = xmlStructuredError; 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if user has defined handler, change data ptr to user's choice 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schannel != NULL) 479df143a5041f03a22808b59c76698770b74692815Selim Gurun data = xmlStructuredErrorContext; 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Formatting the message 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (msg == NULL) { 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str = (char *) xmlStrdup(BAD_CAST "No error message provided"); 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_GET_VAR_STR(msg, str); 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * specific processing if a parser context is provided 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (file == NULL) { 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->input; 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((input != NULL) && (input->filename == NULL) && 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->inputNr > 1)) { 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->inputTab[ctxt->inputNr - 2]; 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input != NULL) { 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project file = input->filename; 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project line = input->line; 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project col = input->col; 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to = &ctxt->lastError; 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((node != NULL) && (file == NULL)) { 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->doc != NULL) && (node->doc->URL != NULL)) { 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project baseptr = node; 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* file = (const char *) node->doc->URL; */ 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0; 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((i < 10) && (node != NULL) && (node->type != XML_ELEMENT_NODE)); 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++) 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((baseptr == NULL) && (node != NULL) && 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->doc != NULL) && (node->doc->URL != NULL)) 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project baseptr = node; 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project line = node->line; 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Save the information about the error 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlResetError(to); 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->domain = domain; 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->code = code; 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->message = str; 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->level = level; 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (file != NULL) 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->file = (char *) xmlStrdup((const xmlChar *) file); 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (baseptr != NULL) { 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_XINCLUDE_ENABLED 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We check if the error is within an XInclude section and, 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if so, attempt to print out the href of the XInclude instead 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the usual "base" (doc->URL) for the node (bug 152623). 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr prev = baseptr; 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int inclcount = 0; 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (prev != NULL) { 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev->prev == NULL) 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = prev->parent; 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = prev->prev; 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev->type == XML_XINCLUDE_START) { 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (--inclcount < 0) 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (prev->type == XML_XINCLUDE_END) 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project inclcount++; 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev != NULL) { 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prev->type == XML_XINCLUDE_START) { 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->type = XML_ELEMENT_NODE; 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->file = (char *) xmlGetProp(prev, BAD_CAST "href"); 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->type = XML_XINCLUDE_START; 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->file = (char *) xmlGetProp(prev, BAD_CAST "href"); 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->file = (char *) xmlStrdup(baseptr->doc->URL); 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((to->file == NULL) && (node != NULL) && (node->doc != NULL)) { 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->file = (char *) xmlStrdup(node->doc->URL); 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->line = line; 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str1 != NULL) 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->str1 = (char *) xmlStrdup((const xmlChar *) str1); 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str2 != NULL) 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->str2 = (char *) xmlStrdup((const xmlChar *) str2); 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str3 != NULL) 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->str3 = (char *) xmlStrdup((const xmlChar *) str3); 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->int1 = int1; 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->int2 = col; 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->node = node; 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->ctxt = ctx; 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to != &xmlLastError) 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCopyError(to,&xmlLastError); 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 587df143a5041f03a22808b59c76698770b74692815Selim Gurun if (schannel != NULL) { 588df143a5041f03a22808b59c76698770b74692815Selim Gurun schannel(data, to); 589df143a5041f03a22808b59c76698770b74692815Selim Gurun return; 590df143a5041f03a22808b59c76698770b74692815Selim Gurun } 591df143a5041f03a22808b59c76698770b74692815Selim Gurun 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the callback channel if channel param is NULL 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 595df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((ctxt != NULL) && (channel == NULL) && 596df143a5041f03a22808b59c76698770b74692815Selim Gurun (xmlStructuredError == NULL) && (ctxt->sax != NULL)) { 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (level == XML_ERR_WARNING) 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->sax->warning; 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->sax->error; 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (channel == NULL) { 603df143a5041f03a22808b59c76698770b74692815Selim Gurun channel = xmlGenericError; 604df143a5041f03a22808b59c76698770b74692815Selim Gurun if (!data) 605df143a5041f03a22808b59c76698770b74692815Selim Gurun data = xmlGenericErrorContext; 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (channel == NULL) 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((channel == xmlParserError) || 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (channel == xmlParserWarning) || 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (channel == xmlParserValidityError) || 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (channel == xmlParserValidityWarning)) 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlReportError(to, ctxt, str, NULL, NULL); 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((channel == (xmlGenericErrorFunc) fprintf) || 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (channel == xmlGenericErrorDefaultFunc)) 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlReportError(to, ctxt, str, channel, data); 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel(data, "%s", str); 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * __xmlSimpleError: 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @domain: where the error comes from 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @code: the error code 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlSimpleError(int domain, int code, xmlNodePtr node, 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const char *extra) 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (code == XML_ERR_NO_MEMORY) { 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (extra) 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra, 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Memory allocation failed : %s\n", extra); 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL, 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, "Memory allocation failed\n"); 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(NULL, NULL, NULL, NULL, node, domain, 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project code, XML_ERR_ERROR, NULL, 0, extra, 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, 0, 0, msg, extra); 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserError: 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: an XML parser context 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message to display/transmit 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @...: extra parameters for the message display 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Display and format an error messages, gives file, line, position and 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * extra parameters. 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid XMLCDECL 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserError(void *ctx, const char *msg, ...) 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input = NULL; 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr cur = NULL; 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char * str; 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->input; 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((input != NULL) && (input->filename == NULL) && 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->inputNr > 1)) { 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = input; 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->inputTab[ctxt->inputNr - 2]; 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileInfo(input); 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "error: "); 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_GET_VAR_STR(msg, str); 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s", str); 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != NULL) 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str); 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileContext(input); 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileInfo(cur); 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "\n"); 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileContext(cur); 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserWarning: 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: an XML parser context 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message to display/transmit 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @...: extra parameters for the message display 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Display and format a warning messages, gives file, line, position and 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * extra parameters. 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid XMLCDECL 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserWarning(void *ctx, const char *msg, ...) 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input = NULL; 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr cur = NULL; 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char * str; 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->input; 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((input != NULL) && (input->filename == NULL) && 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->inputNr > 1)) { 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = input; 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->inputTab[ctxt->inputNr - 2]; 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileInfo(input); 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "warning: "); 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_GET_VAR_STR(msg, str); 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s", str); 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != NULL) 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str); 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileContext(input); 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) { 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileInfo(cur); 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "\n"); 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileContext(cur); 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handling of validation errors * 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserValidityError: 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: an XML parser context 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message to display/transmit 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @...: extra parameters for the message display 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Display and format an validity error messages, gives file, 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * line, position and extra parameters. 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid XMLCDECL 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserValidityError(void *ctx, const char *msg, ...) 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input = NULL; 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char * str; 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = xmlStrlen((const xmlChar *) msg); 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project static int had_info = 0; 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((len > 1) && (msg[len - 2] != ':')) { 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->input; 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((input->filename == NULL) && (ctxt->inputNr > 1)) 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->inputTab[ctxt->inputNr - 2]; 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (had_info == 0) { 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileInfo(input); 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "validity error: "); 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project had_info = 0; 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project had_info = 1; 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_GET_VAR_STR(msg, str); 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s", str); 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != NULL) 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str); 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (input != NULL)) { 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileContext(input); 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlParserValidityWarning: 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: an XML parser context 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message to display/transmit 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @...: extra parameters for the message display 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Display and format a validity warning messages, gives file, line, 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * position and extra parameters. 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid XMLCDECL 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlParserValidityWarning(void *ctx, const char *msg, ...) 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserInputPtr input = NULL; 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char * str; 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = xmlStrlen((const xmlChar *) msg); 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt != NULL) && (len != 0) && (msg[len - 1] != ':')) { 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->input; 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((input->filename == NULL) && (ctxt->inputNr > 1)) 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project input = ctxt->inputTab[ctxt->inputNr - 2]; 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileInfo(input); 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "validity warning: "); 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_GET_VAR_STR(msg, str); 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "%s", str); 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (str != NULL) 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(str); 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserPrintFileContext(input); 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extended Error Handling * 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetLastError: 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the last global error registered. This is per thread if compiled 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * with thread support. 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if no error occured or a pointer to the error 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlErrorPtr 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetLastError(void) 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlLastError.code == XML_ERR_OK) 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (&xmlLastError); 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlResetError: 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: pointer to the error. 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the error. 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlResetError(xmlErrorPtr err) 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err == NULL) 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->code == XML_ERR_OK) 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->message != NULL) 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(err->message); 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->file != NULL) 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(err->file); 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->str1 != NULL) 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(err->str1); 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->str2 != NULL) 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(err->str2); 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err->str3 != NULL) 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(err->str3); 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(err, 0, sizeof(xmlError)); 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err->code = XML_ERR_OK; 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlResetLastError: 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the last global error registered. For parsing error 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this does not change the well-formedness result. 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlResetLastError(void) 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlLastError.code == XML_ERR_OK) 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlResetError(&xmlLastError); 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCtxtGetLastError: 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: an XML parser context 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the last parsing error registered. 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if no error occured or a pointer to the error 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlErrorPtr 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCtxtGetLastError(void *ctx) 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->lastError.code == XML_ERR_OK) 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (&ctxt->lastError); 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCtxtResetLastError: 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: an XML parser context 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the last global error registered. For parsing error 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this does not change the well-formedness result. 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCtxtResetLastError(void *ctx) 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 922df143a5041f03a22808b59c76698770b74692815Selim Gurun ctxt->errNo = XML_ERR_OK; 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->lastError.code == XML_ERR_OK) 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlResetError(&ctxt->lastError); 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyError: 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @from: a source error 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @to: a target error 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Save the original error to the new place. 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error. 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyError(xmlErrorPtr from, xmlErrorPtr to) { 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char *message, *file, *str1, *str2, *str3; 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((from == NULL) || (to == NULL)) 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project message = (char *) xmlStrdup((xmlChar *) from->message); 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project file = (char *) xmlStrdup ((xmlChar *) from->file); 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str1 = (char *) xmlStrdup ((xmlChar *) from->str1); 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str2 = (char *) xmlStrdup ((xmlChar *) from->str2); 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project str3 = (char *) xmlStrdup ((xmlChar *) from->str3); 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->message != NULL) 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(to->message); 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->file != NULL) 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(to->file); 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->str1 != NULL) 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(to->str1); 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->str2 != NULL) 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(to->str2); 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (to->str3 != NULL) 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(to->str3); 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->domain = from->domain; 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->code = from->code; 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->level = from->level; 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->line = from->line; 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->node = from->node; 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->int1 = from->int1; 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->int2 = from->int2; 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->node = from->node; 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->ctxt = from->ctxt; 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->message = message; 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->file = file; 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->str1 = str1; 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->str2 = str2; 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project to->str3 = str3; 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return 0; 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_error 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 980