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