blob: 6d1f57dd8f332cee0bef68c4031d97cf44d03c96 [file] [log] [blame]
Daniel Veillard260a68f1998-08-13 03:39:55 +00001/*
Daniel Veillard97b58771998-10-20 06:14:16 +00002 * error.c: module displaying/handling XML parser errors
3 *
Daniel Veillard39a1f9a1999-01-17 19:11:59 +00004 * See Copyright for the status of this software.
5 *
Daniel Veillard97b58771998-10-20 06:14:16 +00006 * Daniel Veillard <Daniel.Veillard@w3.org>
Daniel Veillard260a68f1998-08-13 03:39:55 +00007 */
8
9#include <stdio.h>
10#include <stdarg.h>
11#include "parser.h"
12
Daniel Veillard97b58771998-10-20 06:14:16 +000013/**
14 * xmlParserError:
Daniel Veillard011b63c1999-06-02 17:44:04 +000015 * @ctx: an XML parser context
Daniel Veillard97b58771998-10-20 06:14:16 +000016 * @msg: the message to display/transmit
17 * @...: extra parameters for the message display
18 *
19 * Display and format an error messages, gives file, line, position and
20 * extra parameters.
Daniel Veillard260a68f1998-08-13 03:39:55 +000021 */
Daniel Veillard97b58771998-10-20 06:14:16 +000022void
Daniel Veillard27d88741999-05-29 11:51:49 +000023xmlParserError(void *ctx, const char *msg, ...)
Daniel Veillard97b58771998-10-20 06:14:16 +000024{
Daniel Veillard27d88741999-05-29 11:51:49 +000025 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
Daniel Veillard260a68f1998-08-13 03:39:55 +000026 const CHAR *cur, *base;
27 va_list args;
28 int n;
29
30 va_start(args, msg);
31 if (ctxt->input->filename)
32 fprintf(stderr, "%s:%d: ", ctxt->input->filename,
33 ctxt->input->line);
34 else
35 fprintf(stderr, "line %d: ", ctxt->input->line);
36
37 fprintf(stderr, "error: ");
38 vfprintf(stderr, msg, args);
Daniel Veillard64068b31999-03-24 20:42:16 +000039 va_end(args);
Daniel Veillard260a68f1998-08-13 03:39:55 +000040 cur = ctxt->input->cur;
41 base = ctxt->input->base;
Daniel Veillard1e346af1999-02-22 10:33:01 +000042 while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
Daniel Veillard260a68f1998-08-13 03:39:55 +000043 cur--;
Daniel Veillard260a68f1998-08-13 03:39:55 +000044 }
45 n = 0;
Daniel Veillardbc50b591999-03-01 12:28:53 +000046 while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
Daniel Veillard260a68f1998-08-13 03:39:55 +000047 cur--;
48 if ((*cur == '\n') || (*cur == '\r')) cur++;
49 base = cur;
50 n = 0;
51 while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
52 fprintf(stderr, "%c", (unsigned char) *cur++);
53 n++;
54 }
55 fprintf(stderr, "\n");
56 cur = ctxt->input->cur;
57 while ((*cur == '\n') || (*cur == '\r'))
58 cur--;
59 n = 0;
Daniel Veillardbc50b591999-03-01 12:28:53 +000060 while ((cur != base) && (n++ < 80)) {
Daniel Veillard260a68f1998-08-13 03:39:55 +000061 fprintf(stderr, " ");
62 base++;
63 }
64 fprintf(stderr,"^\n");
65}
66
Daniel Veillard97b58771998-10-20 06:14:16 +000067/**
68 * xmlParserWarning:
Daniel Veillard011b63c1999-06-02 17:44:04 +000069 * @ctx: an XML parser context
Daniel Veillard97b58771998-10-20 06:14:16 +000070 * @msg: the message to display/transmit
71 * @...: extra parameters for the message display
72 *
73 * Display and format a warning messages, gives file, line, position and
74 * extra parameters.
Daniel Veillard260a68f1998-08-13 03:39:55 +000075 */
Daniel Veillard97b58771998-10-20 06:14:16 +000076void
Daniel Veillard27d88741999-05-29 11:51:49 +000077xmlParserWarning(void *ctx, const char *msg, ...)
Daniel Veillard97b58771998-10-20 06:14:16 +000078{
Daniel Veillard27d88741999-05-29 11:51:49 +000079 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
Daniel Veillard260a68f1998-08-13 03:39:55 +000080 const CHAR *cur, *base;
81 va_list args;
82 int n;
83
84 va_start(args, msg);
85 if (ctxt->input->filename)
86 fprintf(stderr, "%s:%d: ", ctxt->input->filename,
87 ctxt->input->line);
88 else
89 fprintf(stderr, "line %d: ", ctxt->input->line);
90
91 fprintf(stderr, "warning: ");
92 vfprintf(stderr, msg, args);
Daniel Veillard64068b31999-03-24 20:42:16 +000093 va_end(args);
Daniel Veillard260a68f1998-08-13 03:39:55 +000094 cur = ctxt->input->cur;
95 base = ctxt->input->base;
Daniel Veillardbc50b591999-03-01 12:28:53 +000096 while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
97 cur--;
98 }
Daniel Veillard260a68f1998-08-13 03:39:55 +000099 n = 0;
Daniel Veillardbc50b591999-03-01 12:28:53 +0000100 while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
Daniel Veillard260a68f1998-08-13 03:39:55 +0000101 cur--;
Daniel Veillardbc50b591999-03-01 12:28:53 +0000102 if ((*cur == '\n') || (*cur == '\r')) cur++;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000103 base = cur;
104 n = 0;
105 while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
106 fprintf(stderr, "%c", (unsigned char) *cur++);
107 n++;
108 }
109 fprintf(stderr, "\n");
110 cur = ctxt->input->cur;
Daniel Veillardbc50b591999-03-01 12:28:53 +0000111 while ((*cur == '\n') || (*cur == '\r'))
112 cur--;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000113 n = 0;
Daniel Veillardbc50b591999-03-01 12:28:53 +0000114 while ((cur != base) && (n++ < 80)) {
Daniel Veillard260a68f1998-08-13 03:39:55 +0000115 fprintf(stderr, " ");
116 base++;
117 }
118 fprintf(stderr,"^\n");
119}
Daniel Veillard97b58771998-10-20 06:14:16 +0000120