Annotation of XML/error.c, revision 1.20
1.1 daniel 1: /*
1.8 daniel 2: * error.c: module displaying/handling XML parser errors
3: *
1.9 daniel 4: * See Copyright for the status of this software.
5: *
1.8 daniel 6: * Daniel Veillard <Daniel.Veillard@w3.org>
1.1 daniel 7: */
8:
9: #include <stdio.h>
10: #include <stdarg.h>
11: #include "parser.h"
12:
1.19 daniel 13: /**
14: * xmlParserPrintFileInfo:
15: * @input: an xmlParserInputPtr input
16: *
17: * Displays the associated file and line informations for the current input
18: */
19:
20: void
1.17 daniel 21: xmlParserPrintFileInfo(xmlParserInputPtr input) {
22: if (input != NULL) {
23: if (input->filename)
24: fprintf(stderr, "%s:%d: ", input->filename,
25: input->line);
26: else
1.18 daniel 27: fprintf(stderr, "Entity: line %d: ", input->line);
1.17 daniel 28: }
29: }
30:
1.19 daniel 31: /**
32: * xmlParserPrintFileContext:
33: * @input: an xmlParserInputPtr input
34: *
35: * Displays current context within the input content for error tracking
36: */
37:
38: void
1.17 daniel 39: xmlParserPrintFileContext(xmlParserInputPtr input) {
1.20 ! daniel 40: const xmlChar *cur, *base;
1.1 daniel 41: int n;
42:
1.16 daniel 43: cur = input->cur;
44: base = input->base;
1.11 daniel 45: while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
1.7 daniel 46: cur--;
47: }
1.2 daniel 48: n = 0;
1.12 daniel 49: while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
1.2 daniel 50: cur--;
1.7 daniel 51: if ((*cur == '\n') || (*cur == '\r')) cur++;
1.1 daniel 52: base = cur;
1.2 daniel 53: n = 0;
1.1 daniel 54: while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
55: fprintf(stderr, "%c", (unsigned char) *cur++);
56: n++;
57: }
58: fprintf(stderr, "\n");
1.16 daniel 59: cur = input->cur;
1.7 daniel 60: while ((*cur == '\n') || (*cur == '\r'))
61: cur--;
1.5 daniel 62: n = 0;
1.12 daniel 63: while ((cur != base) && (n++ < 80)) {
1.1 daniel 64: fprintf(stderr, " ");
65: base++;
66: }
67: fprintf(stderr,"^\n");
68: }
1.6 daniel 69:
1.8 daniel 70: /**
1.17 daniel 71: * xmlParserError:
72: * @ctx: an XML parser context
73: * @msg: the message to display/transmit
74: * @...: extra parameters for the message display
75: *
76: * Display and format an error messages, gives file, line, position and
77: * extra parameters.
78: */
79: void
80: xmlParserError(void *ctx, const char *msg, ...)
81: {
82: xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
83: xmlParserInputPtr input;
1.18 daniel 84: xmlParserInputPtr cur = NULL;
1.17 daniel 85: va_list args;
86:
87: input = ctxt->input;
1.18 daniel 88: if ((input->filename == NULL) && (ctxt->inputNr > 1)) {
89: cur = input;
1.17 daniel 90: input = ctxt->inputTab[ctxt->inputNr - 2];
1.18 daniel 91: }
1.17 daniel 92:
93: xmlParserPrintFileInfo(input);
94:
95: fprintf(stderr, "error: ");
96: va_start(args, msg);
97: vfprintf(stderr, msg, args);
98: va_end(args);
99:
100: xmlParserPrintFileContext(input);
1.18 daniel 101: if (cur != NULL) {
102: xmlParserPrintFileInfo(cur);
103: fprintf(stderr, "\n");
104: xmlParserPrintFileContext(cur);
105: }
1.17 daniel 106: }
107:
108: /**
1.8 daniel 109: * xmlParserWarning:
1.15 daniel 110: * @ctx: an XML parser context
1.8 daniel 111: * @msg: the message to display/transmit
112: * @...: extra parameters for the message display
113: *
114: * Display and format a warning messages, gives file, line, position and
115: * extra parameters.
1.6 daniel 116: */
1.8 daniel 117: void
1.14 daniel 118: xmlParserWarning(void *ctx, const char *msg, ...)
1.8 daniel 119: {
1.14 daniel 120: xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
1.16 daniel 121: xmlParserInputPtr input;
1.18 daniel 122: xmlParserInputPtr cur = NULL;
1.6 daniel 123: va_list args;
124:
1.16 daniel 125: input = ctxt->input;
1.18 daniel 126: if ((input->filename == NULL) && (ctxt->inputNr > 1)) {
127: cur = input;
1.16 daniel 128: input = ctxt->inputTab[ctxt->inputNr - 2];
1.18 daniel 129: }
130:
1.17 daniel 131:
132: xmlParserPrintFileInfo(input);
1.6 daniel 133:
134: fprintf(stderr, "warning: ");
1.16 daniel 135: va_start(args, msg);
1.6 daniel 136: vfprintf(stderr, msg, args);
1.13 daniel 137: va_end(args);
1.17 daniel 138:
139: xmlParserPrintFileContext(input);
1.18 daniel 140: if (cur != NULL) {
141: xmlParserPrintFileInfo(cur);
142: fprintf(stderr, "\n");
143: xmlParserPrintFileContext(cur);
144: }
1.17 daniel 145: }
146:
147: /**
148: * xmlParserValidityError:
149: * @ctx: an XML parser context
150: * @msg: the message to display/transmit
151: * @...: extra parameters for the message display
152: *
153: * Display and format an validity error messages, gives file,
154: * line, position and extra parameters.
155: */
156: void
157: xmlParserValidityError(void *ctx, const char *msg, ...)
158: {
159: xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
160: xmlParserInputPtr input;
161: va_list args;
162:
163: input = ctxt->input;
164: if ((input->filename == NULL) && (ctxt->inputNr > 1))
165: input = ctxt->inputTab[ctxt->inputNr - 2];
166:
167: xmlParserPrintFileInfo(input);
168:
169: fprintf(stderr, "validity error: ");
170: va_start(args, msg);
171: vfprintf(stderr, msg, args);
172: va_end(args);
173:
174: xmlParserPrintFileContext(input);
175: }
176:
177: /**
178: * xmlParserValidityWarning:
179: * @ctx: an XML parser context
180: * @msg: the message to display/transmit
181: * @...: extra parameters for the message display
182: *
183: * Display and format a validity warning messages, gives file, line,
184: * position and extra parameters.
185: */
186: void
187: xmlParserValidityWarning(void *ctx, const char *msg, ...)
188: {
189: xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
190: xmlParserInputPtr input;
191: va_list args;
192:
193: input = ctxt->input;
194: if ((input->filename == NULL) && (ctxt->inputNr > 1))
195: input = ctxt->inputTab[ctxt->inputNr - 2];
196:
197: xmlParserPrintFileInfo(input);
198:
199: fprintf(stderr, "validity warning: ");
200: va_start(args, msg);
201: vfprintf(stderr, msg, args);
202: va_end(args);
203:
204: xmlParserPrintFileContext(input);
1.6 daniel 205: }
1.8 daniel 206:
Webmaster