1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker * error.c: module displaying/handling XML parser errors
3*7c568831SAndroid Build Coastguard Worker *
4*7c568831SAndroid Build Coastguard Worker * See Copyright for the status of this software.
5*7c568831SAndroid Build Coastguard Worker *
6*7c568831SAndroid Build Coastguard Worker * Daniel Veillard <[email protected]>
7*7c568831SAndroid Build Coastguard Worker */
8*7c568831SAndroid Build Coastguard Worker
9*7c568831SAndroid Build Coastguard Worker #define IN_LIBXML
10*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
11*7c568831SAndroid Build Coastguard Worker
12*7c568831SAndroid Build Coastguard Worker #include <string.h>
13*7c568831SAndroid Build Coastguard Worker #include <stdarg.h>
14*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
15*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
16*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
17*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
18*7c568831SAndroid Build Coastguard Worker
19*7c568831SAndroid Build Coastguard Worker #include "private/error.h"
20*7c568831SAndroid Build Coastguard Worker #include "private/globals.h"
21*7c568831SAndroid Build Coastguard Worker #include "private/string.h"
22*7c568831SAndroid Build Coastguard Worker
23*7c568831SAndroid Build Coastguard Worker /************************************************************************
24*7c568831SAndroid Build Coastguard Worker * *
25*7c568831SAndroid Build Coastguard Worker * Error struct *
26*7c568831SAndroid Build Coastguard Worker * *
27*7c568831SAndroid Build Coastguard Worker ************************************************************************/
28*7c568831SAndroid Build Coastguard Worker
29*7c568831SAndroid Build Coastguard Worker static int
xmlVSetError(xmlError * err,void * ctxt,xmlNodePtr node,int domain,int code,xmlErrorLevel level,const char * file,int line,const char * str1,const char * str2,const char * str3,int int1,int col,const char * fmt,va_list ap)30*7c568831SAndroid Build Coastguard Worker xmlVSetError(xmlError *err,
31*7c568831SAndroid Build Coastguard Worker void *ctxt, xmlNodePtr node,
32*7c568831SAndroid Build Coastguard Worker int domain, int code, xmlErrorLevel level,
33*7c568831SAndroid Build Coastguard Worker const char *file, int line,
34*7c568831SAndroid Build Coastguard Worker const char *str1, const char *str2, const char *str3,
35*7c568831SAndroid Build Coastguard Worker int int1, int col,
36*7c568831SAndroid Build Coastguard Worker const char *fmt, va_list ap)
37*7c568831SAndroid Build Coastguard Worker {
38*7c568831SAndroid Build Coastguard Worker char *message = NULL;
39*7c568831SAndroid Build Coastguard Worker char *fileCopy = NULL;
40*7c568831SAndroid Build Coastguard Worker char *str1Copy = NULL;
41*7c568831SAndroid Build Coastguard Worker char *str2Copy = NULL;
42*7c568831SAndroid Build Coastguard Worker char *str3Copy = NULL;
43*7c568831SAndroid Build Coastguard Worker
44*7c568831SAndroid Build Coastguard Worker if (code == XML_ERR_OK) {
45*7c568831SAndroid Build Coastguard Worker xmlResetError(err);
46*7c568831SAndroid Build Coastguard Worker return(0);
47*7c568831SAndroid Build Coastguard Worker }
48*7c568831SAndroid Build Coastguard Worker
49*7c568831SAndroid Build Coastguard Worker /*
50*7c568831SAndroid Build Coastguard Worker * Formatting the message
51*7c568831SAndroid Build Coastguard Worker */
52*7c568831SAndroid Build Coastguard Worker if (fmt == NULL) {
53*7c568831SAndroid Build Coastguard Worker message = xmlMemStrdup("No error message provided");
54*7c568831SAndroid Build Coastguard Worker } else {
55*7c568831SAndroid Build Coastguard Worker xmlChar *tmp;
56*7c568831SAndroid Build Coastguard Worker int res;
57*7c568831SAndroid Build Coastguard Worker
58*7c568831SAndroid Build Coastguard Worker res = xmlStrVASPrintf(&tmp, MAX_ERR_MSG_SIZE, fmt, ap);
59*7c568831SAndroid Build Coastguard Worker if (res < 0)
60*7c568831SAndroid Build Coastguard Worker goto err_memory;
61*7c568831SAndroid Build Coastguard Worker message = (char *) tmp;
62*7c568831SAndroid Build Coastguard Worker }
63*7c568831SAndroid Build Coastguard Worker if (message == NULL)
64*7c568831SAndroid Build Coastguard Worker goto err_memory;
65*7c568831SAndroid Build Coastguard Worker
66*7c568831SAndroid Build Coastguard Worker if (file != NULL) {
67*7c568831SAndroid Build Coastguard Worker fileCopy = (char *) xmlStrdup((const xmlChar *) file);
68*7c568831SAndroid Build Coastguard Worker if (fileCopy == NULL)
69*7c568831SAndroid Build Coastguard Worker goto err_memory;
70*7c568831SAndroid Build Coastguard Worker }
71*7c568831SAndroid Build Coastguard Worker if (str1 != NULL) {
72*7c568831SAndroid Build Coastguard Worker str1Copy = (char *) xmlStrdup((const xmlChar *) str1);
73*7c568831SAndroid Build Coastguard Worker if (str1Copy == NULL)
74*7c568831SAndroid Build Coastguard Worker goto err_memory;
75*7c568831SAndroid Build Coastguard Worker }
76*7c568831SAndroid Build Coastguard Worker if (str2 != NULL) {
77*7c568831SAndroid Build Coastguard Worker str2Copy = (char *) xmlStrdup((const xmlChar *) str2);
78*7c568831SAndroid Build Coastguard Worker if (str2Copy == NULL)
79*7c568831SAndroid Build Coastguard Worker goto err_memory;
80*7c568831SAndroid Build Coastguard Worker }
81*7c568831SAndroid Build Coastguard Worker if (str3 != NULL) {
82*7c568831SAndroid Build Coastguard Worker str3Copy = (char *) xmlStrdup((const xmlChar *) str3);
83*7c568831SAndroid Build Coastguard Worker if (str3Copy == NULL)
84*7c568831SAndroid Build Coastguard Worker goto err_memory;
85*7c568831SAndroid Build Coastguard Worker }
86*7c568831SAndroid Build Coastguard Worker
87*7c568831SAndroid Build Coastguard Worker xmlResetError(err);
88*7c568831SAndroid Build Coastguard Worker
89*7c568831SAndroid Build Coastguard Worker err->domain = domain;
90*7c568831SAndroid Build Coastguard Worker err->code = code;
91*7c568831SAndroid Build Coastguard Worker err->message = message;
92*7c568831SAndroid Build Coastguard Worker err->level = level;
93*7c568831SAndroid Build Coastguard Worker err->file = fileCopy;
94*7c568831SAndroid Build Coastguard Worker err->line = line;
95*7c568831SAndroid Build Coastguard Worker err->str1 = str1Copy;
96*7c568831SAndroid Build Coastguard Worker err->str2 = str2Copy;
97*7c568831SAndroid Build Coastguard Worker err->str3 = str3Copy;
98*7c568831SAndroid Build Coastguard Worker err->int1 = int1;
99*7c568831SAndroid Build Coastguard Worker err->int2 = col;
100*7c568831SAndroid Build Coastguard Worker err->node = node;
101*7c568831SAndroid Build Coastguard Worker err->ctxt = ctxt;
102*7c568831SAndroid Build Coastguard Worker
103*7c568831SAndroid Build Coastguard Worker return(0);
104*7c568831SAndroid Build Coastguard Worker
105*7c568831SAndroid Build Coastguard Worker err_memory:
106*7c568831SAndroid Build Coastguard Worker xmlFree(message);
107*7c568831SAndroid Build Coastguard Worker xmlFree(fileCopy);
108*7c568831SAndroid Build Coastguard Worker xmlFree(str1Copy);
109*7c568831SAndroid Build Coastguard Worker xmlFree(str2Copy);
110*7c568831SAndroid Build Coastguard Worker xmlFree(str3Copy);
111*7c568831SAndroid Build Coastguard Worker return(-1);
112*7c568831SAndroid Build Coastguard Worker }
113*7c568831SAndroid Build Coastguard Worker
114*7c568831SAndroid Build Coastguard Worker static int LIBXML_ATTR_FORMAT(14,15)
xmlSetError(xmlError * err,void * ctxt,xmlNodePtr node,int domain,int code,xmlErrorLevel level,const char * file,int line,const char * str1,const char * str2,const char * str3,int int1,int col,const char * fmt,...)115*7c568831SAndroid Build Coastguard Worker xmlSetError(xmlError *err,
116*7c568831SAndroid Build Coastguard Worker void *ctxt, xmlNodePtr node,
117*7c568831SAndroid Build Coastguard Worker int domain, int code, xmlErrorLevel level,
118*7c568831SAndroid Build Coastguard Worker const char *file, int line,
119*7c568831SAndroid Build Coastguard Worker const char *str1, const char *str2, const char *str3,
120*7c568831SAndroid Build Coastguard Worker int int1, int col,
121*7c568831SAndroid Build Coastguard Worker const char *fmt, ...)
122*7c568831SAndroid Build Coastguard Worker {
123*7c568831SAndroid Build Coastguard Worker va_list ap;
124*7c568831SAndroid Build Coastguard Worker int res;
125*7c568831SAndroid Build Coastguard Worker
126*7c568831SAndroid Build Coastguard Worker va_start(ap, fmt);
127*7c568831SAndroid Build Coastguard Worker res = xmlVSetError(err, ctxt, node, domain, code, level, file, line,
128*7c568831SAndroid Build Coastguard Worker str1, str2, str3, int1, col, fmt, ap);
129*7c568831SAndroid Build Coastguard Worker va_end(ap);
130*7c568831SAndroid Build Coastguard Worker
131*7c568831SAndroid Build Coastguard Worker return(res);
132*7c568831SAndroid Build Coastguard Worker }
133*7c568831SAndroid Build Coastguard Worker
134*7c568831SAndroid Build Coastguard Worker static int
xmlVUpdateError(xmlError * err,void * ctxt,xmlNodePtr node,int domain,int code,xmlErrorLevel level,const char * file,int line,const char * str1,const char * str2,const char * str3,int int1,int col,const char * fmt,va_list ap)135*7c568831SAndroid Build Coastguard Worker xmlVUpdateError(xmlError *err,
136*7c568831SAndroid Build Coastguard Worker void *ctxt, xmlNodePtr node,
137*7c568831SAndroid Build Coastguard Worker int domain, int code, xmlErrorLevel level,
138*7c568831SAndroid Build Coastguard Worker const char *file, int line,
139*7c568831SAndroid Build Coastguard Worker const char *str1, const char *str2, const char *str3,
140*7c568831SAndroid Build Coastguard Worker int int1, int col,
141*7c568831SAndroid Build Coastguard Worker const char *fmt, va_list ap)
142*7c568831SAndroid Build Coastguard Worker {
143*7c568831SAndroid Build Coastguard Worker int res;
144*7c568831SAndroid Build Coastguard Worker
145*7c568831SAndroid Build Coastguard Worker /*
146*7c568831SAndroid Build Coastguard Worker * Find first element parent.
147*7c568831SAndroid Build Coastguard Worker */
148*7c568831SAndroid Build Coastguard Worker if (node != NULL) {
149*7c568831SAndroid Build Coastguard Worker int i;
150*7c568831SAndroid Build Coastguard Worker
151*7c568831SAndroid Build Coastguard Worker for (i = 0; i < 10; i++) {
152*7c568831SAndroid Build Coastguard Worker if ((node->type == XML_ELEMENT_NODE) ||
153*7c568831SAndroid Build Coastguard Worker (node->parent == NULL))
154*7c568831SAndroid Build Coastguard Worker break;
155*7c568831SAndroid Build Coastguard Worker node = node->parent;
156*7c568831SAndroid Build Coastguard Worker }
157*7c568831SAndroid Build Coastguard Worker }
158*7c568831SAndroid Build Coastguard Worker
159*7c568831SAndroid Build Coastguard Worker /*
160*7c568831SAndroid Build Coastguard Worker * Get file and line from node.
161*7c568831SAndroid Build Coastguard Worker */
162*7c568831SAndroid Build Coastguard Worker if (node != NULL) {
163*7c568831SAndroid Build Coastguard Worker if ((file == NULL) && (node->doc != NULL))
164*7c568831SAndroid Build Coastguard Worker file = (const char *) node->doc->URL;
165*7c568831SAndroid Build Coastguard Worker
166*7c568831SAndroid Build Coastguard Worker if (line == 0) {
167*7c568831SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE)
168*7c568831SAndroid Build Coastguard Worker line = node->line;
169*7c568831SAndroid Build Coastguard Worker if ((line == 0) || (line == 65535))
170*7c568831SAndroid Build Coastguard Worker line = xmlGetLineNo(node);
171*7c568831SAndroid Build Coastguard Worker }
172*7c568831SAndroid Build Coastguard Worker }
173*7c568831SAndroid Build Coastguard Worker
174*7c568831SAndroid Build Coastguard Worker res = xmlVSetError(err, ctxt, node, domain, code, level, file, line,
175*7c568831SAndroid Build Coastguard Worker str1, str2, str3, int1, col, fmt, ap);
176*7c568831SAndroid Build Coastguard Worker
177*7c568831SAndroid Build Coastguard Worker return(res);
178*7c568831SAndroid Build Coastguard Worker }
179*7c568831SAndroid Build Coastguard Worker
180*7c568831SAndroid Build Coastguard Worker /************************************************************************
181*7c568831SAndroid Build Coastguard Worker * *
182*7c568831SAndroid Build Coastguard Worker * Handling of out of context errors *
183*7c568831SAndroid Build Coastguard Worker * *
184*7c568831SAndroid Build Coastguard Worker ************************************************************************/
185*7c568831SAndroid Build Coastguard Worker
186*7c568831SAndroid Build Coastguard Worker /**
187*7c568831SAndroid Build Coastguard Worker * xmlGenericErrorDefaultFunc:
188*7c568831SAndroid Build Coastguard Worker * @ctx: an error context
189*7c568831SAndroid Build Coastguard Worker * @msg: the message to display/transmit
190*7c568831SAndroid Build Coastguard Worker * @...: extra parameters for the message display
191*7c568831SAndroid Build Coastguard Worker *
192*7c568831SAndroid Build Coastguard Worker * Default handler for out of context error messages.
193*7c568831SAndroid Build Coastguard Worker */
194*7c568831SAndroid Build Coastguard Worker void
xmlGenericErrorDefaultFunc(void * ctx ATTRIBUTE_UNUSED,const char * msg,...)195*7c568831SAndroid Build Coastguard Worker xmlGenericErrorDefaultFunc(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) {
196*7c568831SAndroid Build Coastguard Worker va_list args;
197*7c568831SAndroid Build Coastguard Worker
198*7c568831SAndroid Build Coastguard Worker if (xmlGenericErrorContext == NULL)
199*7c568831SAndroid Build Coastguard Worker xmlGenericErrorContext = (void *) stderr;
200*7c568831SAndroid Build Coastguard Worker
201*7c568831SAndroid Build Coastguard Worker va_start(args, msg);
202*7c568831SAndroid Build Coastguard Worker vfprintf((FILE *)xmlGenericErrorContext, msg, args);
203*7c568831SAndroid Build Coastguard Worker va_end(args);
204*7c568831SAndroid Build Coastguard Worker }
205*7c568831SAndroid Build Coastguard Worker
206*7c568831SAndroid Build Coastguard Worker /**
207*7c568831SAndroid Build Coastguard Worker * initGenericErrorDefaultFunc:
208*7c568831SAndroid Build Coastguard Worker * @handler: the handler
209*7c568831SAndroid Build Coastguard Worker *
210*7c568831SAndroid Build Coastguard Worker * DEPRECATED: Use xmlSetGenericErrorFunc.
211*7c568831SAndroid Build Coastguard Worker *
212*7c568831SAndroid Build Coastguard Worker * Set or reset (if NULL) the default handler for generic errors
213*7c568831SAndroid Build Coastguard Worker * to the builtin error function.
214*7c568831SAndroid Build Coastguard Worker */
215*7c568831SAndroid Build Coastguard Worker void
initGenericErrorDefaultFunc(xmlGenericErrorFunc * handler)216*7c568831SAndroid Build Coastguard Worker initGenericErrorDefaultFunc(xmlGenericErrorFunc * handler)
217*7c568831SAndroid Build Coastguard Worker {
218*7c568831SAndroid Build Coastguard Worker if (handler == NULL)
219*7c568831SAndroid Build Coastguard Worker xmlGenericError = xmlGenericErrorDefaultFunc;
220*7c568831SAndroid Build Coastguard Worker else
221*7c568831SAndroid Build Coastguard Worker xmlGenericError = (*handler);
222*7c568831SAndroid Build Coastguard Worker }
223*7c568831SAndroid Build Coastguard Worker
224*7c568831SAndroid Build Coastguard Worker /**
225*7c568831SAndroid Build Coastguard Worker * xmlSetGenericErrorFunc:
226*7c568831SAndroid Build Coastguard Worker * @ctx: the new error handling context
227*7c568831SAndroid Build Coastguard Worker * @handler: the new handler function
228*7c568831SAndroid Build Coastguard Worker *
229*7c568831SAndroid Build Coastguard Worker * DEPRECATED: See xmlSetStructuredErrorFunc for alternatives.
230*7c568831SAndroid Build Coastguard Worker *
231*7c568831SAndroid Build Coastguard Worker * Set the global "generic" handler and context for error messages.
232*7c568831SAndroid Build Coastguard Worker * The generic error handler will only receive fragments of error
233*7c568831SAndroid Build Coastguard Worker * messages which should be concatenated or printed to a stream.
234*7c568831SAndroid Build Coastguard Worker *
235*7c568831SAndroid Build Coastguard Worker * If handler is NULL, use the built-in default handler which prints
236*7c568831SAndroid Build Coastguard Worker * to stderr.
237*7c568831SAndroid Build Coastguard Worker *
238*7c568831SAndroid Build Coastguard Worker * Since this is a global setting, it's a good idea to reset the
239*7c568831SAndroid Build Coastguard Worker * error handler to its default value after collecting the errors
240*7c568831SAndroid Build Coastguard Worker * you're interested in.
241*7c568831SAndroid Build Coastguard Worker *
242*7c568831SAndroid Build Coastguard Worker * For multi-threaded applications, this must be set separately for
243*7c568831SAndroid Build Coastguard Worker * each thread.
244*7c568831SAndroid Build Coastguard Worker */
245*7c568831SAndroid Build Coastguard Worker void
xmlSetGenericErrorFunc(void * ctx,xmlGenericErrorFunc handler)246*7c568831SAndroid Build Coastguard Worker xmlSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler) {
247*7c568831SAndroid Build Coastguard Worker xmlGenericErrorContext = ctx;
248*7c568831SAndroid Build Coastguard Worker if (handler != NULL)
249*7c568831SAndroid Build Coastguard Worker xmlGenericError = handler;
250*7c568831SAndroid Build Coastguard Worker else
251*7c568831SAndroid Build Coastguard Worker xmlGenericError = xmlGenericErrorDefaultFunc;
252*7c568831SAndroid Build Coastguard Worker }
253*7c568831SAndroid Build Coastguard Worker
254*7c568831SAndroid Build Coastguard Worker /**
255*7c568831SAndroid Build Coastguard Worker * xmlSetStructuredErrorFunc:
256*7c568831SAndroid Build Coastguard Worker * @ctx: the new error handling context
257*7c568831SAndroid Build Coastguard Worker * @handler: the new handler function
258*7c568831SAndroid Build Coastguard Worker *
259*7c568831SAndroid Build Coastguard Worker * DEPRECATED: Use a per-context error handler.
260*7c568831SAndroid Build Coastguard Worker *
261*7c568831SAndroid Build Coastguard Worker * It's recommended to use the per-context error handlers instead:
262*7c568831SAndroid Build Coastguard Worker *
263*7c568831SAndroid Build Coastguard Worker * - xmlCtxtSetErrorHandler (since 2.13.0)
264*7c568831SAndroid Build Coastguard Worker * - xmlTextReaderSetStructuredErrorHandler
265*7c568831SAndroid Build Coastguard Worker * - xmlXPathSetErrorHandler (since 2.13.0)
266*7c568831SAndroid Build Coastguard Worker * - xmlXIncludeSetErrorHandler (since 2.13.0)
267*7c568831SAndroid Build Coastguard Worker * - xmlSchemaSetParserStructuredErrors
268*7c568831SAndroid Build Coastguard Worker * - xmlSchemaSetValidStructuredErrors
269*7c568831SAndroid Build Coastguard Worker * - xmlRelaxNGSetParserStructuredErrors
270*7c568831SAndroid Build Coastguard Worker * - xmlRelaxNGSetValidStructuredErrors
271*7c568831SAndroid Build Coastguard Worker *
272*7c568831SAndroid Build Coastguard Worker * Set the global "structured" handler and context for error messages.
273*7c568831SAndroid Build Coastguard Worker * If handler is NULL, the error handler is deactivated.
274*7c568831SAndroid Build Coastguard Worker *
275*7c568831SAndroid Build Coastguard Worker * The structured error handler takes precedence over "generic"
276*7c568831SAndroid Build Coastguard Worker * handlers, even per-context generic handlers.
277*7c568831SAndroid Build Coastguard Worker *
278*7c568831SAndroid Build Coastguard Worker * Since this is a global setting, it's a good idea to deactivate the
279*7c568831SAndroid Build Coastguard Worker * error handler after collecting the errors you're interested in.
280*7c568831SAndroid Build Coastguard Worker *
281*7c568831SAndroid Build Coastguard Worker * For multi-threaded applications, this must be set separately for
282*7c568831SAndroid Build Coastguard Worker * each thread.
283*7c568831SAndroid Build Coastguard Worker */
284*7c568831SAndroid Build Coastguard Worker void
xmlSetStructuredErrorFunc(void * ctx,xmlStructuredErrorFunc handler)285*7c568831SAndroid Build Coastguard Worker xmlSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler) {
286*7c568831SAndroid Build Coastguard Worker xmlStructuredErrorContext = ctx;
287*7c568831SAndroid Build Coastguard Worker xmlStructuredError = handler;
288*7c568831SAndroid Build Coastguard Worker }
289*7c568831SAndroid Build Coastguard Worker
290*7c568831SAndroid Build Coastguard Worker /************************************************************************
291*7c568831SAndroid Build Coastguard Worker * *
292*7c568831SAndroid Build Coastguard Worker * Handling of parsing errors *
293*7c568831SAndroid Build Coastguard Worker * *
294*7c568831SAndroid Build Coastguard Worker ************************************************************************/
295*7c568831SAndroid Build Coastguard Worker
296*7c568831SAndroid Build Coastguard Worker /**
297*7c568831SAndroid Build Coastguard Worker * xmlParserPrintFileInfo:
298*7c568831SAndroid Build Coastguard Worker * @input: an xmlParserInputPtr input
299*7c568831SAndroid Build Coastguard Worker *
300*7c568831SAndroid Build Coastguard Worker * DEPRECATED: Use xmlFormatError.
301*7c568831SAndroid Build Coastguard Worker *
302*7c568831SAndroid Build Coastguard Worker * Displays the associated file and line information for the current input
303*7c568831SAndroid Build Coastguard Worker */
304*7c568831SAndroid Build Coastguard Worker
305*7c568831SAndroid Build Coastguard Worker void
xmlParserPrintFileInfo(xmlParserInputPtr input)306*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileInfo(xmlParserInputPtr input) {
307*7c568831SAndroid Build Coastguard Worker if (input != NULL) {
308*7c568831SAndroid Build Coastguard Worker if (input->filename)
309*7c568831SAndroid Build Coastguard Worker xmlGenericError(xmlGenericErrorContext,
310*7c568831SAndroid Build Coastguard Worker "%s:%d: ", input->filename,
311*7c568831SAndroid Build Coastguard Worker input->line);
312*7c568831SAndroid Build Coastguard Worker else
313*7c568831SAndroid Build Coastguard Worker xmlGenericError(xmlGenericErrorContext,
314*7c568831SAndroid Build Coastguard Worker "Entity: line %d: ", input->line);
315*7c568831SAndroid Build Coastguard Worker }
316*7c568831SAndroid Build Coastguard Worker }
317*7c568831SAndroid Build Coastguard Worker
318*7c568831SAndroid Build Coastguard Worker /**
319*7c568831SAndroid Build Coastguard Worker * xmlParserPrintFileContextInternal:
320*7c568831SAndroid Build Coastguard Worker * @input: an xmlParserInputPtr input
321*7c568831SAndroid Build Coastguard Worker *
322*7c568831SAndroid Build Coastguard Worker * Displays current context within the input content for error tracking
323*7c568831SAndroid Build Coastguard Worker */
324*7c568831SAndroid Build Coastguard Worker
325*7c568831SAndroid Build Coastguard Worker static void
xmlParserPrintFileContextInternal(xmlParserInputPtr input,xmlGenericErrorFunc channel,void * data)326*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileContextInternal(xmlParserInputPtr input ,
327*7c568831SAndroid Build Coastguard Worker xmlGenericErrorFunc channel, void *data ) {
328*7c568831SAndroid Build Coastguard Worker const xmlChar *cur, *base, *start;
329*7c568831SAndroid Build Coastguard Worker unsigned int n, col; /* GCC warns if signed, because compared with sizeof() */
330*7c568831SAndroid Build Coastguard Worker xmlChar content[81]; /* space for 80 chars + line terminator */
331*7c568831SAndroid Build Coastguard Worker xmlChar *ctnt;
332*7c568831SAndroid Build Coastguard Worker
333*7c568831SAndroid Build Coastguard Worker if ((input == NULL) || (input->cur == NULL))
334*7c568831SAndroid Build Coastguard Worker return;
335*7c568831SAndroid Build Coastguard Worker
336*7c568831SAndroid Build Coastguard Worker cur = input->cur;
337*7c568831SAndroid Build Coastguard Worker base = input->base;
338*7c568831SAndroid Build Coastguard Worker /* skip backwards over any end-of-lines */
339*7c568831SAndroid Build Coastguard Worker while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) {
340*7c568831SAndroid Build Coastguard Worker cur--;
341*7c568831SAndroid Build Coastguard Worker }
342*7c568831SAndroid Build Coastguard Worker n = 0;
343*7c568831SAndroid Build Coastguard Worker /* search backwards for beginning-of-line (to max buff size) */
344*7c568831SAndroid Build Coastguard Worker while ((n < sizeof(content) - 1) && (cur > base) &&
345*7c568831SAndroid Build Coastguard Worker (*cur != '\n') && (*cur != '\r')) {
346*7c568831SAndroid Build Coastguard Worker cur--;
347*7c568831SAndroid Build Coastguard Worker n++;
348*7c568831SAndroid Build Coastguard Worker }
349*7c568831SAndroid Build Coastguard Worker if ((n > 0) && ((*cur == '\n') || (*cur == '\r'))) {
350*7c568831SAndroid Build Coastguard Worker cur++;
351*7c568831SAndroid Build Coastguard Worker } else {
352*7c568831SAndroid Build Coastguard Worker /* skip over continuation bytes */
353*7c568831SAndroid Build Coastguard Worker while ((cur < input->cur) && ((*cur & 0xC0) == 0x80))
354*7c568831SAndroid Build Coastguard Worker cur++;
355*7c568831SAndroid Build Coastguard Worker }
356*7c568831SAndroid Build Coastguard Worker /* calculate the error position in terms of the current position */
357*7c568831SAndroid Build Coastguard Worker col = input->cur - cur;
358*7c568831SAndroid Build Coastguard Worker /* search forward for end-of-line (to max buff size) */
359*7c568831SAndroid Build Coastguard Worker n = 0;
360*7c568831SAndroid Build Coastguard Worker start = cur;
361*7c568831SAndroid Build Coastguard Worker /* copy selected text to our buffer */
362*7c568831SAndroid Build Coastguard Worker while ((*cur != 0) && (*(cur) != '\n') && (*(cur) != '\r')) {
363*7c568831SAndroid Build Coastguard Worker int len = input->end - cur;
364*7c568831SAndroid Build Coastguard Worker int c = xmlGetUTF8Char(cur, &len);
365*7c568831SAndroid Build Coastguard Worker
366*7c568831SAndroid Build Coastguard Worker if ((c < 0) || (n + len > sizeof(content)-1))
367*7c568831SAndroid Build Coastguard Worker break;
368*7c568831SAndroid Build Coastguard Worker cur += len;
369*7c568831SAndroid Build Coastguard Worker n += len;
370*7c568831SAndroid Build Coastguard Worker }
371*7c568831SAndroid Build Coastguard Worker memcpy(content, start, n);
372*7c568831SAndroid Build Coastguard Worker content[n] = 0;
373*7c568831SAndroid Build Coastguard Worker /* print out the selected text */
374*7c568831SAndroid Build Coastguard Worker channel(data ,"%s\n", content);
375*7c568831SAndroid Build Coastguard Worker /* create blank line with problem pointer */
376*7c568831SAndroid Build Coastguard Worker n = 0;
377*7c568831SAndroid Build Coastguard Worker ctnt = content;
378*7c568831SAndroid Build Coastguard Worker /* (leave buffer space for pointer + line terminator) */
379*7c568831SAndroid Build Coastguard Worker while ((n<col) && (n++ < sizeof(content)-2) && (*ctnt != 0)) {
380*7c568831SAndroid Build Coastguard Worker if (*(ctnt) != '\t')
381*7c568831SAndroid Build Coastguard Worker *(ctnt) = ' ';
382*7c568831SAndroid Build Coastguard Worker ctnt++;
383*7c568831SAndroid Build Coastguard Worker }
384*7c568831SAndroid Build Coastguard Worker *ctnt++ = '^';
385*7c568831SAndroid Build Coastguard Worker *ctnt = 0;
386*7c568831SAndroid Build Coastguard Worker channel(data ,"%s\n", content);
387*7c568831SAndroid Build Coastguard Worker }
388*7c568831SAndroid Build Coastguard Worker
389*7c568831SAndroid Build Coastguard Worker /**
390*7c568831SAndroid Build Coastguard Worker * xmlParserPrintFileContext:
391*7c568831SAndroid Build Coastguard Worker * @input: an xmlParserInputPtr input
392*7c568831SAndroid Build Coastguard Worker *
393*7c568831SAndroid Build Coastguard Worker * DEPRECATED: Use xmlFormatError.
394*7c568831SAndroid Build Coastguard Worker *
395*7c568831SAndroid Build Coastguard Worker * Displays current context within the input content for error tracking
396*7c568831SAndroid Build Coastguard Worker */
397*7c568831SAndroid Build Coastguard Worker void
xmlParserPrintFileContext(xmlParserInputPtr input)398*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileContext(xmlParserInputPtr input) {
399*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileContextInternal(input, xmlGenericError,
400*7c568831SAndroid Build Coastguard Worker xmlGenericErrorContext);
401*7c568831SAndroid Build Coastguard Worker }
402*7c568831SAndroid Build Coastguard Worker
403*7c568831SAndroid Build Coastguard Worker /**
404*7c568831SAndroid Build Coastguard Worker * xmlFormatError:
405*7c568831SAndroid Build Coastguard Worker * @err: the error
406*7c568831SAndroid Build Coastguard Worker * @channel: callback
407*7c568831SAndroid Build Coastguard Worker * @data: user data for callback
408*7c568831SAndroid Build Coastguard Worker *
409*7c568831SAndroid Build Coastguard Worker * Report a formatted error to a printf-like callback.
410*7c568831SAndroid Build Coastguard Worker *
411*7c568831SAndroid Build Coastguard Worker * This can result in a verbose multi-line report including additional
412*7c568831SAndroid Build Coastguard Worker * information from the parser context.
413*7c568831SAndroid Build Coastguard Worker *
414*7c568831SAndroid Build Coastguard Worker * Available since 2.13.0.
415*7c568831SAndroid Build Coastguard Worker */
416*7c568831SAndroid Build Coastguard Worker void
xmlFormatError(const xmlError * err,xmlGenericErrorFunc channel,void * data)417*7c568831SAndroid Build Coastguard Worker xmlFormatError(const xmlError *err, xmlGenericErrorFunc channel, void *data)
418*7c568831SAndroid Build Coastguard Worker {
419*7c568831SAndroid Build Coastguard Worker const char *message;
420*7c568831SAndroid Build Coastguard Worker const char *file;
421*7c568831SAndroid Build Coastguard Worker int line;
422*7c568831SAndroid Build Coastguard Worker int code;
423*7c568831SAndroid Build Coastguard Worker int domain;
424*7c568831SAndroid Build Coastguard Worker const xmlChar *name = NULL;
425*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
426*7c568831SAndroid Build Coastguard Worker xmlErrorLevel level;
427*7c568831SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt = NULL;
428*7c568831SAndroid Build Coastguard Worker xmlParserInputPtr input = NULL;
429*7c568831SAndroid Build Coastguard Worker xmlParserInputPtr cur = NULL;
430*7c568831SAndroid Build Coastguard Worker
431*7c568831SAndroid Build Coastguard Worker if ((err == NULL) || (channel == NULL))
432*7c568831SAndroid Build Coastguard Worker return;
433*7c568831SAndroid Build Coastguard Worker
434*7c568831SAndroid Build Coastguard Worker message = err->message;
435*7c568831SAndroid Build Coastguard Worker file = err->file;
436*7c568831SAndroid Build Coastguard Worker line = err->line;
437*7c568831SAndroid Build Coastguard Worker code = err->code;
438*7c568831SAndroid Build Coastguard Worker domain = err->domain;
439*7c568831SAndroid Build Coastguard Worker level = err->level;
440*7c568831SAndroid Build Coastguard Worker node = err->node;
441*7c568831SAndroid Build Coastguard Worker
442*7c568831SAndroid Build Coastguard Worker if (code == XML_ERR_OK)
443*7c568831SAndroid Build Coastguard Worker return;
444*7c568831SAndroid Build Coastguard Worker
445*7c568831SAndroid Build Coastguard Worker if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) ||
446*7c568831SAndroid Build Coastguard Worker (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) ||
447*7c568831SAndroid Build Coastguard Worker (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) {
448*7c568831SAndroid Build Coastguard Worker ctxt = err->ctxt;
449*7c568831SAndroid Build Coastguard Worker }
450*7c568831SAndroid Build Coastguard Worker
451*7c568831SAndroid Build Coastguard Worker if ((node != NULL) && (node->type == XML_ELEMENT_NODE) &&
452*7c568831SAndroid Build Coastguard Worker (domain != XML_FROM_SCHEMASV))
453*7c568831SAndroid Build Coastguard Worker name = node->name;
454*7c568831SAndroid Build Coastguard Worker
455*7c568831SAndroid Build Coastguard Worker /*
456*7c568831SAndroid Build Coastguard Worker * Maintain the compatibility with the legacy error handling
457*7c568831SAndroid Build Coastguard Worker */
458*7c568831SAndroid Build Coastguard Worker if ((ctxt != NULL) && (ctxt->input != NULL)) {
459*7c568831SAndroid Build Coastguard Worker input = ctxt->input;
460*7c568831SAndroid Build Coastguard Worker if ((input->filename == NULL) &&
461*7c568831SAndroid Build Coastguard Worker (ctxt->inputNr > 1)) {
462*7c568831SAndroid Build Coastguard Worker cur = input;
463*7c568831SAndroid Build Coastguard Worker input = ctxt->inputTab[ctxt->inputNr - 2];
464*7c568831SAndroid Build Coastguard Worker }
465*7c568831SAndroid Build Coastguard Worker if (input->filename)
466*7c568831SAndroid Build Coastguard Worker channel(data, "%s:%d: ", input->filename, input->line);
467*7c568831SAndroid Build Coastguard Worker else if ((line != 0) && (domain == XML_FROM_PARSER))
468*7c568831SAndroid Build Coastguard Worker channel(data, "Entity: line %d: ", input->line);
469*7c568831SAndroid Build Coastguard Worker } else {
470*7c568831SAndroid Build Coastguard Worker if (file != NULL)
471*7c568831SAndroid Build Coastguard Worker channel(data, "%s:%d: ", file, line);
472*7c568831SAndroid Build Coastguard Worker else if ((line != 0) &&
473*7c568831SAndroid Build Coastguard Worker ((domain == XML_FROM_PARSER) || (domain == XML_FROM_SCHEMASV)||
474*7c568831SAndroid Build Coastguard Worker (domain == XML_FROM_SCHEMASP)||(domain == XML_FROM_DTD) ||
475*7c568831SAndroid Build Coastguard Worker (domain == XML_FROM_RELAXNGP)||(domain == XML_FROM_RELAXNGV)))
476*7c568831SAndroid Build Coastguard Worker channel(data, "Entity: line %d: ", line);
477*7c568831SAndroid Build Coastguard Worker }
478*7c568831SAndroid Build Coastguard Worker if (name != NULL) {
479*7c568831SAndroid Build Coastguard Worker channel(data, "element %s: ", name);
480*7c568831SAndroid Build Coastguard Worker }
481*7c568831SAndroid Build Coastguard Worker switch (domain) {
482*7c568831SAndroid Build Coastguard Worker case XML_FROM_PARSER:
483*7c568831SAndroid Build Coastguard Worker channel(data, "parser ");
484*7c568831SAndroid Build Coastguard Worker break;
485*7c568831SAndroid Build Coastguard Worker case XML_FROM_NAMESPACE:
486*7c568831SAndroid Build Coastguard Worker channel(data, "namespace ");
487*7c568831SAndroid Build Coastguard Worker break;
488*7c568831SAndroid Build Coastguard Worker case XML_FROM_DTD:
489*7c568831SAndroid Build Coastguard Worker case XML_FROM_VALID:
490*7c568831SAndroid Build Coastguard Worker channel(data, "validity ");
491*7c568831SAndroid Build Coastguard Worker break;
492*7c568831SAndroid Build Coastguard Worker case XML_FROM_HTML:
493*7c568831SAndroid Build Coastguard Worker channel(data, "HTML parser ");
494*7c568831SAndroid Build Coastguard Worker break;
495*7c568831SAndroid Build Coastguard Worker case XML_FROM_MEMORY:
496*7c568831SAndroid Build Coastguard Worker channel(data, "memory ");
497*7c568831SAndroid Build Coastguard Worker break;
498*7c568831SAndroid Build Coastguard Worker case XML_FROM_OUTPUT:
499*7c568831SAndroid Build Coastguard Worker channel(data, "output ");
500*7c568831SAndroid Build Coastguard Worker break;
501*7c568831SAndroid Build Coastguard Worker case XML_FROM_IO:
502*7c568831SAndroid Build Coastguard Worker channel(data, "I/O ");
503*7c568831SAndroid Build Coastguard Worker break;
504*7c568831SAndroid Build Coastguard Worker case XML_FROM_XINCLUDE:
505*7c568831SAndroid Build Coastguard Worker channel(data, "XInclude ");
506*7c568831SAndroid Build Coastguard Worker break;
507*7c568831SAndroid Build Coastguard Worker case XML_FROM_XPATH:
508*7c568831SAndroid Build Coastguard Worker channel(data, "XPath ");
509*7c568831SAndroid Build Coastguard Worker break;
510*7c568831SAndroid Build Coastguard Worker case XML_FROM_XPOINTER:
511*7c568831SAndroid Build Coastguard Worker channel(data, "parser ");
512*7c568831SAndroid Build Coastguard Worker break;
513*7c568831SAndroid Build Coastguard Worker case XML_FROM_REGEXP:
514*7c568831SAndroid Build Coastguard Worker channel(data, "regexp ");
515*7c568831SAndroid Build Coastguard Worker break;
516*7c568831SAndroid Build Coastguard Worker case XML_FROM_MODULE:
517*7c568831SAndroid Build Coastguard Worker channel(data, "module ");
518*7c568831SAndroid Build Coastguard Worker break;
519*7c568831SAndroid Build Coastguard Worker case XML_FROM_SCHEMASV:
520*7c568831SAndroid Build Coastguard Worker channel(data, "Schemas validity ");
521*7c568831SAndroid Build Coastguard Worker break;
522*7c568831SAndroid Build Coastguard Worker case XML_FROM_SCHEMASP:
523*7c568831SAndroid Build Coastguard Worker channel(data, "Schemas parser ");
524*7c568831SAndroid Build Coastguard Worker break;
525*7c568831SAndroid Build Coastguard Worker case XML_FROM_RELAXNGP:
526*7c568831SAndroid Build Coastguard Worker channel(data, "Relax-NG parser ");
527*7c568831SAndroid Build Coastguard Worker break;
528*7c568831SAndroid Build Coastguard Worker case XML_FROM_RELAXNGV:
529*7c568831SAndroid Build Coastguard Worker channel(data, "Relax-NG validity ");
530*7c568831SAndroid Build Coastguard Worker break;
531*7c568831SAndroid Build Coastguard Worker case XML_FROM_CATALOG:
532*7c568831SAndroid Build Coastguard Worker channel(data, "Catalog ");
533*7c568831SAndroid Build Coastguard Worker break;
534*7c568831SAndroid Build Coastguard Worker case XML_FROM_C14N:
535*7c568831SAndroid Build Coastguard Worker channel(data, "C14N ");
536*7c568831SAndroid Build Coastguard Worker break;
537*7c568831SAndroid Build Coastguard Worker case XML_FROM_XSLT:
538*7c568831SAndroid Build Coastguard Worker channel(data, "XSLT ");
539*7c568831SAndroid Build Coastguard Worker break;
540*7c568831SAndroid Build Coastguard Worker case XML_FROM_I18N:
541*7c568831SAndroid Build Coastguard Worker channel(data, "encoding ");
542*7c568831SAndroid Build Coastguard Worker break;
543*7c568831SAndroid Build Coastguard Worker case XML_FROM_SCHEMATRONV:
544*7c568831SAndroid Build Coastguard Worker channel(data, "schematron ");
545*7c568831SAndroid Build Coastguard Worker break;
546*7c568831SAndroid Build Coastguard Worker case XML_FROM_BUFFER:
547*7c568831SAndroid Build Coastguard Worker channel(data, "internal buffer ");
548*7c568831SAndroid Build Coastguard Worker break;
549*7c568831SAndroid Build Coastguard Worker case XML_FROM_URI:
550*7c568831SAndroid Build Coastguard Worker channel(data, "URI ");
551*7c568831SAndroid Build Coastguard Worker break;
552*7c568831SAndroid Build Coastguard Worker default:
553*7c568831SAndroid Build Coastguard Worker break;
554*7c568831SAndroid Build Coastguard Worker }
555*7c568831SAndroid Build Coastguard Worker switch (level) {
556*7c568831SAndroid Build Coastguard Worker case XML_ERR_NONE:
557*7c568831SAndroid Build Coastguard Worker channel(data, ": ");
558*7c568831SAndroid Build Coastguard Worker break;
559*7c568831SAndroid Build Coastguard Worker case XML_ERR_WARNING:
560*7c568831SAndroid Build Coastguard Worker channel(data, "warning : ");
561*7c568831SAndroid Build Coastguard Worker break;
562*7c568831SAndroid Build Coastguard Worker case XML_ERR_ERROR:
563*7c568831SAndroid Build Coastguard Worker channel(data, "error : ");
564*7c568831SAndroid Build Coastguard Worker break;
565*7c568831SAndroid Build Coastguard Worker case XML_ERR_FATAL:
566*7c568831SAndroid Build Coastguard Worker channel(data, "error : ");
567*7c568831SAndroid Build Coastguard Worker break;
568*7c568831SAndroid Build Coastguard Worker }
569*7c568831SAndroid Build Coastguard Worker if (message != NULL) {
570*7c568831SAndroid Build Coastguard Worker int len;
571*7c568831SAndroid Build Coastguard Worker len = xmlStrlen((const xmlChar *) message);
572*7c568831SAndroid Build Coastguard Worker if ((len > 0) && (message[len - 1] != '\n'))
573*7c568831SAndroid Build Coastguard Worker channel(data, "%s\n", message);
574*7c568831SAndroid Build Coastguard Worker else
575*7c568831SAndroid Build Coastguard Worker channel(data, "%s", message);
576*7c568831SAndroid Build Coastguard Worker } else {
577*7c568831SAndroid Build Coastguard Worker channel(data, "%s\n", "No error message provided");
578*7c568831SAndroid Build Coastguard Worker }
579*7c568831SAndroid Build Coastguard Worker
580*7c568831SAndroid Build Coastguard Worker if (ctxt != NULL) {
581*7c568831SAndroid Build Coastguard Worker if ((input != NULL) &&
582*7c568831SAndroid Build Coastguard Worker ((input->buf == NULL) || (input->buf->encoder == NULL)) &&
583*7c568831SAndroid Build Coastguard Worker (code == XML_ERR_INVALID_ENCODING) &&
584*7c568831SAndroid Build Coastguard Worker (input->cur < input->end)) {
585*7c568831SAndroid Build Coastguard Worker int i;
586*7c568831SAndroid Build Coastguard Worker
587*7c568831SAndroid Build Coastguard Worker channel(data, "Bytes:");
588*7c568831SAndroid Build Coastguard Worker for (i = 0; i < 4; i++) {
589*7c568831SAndroid Build Coastguard Worker if (input->cur + i >= input->end)
590*7c568831SAndroid Build Coastguard Worker break;
591*7c568831SAndroid Build Coastguard Worker channel(data, " 0x%02X", input->cur[i]);
592*7c568831SAndroid Build Coastguard Worker }
593*7c568831SAndroid Build Coastguard Worker channel(data, "\n");
594*7c568831SAndroid Build Coastguard Worker }
595*7c568831SAndroid Build Coastguard Worker
596*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileContextInternal(input, channel, data);
597*7c568831SAndroid Build Coastguard Worker
598*7c568831SAndroid Build Coastguard Worker if (cur != NULL) {
599*7c568831SAndroid Build Coastguard Worker if (cur->filename)
600*7c568831SAndroid Build Coastguard Worker channel(data, "%s:%d: \n", cur->filename, cur->line);
601*7c568831SAndroid Build Coastguard Worker else if ((line != 0) && (domain == XML_FROM_PARSER))
602*7c568831SAndroid Build Coastguard Worker channel(data, "Entity: line %d: \n", cur->line);
603*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileContextInternal(cur, channel, data);
604*7c568831SAndroid Build Coastguard Worker }
605*7c568831SAndroid Build Coastguard Worker }
606*7c568831SAndroid Build Coastguard Worker if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) &&
607*7c568831SAndroid Build Coastguard Worker (err->int1 < 100) &&
608*7c568831SAndroid Build Coastguard Worker (err->int1 < xmlStrlen((const xmlChar *)err->str1))) {
609*7c568831SAndroid Build Coastguard Worker xmlChar buf[150];
610*7c568831SAndroid Build Coastguard Worker int i;
611*7c568831SAndroid Build Coastguard Worker
612*7c568831SAndroid Build Coastguard Worker channel(data, "%s\n", err->str1);
613*7c568831SAndroid Build Coastguard Worker for (i=0;i < err->int1;i++)
614*7c568831SAndroid Build Coastguard Worker buf[i] = ' ';
615*7c568831SAndroid Build Coastguard Worker buf[i++] = '^';
616*7c568831SAndroid Build Coastguard Worker buf[i] = 0;
617*7c568831SAndroid Build Coastguard Worker channel(data, "%s\n", buf);
618*7c568831SAndroid Build Coastguard Worker }
619*7c568831SAndroid Build Coastguard Worker }
620*7c568831SAndroid Build Coastguard Worker
621*7c568831SAndroid Build Coastguard Worker /**
622*7c568831SAndroid Build Coastguard Worker * xmlRaiseMemoryError:
623*7c568831SAndroid Build Coastguard Worker * @schannel: the structured callback channel
624*7c568831SAndroid Build Coastguard Worker * @channel: the old callback channel
625*7c568831SAndroid Build Coastguard Worker * @data: the callback data
626*7c568831SAndroid Build Coastguard Worker * @domain: the domain for the error
627*7c568831SAndroid Build Coastguard Worker * @error: optional error struct to be filled
628*7c568831SAndroid Build Coastguard Worker *
629*7c568831SAndroid Build Coastguard Worker * Update the global and optional error structure, then forward the
630*7c568831SAndroid Build Coastguard Worker * error to an error handler.
631*7c568831SAndroid Build Coastguard Worker *
632*7c568831SAndroid Build Coastguard Worker * This function doesn't make memory allocations which are likely
633*7c568831SAndroid Build Coastguard Worker * to fail after an OOM error.
634*7c568831SAndroid Build Coastguard Worker */
635*7c568831SAndroid Build Coastguard Worker void
xmlRaiseMemoryError(xmlStructuredErrorFunc schannel,xmlGenericErrorFunc channel,void * data,int domain,xmlError * error)636*7c568831SAndroid Build Coastguard Worker xmlRaiseMemoryError(xmlStructuredErrorFunc schannel, xmlGenericErrorFunc channel,
637*7c568831SAndroid Build Coastguard Worker void *data, int domain, xmlError *error)
638*7c568831SAndroid Build Coastguard Worker {
639*7c568831SAndroid Build Coastguard Worker xmlError *lastError = xmlGetLastErrorInternal();
640*7c568831SAndroid Build Coastguard Worker
641*7c568831SAndroid Build Coastguard Worker xmlResetLastError();
642*7c568831SAndroid Build Coastguard Worker lastError->domain = domain;
643*7c568831SAndroid Build Coastguard Worker lastError->code = XML_ERR_NO_MEMORY;
644*7c568831SAndroid Build Coastguard Worker lastError->level = XML_ERR_FATAL;
645*7c568831SAndroid Build Coastguard Worker
646*7c568831SAndroid Build Coastguard Worker if (error != NULL) {
647*7c568831SAndroid Build Coastguard Worker xmlResetError(error);
648*7c568831SAndroid Build Coastguard Worker error->domain = domain;
649*7c568831SAndroid Build Coastguard Worker error->code = XML_ERR_NO_MEMORY;
650*7c568831SAndroid Build Coastguard Worker error->level = XML_ERR_FATAL;
651*7c568831SAndroid Build Coastguard Worker }
652*7c568831SAndroid Build Coastguard Worker
653*7c568831SAndroid Build Coastguard Worker if (schannel != NULL) {
654*7c568831SAndroid Build Coastguard Worker schannel(data, lastError);
655*7c568831SAndroid Build Coastguard Worker } else if (xmlStructuredError != NULL) {
656*7c568831SAndroid Build Coastguard Worker xmlStructuredError(xmlStructuredErrorContext, lastError);
657*7c568831SAndroid Build Coastguard Worker } else if (channel != NULL) {
658*7c568831SAndroid Build Coastguard Worker channel(data, "libxml2: out of memory\n");
659*7c568831SAndroid Build Coastguard Worker }
660*7c568831SAndroid Build Coastguard Worker }
661*7c568831SAndroid Build Coastguard Worker
662*7c568831SAndroid Build Coastguard Worker /**
663*7c568831SAndroid Build Coastguard Worker * xmlVRaiseError:
664*7c568831SAndroid Build Coastguard Worker * @schannel: the structured callback channel
665*7c568831SAndroid Build Coastguard Worker * @channel: the old callback channel
666*7c568831SAndroid Build Coastguard Worker * @data: the callback data
667*7c568831SAndroid Build Coastguard Worker * @ctx: the parser context or NULL
668*7c568831SAndroid Build Coastguard Worker * @node: the current node or NULL
669*7c568831SAndroid Build Coastguard Worker * @domain: the domain for the error
670*7c568831SAndroid Build Coastguard Worker * @code: the code for the error
671*7c568831SAndroid Build Coastguard Worker * @level: the xmlErrorLevel for the error
672*7c568831SAndroid Build Coastguard Worker * @file: the file source of the error (or NULL)
673*7c568831SAndroid Build Coastguard Worker * @line: the line of the error or 0 if N/A
674*7c568831SAndroid Build Coastguard Worker * @str1: extra string info
675*7c568831SAndroid Build Coastguard Worker * @str2: extra string info
676*7c568831SAndroid Build Coastguard Worker * @str3: extra string info
677*7c568831SAndroid Build Coastguard Worker * @int1: extra int info
678*7c568831SAndroid Build Coastguard Worker * @col: column number of the error or 0 if N/A
679*7c568831SAndroid Build Coastguard Worker * @msg: the message to display/transmit
680*7c568831SAndroid Build Coastguard Worker * @ap: extra parameters for the message display
681*7c568831SAndroid Build Coastguard Worker *
682*7c568831SAndroid Build Coastguard Worker * Update the appropriate global or contextual error structure,
683*7c568831SAndroid Build Coastguard Worker * then forward the error message down the parser or generic
684*7c568831SAndroid Build Coastguard Worker * error callback handler
685*7c568831SAndroid Build Coastguard Worker *
686*7c568831SAndroid Build Coastguard Worker * Returns 0 on success, -1 if a memory allocation failed.
687*7c568831SAndroid Build Coastguard Worker */
688*7c568831SAndroid Build Coastguard Worker int
xmlVRaiseError(xmlStructuredErrorFunc schannel,xmlGenericErrorFunc channel,void * data,void * ctx,xmlNode * node,int domain,int code,xmlErrorLevel level,const char * file,int line,const char * str1,const char * str2,const char * str3,int int1,int col,const char * msg,va_list ap)689*7c568831SAndroid Build Coastguard Worker xmlVRaiseError(xmlStructuredErrorFunc schannel,
690*7c568831SAndroid Build Coastguard Worker xmlGenericErrorFunc channel, void *data, void *ctx,
691*7c568831SAndroid Build Coastguard Worker xmlNode *node, int domain, int code, xmlErrorLevel level,
692*7c568831SAndroid Build Coastguard Worker const char *file, int line, const char *str1,
693*7c568831SAndroid Build Coastguard Worker const char *str2, const char *str3, int int1, int col,
694*7c568831SAndroid Build Coastguard Worker const char *msg, va_list ap)
695*7c568831SAndroid Build Coastguard Worker {
696*7c568831SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt = NULL;
697*7c568831SAndroid Build Coastguard Worker /* xmlLastError is a macro retrieving the per-thread global. */
698*7c568831SAndroid Build Coastguard Worker xmlErrorPtr lastError = xmlGetLastErrorInternal();
699*7c568831SAndroid Build Coastguard Worker xmlErrorPtr to = lastError;
700*7c568831SAndroid Build Coastguard Worker
701*7c568831SAndroid Build Coastguard Worker if (code == XML_ERR_OK)
702*7c568831SAndroid Build Coastguard Worker return(0);
703*7c568831SAndroid Build Coastguard Worker #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
704*7c568831SAndroid Build Coastguard Worker if (code == XML_ERR_INTERNAL_ERROR)
705*7c568831SAndroid Build Coastguard Worker xmlAbort("Unexpected error: %d\n", code);
706*7c568831SAndroid Build Coastguard Worker #endif
707*7c568831SAndroid Build Coastguard Worker if ((xmlGetWarningsDefaultValue == 0) && (level == XML_ERR_WARNING))
708*7c568831SAndroid Build Coastguard Worker return(0);
709*7c568831SAndroid Build Coastguard Worker
710*7c568831SAndroid Build Coastguard Worker if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) ||
711*7c568831SAndroid Build Coastguard Worker (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) ||
712*7c568831SAndroid Build Coastguard Worker (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) {
713*7c568831SAndroid Build Coastguard Worker ctxt = (xmlParserCtxtPtr) ctx;
714*7c568831SAndroid Build Coastguard Worker
715*7c568831SAndroid Build Coastguard Worker if (ctxt != NULL)
716*7c568831SAndroid Build Coastguard Worker to = &ctxt->lastError;
717*7c568831SAndroid Build Coastguard Worker }
718*7c568831SAndroid Build Coastguard Worker
719*7c568831SAndroid Build Coastguard Worker if (xmlVUpdateError(to, ctxt, node, domain, code, level, file, line,
720*7c568831SAndroid Build Coastguard Worker str1, str2, str3, int1, col, msg, ap))
721*7c568831SAndroid Build Coastguard Worker return(-1);
722*7c568831SAndroid Build Coastguard Worker
723*7c568831SAndroid Build Coastguard Worker if (to != lastError) {
724*7c568831SAndroid Build Coastguard Worker if (xmlCopyError(to, lastError) < 0)
725*7c568831SAndroid Build Coastguard Worker return(-1);
726*7c568831SAndroid Build Coastguard Worker }
727*7c568831SAndroid Build Coastguard Worker
728*7c568831SAndroid Build Coastguard Worker if (schannel != NULL) {
729*7c568831SAndroid Build Coastguard Worker schannel(data, to);
730*7c568831SAndroid Build Coastguard Worker } else if (xmlStructuredError != NULL) {
731*7c568831SAndroid Build Coastguard Worker xmlStructuredError(xmlStructuredErrorContext, to);
732*7c568831SAndroid Build Coastguard Worker } else if (channel != NULL) {
733*7c568831SAndroid Build Coastguard Worker /* Don't invoke legacy error handlers */
734*7c568831SAndroid Build Coastguard Worker if ((channel == xmlGenericErrorDefaultFunc) ||
735*7c568831SAndroid Build Coastguard Worker (channel == xmlParserError) ||
736*7c568831SAndroid Build Coastguard Worker (channel == xmlParserWarning) ||
737*7c568831SAndroid Build Coastguard Worker (channel == xmlParserValidityError) ||
738*7c568831SAndroid Build Coastguard Worker (channel == xmlParserValidityWarning))
739*7c568831SAndroid Build Coastguard Worker xmlFormatError(to, xmlGenericError, xmlGenericErrorContext);
740*7c568831SAndroid Build Coastguard Worker else
741*7c568831SAndroid Build Coastguard Worker channel(data, "%s", to->message);
742*7c568831SAndroid Build Coastguard Worker }
743*7c568831SAndroid Build Coastguard Worker
744*7c568831SAndroid Build Coastguard Worker return(0);
745*7c568831SAndroid Build Coastguard Worker }
746*7c568831SAndroid Build Coastguard Worker
747*7c568831SAndroid Build Coastguard Worker /**
748*7c568831SAndroid Build Coastguard Worker * xmlRaiseError:
749*7c568831SAndroid Build Coastguard Worker * @schannel: the structured callback channel
750*7c568831SAndroid Build Coastguard Worker * @channel: the old callback channel
751*7c568831SAndroid Build Coastguard Worker * @data: the callback data
752*7c568831SAndroid Build Coastguard Worker * @ctx: the parser context or NULL
753*7c568831SAndroid Build Coastguard Worker * @nod: the node or NULL
754*7c568831SAndroid Build Coastguard Worker * @domain: the domain for the error
755*7c568831SAndroid Build Coastguard Worker * @code: the code for the error
756*7c568831SAndroid Build Coastguard Worker * @level: the xmlErrorLevel for the error
757*7c568831SAndroid Build Coastguard Worker * @file: the file source of the error (or NULL)
758*7c568831SAndroid Build Coastguard Worker * @line: the line of the error or 0 if N/A
759*7c568831SAndroid Build Coastguard Worker * @str1: extra string info
760*7c568831SAndroid Build Coastguard Worker * @str2: extra string info
761*7c568831SAndroid Build Coastguard Worker * @str3: extra string info
762*7c568831SAndroid Build Coastguard Worker * @int1: extra int info
763*7c568831SAndroid Build Coastguard Worker * @col: column number of the error or 0 if N/A
764*7c568831SAndroid Build Coastguard Worker * @msg: the message to display/transmit
765*7c568831SAndroid Build Coastguard Worker * @...: extra parameters for the message display
766*7c568831SAndroid Build Coastguard Worker *
767*7c568831SAndroid Build Coastguard Worker * Update the appropriate global or contextual error structure,
768*7c568831SAndroid Build Coastguard Worker * then forward the error message down the parser or generic
769*7c568831SAndroid Build Coastguard Worker * error callback handler
770*7c568831SAndroid Build Coastguard Worker *
771*7c568831SAndroid Build Coastguard Worker * Returns 0 on success, -1 if a memory allocation failed.
772*7c568831SAndroid Build Coastguard Worker */
773*7c568831SAndroid Build Coastguard Worker int
xmlRaiseError(xmlStructuredErrorFunc schannel,xmlGenericErrorFunc channel,void * data,void * ctx,xmlNode * node,int domain,int code,xmlErrorLevel level,const char * file,int line,const char * str1,const char * str2,const char * str3,int int1,int col,const char * msg,...)774*7c568831SAndroid Build Coastguard Worker xmlRaiseError(xmlStructuredErrorFunc schannel,
775*7c568831SAndroid Build Coastguard Worker xmlGenericErrorFunc channel, void *data, void *ctx,
776*7c568831SAndroid Build Coastguard Worker xmlNode *node, int domain, int code, xmlErrorLevel level,
777*7c568831SAndroid Build Coastguard Worker const char *file, int line, const char *str1,
778*7c568831SAndroid Build Coastguard Worker const char *str2, const char *str3, int int1, int col,
779*7c568831SAndroid Build Coastguard Worker const char *msg, ...)
780*7c568831SAndroid Build Coastguard Worker {
781*7c568831SAndroid Build Coastguard Worker va_list ap;
782*7c568831SAndroid Build Coastguard Worker int res;
783*7c568831SAndroid Build Coastguard Worker
784*7c568831SAndroid Build Coastguard Worker va_start(ap, msg);
785*7c568831SAndroid Build Coastguard Worker res = xmlVRaiseError(schannel, channel, data, ctx, node, domain, code,
786*7c568831SAndroid Build Coastguard Worker level, file, line, str1, str2, str3, int1, col, msg,
787*7c568831SAndroid Build Coastguard Worker ap);
788*7c568831SAndroid Build Coastguard Worker va_end(ap);
789*7c568831SAndroid Build Coastguard Worker
790*7c568831SAndroid Build Coastguard Worker return(res);
791*7c568831SAndroid Build Coastguard Worker }
792*7c568831SAndroid Build Coastguard Worker
793*7c568831SAndroid Build Coastguard Worker static void
xmlVFormatLegacyError(void * ctx,const char * level,const char * fmt,va_list ap)794*7c568831SAndroid Build Coastguard Worker xmlVFormatLegacyError(void *ctx, const char *level,
795*7c568831SAndroid Build Coastguard Worker const char *fmt, va_list ap) {
796*7c568831SAndroid Build Coastguard Worker xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
797*7c568831SAndroid Build Coastguard Worker xmlParserInputPtr input = NULL;
798*7c568831SAndroid Build Coastguard Worker xmlParserInputPtr cur = NULL;
799*7c568831SAndroid Build Coastguard Worker xmlChar *str = NULL;
800*7c568831SAndroid Build Coastguard Worker
801*7c568831SAndroid Build Coastguard Worker if (ctxt != NULL) {
802*7c568831SAndroid Build Coastguard Worker input = ctxt->input;
803*7c568831SAndroid Build Coastguard Worker if ((input != NULL) && (input->filename == NULL) &&
804*7c568831SAndroid Build Coastguard Worker (ctxt->inputNr > 1)) {
805*7c568831SAndroid Build Coastguard Worker cur = input;
806*7c568831SAndroid Build Coastguard Worker input = ctxt->inputTab[ctxt->inputNr - 2];
807*7c568831SAndroid Build Coastguard Worker }
808*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileInfo(input);
809*7c568831SAndroid Build Coastguard Worker }
810*7c568831SAndroid Build Coastguard Worker
811*7c568831SAndroid Build Coastguard Worker xmlGenericError(xmlGenericErrorContext, "%s: ", level);
812*7c568831SAndroid Build Coastguard Worker
813*7c568831SAndroid Build Coastguard Worker xmlStrVASPrintf(&str, MAX_ERR_MSG_SIZE, fmt, ap);
814*7c568831SAndroid Build Coastguard Worker if (str != NULL) {
815*7c568831SAndroid Build Coastguard Worker xmlGenericError(xmlGenericErrorContext, "%s", (char *) str);
816*7c568831SAndroid Build Coastguard Worker xmlFree(str);
817*7c568831SAndroid Build Coastguard Worker }
818*7c568831SAndroid Build Coastguard Worker
819*7c568831SAndroid Build Coastguard Worker if (ctxt != NULL) {
820*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileContext(input);
821*7c568831SAndroid Build Coastguard Worker if (cur != NULL) {
822*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileInfo(cur);
823*7c568831SAndroid Build Coastguard Worker xmlGenericError(xmlGenericErrorContext, "\n");
824*7c568831SAndroid Build Coastguard Worker xmlParserPrintFileContext(cur);
825*7c568831SAndroid Build Coastguard Worker }
826*7c568831SAndroid Build Coastguard Worker }
827*7c568831SAndroid Build Coastguard Worker }
828*7c568831SAndroid Build Coastguard Worker
829*7c568831SAndroid Build Coastguard Worker /**
830*7c568831SAndroid Build Coastguard Worker * xmlParserError:
831*7c568831SAndroid Build Coastguard Worker * @ctx: an XML parser context
832*7c568831SAndroid Build Coastguard Worker * @msg: the message to display/transmit
833*7c568831SAndroid Build Coastguard Worker * @...: extra parameters for the message display
834*7c568831SAndroid Build Coastguard Worker *
835*7c568831SAndroid Build Coastguard Worker * Display and format an error messages, gives file, line, position and
836*7c568831SAndroid Build Coastguard Worker * extra parameters.
837*7c568831SAndroid Build Coastguard Worker */
838*7c568831SAndroid Build Coastguard Worker void
xmlParserError(void * ctx,const char * msg ATTRIBUTE_UNUSED,...)839*7c568831SAndroid Build Coastguard Worker xmlParserError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...)
840*7c568831SAndroid Build Coastguard Worker {
841*7c568831SAndroid Build Coastguard Worker va_list ap;
842*7c568831SAndroid Build Coastguard Worker
843*7c568831SAndroid Build Coastguard Worker va_start(ap, msg);
844*7c568831SAndroid Build Coastguard Worker xmlVFormatLegacyError(ctx, "error", msg, ap);
845*7c568831SAndroid Build Coastguard Worker va_end(ap);
846*7c568831SAndroid Build Coastguard Worker }
847*7c568831SAndroid Build Coastguard Worker
848*7c568831SAndroid Build Coastguard Worker /**
849*7c568831SAndroid Build Coastguard Worker * xmlParserWarning:
850*7c568831SAndroid Build Coastguard Worker * @ctx: an XML parser context
851*7c568831SAndroid Build Coastguard Worker * @msg: the message to display/transmit
852*7c568831SAndroid Build Coastguard Worker * @...: extra parameters for the message display
853*7c568831SAndroid Build Coastguard Worker *
854*7c568831SAndroid Build Coastguard Worker * Display and format a warning messages, gives file, line, position and
855*7c568831SAndroid Build Coastguard Worker * extra parameters.
856*7c568831SAndroid Build Coastguard Worker */
857*7c568831SAndroid Build Coastguard Worker void
xmlParserWarning(void * ctx,const char * msg ATTRIBUTE_UNUSED,...)858*7c568831SAndroid Build Coastguard Worker xmlParserWarning(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...)
859*7c568831SAndroid Build Coastguard Worker {
860*7c568831SAndroid Build Coastguard Worker va_list ap;
861*7c568831SAndroid Build Coastguard Worker
862*7c568831SAndroid Build Coastguard Worker va_start(ap, msg);
863*7c568831SAndroid Build Coastguard Worker xmlVFormatLegacyError(ctx, "warning", msg, ap);
864*7c568831SAndroid Build Coastguard Worker va_end(ap);
865*7c568831SAndroid Build Coastguard Worker }
866*7c568831SAndroid Build Coastguard Worker
867*7c568831SAndroid Build Coastguard Worker /**
868*7c568831SAndroid Build Coastguard Worker * xmlParserValidityError:
869*7c568831SAndroid Build Coastguard Worker * @ctx: an XML parser context
870*7c568831SAndroid Build Coastguard Worker * @msg: the message to display/transmit
871*7c568831SAndroid Build Coastguard Worker * @...: extra parameters for the message display
872*7c568831SAndroid Build Coastguard Worker *
873*7c568831SAndroid Build Coastguard Worker * Display and format an validity error messages, gives file,
874*7c568831SAndroid Build Coastguard Worker * line, position and extra parameters.
875*7c568831SAndroid Build Coastguard Worker */
876*7c568831SAndroid Build Coastguard Worker void
xmlParserValidityError(void * ctx,const char * msg ATTRIBUTE_UNUSED,...)877*7c568831SAndroid Build Coastguard Worker xmlParserValidityError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...)
878*7c568831SAndroid Build Coastguard Worker {
879*7c568831SAndroid Build Coastguard Worker va_list ap;
880*7c568831SAndroid Build Coastguard Worker
881*7c568831SAndroid Build Coastguard Worker va_start(ap, msg);
882*7c568831SAndroid Build Coastguard Worker xmlVFormatLegacyError(ctx, "validity error", msg, ap);
883*7c568831SAndroid Build Coastguard Worker va_end(ap);
884*7c568831SAndroid Build Coastguard Worker }
885*7c568831SAndroid Build Coastguard Worker
886*7c568831SAndroid Build Coastguard Worker /**
887*7c568831SAndroid Build Coastguard Worker * xmlParserValidityWarning:
888*7c568831SAndroid Build Coastguard Worker * @ctx: an XML parser context
889*7c568831SAndroid Build Coastguard Worker * @msg: the message to display/transmit
890*7c568831SAndroid Build Coastguard Worker * @...: extra parameters for the message display
891*7c568831SAndroid Build Coastguard Worker *
892*7c568831SAndroid Build Coastguard Worker * Display and format a validity warning messages, gives file, line,
893*7c568831SAndroid Build Coastguard Worker * position and extra parameters.
894*7c568831SAndroid Build Coastguard Worker */
895*7c568831SAndroid Build Coastguard Worker void
xmlParserValidityWarning(void * ctx,const char * msg ATTRIBUTE_UNUSED,...)896*7c568831SAndroid Build Coastguard Worker xmlParserValidityWarning(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...)
897*7c568831SAndroid Build Coastguard Worker {
898*7c568831SAndroid Build Coastguard Worker va_list ap;
899*7c568831SAndroid Build Coastguard Worker
900*7c568831SAndroid Build Coastguard Worker va_start(ap, msg);
901*7c568831SAndroid Build Coastguard Worker xmlVFormatLegacyError(ctx, "validity warning", msg, ap);
902*7c568831SAndroid Build Coastguard Worker va_end(ap);
903*7c568831SAndroid Build Coastguard Worker }
904*7c568831SAndroid Build Coastguard Worker
905*7c568831SAndroid Build Coastguard Worker
906*7c568831SAndroid Build Coastguard Worker /************************************************************************
907*7c568831SAndroid Build Coastguard Worker * *
908*7c568831SAndroid Build Coastguard Worker * Extended Error Handling *
909*7c568831SAndroid Build Coastguard Worker * *
910*7c568831SAndroid Build Coastguard Worker ************************************************************************/
911*7c568831SAndroid Build Coastguard Worker
912*7c568831SAndroid Build Coastguard Worker /**
913*7c568831SAndroid Build Coastguard Worker * xmlGetLastError:
914*7c568831SAndroid Build Coastguard Worker *
915*7c568831SAndroid Build Coastguard Worker * Get the last global error registered. This is per thread if compiled
916*7c568831SAndroid Build Coastguard Worker * with thread support.
917*7c568831SAndroid Build Coastguard Worker *
918*7c568831SAndroid Build Coastguard Worker * Returns a pointer to the error
919*7c568831SAndroid Build Coastguard Worker */
920*7c568831SAndroid Build Coastguard Worker const xmlError *
xmlGetLastError(void)921*7c568831SAndroid Build Coastguard Worker xmlGetLastError(void)
922*7c568831SAndroid Build Coastguard Worker {
923*7c568831SAndroid Build Coastguard Worker const xmlError *error = xmlGetLastErrorInternal();
924*7c568831SAndroid Build Coastguard Worker
925*7c568831SAndroid Build Coastguard Worker if (error->code == XML_ERR_OK)
926*7c568831SAndroid Build Coastguard Worker return(NULL);
927*7c568831SAndroid Build Coastguard Worker return(error);
928*7c568831SAndroid Build Coastguard Worker }
929*7c568831SAndroid Build Coastguard Worker
930*7c568831SAndroid Build Coastguard Worker /**
931*7c568831SAndroid Build Coastguard Worker * xmlResetError:
932*7c568831SAndroid Build Coastguard Worker * @err: pointer to the error.
933*7c568831SAndroid Build Coastguard Worker *
934*7c568831SAndroid Build Coastguard Worker * Cleanup the error.
935*7c568831SAndroid Build Coastguard Worker */
936*7c568831SAndroid Build Coastguard Worker void
xmlResetError(xmlErrorPtr err)937*7c568831SAndroid Build Coastguard Worker xmlResetError(xmlErrorPtr err)
938*7c568831SAndroid Build Coastguard Worker {
939*7c568831SAndroid Build Coastguard Worker if (err == NULL)
940*7c568831SAndroid Build Coastguard Worker return;
941*7c568831SAndroid Build Coastguard Worker if (err->code == XML_ERR_OK)
942*7c568831SAndroid Build Coastguard Worker return;
943*7c568831SAndroid Build Coastguard Worker if (err->message != NULL)
944*7c568831SAndroid Build Coastguard Worker xmlFree(err->message);
945*7c568831SAndroid Build Coastguard Worker if (err->file != NULL)
946*7c568831SAndroid Build Coastguard Worker xmlFree(err->file);
947*7c568831SAndroid Build Coastguard Worker if (err->str1 != NULL)
948*7c568831SAndroid Build Coastguard Worker xmlFree(err->str1);
949*7c568831SAndroid Build Coastguard Worker if (err->str2 != NULL)
950*7c568831SAndroid Build Coastguard Worker xmlFree(err->str2);
951*7c568831SAndroid Build Coastguard Worker if (err->str3 != NULL)
952*7c568831SAndroid Build Coastguard Worker xmlFree(err->str3);
953*7c568831SAndroid Build Coastguard Worker memset(err, 0, sizeof(xmlError));
954*7c568831SAndroid Build Coastguard Worker err->code = XML_ERR_OK;
955*7c568831SAndroid Build Coastguard Worker }
956*7c568831SAndroid Build Coastguard Worker
957*7c568831SAndroid Build Coastguard Worker /**
958*7c568831SAndroid Build Coastguard Worker * xmlResetLastError:
959*7c568831SAndroid Build Coastguard Worker *
960*7c568831SAndroid Build Coastguard Worker * Cleanup the last global error registered. For parsing error
961*7c568831SAndroid Build Coastguard Worker * this does not change the well-formedness result.
962*7c568831SAndroid Build Coastguard Worker */
963*7c568831SAndroid Build Coastguard Worker void
xmlResetLastError(void)964*7c568831SAndroid Build Coastguard Worker xmlResetLastError(void)
965*7c568831SAndroid Build Coastguard Worker {
966*7c568831SAndroid Build Coastguard Worker xmlError *error = xmlGetLastErrorInternal();
967*7c568831SAndroid Build Coastguard Worker
968*7c568831SAndroid Build Coastguard Worker if (error->code != XML_ERR_OK)
969*7c568831SAndroid Build Coastguard Worker xmlResetError(error);
970*7c568831SAndroid Build Coastguard Worker }
971*7c568831SAndroid Build Coastguard Worker
972*7c568831SAndroid Build Coastguard Worker /**
973*7c568831SAndroid Build Coastguard Worker * xmlCopyError:
974*7c568831SAndroid Build Coastguard Worker * @from: a source error
975*7c568831SAndroid Build Coastguard Worker * @to: a target error
976*7c568831SAndroid Build Coastguard Worker *
977*7c568831SAndroid Build Coastguard Worker * Save the original error to the new place.
978*7c568831SAndroid Build Coastguard Worker *
979*7c568831SAndroid Build Coastguard Worker * Returns 0 in case of success and -1 in case of error.
980*7c568831SAndroid Build Coastguard Worker */
981*7c568831SAndroid Build Coastguard Worker int
xmlCopyError(const xmlError * from,xmlErrorPtr to)982*7c568831SAndroid Build Coastguard Worker xmlCopyError(const xmlError *from, xmlErrorPtr to) {
983*7c568831SAndroid Build Coastguard Worker const char *fmt = NULL;
984*7c568831SAndroid Build Coastguard Worker
985*7c568831SAndroid Build Coastguard Worker if ((from == NULL) || (to == NULL))
986*7c568831SAndroid Build Coastguard Worker return(-1);
987*7c568831SAndroid Build Coastguard Worker
988*7c568831SAndroid Build Coastguard Worker if (from->message != NULL)
989*7c568831SAndroid Build Coastguard Worker fmt = "%s";
990*7c568831SAndroid Build Coastguard Worker
991*7c568831SAndroid Build Coastguard Worker return(xmlSetError(to, from->ctxt, from->node,
992*7c568831SAndroid Build Coastguard Worker from->domain, from->code, from->level,
993*7c568831SAndroid Build Coastguard Worker from->file, from->line,
994*7c568831SAndroid Build Coastguard Worker from->str1, from->str2, from->str3,
995*7c568831SAndroid Build Coastguard Worker from->int1, from->int2,
996*7c568831SAndroid Build Coastguard Worker fmt, from->message));
997*7c568831SAndroid Build Coastguard Worker }
998*7c568831SAndroid Build Coastguard Worker
999*7c568831SAndroid Build Coastguard Worker /**
1000*7c568831SAndroid Build Coastguard Worker * xmlErrString:
1001*7c568831SAndroid Build Coastguard Worker * @code: an xmlParserErrors code
1002*7c568831SAndroid Build Coastguard Worker *
1003*7c568831SAndroid Build Coastguard Worker * Returns an error message for a code.
1004*7c568831SAndroid Build Coastguard Worker */
1005*7c568831SAndroid Build Coastguard Worker const char *
xmlErrString(xmlParserErrors code)1006*7c568831SAndroid Build Coastguard Worker xmlErrString(xmlParserErrors code) {
1007*7c568831SAndroid Build Coastguard Worker const char *errmsg;
1008*7c568831SAndroid Build Coastguard Worker
1009*7c568831SAndroid Build Coastguard Worker switch (code) {
1010*7c568831SAndroid Build Coastguard Worker case XML_ERR_INVALID_HEX_CHARREF:
1011*7c568831SAndroid Build Coastguard Worker errmsg = "CharRef: invalid hexadecimal value";
1012*7c568831SAndroid Build Coastguard Worker break;
1013*7c568831SAndroid Build Coastguard Worker case XML_ERR_INVALID_DEC_CHARREF:
1014*7c568831SAndroid Build Coastguard Worker errmsg = "CharRef: invalid decimal value";
1015*7c568831SAndroid Build Coastguard Worker break;
1016*7c568831SAndroid Build Coastguard Worker case XML_ERR_INVALID_CHARREF:
1017*7c568831SAndroid Build Coastguard Worker errmsg = "CharRef: invalid value";
1018*7c568831SAndroid Build Coastguard Worker break;
1019*7c568831SAndroid Build Coastguard Worker case XML_ERR_INTERNAL_ERROR:
1020*7c568831SAndroid Build Coastguard Worker errmsg = "internal error";
1021*7c568831SAndroid Build Coastguard Worker break;
1022*7c568831SAndroid Build Coastguard Worker case XML_ERR_PEREF_AT_EOF:
1023*7c568831SAndroid Build Coastguard Worker errmsg = "PEReference at end of document";
1024*7c568831SAndroid Build Coastguard Worker break;
1025*7c568831SAndroid Build Coastguard Worker case XML_ERR_PEREF_IN_PROLOG:
1026*7c568831SAndroid Build Coastguard Worker errmsg = "PEReference in prolog";
1027*7c568831SAndroid Build Coastguard Worker break;
1028*7c568831SAndroid Build Coastguard Worker case XML_ERR_PEREF_IN_EPILOG:
1029*7c568831SAndroid Build Coastguard Worker errmsg = "PEReference in epilog";
1030*7c568831SAndroid Build Coastguard Worker break;
1031*7c568831SAndroid Build Coastguard Worker case XML_ERR_PEREF_NO_NAME:
1032*7c568831SAndroid Build Coastguard Worker errmsg = "PEReference: no name";
1033*7c568831SAndroid Build Coastguard Worker break;
1034*7c568831SAndroid Build Coastguard Worker case XML_ERR_PEREF_SEMICOL_MISSING:
1035*7c568831SAndroid Build Coastguard Worker errmsg = "PEReference: expecting ';'";
1036*7c568831SAndroid Build Coastguard Worker break;
1037*7c568831SAndroid Build Coastguard Worker case XML_ERR_ENTITY_LOOP:
1038*7c568831SAndroid Build Coastguard Worker errmsg = "Detected an entity reference loop";
1039*7c568831SAndroid Build Coastguard Worker break;
1040*7c568831SAndroid Build Coastguard Worker case XML_ERR_ENTITY_NOT_STARTED:
1041*7c568831SAndroid Build Coastguard Worker errmsg = "EntityValue: \" or ' expected";
1042*7c568831SAndroid Build Coastguard Worker break;
1043*7c568831SAndroid Build Coastguard Worker case XML_ERR_ENTITY_PE_INTERNAL:
1044*7c568831SAndroid Build Coastguard Worker errmsg = "PEReferences forbidden in internal subset";
1045*7c568831SAndroid Build Coastguard Worker break;
1046*7c568831SAndroid Build Coastguard Worker case XML_ERR_ENTITY_NOT_FINISHED:
1047*7c568831SAndroid Build Coastguard Worker errmsg = "EntityValue: \" or ' expected";
1048*7c568831SAndroid Build Coastguard Worker break;
1049*7c568831SAndroid Build Coastguard Worker case XML_ERR_ATTRIBUTE_NOT_STARTED:
1050*7c568831SAndroid Build Coastguard Worker errmsg = "AttValue: \" or ' expected";
1051*7c568831SAndroid Build Coastguard Worker break;
1052*7c568831SAndroid Build Coastguard Worker case XML_ERR_LT_IN_ATTRIBUTE:
1053*7c568831SAndroid Build Coastguard Worker errmsg = "Unescaped '<' not allowed in attributes values";
1054*7c568831SAndroid Build Coastguard Worker break;
1055*7c568831SAndroid Build Coastguard Worker case XML_ERR_LITERAL_NOT_STARTED:
1056*7c568831SAndroid Build Coastguard Worker errmsg = "SystemLiteral \" or ' expected";
1057*7c568831SAndroid Build Coastguard Worker break;
1058*7c568831SAndroid Build Coastguard Worker case XML_ERR_LITERAL_NOT_FINISHED:
1059*7c568831SAndroid Build Coastguard Worker errmsg = "Unfinished System or Public ID \" or ' expected";
1060*7c568831SAndroid Build Coastguard Worker break;
1061*7c568831SAndroid Build Coastguard Worker case XML_ERR_MISPLACED_CDATA_END:
1062*7c568831SAndroid Build Coastguard Worker errmsg = "Sequence ']]>' not allowed in content";
1063*7c568831SAndroid Build Coastguard Worker break;
1064*7c568831SAndroid Build Coastguard Worker case XML_ERR_URI_REQUIRED:
1065*7c568831SAndroid Build Coastguard Worker errmsg = "SYSTEM or PUBLIC, the URI is missing";
1066*7c568831SAndroid Build Coastguard Worker break;
1067*7c568831SAndroid Build Coastguard Worker case XML_ERR_PUBID_REQUIRED:
1068*7c568831SAndroid Build Coastguard Worker errmsg = "PUBLIC, the Public Identifier is missing";
1069*7c568831SAndroid Build Coastguard Worker break;
1070*7c568831SAndroid Build Coastguard Worker case XML_ERR_HYPHEN_IN_COMMENT:
1071*7c568831SAndroid Build Coastguard Worker errmsg = "Comment must not contain '--' (double-hyphen)";
1072*7c568831SAndroid Build Coastguard Worker break;
1073*7c568831SAndroid Build Coastguard Worker case XML_ERR_PI_NOT_STARTED:
1074*7c568831SAndroid Build Coastguard Worker errmsg = "xmlParsePI : no target name";
1075*7c568831SAndroid Build Coastguard Worker break;
1076*7c568831SAndroid Build Coastguard Worker case XML_ERR_RESERVED_XML_NAME:
1077*7c568831SAndroid Build Coastguard Worker errmsg = "Invalid PI name";
1078*7c568831SAndroid Build Coastguard Worker break;
1079*7c568831SAndroid Build Coastguard Worker case XML_ERR_NOTATION_NOT_STARTED:
1080*7c568831SAndroid Build Coastguard Worker errmsg = "NOTATION: Name expected here";
1081*7c568831SAndroid Build Coastguard Worker break;
1082*7c568831SAndroid Build Coastguard Worker case XML_ERR_NOTATION_NOT_FINISHED:
1083*7c568831SAndroid Build Coastguard Worker errmsg = "'>' required to close NOTATION declaration";
1084*7c568831SAndroid Build Coastguard Worker break;
1085*7c568831SAndroid Build Coastguard Worker case XML_ERR_VALUE_REQUIRED:
1086*7c568831SAndroid Build Coastguard Worker errmsg = "Entity value required";
1087*7c568831SAndroid Build Coastguard Worker break;
1088*7c568831SAndroid Build Coastguard Worker case XML_ERR_URI_FRAGMENT:
1089*7c568831SAndroid Build Coastguard Worker errmsg = "Fragment not allowed";
1090*7c568831SAndroid Build Coastguard Worker break;
1091*7c568831SAndroid Build Coastguard Worker case XML_ERR_ATTLIST_NOT_STARTED:
1092*7c568831SAndroid Build Coastguard Worker errmsg = "'(' required to start ATTLIST enumeration";
1093*7c568831SAndroid Build Coastguard Worker break;
1094*7c568831SAndroid Build Coastguard Worker case XML_ERR_NMTOKEN_REQUIRED:
1095*7c568831SAndroid Build Coastguard Worker errmsg = "NmToken expected in ATTLIST enumeration";
1096*7c568831SAndroid Build Coastguard Worker break;
1097*7c568831SAndroid Build Coastguard Worker case XML_ERR_ATTLIST_NOT_FINISHED:
1098*7c568831SAndroid Build Coastguard Worker errmsg = "')' required to finish ATTLIST enumeration";
1099*7c568831SAndroid Build Coastguard Worker break;
1100*7c568831SAndroid Build Coastguard Worker case XML_ERR_MIXED_NOT_STARTED:
1101*7c568831SAndroid Build Coastguard Worker errmsg = "MixedContentDecl : '|' or ')*' expected";
1102*7c568831SAndroid Build Coastguard Worker break;
1103*7c568831SAndroid Build Coastguard Worker case XML_ERR_PCDATA_REQUIRED:
1104*7c568831SAndroid Build Coastguard Worker errmsg = "MixedContentDecl : '#PCDATA' expected";
1105*7c568831SAndroid Build Coastguard Worker break;
1106*7c568831SAndroid Build Coastguard Worker case XML_ERR_ELEMCONTENT_NOT_STARTED:
1107*7c568831SAndroid Build Coastguard Worker errmsg = "ContentDecl : Name or '(' expected";
1108*7c568831SAndroid Build Coastguard Worker break;
1109*7c568831SAndroid Build Coastguard Worker case XML_ERR_ELEMCONTENT_NOT_FINISHED:
1110*7c568831SAndroid Build Coastguard Worker errmsg = "ContentDecl : ',' '|' or ')' expected";
1111*7c568831SAndroid Build Coastguard Worker break;
1112*7c568831SAndroid Build Coastguard Worker case XML_ERR_PEREF_IN_INT_SUBSET:
1113*7c568831SAndroid Build Coastguard Worker errmsg =
1114*7c568831SAndroid Build Coastguard Worker "PEReference: forbidden within markup decl in internal subset";
1115*7c568831SAndroid Build Coastguard Worker break;
1116*7c568831SAndroid Build Coastguard Worker case XML_ERR_GT_REQUIRED:
1117*7c568831SAndroid Build Coastguard Worker errmsg = "expected '>'";
1118*7c568831SAndroid Build Coastguard Worker break;
1119*7c568831SAndroid Build Coastguard Worker case XML_ERR_CONDSEC_INVALID:
1120*7c568831SAndroid Build Coastguard Worker errmsg = "XML conditional section '[' expected";
1121*7c568831SAndroid Build Coastguard Worker break;
1122*7c568831SAndroid Build Coastguard Worker case XML_ERR_INT_SUBSET_NOT_FINISHED:
1123*7c568831SAndroid Build Coastguard Worker errmsg = "Content error in the internal subset";
1124*7c568831SAndroid Build Coastguard Worker break;
1125*7c568831SAndroid Build Coastguard Worker case XML_ERR_EXT_SUBSET_NOT_FINISHED:
1126*7c568831SAndroid Build Coastguard Worker errmsg = "Content error in the external subset";
1127*7c568831SAndroid Build Coastguard Worker break;
1128*7c568831SAndroid Build Coastguard Worker case XML_ERR_CONDSEC_INVALID_KEYWORD:
1129*7c568831SAndroid Build Coastguard Worker errmsg =
1130*7c568831SAndroid Build Coastguard Worker "conditional section INCLUDE or IGNORE keyword expected";
1131*7c568831SAndroid Build Coastguard Worker break;
1132*7c568831SAndroid Build Coastguard Worker case XML_ERR_CONDSEC_NOT_FINISHED:
1133*7c568831SAndroid Build Coastguard Worker errmsg = "XML conditional section not closed";
1134*7c568831SAndroid Build Coastguard Worker break;
1135*7c568831SAndroid Build Coastguard Worker case XML_ERR_XMLDECL_NOT_STARTED:
1136*7c568831SAndroid Build Coastguard Worker errmsg = "Text declaration '<?xml' required";
1137*7c568831SAndroid Build Coastguard Worker break;
1138*7c568831SAndroid Build Coastguard Worker case XML_ERR_XMLDECL_NOT_FINISHED:
1139*7c568831SAndroid Build Coastguard Worker errmsg = "parsing XML declaration: '?>' expected";
1140*7c568831SAndroid Build Coastguard Worker break;
1141*7c568831SAndroid Build Coastguard Worker case XML_ERR_EXT_ENTITY_STANDALONE:
1142*7c568831SAndroid Build Coastguard Worker errmsg = "external parsed entities cannot be standalone";
1143*7c568831SAndroid Build Coastguard Worker break;
1144*7c568831SAndroid Build Coastguard Worker case XML_ERR_ENTITYREF_SEMICOL_MISSING:
1145*7c568831SAndroid Build Coastguard Worker errmsg = "EntityRef: expecting ';'";
1146*7c568831SAndroid Build Coastguard Worker break;
1147*7c568831SAndroid Build Coastguard Worker case XML_ERR_DOCTYPE_NOT_FINISHED:
1148*7c568831SAndroid Build Coastguard Worker errmsg = "DOCTYPE improperly terminated";
1149*7c568831SAndroid Build Coastguard Worker break;
1150*7c568831SAndroid Build Coastguard Worker case XML_ERR_LTSLASH_REQUIRED:
1151*7c568831SAndroid Build Coastguard Worker errmsg = "EndTag: '</' not found";
1152*7c568831SAndroid Build Coastguard Worker break;
1153*7c568831SAndroid Build Coastguard Worker case XML_ERR_EQUAL_REQUIRED:
1154*7c568831SAndroid Build Coastguard Worker errmsg = "expected '='";
1155*7c568831SAndroid Build Coastguard Worker break;
1156*7c568831SAndroid Build Coastguard Worker case XML_ERR_STRING_NOT_CLOSED:
1157*7c568831SAndroid Build Coastguard Worker errmsg = "String not closed expecting \" or '";
1158*7c568831SAndroid Build Coastguard Worker break;
1159*7c568831SAndroid Build Coastguard Worker case XML_ERR_STRING_NOT_STARTED:
1160*7c568831SAndroid Build Coastguard Worker errmsg = "String not started expecting ' or \"";
1161*7c568831SAndroid Build Coastguard Worker break;
1162*7c568831SAndroid Build Coastguard Worker case XML_ERR_ENCODING_NAME:
1163*7c568831SAndroid Build Coastguard Worker errmsg = "Invalid XML encoding name";
1164*7c568831SAndroid Build Coastguard Worker break;
1165*7c568831SAndroid Build Coastguard Worker case XML_ERR_STANDALONE_VALUE:
1166*7c568831SAndroid Build Coastguard Worker errmsg = "standalone accepts only 'yes' or 'no'";
1167*7c568831SAndroid Build Coastguard Worker break;
1168*7c568831SAndroid Build Coastguard Worker case XML_ERR_DOCUMENT_EMPTY:
1169*7c568831SAndroid Build Coastguard Worker errmsg = "Document is empty";
1170*7c568831SAndroid Build Coastguard Worker break;
1171*7c568831SAndroid Build Coastguard Worker case XML_ERR_DOCUMENT_END:
1172*7c568831SAndroid Build Coastguard Worker errmsg = "Extra content at the end of the document";
1173*7c568831SAndroid Build Coastguard Worker break;
1174*7c568831SAndroid Build Coastguard Worker case XML_ERR_NOT_WELL_BALANCED:
1175*7c568831SAndroid Build Coastguard Worker errmsg = "chunk is not well balanced";
1176*7c568831SAndroid Build Coastguard Worker break;
1177*7c568831SAndroid Build Coastguard Worker case XML_ERR_EXTRA_CONTENT:
1178*7c568831SAndroid Build Coastguard Worker errmsg = "extra content at the end of well balanced chunk";
1179*7c568831SAndroid Build Coastguard Worker break;
1180*7c568831SAndroid Build Coastguard Worker case XML_ERR_VERSION_MISSING:
1181*7c568831SAndroid Build Coastguard Worker errmsg = "Malformed declaration expecting version";
1182*7c568831SAndroid Build Coastguard Worker break;
1183*7c568831SAndroid Build Coastguard Worker case XML_ERR_NAME_TOO_LONG:
1184*7c568831SAndroid Build Coastguard Worker errmsg = "Name too long";
1185*7c568831SAndroid Build Coastguard Worker break;
1186*7c568831SAndroid Build Coastguard Worker case XML_ERR_INVALID_ENCODING:
1187*7c568831SAndroid Build Coastguard Worker errmsg = "Invalid bytes in character encoding";
1188*7c568831SAndroid Build Coastguard Worker break;
1189*7c568831SAndroid Build Coastguard Worker case XML_ERR_RESOURCE_LIMIT:
1190*7c568831SAndroid Build Coastguard Worker errmsg = "Resource limit exceeded";
1191*7c568831SAndroid Build Coastguard Worker break;
1192*7c568831SAndroid Build Coastguard Worker case XML_ERR_ARGUMENT:
1193*7c568831SAndroid Build Coastguard Worker errmsg = "Invalid argument";
1194*7c568831SAndroid Build Coastguard Worker break;
1195*7c568831SAndroid Build Coastguard Worker case XML_ERR_SYSTEM:
1196*7c568831SAndroid Build Coastguard Worker errmsg = "Out of system resources";
1197*7c568831SAndroid Build Coastguard Worker break;
1198*7c568831SAndroid Build Coastguard Worker case XML_ERR_REDECL_PREDEF_ENTITY:
1199*7c568831SAndroid Build Coastguard Worker errmsg = "Invalid redeclaration of predefined entity";
1200*7c568831SAndroid Build Coastguard Worker break;
1201*7c568831SAndroid Build Coastguard Worker case XML_ERR_UNSUPPORTED_ENCODING:
1202*7c568831SAndroid Build Coastguard Worker errmsg = "Unsupported encoding";
1203*7c568831SAndroid Build Coastguard Worker break;
1204*7c568831SAndroid Build Coastguard Worker case XML_ERR_INVALID_CHAR:
1205*7c568831SAndroid Build Coastguard Worker errmsg = "Invalid character";
1206*7c568831SAndroid Build Coastguard Worker break;
1207*7c568831SAndroid Build Coastguard Worker
1208*7c568831SAndroid Build Coastguard Worker case XML_IO_UNKNOWN:
1209*7c568831SAndroid Build Coastguard Worker errmsg = "Unknown IO error"; break;
1210*7c568831SAndroid Build Coastguard Worker case XML_IO_EACCES:
1211*7c568831SAndroid Build Coastguard Worker errmsg = "Permission denied"; break;
1212*7c568831SAndroid Build Coastguard Worker case XML_IO_EAGAIN:
1213*7c568831SAndroid Build Coastguard Worker errmsg = "Resource temporarily unavailable"; break;
1214*7c568831SAndroid Build Coastguard Worker case XML_IO_EBADF:
1215*7c568831SAndroid Build Coastguard Worker errmsg = "Bad file descriptor"; break;
1216*7c568831SAndroid Build Coastguard Worker case XML_IO_EBADMSG:
1217*7c568831SAndroid Build Coastguard Worker errmsg = "Bad message"; break;
1218*7c568831SAndroid Build Coastguard Worker case XML_IO_EBUSY:
1219*7c568831SAndroid Build Coastguard Worker errmsg = "Resource busy"; break;
1220*7c568831SAndroid Build Coastguard Worker case XML_IO_ECANCELED:
1221*7c568831SAndroid Build Coastguard Worker errmsg = "Operation canceled"; break;
1222*7c568831SAndroid Build Coastguard Worker case XML_IO_ECHILD:
1223*7c568831SAndroid Build Coastguard Worker errmsg = "No child processes"; break;
1224*7c568831SAndroid Build Coastguard Worker case XML_IO_EDEADLK:
1225*7c568831SAndroid Build Coastguard Worker errmsg = "Resource deadlock avoided"; break;
1226*7c568831SAndroid Build Coastguard Worker case XML_IO_EDOM:
1227*7c568831SAndroid Build Coastguard Worker errmsg = "Domain error"; break;
1228*7c568831SAndroid Build Coastguard Worker case XML_IO_EEXIST:
1229*7c568831SAndroid Build Coastguard Worker errmsg = "File exists"; break;
1230*7c568831SAndroid Build Coastguard Worker case XML_IO_EFAULT:
1231*7c568831SAndroid Build Coastguard Worker errmsg = "Bad address"; break;
1232*7c568831SAndroid Build Coastguard Worker case XML_IO_EFBIG:
1233*7c568831SAndroid Build Coastguard Worker errmsg = "File too large"; break;
1234*7c568831SAndroid Build Coastguard Worker case XML_IO_EINPROGRESS:
1235*7c568831SAndroid Build Coastguard Worker errmsg = "Operation in progress"; break;
1236*7c568831SAndroid Build Coastguard Worker case XML_IO_EINTR:
1237*7c568831SAndroid Build Coastguard Worker errmsg = "Interrupted function call"; break;
1238*7c568831SAndroid Build Coastguard Worker case XML_IO_EINVAL:
1239*7c568831SAndroid Build Coastguard Worker errmsg = "Invalid argument"; break;
1240*7c568831SAndroid Build Coastguard Worker case XML_IO_EIO:
1241*7c568831SAndroid Build Coastguard Worker errmsg = "Input/output error"; break;
1242*7c568831SAndroid Build Coastguard Worker case XML_IO_EISDIR:
1243*7c568831SAndroid Build Coastguard Worker errmsg = "Is a directory"; break;
1244*7c568831SAndroid Build Coastguard Worker case XML_IO_EMFILE:
1245*7c568831SAndroid Build Coastguard Worker errmsg = "Too many open files"; break;
1246*7c568831SAndroid Build Coastguard Worker case XML_IO_EMLINK:
1247*7c568831SAndroid Build Coastguard Worker errmsg = "Too many links"; break;
1248*7c568831SAndroid Build Coastguard Worker case XML_IO_EMSGSIZE:
1249*7c568831SAndroid Build Coastguard Worker errmsg = "Inappropriate message buffer length"; break;
1250*7c568831SAndroid Build Coastguard Worker case XML_IO_ENAMETOOLONG:
1251*7c568831SAndroid Build Coastguard Worker errmsg = "Filename too long"; break;
1252*7c568831SAndroid Build Coastguard Worker case XML_IO_ENFILE:
1253*7c568831SAndroid Build Coastguard Worker errmsg = "Too many open files in system"; break;
1254*7c568831SAndroid Build Coastguard Worker case XML_IO_ENODEV:
1255*7c568831SAndroid Build Coastguard Worker errmsg = "No such device"; break;
1256*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOENT:
1257*7c568831SAndroid Build Coastguard Worker errmsg = "No such file or directory"; break;
1258*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOEXEC:
1259*7c568831SAndroid Build Coastguard Worker errmsg = "Exec format error"; break;
1260*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOLCK:
1261*7c568831SAndroid Build Coastguard Worker errmsg = "No locks available"; break;
1262*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOMEM:
1263*7c568831SAndroid Build Coastguard Worker errmsg = "Not enough space"; break;
1264*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOSPC:
1265*7c568831SAndroid Build Coastguard Worker errmsg = "No space left on device"; break;
1266*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOSYS:
1267*7c568831SAndroid Build Coastguard Worker errmsg = "Function not implemented"; break;
1268*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOTDIR:
1269*7c568831SAndroid Build Coastguard Worker errmsg = "Not a directory"; break;
1270*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOTEMPTY:
1271*7c568831SAndroid Build Coastguard Worker errmsg = "Directory not empty"; break;
1272*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOTSUP:
1273*7c568831SAndroid Build Coastguard Worker errmsg = "Not supported"; break;
1274*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOTTY:
1275*7c568831SAndroid Build Coastguard Worker errmsg = "Inappropriate I/O control operation"; break;
1276*7c568831SAndroid Build Coastguard Worker case XML_IO_ENXIO:
1277*7c568831SAndroid Build Coastguard Worker errmsg = "No such device or address"; break;
1278*7c568831SAndroid Build Coastguard Worker case XML_IO_EPERM:
1279*7c568831SAndroid Build Coastguard Worker errmsg = "Operation not permitted"; break;
1280*7c568831SAndroid Build Coastguard Worker case XML_IO_EPIPE:
1281*7c568831SAndroid Build Coastguard Worker errmsg = "Broken pipe"; break;
1282*7c568831SAndroid Build Coastguard Worker case XML_IO_ERANGE:
1283*7c568831SAndroid Build Coastguard Worker errmsg = "Result too large"; break;
1284*7c568831SAndroid Build Coastguard Worker case XML_IO_EROFS:
1285*7c568831SAndroid Build Coastguard Worker errmsg = "Read-only file system"; break;
1286*7c568831SAndroid Build Coastguard Worker case XML_IO_ESPIPE:
1287*7c568831SAndroid Build Coastguard Worker errmsg = "Invalid seek"; break;
1288*7c568831SAndroid Build Coastguard Worker case XML_IO_ESRCH:
1289*7c568831SAndroid Build Coastguard Worker errmsg = "No such process"; break;
1290*7c568831SAndroid Build Coastguard Worker case XML_IO_ETIMEDOUT:
1291*7c568831SAndroid Build Coastguard Worker errmsg = "Operation timed out"; break;
1292*7c568831SAndroid Build Coastguard Worker case XML_IO_EXDEV:
1293*7c568831SAndroid Build Coastguard Worker errmsg = "Improper link"; break;
1294*7c568831SAndroid Build Coastguard Worker case XML_IO_NETWORK_ATTEMPT:
1295*7c568831SAndroid Build Coastguard Worker errmsg = "Attempt to load network entity"; break;
1296*7c568831SAndroid Build Coastguard Worker case XML_IO_ENCODER:
1297*7c568831SAndroid Build Coastguard Worker errmsg = "encoder error"; break;
1298*7c568831SAndroid Build Coastguard Worker case XML_IO_FLUSH:
1299*7c568831SAndroid Build Coastguard Worker errmsg = "flush error"; break;
1300*7c568831SAndroid Build Coastguard Worker case XML_IO_WRITE:
1301*7c568831SAndroid Build Coastguard Worker errmsg = "write error"; break;
1302*7c568831SAndroid Build Coastguard Worker case XML_IO_NO_INPUT:
1303*7c568831SAndroid Build Coastguard Worker errmsg = "no input"; break;
1304*7c568831SAndroid Build Coastguard Worker case XML_IO_BUFFER_FULL:
1305*7c568831SAndroid Build Coastguard Worker errmsg = "buffer full"; break;
1306*7c568831SAndroid Build Coastguard Worker case XML_IO_LOAD_ERROR:
1307*7c568831SAndroid Build Coastguard Worker errmsg = "loading error"; break;
1308*7c568831SAndroid Build Coastguard Worker case XML_IO_ENOTSOCK:
1309*7c568831SAndroid Build Coastguard Worker errmsg = "not a socket"; break;
1310*7c568831SAndroid Build Coastguard Worker case XML_IO_EISCONN:
1311*7c568831SAndroid Build Coastguard Worker errmsg = "already connected"; break;
1312*7c568831SAndroid Build Coastguard Worker case XML_IO_ECONNREFUSED:
1313*7c568831SAndroid Build Coastguard Worker errmsg = "connection refused"; break;
1314*7c568831SAndroid Build Coastguard Worker case XML_IO_ENETUNREACH:
1315*7c568831SAndroid Build Coastguard Worker errmsg = "unreachable network"; break;
1316*7c568831SAndroid Build Coastguard Worker case XML_IO_EADDRINUSE:
1317*7c568831SAndroid Build Coastguard Worker errmsg = "address in use"; break;
1318*7c568831SAndroid Build Coastguard Worker case XML_IO_EALREADY:
1319*7c568831SAndroid Build Coastguard Worker errmsg = "already in use"; break;
1320*7c568831SAndroid Build Coastguard Worker case XML_IO_EAFNOSUPPORT:
1321*7c568831SAndroid Build Coastguard Worker errmsg = "unknown address family"; break;
1322*7c568831SAndroid Build Coastguard Worker case XML_IO_UNSUPPORTED_PROTOCOL:
1323*7c568831SAndroid Build Coastguard Worker errmsg = "unsupported protocol"; break;
1324*7c568831SAndroid Build Coastguard Worker
1325*7c568831SAndroid Build Coastguard Worker default:
1326*7c568831SAndroid Build Coastguard Worker errmsg = "Unregistered error message";
1327*7c568831SAndroid Build Coastguard Worker }
1328*7c568831SAndroid Build Coastguard Worker
1329*7c568831SAndroid Build Coastguard Worker return(errmsg);
1330*7c568831SAndroid Build Coastguard Worker }
1331*7c568831SAndroid Build Coastguard Worker
1332*7c568831SAndroid Build Coastguard Worker void
xmlVPrintErrorMessage(const char * fmt,va_list ap)1333*7c568831SAndroid Build Coastguard Worker xmlVPrintErrorMessage(const char *fmt, va_list ap) {
1334*7c568831SAndroid Build Coastguard Worker vfprintf(stderr, fmt, ap);
1335*7c568831SAndroid Build Coastguard Worker }
1336*7c568831SAndroid Build Coastguard Worker
1337*7c568831SAndroid Build Coastguard Worker void
xmlPrintErrorMessage(const char * fmt,...)1338*7c568831SAndroid Build Coastguard Worker xmlPrintErrorMessage(const char *fmt, ...) {
1339*7c568831SAndroid Build Coastguard Worker va_list ap;
1340*7c568831SAndroid Build Coastguard Worker
1341*7c568831SAndroid Build Coastguard Worker va_start(ap, fmt);
1342*7c568831SAndroid Build Coastguard Worker xmlVPrintErrorMessage(fmt, ap);
1343*7c568831SAndroid Build Coastguard Worker va_end(ap);
1344*7c568831SAndroid Build Coastguard Worker }
1345*7c568831SAndroid Build Coastguard Worker
1346*7c568831SAndroid Build Coastguard Worker void
xmlAbort(const char * fmt,...)1347*7c568831SAndroid Build Coastguard Worker xmlAbort(const char *fmt, ...) {
1348*7c568831SAndroid Build Coastguard Worker va_list ap;
1349*7c568831SAndroid Build Coastguard Worker
1350*7c568831SAndroid Build Coastguard Worker va_start(ap, fmt);
1351*7c568831SAndroid Build Coastguard Worker xmlVPrintErrorMessage(fmt, ap);
1352*7c568831SAndroid Build Coastguard Worker va_end(ap);
1353*7c568831SAndroid Build Coastguard Worker
1354*7c568831SAndroid Build Coastguard Worker abort();
1355*7c568831SAndroid Build Coastguard Worker }
1356