Edit

kc3-lang/libxml2/error.c

Branch :

  • Show log

    Commit

  • Author : Daniel Veillard
    Date : 2000-01-03 11:08:02
    Hash : 686d6b6a
    Message : - added xmlRemoveProp - changed the way Windows socket stuff get included - removed an indetermination xmLDecl/PI(xml...) - xmlNewNs wasn't checking for double definition - fixed a problem with dist-hook duplicates - fixed the loading of external entities APIs, now xmlLoadExternalEntity() is used everywhere - now the xhtml spec validates with the xhtml DTD. - error.c: fixed crashes in case of no input stream - added the xhtml spec and dtds to the validation tests and results Daniel

  • error.c
  • /*
     * error.c: module displaying/handling XML parser errors
     *
     * See Copyright for the status of this software.
     *
     * Daniel Veillard <Daniel.Veillard@w3.org>
     */
    
    #ifdef WIN32
    #include "win32config.h"
    #else
    #include "config.h"
    #endif
    
    #include <stdio.h>
    #include <stdarg.h>
    #include "parser.h"
    
    /**
     * xmlParserPrintFileInfo:
     * @input:  an xmlParserInputPtr input
     * 
     * Displays the associated file and line informations for the current input
     */
    
    void
    xmlParserPrintFileInfo(xmlParserInputPtr input) {
        if (input != NULL) {
    	if (input->filename)
    	    fprintf(stderr, "%s:%d: ", input->filename,
    		    input->line);
    	else
    	    fprintf(stderr, "Entity: line %d: ", input->line);
        }
    }
    
    /**
     * xmlParserPrintFileContext:
     * @input:  an xmlParserInputPtr input
     * 
     * Displays current context within the input content for error tracking
     */
    
    void
    xmlParserPrintFileContext(xmlParserInputPtr input) {
        const xmlChar *cur, *base;
        int n;
    
        if (input == NULL) return;
        cur = input->cur;
        base = input->base;
        while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
    	cur--;
        }
        n = 0;
        while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
            cur--;
        if ((*cur == '\n') || (*cur == '\r')) cur++;
        base = cur;
        n = 0;
        while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
            fprintf(stderr, "%c", (unsigned char) *cur++);
    	n++;
        }
        fprintf(stderr, "\n");
        cur = input->cur;
        while ((*cur == '\n') || (*cur == '\r'))
    	cur--;
        n = 0;
        while ((cur != base) && (n++ < 80)) {
            fprintf(stderr, " ");
            base++;
        }
        fprintf(stderr,"^\n");
    }
    
    /**
     * xmlParserError:
     * @ctx:  an XML parser context
     * @msg:  the message to display/transmit
     * @...:  extra parameters for the message display
     * 
     * Display and format an error messages, gives file, line, position and
     * extra parameters.
     */
    void
    xmlParserError(void *ctx, const char *msg, ...)
    {
        xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
        xmlParserInputPtr input;
        xmlParserInputPtr cur = NULL;
        va_list args;
    
        input = ctxt->input;
        if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
    	cur = input;
            input = ctxt->inputTab[ctxt->inputNr - 2];
        }
            
        xmlParserPrintFileInfo(input);
    
        fprintf(stderr, "error: ");
        va_start(args, msg);
        vfprintf(stderr, msg, args);
        va_end(args);
    
        xmlParserPrintFileContext(input);
        if (cur != NULL) {
            xmlParserPrintFileInfo(cur);
    	fprintf(stderr, "\n");
    	xmlParserPrintFileContext(cur);
        }
    }
    
    /**
     * xmlParserWarning:
     * @ctx:  an XML parser context
     * @msg:  the message to display/transmit
     * @...:  extra parameters for the message display
     * 
     * Display and format a warning messages, gives file, line, position and
     * extra parameters.
     */
    void
    xmlParserWarning(void *ctx, const char *msg, ...)
    {
        xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
        xmlParserInputPtr input;
        xmlParserInputPtr cur = NULL;
        va_list args;
    
        input = ctxt->input;
        if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
    	cur = input;
            input = ctxt->inputTab[ctxt->inputNr - 2];
        }
            
    
        xmlParserPrintFileInfo(input);
            
        fprintf(stderr, "warning: ");
        va_start(args, msg);
        vfprintf(stderr, msg, args);
        va_end(args);
    
        xmlParserPrintFileContext(input);
        if (cur != NULL) {
            xmlParserPrintFileInfo(cur);
    	fprintf(stderr, "\n");
    	xmlParserPrintFileContext(cur);
        }
    }
    
    /**
     * xmlParserValidityError:
     * @ctx:  an XML parser context
     * @msg:  the message to display/transmit
     * @...:  extra parameters for the message display
     * 
     * Display and format an validity error messages, gives file,
     * line, position and extra parameters.
     */
    void
    xmlParserValidityError(void *ctx, const char *msg, ...)
    {
        xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
        xmlParserInputPtr input;
        va_list args;
    
        input = ctxt->input;
        if ((input->filename == NULL) && (ctxt->inputNr > 1))
            input = ctxt->inputTab[ctxt->inputNr - 2];
            
        xmlParserPrintFileInfo(input);
    
        fprintf(stderr, "validity error: ");
        va_start(args, msg);
        vfprintf(stderr, msg, args);
        va_end(args);
    
        xmlParserPrintFileContext(input);
    }
    
    /**
     * xmlParserValidityWarning:
     * @ctx:  an XML parser context
     * @msg:  the message to display/transmit
     * @...:  extra parameters for the message display
     * 
     * Display and format a validity warning messages, gives file, line,
     * position and extra parameters.
     */
    void
    xmlParserValidityWarning(void *ctx, const char *msg, ...)
    {
        xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
        xmlParserInputPtr input;
        va_list args;
    
        input = ctxt->input;
        if ((input->filename == NULL) && (ctxt->inputNr > 1))
            input = ctxt->inputTab[ctxt->inputNr - 2];
    
        xmlParserPrintFileInfo(input);
            
        fprintf(stderr, "validity warning: ");
        va_start(args, msg);
        vfprintf(stderr, msg, args);
        va_end(args);
    
        xmlParserPrintFileContext(input);
    }