Blame testSAX.c

Packit 423ecb
/*
Packit 423ecb
 * testSAX.c : a small tester program for parsing using the SAX API.
Packit 423ecb
 *
Packit 423ecb
 * See Copyright for the status of this software.
Packit 423ecb
 *
Packit 423ecb
 * daniel@veillard.com
Packit 423ecb
 */
Packit 423ecb
Packit 423ecb
#include "libxml.h"
Packit 423ecb
Packit 423ecb
#ifdef HAVE_SYS_TIME_H
Packit 423ecb
#include <sys/time.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_SYS_TIMEB_H
Packit 423ecb
#include <sys/timeb.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_TIME_H
Packit 423ecb
#include <time.h>
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_SAX1_ENABLED
Packit 423ecb
#include <string.h>
Packit 423ecb
#include <stdarg.h>
Packit 423ecb
Packit 423ecb
#ifdef HAVE_SYS_TYPES_H
Packit 423ecb
#include <sys/types.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_SYS_STAT_H
Packit 423ecb
#include <sys/stat.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_FCNTL_H
Packit 423ecb
#include <fcntl.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_UNISTD_H
Packit 423ecb
#include <unistd.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_STDLIB_H
Packit 423ecb
#include <stdlib.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_STRING_H
Packit 423ecb
#include <string.h>
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
Packit 423ecb
#include <libxml/globals.h>
Packit 423ecb
#include <libxml/xmlerror.h>
Packit 423ecb
#include <libxml/parser.h>
Packit 423ecb
#include <libxml/parserInternals.h> /* only for xmlNewInputFromFile() */
Packit 423ecb
#include <libxml/tree.h>
Packit 423ecb
#include <libxml/debugXML.h>
Packit 423ecb
#include <libxml/xmlmemory.h>
Packit 423ecb
Packit 423ecb
static int debug = 0;
Packit 423ecb
static int copy = 0;
Packit 423ecb
static int recovery = 0;
Packit 423ecb
static int push = 0;
Packit 423ecb
static int speed = 0;
Packit 423ecb
static int noent = 0;
Packit 423ecb
static int quiet = 0;
Packit 423ecb
static int nonull = 0;
Packit 423ecb
static int sax2 = 0;
Packit 423ecb
static int repeat = 0;
Packit 423ecb
static int callbacks = 0;
Packit 423ecb
static int timing = 0;
Packit 423ecb
Packit 423ecb
/*
Packit 423ecb
 * Timing routines.
Packit 423ecb
 */
Packit 423ecb
/*
Packit 423ecb
 * Internal timing routines to remove the necessity to have unix-specific
Packit 423ecb
 * function calls
Packit 423ecb
 */
Packit 423ecb
Packit 423ecb
#ifndef HAVE_GETTIMEOFDAY
Packit 423ecb
#ifdef HAVE_SYS_TIMEB_H
Packit 423ecb
#ifdef HAVE_SYS_TIME_H
Packit 423ecb
#ifdef HAVE_FTIME
Packit 423ecb
Packit 423ecb
static int
Packit 423ecb
my_gettimeofday(struct timeval *tvp, void *tzp)
Packit 423ecb
{
Packit 423ecb
	struct timeb timebuffer;
Packit 423ecb
Packit 423ecb
	ftime(&timebuffer);
Packit 423ecb
	if (tvp) {
Packit 423ecb
		tvp->tv_sec = timebuffer.time;
Packit 423ecb
		tvp->tv_usec = timebuffer.millitm * 1000L;
Packit 423ecb
	}
Packit 423ecb
	return (0);
Packit 423ecb
}
Packit 423ecb
#define HAVE_GETTIMEOFDAY 1
Packit 423ecb
#define gettimeofday my_gettimeofday
Packit 423ecb
Packit 423ecb
#endif /* HAVE_FTIME */
Packit 423ecb
#endif /* HAVE_SYS_TIME_H */
Packit 423ecb
#endif /* HAVE_SYS_TIMEB_H */
Packit 423ecb
#endif /* !HAVE_GETTIMEOFDAY */
Packit 423ecb
Packit 423ecb
#if defined(HAVE_GETTIMEOFDAY)
Packit 423ecb
static struct timeval begin, end;
Packit 423ecb
Packit 423ecb
/*
Packit 423ecb
 * startTimer: call where you want to start timing
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
startTimer(void)
Packit 423ecb
{
Packit 423ecb
    gettimeofday(&begin, NULL);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/*
Packit 423ecb
 * endTimer: call where you want to stop timing and to print out a
Packit 423ecb
 *           message about the timing performed; format is a printf
Packit 423ecb
 *           type argument
Packit 423ecb
 */
Packit 423ecb
static void XMLCDECL
Packit 423ecb
endTimer(const char *fmt, ...)
Packit 423ecb
{
Packit 423ecb
    long msec;
Packit 423ecb
    va_list ap;
Packit 423ecb
Packit 423ecb
    gettimeofday(&end, NULL);
Packit 423ecb
    msec = end.tv_sec - begin.tv_sec;
Packit 423ecb
    msec *= 1000;
Packit 423ecb
    msec += (end.tv_usec - begin.tv_usec) / 1000;
Packit 423ecb
Packit 423ecb
#ifndef HAVE_STDARG_H
Packit 423ecb
#error "endTimer required stdarg functions"
Packit 423ecb
#endif
Packit 423ecb
    va_start(ap, fmt);
Packit 423ecb
    vfprintf(stderr, fmt, ap);
Packit 423ecb
    va_end(ap);
Packit 423ecb
Packit 423ecb
    fprintf(stderr, " took %ld ms\n", msec);
Packit 423ecb
}
Packit 423ecb
#elif defined(HAVE_TIME_H)
Packit 423ecb
/*
Packit 423ecb
 * No gettimeofday function, so we have to make do with calling clock.
Packit 423ecb
 * This is obviously less accurate, but there's little we can do about
Packit 423ecb
 * that.
Packit 423ecb
 */
Packit 423ecb
#ifndef CLOCKS_PER_SEC
Packit 423ecb
#define CLOCKS_PER_SEC 100
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
static clock_t begin, end;
Packit 423ecb
static void
Packit 423ecb
startTimer(void)
Packit 423ecb
{
Packit 423ecb
    begin = clock();
Packit 423ecb
}
Packit 423ecb
static void XMLCDECL
Packit 423ecb
endTimer(const char *fmt, ...)
Packit 423ecb
{
Packit 423ecb
    long msec;
Packit 423ecb
    va_list ap;
Packit 423ecb
Packit 423ecb
    end = clock();
Packit 423ecb
    msec = ((end - begin) * 1000) / CLOCKS_PER_SEC;
Packit 423ecb
Packit 423ecb
#ifndef HAVE_STDARG_H
Packit 423ecb
#error "endTimer required stdarg functions"
Packit 423ecb
#endif
Packit 423ecb
    va_start(ap, fmt);
Packit 423ecb
    vfprintf(stderr, fmt, ap);
Packit 423ecb
    va_end(ap);
Packit 423ecb
    fprintf(stderr, " took %ld ms\n", msec);
Packit 423ecb
}
Packit 423ecb
#else
Packit 423ecb
Packit 423ecb
/*
Packit 423ecb
 * We don't have a gettimeofday or time.h, so we just don't do timing
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
startTimer(void)
Packit 423ecb
{
Packit 423ecb
    /*
Packit 423ecb
     * Do nothing
Packit 423ecb
     */
Packit 423ecb
}
Packit 423ecb
static void XMLCDECL
Packit 423ecb
endTimer(char *format, ...)
Packit 423ecb
{
Packit 423ecb
    /*
Packit 423ecb
     * We cannot do anything because we don't have a timing function
Packit 423ecb
     */
Packit 423ecb
#ifdef HAVE_STDARG_H
Packit 423ecb
    va_start(ap, format);
Packit 423ecb
    vfprintf(stderr, format, ap);
Packit 423ecb
    va_end(ap);
Packit 423ecb
    fprintf(stderr, " was not timed\n", msec);
Packit 423ecb
#else
Packit 423ecb
    /* We don't have gettimeofday, time or stdarg.h, what crazy world is
Packit 423ecb
     * this ?!
Packit 423ecb
     */
Packit 423ecb
#endif
Packit 423ecb
}
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
/*
Packit 423ecb
 * empty SAX block
Packit 423ecb
 */
Packit 423ecb
static xmlSAXHandler emptySAXHandlerStruct = {
Packit 423ecb
    NULL, /* internalSubset */
Packit 423ecb
    NULL, /* isStandalone */
Packit 423ecb
    NULL, /* hasInternalSubset */
Packit 423ecb
    NULL, /* hasExternalSubset */
Packit 423ecb
    NULL, /* resolveEntity */
Packit 423ecb
    NULL, /* getEntity */
Packit 423ecb
    NULL, /* entityDecl */
Packit 423ecb
    NULL, /* notationDecl */
Packit 423ecb
    NULL, /* attributeDecl */
Packit 423ecb
    NULL, /* elementDecl */
Packit 423ecb
    NULL, /* unparsedEntityDecl */
Packit 423ecb
    NULL, /* setDocumentLocator */
Packit 423ecb
    NULL, /* startDocument */
Packit 423ecb
    NULL, /* endDocument */
Packit 423ecb
    NULL, /* startElement */
Packit 423ecb
    NULL, /* endElement */
Packit 423ecb
    NULL, /* reference */
Packit 423ecb
    NULL, /* characters */
Packit 423ecb
    NULL, /* ignorableWhitespace */
Packit 423ecb
    NULL, /* processingInstruction */
Packit 423ecb
    NULL, /* comment */
Packit 423ecb
    NULL, /* xmlParserWarning */
Packit 423ecb
    NULL, /* xmlParserError */
Packit 423ecb
    NULL, /* xmlParserError */
Packit 423ecb
    NULL, /* getParameterEntity */
Packit 423ecb
    NULL, /* cdataBlock; */
Packit 423ecb
    NULL, /* externalSubset; */
Packit 423ecb
    1,
Packit 423ecb
    NULL,
Packit 423ecb
    NULL, /* startElementNs */
Packit 423ecb
    NULL, /* endElementNs */
Packit 423ecb
    NULL  /* xmlStructuredErrorFunc */
Packit 423ecb
};
Packit 423ecb
Packit 423ecb
static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
Packit 423ecb
extern xmlSAXHandlerPtr debugSAXHandler;
Packit 423ecb
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *				Debug Handlers				*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * isStandaloneDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 *
Packit 423ecb
 * Is this document tagged standalone ?
Packit 423ecb
 *
Packit 423ecb
 * Returns 1 if true
Packit 423ecb
 */
Packit 423ecb
static int
Packit 423ecb
isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return(0);
Packit 423ecb
    fprintf(stdout, "SAX.isStandalone()\n");
Packit 423ecb
    return(0);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * hasInternalSubsetDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 *
Packit 423ecb
 * Does this document has an internal subset
Packit 423ecb
 *
Packit 423ecb
 * Returns 1 if true
Packit 423ecb
 */
Packit 423ecb
static int
Packit 423ecb
hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return(0);
Packit 423ecb
    fprintf(stdout, "SAX.hasInternalSubset()\n");
Packit 423ecb
    return(0);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * hasExternalSubsetDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 *
Packit 423ecb
 * Does this document has an external subset
Packit 423ecb
 *
Packit 423ecb
 * Returns 1 if true
Packit 423ecb
 */
Packit 423ecb
static int
Packit 423ecb
hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return(0);
Packit 423ecb
    fprintf(stdout, "SAX.hasExternalSubset()\n");
Packit 423ecb
    return(0);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * internalSubsetDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 *
Packit 423ecb
 * Does this document has an internal subset
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
Packit 423ecb
	       const xmlChar *ExternalID, const xmlChar *SystemID)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.internalSubset(%s,", name);
Packit 423ecb
    if (ExternalID == NULL)
Packit 423ecb
	fprintf(stdout, " ,");
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, " %s,", ExternalID);
Packit 423ecb
    if (SystemID == NULL)
Packit 423ecb
	fprintf(stdout, " )\n");
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, " %s)\n", SystemID);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * externalSubsetDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 *
Packit 423ecb
 * Does this document has an external subset
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
Packit 423ecb
	       const xmlChar *ExternalID, const xmlChar *SystemID)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.externalSubset(%s,", name);
Packit 423ecb
    if (ExternalID == NULL)
Packit 423ecb
	fprintf(stdout, " ,");
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, " %s,", ExternalID);
Packit 423ecb
    if (SystemID == NULL)
Packit 423ecb
	fprintf(stdout, " )\n");
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, " %s)\n", SystemID);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * resolveEntityDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @publicId: The public ID of the entity
Packit 423ecb
 * @systemId: The system ID of the entity
Packit 423ecb
 *
Packit 423ecb
 * Special entity resolver, better left to the parser, it has
Packit 423ecb
 * more context than the application layer.
Packit 423ecb
 * The default behaviour is to NOT resolve the entities, in that case
Packit 423ecb
 * the ENTITY_REF nodes are built in the structure (and the parameter
Packit 423ecb
 * values).
Packit 423ecb
 *
Packit 423ecb
 * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
Packit 423ecb
 */
Packit 423ecb
static xmlParserInputPtr
Packit 423ecb
resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return(NULL);
Packit 423ecb
    /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
Packit 423ecb
Packit 423ecb
Packit 423ecb
    fprintf(stdout, "SAX.resolveEntity(");
Packit 423ecb
    if (publicId != NULL)
Packit 423ecb
	fprintf(stdout, "%s", (char *)publicId);
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, " ");
Packit 423ecb
    if (systemId != NULL)
Packit 423ecb
	fprintf(stdout, ", %s)\n", (char *)systemId);
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, ", )\n");
Packit 423ecb
/*********
Packit 423ecb
    if (systemId != NULL) {
Packit 423ecb
        return(xmlNewInputFromFile(ctxt, (char *) systemId));
Packit 423ecb
    }
Packit 423ecb
 *********/
Packit 423ecb
    return(NULL);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * getEntityDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name: The entity name
Packit 423ecb
 *
Packit 423ecb
 * Get an entity by name
Packit 423ecb
 *
Packit 423ecb
 * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
Packit 423ecb
 */
Packit 423ecb
static xmlEntityPtr
Packit 423ecb
getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return(NULL);
Packit 423ecb
    fprintf(stdout, "SAX.getEntity(%s)\n", name);
Packit 423ecb
    return(NULL);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * getParameterEntityDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name: The entity name
Packit 423ecb
 *
Packit 423ecb
 * Get a parameter entity by name
Packit 423ecb
 *
Packit 423ecb
 * Returns the xmlParserInputPtr
Packit 423ecb
 */
Packit 423ecb
static xmlEntityPtr
Packit 423ecb
getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return(NULL);
Packit 423ecb
    fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
Packit 423ecb
    return(NULL);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * entityDeclDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name:  the entity name
Packit 423ecb
 * @type:  the entity type
Packit 423ecb
 * @publicId: The public ID of the entity
Packit 423ecb
 * @systemId: The system ID of the entity
Packit 423ecb
 * @content: the entity value (without processing).
Packit 423ecb
 *
Packit 423ecb
 * An entity definition has been parsed
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
Packit 423ecb
          const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
Packit 423ecb
{
Packit 423ecb
const xmlChar *nullstr = BAD_CAST "(null)";
Packit 423ecb
    /* not all libraries handle printing null pointers nicely */
Packit 423ecb
    if (publicId == NULL)
Packit 423ecb
        publicId = nullstr;
Packit 423ecb
    if (systemId == NULL)
Packit 423ecb
        systemId = nullstr;
Packit 423ecb
    if (content == NULL)
Packit 423ecb
        content = (xmlChar *)nullstr;
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
Packit 423ecb
            name, type, publicId, systemId, content);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * attributeDeclDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name:  the attribute name
Packit 423ecb
 * @type:  the attribute type
Packit 423ecb
 *
Packit 423ecb
 * An attribute definition has been parsed
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
Packit 423ecb
                   const xmlChar * name, int type, int def,
Packit 423ecb
                   const xmlChar * defaultValue, xmlEnumerationPtr tree)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
        return;
Packit 423ecb
    if (defaultValue == NULL)
Packit 423ecb
        fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
Packit 423ecb
                elem, name, type, def);
Packit 423ecb
    else
Packit 423ecb
        fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
Packit 423ecb
                elem, name, type, def, defaultValue);
Packit 423ecb
    xmlFreeEnumeration(tree);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * elementDeclDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name:  the element name
Packit 423ecb
 * @type:  the element type
Packit 423ecb
 * @content: the element value (without processing).
Packit 423ecb
 *
Packit 423ecb
 * An element definition has been parsed
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
Packit 423ecb
	    xmlElementContentPtr content ATTRIBUTE_UNUSED)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
Packit 423ecb
            name, type);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * notationDeclDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name: The name of the notation
Packit 423ecb
 * @publicId: The public ID of the entity
Packit 423ecb
 * @systemId: The system ID of the entity
Packit 423ecb
 *
Packit 423ecb
 * What to do when a notation declaration has been parsed.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
Packit 423ecb
	     const xmlChar *publicId, const xmlChar *systemId)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
Packit 423ecb
            (char *) name, (char *) publicId, (char *) systemId);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * unparsedEntityDeclDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name: The name of the entity
Packit 423ecb
 * @publicId: The public ID of the entity
Packit 423ecb
 * @systemId: The system ID of the entity
Packit 423ecb
 * @notationName: the name of the notation
Packit 423ecb
 *
Packit 423ecb
 * What to do when an unparsed entity declaration is parsed
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
Packit 423ecb
		   const xmlChar *publicId, const xmlChar *systemId,
Packit 423ecb
		   const xmlChar *notationName)
Packit 423ecb
{
Packit 423ecb
const xmlChar *nullstr = BAD_CAST "(null)";
Packit 423ecb
Packit 423ecb
    if (publicId == NULL)
Packit 423ecb
        publicId = nullstr;
Packit 423ecb
    if (systemId == NULL)
Packit 423ecb
        systemId = nullstr;
Packit 423ecb
    if (notationName == NULL)
Packit 423ecb
        notationName = nullstr;
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
Packit 423ecb
            (char *) name, (char *) publicId, (char *) systemId,
Packit 423ecb
	    (char *) notationName);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * setDocumentLocatorDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @loc: A SAX Locator
Packit 423ecb
 *
Packit 423ecb
 * Receive the document locator at startup, actually xmlDefaultSAXLocator
Packit 423ecb
 * Everything is available on the context, so this is useless in our case.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.setDocumentLocator()\n");
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * startDocumentDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 *
Packit 423ecb
 * called when the document start being processed.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.startDocument()\n");
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * endDocumentDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 *
Packit 423ecb
 * called when the document end has been detected.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.endDocument()\n");
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * startElementDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name:  The element name
Packit 423ecb
 *
Packit 423ecb
 * called when an opening tag has been processed.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
Packit 423ecb
{
Packit 423ecb
    int i;
Packit 423ecb
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.startElement(%s", (char *) name);
Packit 423ecb
    if (atts != NULL) {
Packit 423ecb
        for (i = 0;(atts[i] != NULL);i++) {
Packit 423ecb
	    fprintf(stdout, ", %s='", atts[i++]);
Packit 423ecb
	    if (atts[i] != NULL)
Packit 423ecb
	        fprintf(stdout, "%s'", atts[i]);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    fprintf(stdout, ")\n");
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * endElementDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name:  The element name
Packit 423ecb
 *
Packit 423ecb
 * called when the end of an element has been detected.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * charactersDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @ch:  a xmlChar string
Packit 423ecb
 * @len: the number of xmlChar
Packit 423ecb
 *
Packit 423ecb
 * receiving some chars from the parser.
Packit 423ecb
 * Question: how much at a time ???
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
Packit 423ecb
{
Packit 423ecb
    char output[40];
Packit 423ecb
    int i;
Packit 423ecb
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    for (i = 0;(i
Packit 423ecb
	output[i] = ch[i];
Packit 423ecb
    output[i] = 0;
Packit 423ecb
Packit 423ecb
    fprintf(stdout, "SAX.characters(%s, %d)\n", output, len);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * referenceDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name:  The entity name
Packit 423ecb
 *
Packit 423ecb
 * called when an entity reference is detected.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.reference(%s)\n", name);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * ignorableWhitespaceDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @ch:  a xmlChar string
Packit 423ecb
 * @start: the first char in the string
Packit 423ecb
 * @len: the number of xmlChar
Packit 423ecb
 *
Packit 423ecb
 * receiving some ignorable whitespaces from the parser.
Packit 423ecb
 * Question: how much at a time ???
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
Packit 423ecb
{
Packit 423ecb
    char output[40];
Packit 423ecb
    int i;
Packit 423ecb
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    for (i = 0;(i
Packit 423ecb
	output[i] = ch[i];
Packit 423ecb
    output[i] = 0;
Packit 423ecb
    fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", output, len);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * processingInstructionDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @target:  the target name
Packit 423ecb
 * @data: the PI data's
Packit 423ecb
 * @len: the number of xmlChar
Packit 423ecb
 *
Packit 423ecb
 * A processing instruction has been parsed.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
Packit 423ecb
                      const xmlChar *data)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    if (data != NULL)
Packit 423ecb
	fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
Packit 423ecb
		(char *) target, (char *) data);
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, "SAX.processingInstruction(%s, NULL)\n",
Packit 423ecb
		(char *) target);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * cdataBlockDebug:
Packit 423ecb
 * @ctx: the user data (XML parser context)
Packit 423ecb
 * @value:  The pcdata content
Packit 423ecb
 * @len:  the block length
Packit 423ecb
 *
Packit 423ecb
 * called when a pcdata block has been parsed
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.pcdata(%.20s, %d)\n",
Packit 423ecb
	    (char *) value, len);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * commentDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @value:  the comment content
Packit 423ecb
 *
Packit 423ecb
 * A comment has been parsed.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.comment(%s)\n", value);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * warningDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @msg:  the message to display/transmit
Packit 423ecb
 * @...:  extra parameters for the message display
Packit 423ecb
 *
Packit 423ecb
 * Display and format a warning messages, gives file, line, position and
Packit 423ecb
 * extra parameters.
Packit 423ecb
 */
Packit 423ecb
static void XMLCDECL
Packit 423ecb
warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
Packit 423ecb
{
Packit 423ecb
    va_list args;
Packit 423ecb
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    va_start(args, msg);
Packit 423ecb
    fprintf(stdout, "SAX.warning: ");
Packit 423ecb
    vfprintf(stdout, msg, args);
Packit 423ecb
    va_end(args);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * errorDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @msg:  the message to display/transmit
Packit 423ecb
 * @...:  extra parameters for the message display
Packit 423ecb
 *
Packit 423ecb
 * Display and format a error messages, gives file, line, position and
Packit 423ecb
 * extra parameters.
Packit 423ecb
 */
Packit 423ecb
static void XMLCDECL
Packit 423ecb
errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
Packit 423ecb
{
Packit 423ecb
    va_list args;
Packit 423ecb
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    va_start(args, msg);
Packit 423ecb
    fprintf(stdout, "SAX.error: ");
Packit 423ecb
    vfprintf(stdout, msg, args);
Packit 423ecb
    va_end(args);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * fatalErrorDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @msg:  the message to display/transmit
Packit 423ecb
 * @...:  extra parameters for the message display
Packit 423ecb
 *
Packit 423ecb
 * Display and format a fatalError messages, gives file, line, position and
Packit 423ecb
 * extra parameters.
Packit 423ecb
 */
Packit 423ecb
static void XMLCDECL
Packit 423ecb
fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
Packit 423ecb
{
Packit 423ecb
    va_list args;
Packit 423ecb
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    va_start(args, msg);
Packit 423ecb
    fprintf(stdout, "SAX.fatalError: ");
Packit 423ecb
    vfprintf(stdout, msg, args);
Packit 423ecb
    va_end(args);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static xmlSAXHandler debugSAXHandlerStruct = {
Packit 423ecb
    internalSubsetDebug,
Packit 423ecb
    isStandaloneDebug,
Packit 423ecb
    hasInternalSubsetDebug,
Packit 423ecb
    hasExternalSubsetDebug,
Packit 423ecb
    resolveEntityDebug,
Packit 423ecb
    getEntityDebug,
Packit 423ecb
    entityDeclDebug,
Packit 423ecb
    notationDeclDebug,
Packit 423ecb
    attributeDeclDebug,
Packit 423ecb
    elementDeclDebug,
Packit 423ecb
    unparsedEntityDeclDebug,
Packit 423ecb
    setDocumentLocatorDebug,
Packit 423ecb
    startDocumentDebug,
Packit 423ecb
    endDocumentDebug,
Packit 423ecb
    startElementDebug,
Packit 423ecb
    endElementDebug,
Packit 423ecb
    referenceDebug,
Packit 423ecb
    charactersDebug,
Packit 423ecb
    ignorableWhitespaceDebug,
Packit 423ecb
    processingInstructionDebug,
Packit 423ecb
    commentDebug,
Packit 423ecb
    warningDebug,
Packit 423ecb
    errorDebug,
Packit 423ecb
    fatalErrorDebug,
Packit 423ecb
    getParameterEntityDebug,
Packit 423ecb
    cdataBlockDebug,
Packit 423ecb
    externalSubsetDebug,
Packit 423ecb
    1,
Packit 423ecb
    NULL,
Packit 423ecb
    NULL,
Packit 423ecb
    NULL,
Packit 423ecb
    NULL
Packit 423ecb
};
Packit 423ecb
Packit 423ecb
xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
Packit 423ecb
Packit 423ecb
/*
Packit 423ecb
 * SAX2 specific callbacks
Packit 423ecb
 */
Packit 423ecb
/**
Packit 423ecb
 * startElementNsDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name:  The element name
Packit 423ecb
 *
Packit 423ecb
 * called when an opening tag has been processed.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
Packit 423ecb
                    const xmlChar *localname,
Packit 423ecb
                    const xmlChar *prefix,
Packit 423ecb
                    const xmlChar *URI,
Packit 423ecb
		    int nb_namespaces,
Packit 423ecb
		    const xmlChar **namespaces,
Packit 423ecb
		    int nb_attributes,
Packit 423ecb
		    int nb_defaulted,
Packit 423ecb
		    const xmlChar **attributes)
Packit 423ecb
{
Packit 423ecb
    int i;
Packit 423ecb
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.startElementNs(%s", (char *) localname);
Packit 423ecb
    if (prefix == NULL)
Packit 423ecb
	fprintf(stdout, ", NULL");
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, ", %s", (char *) prefix);
Packit 423ecb
    if (URI == NULL)
Packit 423ecb
	fprintf(stdout, ", NULL");
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, ", '%s'", (char *) URI);
Packit 423ecb
    fprintf(stdout, ", %d", nb_namespaces);
Packit 423ecb
Packit 423ecb
    if (namespaces != NULL) {
Packit 423ecb
        for (i = 0;i < nb_namespaces * 2;i++) {
Packit 423ecb
	    fprintf(stdout, ", xmlns");
Packit 423ecb
	    if (namespaces[i] != NULL)
Packit 423ecb
	        fprintf(stdout, ":%s", namespaces[i]);
Packit 423ecb
	    i++;
Packit 423ecb
	    fprintf(stdout, "='%s'", namespaces[i]);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    fprintf(stdout, ", %d, %d", nb_attributes, nb_defaulted);
Packit 423ecb
    if (attributes != NULL) {
Packit 423ecb
        for (i = 0;i < nb_attributes * 5;i += 5) {
Packit 423ecb
	    if (attributes[i + 1] != NULL)
Packit 423ecb
		fprintf(stdout, ", %s:%s='", attributes[i + 1], attributes[i]);
Packit 423ecb
	    else
Packit 423ecb
		fprintf(stdout, ", %s='", attributes[i]);
Packit 423ecb
	    fprintf(stdout, "%.4s...', %d", attributes[i + 3],
Packit 423ecb
		    (int)(attributes[i + 4] - attributes[i + 3]));
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    fprintf(stdout, ")\n");
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * endElementDebug:
Packit 423ecb
 * @ctxt:  An XML parser context
Packit 423ecb
 * @name:  The element name
Packit 423ecb
 *
Packit 423ecb
 * called when the end of an element has been detected.
Packit 423ecb
 */
Packit 423ecb
static void
Packit 423ecb
endElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
Packit 423ecb
                  const xmlChar *localname,
Packit 423ecb
                  const xmlChar *prefix,
Packit 423ecb
                  const xmlChar *URI)
Packit 423ecb
{
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (quiet)
Packit 423ecb
	return;
Packit 423ecb
    fprintf(stdout, "SAX.endElementNs(%s", (char *) localname);
Packit 423ecb
    if (prefix == NULL)
Packit 423ecb
	fprintf(stdout, ", NULL");
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, ", %s", (char *) prefix);
Packit 423ecb
    if (URI == NULL)
Packit 423ecb
	fprintf(stdout, ", NULL)\n");
Packit 423ecb
    else
Packit 423ecb
	fprintf(stdout, ", '%s')\n", (char *) URI);
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static xmlSAXHandler debugSAX2HandlerStruct = {
Packit 423ecb
    internalSubsetDebug,
Packit 423ecb
    isStandaloneDebug,
Packit 423ecb
    hasInternalSubsetDebug,
Packit 423ecb
    hasExternalSubsetDebug,
Packit 423ecb
    resolveEntityDebug,
Packit 423ecb
    getEntityDebug,
Packit 423ecb
    entityDeclDebug,
Packit 423ecb
    notationDeclDebug,
Packit 423ecb
    attributeDeclDebug,
Packit 423ecb
    elementDeclDebug,
Packit 423ecb
    unparsedEntityDeclDebug,
Packit 423ecb
    setDocumentLocatorDebug,
Packit 423ecb
    startDocumentDebug,
Packit 423ecb
    endDocumentDebug,
Packit 423ecb
    NULL,
Packit 423ecb
    NULL,
Packit 423ecb
    referenceDebug,
Packit 423ecb
    charactersDebug,
Packit 423ecb
    ignorableWhitespaceDebug,
Packit 423ecb
    processingInstructionDebug,
Packit 423ecb
    commentDebug,
Packit 423ecb
    warningDebug,
Packit 423ecb
    errorDebug,
Packit 423ecb
    fatalErrorDebug,
Packit 423ecb
    getParameterEntityDebug,
Packit 423ecb
    cdataBlockDebug,
Packit 423ecb
    externalSubsetDebug,
Packit 423ecb
    XML_SAX2_MAGIC,
Packit 423ecb
    NULL,
Packit 423ecb
    startElementNsDebug,
Packit 423ecb
    endElementNsDebug,
Packit 423ecb
    NULL
Packit 423ecb
};
Packit 423ecb
Packit 423ecb
static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct;
Packit 423ecb
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *				Debug					*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
Packit 423ecb
static void
Packit 423ecb
parseAndPrintFile(char *filename) {
Packit 423ecb
    int res;
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_PUSH_ENABLED
Packit 423ecb
    if (push) {
Packit 423ecb
	FILE *f;
Packit 423ecb
Packit 423ecb
        if ((!quiet) && (!nonull)) {
Packit 423ecb
	    /*
Packit 423ecb
	     * Empty callbacks for checking
Packit 423ecb
	     */
Packit 423ecb
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
Packit 423ecb
	    f = fopen(filename, "rb");
Packit 423ecb
#else
Packit 423ecb
	    f = fopen(filename, "r");
Packit 423ecb
#endif
Packit 423ecb
	    if (f != NULL) {
Packit 423ecb
		int ret;
Packit 423ecb
		char chars[10];
Packit 423ecb
		xmlParserCtxtPtr ctxt;
Packit 423ecb
Packit 423ecb
		ret = fread(chars, 1, 4, f);
Packit 423ecb
		if (ret > 0) {
Packit 423ecb
		    ctxt = xmlCreatePushParserCtxt(emptySAXHandler, NULL,
Packit 423ecb
				chars, ret, filename);
Packit 423ecb
		    while ((ret = fread(chars, 1, 3, f)) > 0) {
Packit 423ecb
			xmlParseChunk(ctxt, chars, ret, 0);
Packit 423ecb
		    }
Packit 423ecb
		    xmlParseChunk(ctxt, chars, 0, 1);
Packit 423ecb
		    xmlFreeParserCtxt(ctxt);
Packit 423ecb
		}
Packit 423ecb
		fclose(f);
Packit 423ecb
	    } else {
Packit 423ecb
		xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
			"Cannot read file %s\n", filename);
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
	/*
Packit 423ecb
	 * Debug callback
Packit 423ecb
	 */
Packit 423ecb
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
Packit 423ecb
	f = fopen(filename, "rb");
Packit 423ecb
#else
Packit 423ecb
	f = fopen(filename, "r");
Packit 423ecb
#endif
Packit 423ecb
	if (f != NULL) {
Packit 423ecb
	    int ret;
Packit 423ecb
	    char chars[10];
Packit 423ecb
	    xmlParserCtxtPtr ctxt;
Packit 423ecb
Packit 423ecb
	    ret = fread(chars, 1, 4, f);
Packit 423ecb
	    if (ret > 0) {
Packit 423ecb
	        if (sax2)
Packit 423ecb
		    ctxt = xmlCreatePushParserCtxt(debugSAX2Handler, NULL,
Packit 423ecb
				chars, ret, filename);
Packit 423ecb
		else
Packit 423ecb
		    ctxt = xmlCreatePushParserCtxt(debugSAXHandler, NULL,
Packit 423ecb
				chars, ret, filename);
Packit 423ecb
		while ((ret = fread(chars, 1, 3, f)) > 0) {
Packit 423ecb
		    xmlParseChunk(ctxt, chars, ret, 0);
Packit 423ecb
		}
Packit 423ecb
		ret = xmlParseChunk(ctxt, chars, 0, 1);
Packit 423ecb
		xmlFreeParserCtxt(ctxt);
Packit 423ecb
		if (ret != 0) {
Packit 423ecb
		    fprintf(stdout,
Packit 423ecb
		            "xmlSAXUserParseFile returned error %d\n", ret);
Packit 423ecb
		}
Packit 423ecb
	    }
Packit 423ecb
	    fclose(f);
Packit 423ecb
	}
Packit 423ecb
    } else {
Packit 423ecb
#endif /* LIBXML_PUSH_ENABLED */
Packit 423ecb
	if (!speed) {
Packit 423ecb
	    /*
Packit 423ecb
	     * Empty callbacks for checking
Packit 423ecb
	     */
Packit 423ecb
	    if ((!quiet) && (!nonull)) {
Packit 423ecb
		res = xmlSAXUserParseFile(emptySAXHandler, NULL, filename);
Packit 423ecb
		if (res != 0) {
Packit 423ecb
		    fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
Packit 423ecb
		}
Packit 423ecb
	    }
Packit 423ecb
Packit 423ecb
	    /*
Packit 423ecb
	     * Debug callback
Packit 423ecb
	     */
Packit 423ecb
	    callbacks = 0;
Packit 423ecb
	    if (repeat) {
Packit 423ecb
	        int i;
Packit 423ecb
		for (i = 0;i < 99;i++) {
Packit 423ecb
		    if (sax2)
Packit 423ecb
			res = xmlSAXUserParseFile(debugSAX2Handler, NULL,
Packit 423ecb
			                          filename);
Packit 423ecb
		    else
Packit 423ecb
			res = xmlSAXUserParseFile(debugSAXHandler, NULL,
Packit 423ecb
			                          filename);
Packit 423ecb
		}
Packit 423ecb
	    }
Packit 423ecb
	    if (sax2)
Packit 423ecb
	        res = xmlSAXUserParseFile(debugSAX2Handler, NULL, filename);
Packit 423ecb
	    else
Packit 423ecb
		res = xmlSAXUserParseFile(debugSAXHandler, NULL, filename);
Packit 423ecb
	    if (res != 0) {
Packit 423ecb
		fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
Packit 423ecb
	    }
Packit 423ecb
	    if (quiet)
Packit 423ecb
		fprintf(stdout, "%d callbacks generated\n", callbacks);
Packit 423ecb
	} else {
Packit 423ecb
	    /*
Packit 423ecb
	     * test 100x the SAX parse
Packit 423ecb
	     */
Packit 423ecb
	    int i;
Packit 423ecb
Packit 423ecb
	    for (i = 0; i<100;i++)
Packit 423ecb
		res = xmlSAXUserParseFile(emptySAXHandler, NULL, filename);
Packit 423ecb
	    if (res != 0) {
Packit 423ecb
		fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
#ifdef LIBXML_PUSH_ENABLED
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
Packit 423ecb
int main(int argc, char **argv) {
Packit 423ecb
    int i;
Packit 423ecb
    int files = 0;
Packit 423ecb
Packit 423ecb
    LIBXML_TEST_VERSION	/* be safe, plus calls xmlInitParser */
Packit 423ecb
Packit 423ecb
    for (i = 1; i < argc ; i++) {
Packit 423ecb
	if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
Packit 423ecb
	    debug++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
Packit 423ecb
	    copy++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-recover")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--recover")))
Packit 423ecb
	    recovery++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-push")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--push")))
Packit 423ecb
#ifdef LIBXML_PUSH_ENABLED
Packit 423ecb
	    push++;
Packit 423ecb
#else
Packit 423ecb
	    fprintf(stderr,"'push' not enabled in library - ignoring\n");
Packit 423ecb
#endif /* LIBXML_PUSH_ENABLED */
Packit 423ecb
	else if ((!strcmp(argv[i], "-speed")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--speed")))
Packit 423ecb
	    speed++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-timing")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--timing"))) {
Packit 423ecb
	    nonull++;
Packit 423ecb
	    timing++;
Packit 423ecb
	    quiet++;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-repeat")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--repeat"))) {
Packit 423ecb
	    repeat++;
Packit 423ecb
	    quiet++;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-noent")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--noent")))
Packit 423ecb
	    noent++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-quiet")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--quiet")))
Packit 423ecb
	    quiet++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-sax2")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--sax2")))
Packit 423ecb
	    sax2++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-nonull")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--nonull")))
Packit 423ecb
	    nonull++;
Packit 423ecb
    }
Packit 423ecb
    if (noent != 0) xmlSubstituteEntitiesDefault(1);
Packit 423ecb
    for (i = 1; i < argc ; i++) {
Packit 423ecb
	if (argv[i][0] != '-') {
Packit 423ecb
	    if (timing) {
Packit 423ecb
		startTimer();
Packit 423ecb
	    }
Packit 423ecb
	    parseAndPrintFile(argv[i]);
Packit 423ecb
	    if (timing) {
Packit 423ecb
		endTimer("Parsing");
Packit 423ecb
	    }
Packit 423ecb
	    files ++;
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    xmlCleanupParser();
Packit 423ecb
    xmlMemoryDump();
Packit 423ecb
Packit 423ecb
    return(0);
Packit 423ecb
}
Packit 423ecb
#else
Packit 423ecb
int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
Packit 423ecb
    printf("%s : SAX1 parsing support not compiled in\n", argv[0]);
Packit 423ecb
    return(0);
Packit 423ecb
}
Packit 423ecb
#endif /* LIBXML_SAX1_ENABLED */