Blame xmllint.c

Packit 423ecb
/*
Packit 423ecb
 * xmllint.c : a small tester program for XML input.
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
#include <string.h>
Packit 423ecb
#include <stdarg.h>
Packit 423ecb
#include <assert.h>
Packit 423ecb
Packit 423ecb
#ifdef HAVE_SYS_TIME_H
Packit 423ecb
#include <sys/time.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_TIME_H
Packit 423ecb
#include <time.h>
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
#ifdef HAVE_SYS_TIMEB_H
Packit 423ecb
#include <sys/timeb.h>
Packit 423ecb
#endif
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_SYS_MMAN_H
Packit 423ecb
#include <sys/mman.h>
Packit 423ecb
/* seems needed for Solaris */
Packit 423ecb
#ifndef MAP_FAILED
Packit 423ecb
#define MAP_FAILED ((void *) -1)
Packit 423ecb
#endif
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_STDLIB_H
Packit 423ecb
#include <stdlib.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_LIBREADLINE
Packit 423ecb
#include <readline/readline.h>
Packit 423ecb
#ifdef HAVE_LIBHISTORY
Packit 423ecb
#include <readline/history.h>
Packit 423ecb
#endif
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
#include <libxml/xmlmemory.h>
Packit 423ecb
#include <libxml/parser.h>
Packit 423ecb
#include <libxml/parserInternals.h>
Packit 423ecb
#include <libxml/HTMLparser.h>
Packit 423ecb
#include <libxml/HTMLtree.h>
Packit 423ecb
#include <libxml/tree.h>
Packit 423ecb
#include <libxml/xpath.h>
Packit 423ecb
#include <libxml/debugXML.h>
Packit 423ecb
#include <libxml/xmlerror.h>
Packit 423ecb
#ifdef LIBXML_XINCLUDE_ENABLED
Packit 423ecb
#include <libxml/xinclude.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_CATALOG_ENABLED
Packit 423ecb
#include <libxml/catalog.h>
Packit 423ecb
#endif
Packit 423ecb
#include <libxml/globals.h>
Packit 423ecb
#include <libxml/xmlreader.h>
Packit 423ecb
#ifdef LIBXML_SCHEMATRON_ENABLED
Packit 423ecb
#include <libxml/schematron.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
#include <libxml/relaxng.h>
Packit 423ecb
#include <libxml/xmlschemas.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
#include <libxml/pattern.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_C14N_ENABLED
Packit 423ecb
#include <libxml/c14n.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
#include <libxml/xmlsave.h>
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
#ifndef XML_XML_DEFAULT_CATALOG
Packit 423ecb
#define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
typedef enum {
Packit 423ecb
    XMLLINT_RETURN_OK = 0,	/* No error */
Packit 423ecb
    XMLLINT_ERR_UNCLASS = 1,	/* Unclassified */
Packit 423ecb
    XMLLINT_ERR_DTD = 2,	/* Error in DTD */
Packit 423ecb
    XMLLINT_ERR_VALID = 3,	/* Validation error */
Packit 423ecb
    XMLLINT_ERR_RDFILE = 4,	/* CtxtReadFile error */
Packit 423ecb
    XMLLINT_ERR_SCHEMACOMP = 5,	/* Schema compilation */
Packit 423ecb
    XMLLINT_ERR_OUT = 6,	/* Error writing output */
Packit 423ecb
    XMLLINT_ERR_SCHEMAPAT = 7,	/* Error in schema pattern */
Packit 423ecb
    XMLLINT_ERR_RDREGIS = 8,	/* Error in Reader registration */
Packit 423ecb
    XMLLINT_ERR_MEM = 9,	/* Out of memory error */
Packit 423ecb
    XMLLINT_ERR_XPATH = 10	/* XPath evaluation error */
Packit 423ecb
} xmllintReturnCode;
Packit 423ecb
#ifdef LIBXML_DEBUG_ENABLED
Packit 423ecb
static int shell = 0;
Packit 423ecb
static int debugent = 0;
Packit 423ecb
#endif
Packit 423ecb
static int debug = 0;
Packit 423ecb
static int maxmem = 0;
Packit 423ecb
#ifdef LIBXML_TREE_ENABLED
Packit 423ecb
static int copy = 0;
Packit 423ecb
#endif /* LIBXML_TREE_ENABLED */
Packit 423ecb
static int recovery = 0;
Packit 423ecb
static int noent = 0;
Packit 423ecb
static int noenc = 0;
Packit 423ecb
static int noblanks = 0;
Packit 423ecb
static int noout = 0;
Packit 423ecb
static int nowrap = 0;
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
static int format = 0;
Packit 423ecb
static const char *output = NULL;
Packit 423ecb
static int compress = 0;
Packit 423ecb
static int oldout = 0;
Packit 423ecb
#endif /* LIBXML_OUTPUT_ENABLED */
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
static int valid = 0;
Packit 423ecb
static int postvalid = 0;
Packit 423ecb
static char * dtdvalid = NULL;
Packit 423ecb
static char * dtdvalidfpi = NULL;
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
static char * relaxng = NULL;
Packit 423ecb
static xmlRelaxNGPtr relaxngschemas = NULL;
Packit 423ecb
static char * schema = NULL;
Packit 423ecb
static xmlSchemaPtr wxschemas = NULL;
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_SCHEMATRON_ENABLED
Packit 423ecb
static char * schematron = NULL;
Packit 423ecb
static xmlSchematronPtr wxschematron = NULL;
Packit 423ecb
#endif
Packit 423ecb
static int repeat = 0;
Packit 423ecb
static int insert = 0;
Packit 423ecb
#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
Packit 423ecb
static int html = 0;
Packit 423ecb
static int xmlout = 0;
Packit 423ecb
#endif
Packit 423ecb
static int htmlout = 0;
Packit 423ecb
#if defined(LIBXML_HTML_ENABLED)
Packit 423ecb
static int nodefdtd = 0;
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_PUSH_ENABLED
Packit 423ecb
static int push = 0;
Packit 423ecb
static int pushsize = 4096;
Packit 423ecb
#endif /* LIBXML_PUSH_ENABLED */
Packit 423ecb
#ifdef HAVE_MMAP
Packit 423ecb
static int memory = 0;
Packit 423ecb
#endif
Packit 423ecb
static int testIO = 0;
Packit 423ecb
static char *encoding = NULL;
Packit 423ecb
#ifdef LIBXML_XINCLUDE_ENABLED
Packit 423ecb
static int xinclude = 0;
Packit 423ecb
#endif
Packit 423ecb
static int dtdattrs = 0;
Packit 423ecb
static int loaddtd = 0;
Packit 423ecb
static xmllintReturnCode progresult = XMLLINT_RETURN_OK;
Packit 423ecb
static int timing = 0;
Packit 423ecb
static int generate = 0;
Packit 423ecb
static int dropdtd = 0;
Packit 423ecb
#ifdef LIBXML_CATALOG_ENABLED
Packit 423ecb
static int catalogs = 0;
Packit 423ecb
static int nocatalogs = 0;
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_C14N_ENABLED
Packit 423ecb
static int canonical = 0;
Packit 423ecb
static int canonical_11 = 0;
Packit 423ecb
static int exc_canonical = 0;
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
static int stream = 0;
Packit 423ecb
static int walker = 0;
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
static int chkregister = 0;
Packit 423ecb
static int nbregister = 0;
Packit 423ecb
#ifdef LIBXML_SAX1_ENABLED
Packit 423ecb
static int sax1 = 0;
Packit 423ecb
#endif /* LIBXML_SAX1_ENABLED */
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
static const char *pattern = NULL;
Packit 423ecb
static xmlPatternPtr patternc = NULL;
Packit 423ecb
static xmlStreamCtxtPtr patstream = NULL;
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_XPATH_ENABLED
Packit 423ecb
static const char *xpathquery = NULL;
Packit 423ecb
#endif
Packit 423ecb
static int options = XML_PARSE_COMPACT | XML_PARSE_BIG_LINES;
Packit 423ecb
static int sax = 0;
Packit 423ecb
static int oldxml10 = 0;
Packit 423ecb
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *		 Entity loading control and customization.		*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
#define MAX_PATHS 64
Packit 423ecb
#ifdef _WIN32
Packit 423ecb
# define PATH_SEPARATOR ';'
Packit 423ecb
#else
Packit 423ecb
# define PATH_SEPARATOR ':'
Packit 423ecb
#endif
Packit 423ecb
static xmlChar *paths[MAX_PATHS + 1];
Packit 423ecb
static int nbpaths = 0;
Packit 423ecb
static int load_trace = 0;
Packit 423ecb
Packit 423ecb
static
Packit 423ecb
void parsePath(const xmlChar *path) {
Packit 423ecb
    const xmlChar *cur;
Packit 423ecb
Packit 423ecb
    if (path == NULL)
Packit 423ecb
	return;
Packit 423ecb
    while (*path != 0) {
Packit 423ecb
	if (nbpaths >= MAX_PATHS) {
Packit 423ecb
	    fprintf(stderr, "MAX_PATHS reached: too many paths\n");
Packit 423ecb
	    return;
Packit 423ecb
	}
Packit 423ecb
	cur = path;
Packit 423ecb
	while ((*cur == ' ') || (*cur == PATH_SEPARATOR))
Packit 423ecb
	    cur++;
Packit 423ecb
	path = cur;
Packit 423ecb
	while ((*cur != 0) && (*cur != ' ') && (*cur != PATH_SEPARATOR))
Packit 423ecb
	    cur++;
Packit 423ecb
	if (cur != path) {
Packit 423ecb
	    paths[nbpaths] = xmlStrndup(path, cur - path);
Packit 423ecb
	    if (paths[nbpaths] != NULL)
Packit 423ecb
		nbpaths++;
Packit 423ecb
	    path = cur;
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static xmlExternalEntityLoader defaultEntityLoader = NULL;
Packit 423ecb
Packit 423ecb
static xmlParserInputPtr
Packit 423ecb
xmllintExternalEntityLoader(const char *URL, const char *ID,
Packit 423ecb
			     xmlParserCtxtPtr ctxt) {
Packit 423ecb
    xmlParserInputPtr ret;
Packit 423ecb
    warningSAXFunc warning = NULL;
Packit 423ecb
    errorSAXFunc err = NULL;
Packit 423ecb
Packit 423ecb
    int i;
Packit 423ecb
    const char *lastsegment = URL;
Packit 423ecb
    const char *iter = URL;
Packit 423ecb
Packit 423ecb
    if ((nbpaths > 0) && (iter != NULL)) {
Packit 423ecb
	while (*iter != 0) {
Packit 423ecb
	    if (*iter == '/')
Packit 423ecb
		lastsegment = iter + 1;
Packit 423ecb
	    iter++;
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
    if ((ctxt != NULL) && (ctxt->sax != NULL)) {
Packit 423ecb
	warning = ctxt->sax->warning;
Packit 423ecb
	err = ctxt->sax->error;
Packit 423ecb
	ctxt->sax->warning = NULL;
Packit 423ecb
	ctxt->sax->error = NULL;
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
    if (defaultEntityLoader != NULL) {
Packit 423ecb
	ret = defaultEntityLoader(URL, ID, ctxt);
Packit 423ecb
	if (ret != NULL) {
Packit 423ecb
	    if (warning != NULL)
Packit 423ecb
		ctxt->sax->warning = warning;
Packit 423ecb
	    if (err != NULL)
Packit 423ecb
		ctxt->sax->error = err;
Packit 423ecb
	    if (load_trace) {
Packit 423ecb
		fprintf \
Packit 423ecb
			(stderr,
Packit 423ecb
			 "Loaded URL=\"%s\" ID=\"%s\"\n",
Packit 423ecb
			 URL ? URL : "(null)",
Packit 423ecb
			 ID ? ID : "(null)");
Packit 423ecb
	    }
Packit 423ecb
	    return(ret);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    for (i = 0;i < nbpaths;i++) {
Packit 423ecb
	xmlChar *newURL;
Packit 423ecb
Packit 423ecb
	newURL = xmlStrdup((const xmlChar *) paths[i]);
Packit 423ecb
	newURL = xmlStrcat(newURL, (const xmlChar *) "/");
Packit 423ecb
	newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment);
Packit 423ecb
	if (newURL != NULL) {
Packit 423ecb
	    ret = defaultEntityLoader((const char *)newURL, ID, ctxt);
Packit 423ecb
	    if (ret != NULL) {
Packit 423ecb
		if (warning != NULL)
Packit 423ecb
		    ctxt->sax->warning = warning;
Packit 423ecb
		if (err != NULL)
Packit 423ecb
		    ctxt->sax->error = err;
Packit 423ecb
		if (load_trace) {
Packit 423ecb
		    fprintf \
Packit 423ecb
			(stderr,
Packit 423ecb
			 "Loaded URL=\"%s\" ID=\"%s\"\n",
Packit 423ecb
			 newURL,
Packit 423ecb
			 ID ? ID : "(null)");
Packit 423ecb
		}
Packit 423ecb
		xmlFree(newURL);
Packit 423ecb
		return(ret);
Packit 423ecb
	    }
Packit 423ecb
	    xmlFree(newURL);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    if (err != NULL)
Packit 423ecb
        ctxt->sax->error = err;
Packit 423ecb
    if (warning != NULL) {
Packit 423ecb
	ctxt->sax->warning = warning;
Packit 423ecb
	if (URL != NULL)
Packit 423ecb
	    warning(ctxt, "failed to load external entity \"%s\"\n", URL);
Packit 423ecb
	else if (ID != NULL)
Packit 423ecb
	    warning(ctxt, "failed to load external entity \"%s\"\n", ID);
Packit 423ecb
    }
Packit 423ecb
    return(NULL);
Packit 423ecb
}
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 * Memory allocation consumption debugging				*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
Packit 423ecb
static void
Packit 423ecb
OOM(void)
Packit 423ecb
{
Packit 423ecb
    fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem);
Packit 423ecb
    progresult = XMLLINT_ERR_MEM;
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static void
Packit 423ecb
myFreeFunc(void *mem)
Packit 423ecb
{
Packit 423ecb
    xmlMemFree(mem);
Packit 423ecb
}
Packit 423ecb
static void *
Packit 423ecb
myMallocFunc(size_t size)
Packit 423ecb
{
Packit 423ecb
    void *ret;
Packit 423ecb
Packit 423ecb
    ret = xmlMemMalloc(size);
Packit 423ecb
    if (ret != NULL) {
Packit 423ecb
        if (xmlMemUsed() > maxmem) {
Packit 423ecb
            OOM();
Packit 423ecb
            xmlMemFree(ret);
Packit 423ecb
            return (NULL);
Packit 423ecb
        }
Packit 423ecb
    }
Packit 423ecb
    return (ret);
Packit 423ecb
}
Packit 423ecb
static void *
Packit 423ecb
myReallocFunc(void *mem, size_t size)
Packit 423ecb
{
Packit 423ecb
    void *ret;
Packit 423ecb
Packit 423ecb
    ret = xmlMemRealloc(mem, size);
Packit 423ecb
    if (ret != NULL) {
Packit 423ecb
        if (xmlMemUsed() > maxmem) {
Packit 423ecb
            OOM();
Packit 423ecb
            xmlMemFree(ret);
Packit 423ecb
            return (NULL);
Packit 423ecb
        }
Packit 423ecb
    }
Packit 423ecb
    return (ret);
Packit 423ecb
}
Packit 423ecb
static char *
Packit 423ecb
myStrdupFunc(const char *str)
Packit 423ecb
{
Packit 423ecb
    char *ret;
Packit 423ecb
Packit 423ecb
    ret = xmlMemoryStrdup(str);
Packit 423ecb
    if (ret != NULL) {
Packit 423ecb
        if (xmlMemUsed() > maxmem) {
Packit 423ecb
            OOM();
Packit 423ecb
            xmlFree(ret);
Packit 423ecb
            return (NULL);
Packit 423ecb
        }
Packit 423ecb
    }
Packit 423ecb
    return (ret);
Packit 423ecb
}
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 * Internal timing routines to remove the necessity to have		*
Packit 423ecb
 * unix-specific function calls.					*
Packit 423ecb
 *									*
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 LIBXML_ATTR_FORMAT(1,2)
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 LIBXML_ATTR_FORMAT(1,2)
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 LIBXML_ATTR_FORMAT(1,2)
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_list ap;
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");
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
 *			HTML ouput					*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
static char buffer[50000];
Packit 423ecb
Packit 423ecb
static void
Packit 423ecb
xmlHTMLEncodeSend(void) {
Packit 423ecb
    char *result;
Packit 423ecb
Packit 423ecb
    result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer);
Packit 423ecb
    if (result) {
Packit 423ecb
	xmlGenericError(xmlGenericErrorContext, "%s", result);
Packit 423ecb
	xmlFree(result);
Packit 423ecb
    }
Packit 423ecb
    buffer[0] = 0;
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * xmlHTMLPrintFileInfo:
Packit 423ecb
 * @input:  an xmlParserInputPtr input
Packit 423ecb
 *
Packit 423ecb
 * Displays the associated file and line informations for the current input
Packit 423ecb
 */
Packit 423ecb
Packit 423ecb
static void
Packit 423ecb
xmlHTMLPrintFileInfo(xmlParserInputPtr input) {
Packit 423ecb
    int len;
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "

");

Packit 423ecb
Packit 423ecb
    len = strlen(buffer);
Packit 423ecb
    if (input != NULL) {
Packit 423ecb
	if (input->filename) {
Packit 423ecb
	    snprintf(&buffer[len], sizeof(buffer) - len, "%s:%d: ", input->filename,
Packit 423ecb
		    input->line);
Packit 423ecb
	} else {
Packit 423ecb
	    snprintf(&buffer[len], sizeof(buffer) - len, "Entity: line %d: ", input->line);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * xmlHTMLPrintFileContext:
Packit 423ecb
 * @input:  an xmlParserInputPtr input
Packit 423ecb
 *
Packit 423ecb
 * Displays current context within the input content for error tracking
Packit 423ecb
 */
Packit 423ecb
Packit 423ecb
static void
Packit 423ecb
xmlHTMLPrintFileContext(xmlParserInputPtr input) {
Packit 423ecb
    const xmlChar *cur, *base;
Packit 423ecb
    int len;
Packit 423ecb
    int n;
Packit 423ecb
Packit 423ecb
    if (input == NULL) return;
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "
\n");
Packit 423ecb
    cur = input->cur;
Packit 423ecb
    base = input->base;
Packit 423ecb
    while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
Packit 423ecb
	cur--;
Packit 423ecb
    }
Packit 423ecb
    n = 0;
Packit 423ecb
    while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
Packit 423ecb
        cur--;
Packit 423ecb
    if ((*cur == '\n') || (*cur == '\r')) cur++;
Packit 423ecb
    base = cur;
Packit 423ecb
    n = 0;
Packit 423ecb
    while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
Packit 423ecb
	len = strlen(buffer);
Packit 423ecb
        snprintf(&buffer[len], sizeof(buffer) - len, "%c",
Packit 423ecb
		    (unsigned char) *cur++);
Packit 423ecb
	n++;
Packit 423ecb
    }
Packit 423ecb
    len = strlen(buffer);
Packit 423ecb
    snprintf(&buffer[len], sizeof(buffer) - len, "\n");
Packit 423ecb
    cur = input->cur;
Packit 423ecb
    while ((*cur == '\n') || (*cur == '\r'))
Packit 423ecb
	cur--;
Packit 423ecb
    n = 0;
Packit 423ecb
    while ((cur != base) && (n++ < 80)) {
Packit 423ecb
	len = strlen(buffer);
Packit 423ecb
        snprintf(&buffer[len], sizeof(buffer) - len, " ");
Packit 423ecb
        base++;
Packit 423ecb
    }
Packit 423ecb
    len = strlen(buffer);
Packit 423ecb
    snprintf(&buffer[len], sizeof(buffer) - len, "^\n");
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "");
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * xmlHTMLError:
Packit 423ecb
 * @ctx:  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 an error messages, gives file, line, position and
Packit 423ecb
 * extra parameters.
Packit 423ecb
 */
Packit 423ecb
static void XMLCDECL LIBXML_ATTR_FORMAT(2,3)
Packit 423ecb
xmlHTMLError(void *ctx, const char *msg, ...)
Packit 423ecb
{
Packit 423ecb
    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
Packit 423ecb
    xmlParserInputPtr input;
Packit 423ecb
    va_list args;
Packit 423ecb
    int len;
Packit 423ecb
Packit 423ecb
    buffer[0] = 0;
Packit 423ecb
    input = ctxt->input;
Packit 423ecb
    if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
Packit 423ecb
        input = ctxt->inputTab[ctxt->inputNr - 2];
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
    xmlHTMLPrintFileInfo(input);
Packit 423ecb
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "error: ");
Packit 423ecb
    va_start(args, msg);
Packit 423ecb
    len = strlen(buffer);
Packit 423ecb
    vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
Packit 423ecb
    va_end(args);
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "

\n");
Packit 423ecb
Packit 423ecb
    xmlHTMLPrintFileContext(input);
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * xmlHTMLWarning:
Packit 423ecb
 * @ctx:  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 LIBXML_ATTR_FORMAT(2,3)
Packit 423ecb
xmlHTMLWarning(void *ctx, const char *msg, ...)
Packit 423ecb
{
Packit 423ecb
    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
Packit 423ecb
    xmlParserInputPtr input;
Packit 423ecb
    va_list args;
Packit 423ecb
    int len;
Packit 423ecb
Packit 423ecb
    buffer[0] = 0;
Packit 423ecb
    input = ctxt->input;
Packit 423ecb
    if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
Packit 423ecb
        input = ctxt->inputTab[ctxt->inputNr - 2];
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
Packit 423ecb
    xmlHTMLPrintFileInfo(input);
Packit 423ecb
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "warning: ");
Packit 423ecb
    va_start(args, msg);
Packit 423ecb
    len = strlen(buffer);
Packit 423ecb
    vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
Packit 423ecb
    va_end(args);
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "

\n");
Packit 423ecb
Packit 423ecb
    xmlHTMLPrintFileContext(input);
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * xmlHTMLValidityError:
Packit 423ecb
 * @ctx:  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 an validity error messages, gives file,
Packit 423ecb
 * line, position and extra parameters.
Packit 423ecb
 */
Packit 423ecb
static void XMLCDECL LIBXML_ATTR_FORMAT(2,3)
Packit 423ecb
xmlHTMLValidityError(void *ctx, const char *msg, ...)
Packit 423ecb
{
Packit 423ecb
    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
Packit 423ecb
    xmlParserInputPtr input;
Packit 423ecb
    va_list args;
Packit 423ecb
    int len;
Packit 423ecb
Packit 423ecb
    buffer[0] = 0;
Packit 423ecb
    input = ctxt->input;
Packit 423ecb
    if ((input->filename == NULL) && (ctxt->inputNr > 1))
Packit 423ecb
        input = ctxt->inputTab[ctxt->inputNr - 2];
Packit 423ecb
Packit 423ecb
    xmlHTMLPrintFileInfo(input);
Packit 423ecb
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "validity error: ");
Packit 423ecb
    len = strlen(buffer);
Packit 423ecb
    va_start(args, msg);
Packit 423ecb
    vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
Packit 423ecb
    va_end(args);
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "

\n");
Packit 423ecb
Packit 423ecb
    xmlHTMLPrintFileContext(input);
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
    progresult = XMLLINT_ERR_VALID;
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/**
Packit 423ecb
 * xmlHTMLValidityWarning:
Packit 423ecb
 * @ctx:  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 validity warning messages, gives file, line,
Packit 423ecb
 * position and extra parameters.
Packit 423ecb
 */
Packit 423ecb
static void XMLCDECL LIBXML_ATTR_FORMAT(2,3)
Packit 423ecb
xmlHTMLValidityWarning(void *ctx, const char *msg, ...)
Packit 423ecb
{
Packit 423ecb
    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
Packit 423ecb
    xmlParserInputPtr input;
Packit 423ecb
    va_list args;
Packit 423ecb
    int len;
Packit 423ecb
Packit 423ecb
    buffer[0] = 0;
Packit 423ecb
    input = ctxt->input;
Packit 423ecb
    if ((input->filename == NULL) && (ctxt->inputNr > 1))
Packit 423ecb
        input = ctxt->inputTab[ctxt->inputNr - 2];
Packit 423ecb
Packit 423ecb
    xmlHTMLPrintFileInfo(input);
Packit 423ecb
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "validity warning: ");
Packit 423ecb
    va_start(args, msg);
Packit 423ecb
    len = strlen(buffer);
Packit 423ecb
    vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
Packit 423ecb
    va_end(args);
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
    xmlGenericError(xmlGenericErrorContext, "

\n");
Packit 423ecb
Packit 423ecb
    xmlHTMLPrintFileContext(input);
Packit 423ecb
    xmlHTMLEncodeSend();
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *			Shell Interface					*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
#ifdef LIBXML_DEBUG_ENABLED
Packit 423ecb
#ifdef LIBXML_XPATH_ENABLED
Packit 423ecb
/**
Packit 423ecb
 * xmlShellReadline:
Packit 423ecb
 * @prompt:  the prompt value
Packit 423ecb
 *
Packit 423ecb
 * Read a string
Packit 423ecb
 *
Packit 423ecb
 * Returns a pointer to it or NULL on EOF the caller is expected to
Packit 423ecb
 *     free the returned string.
Packit 423ecb
 */
Packit 423ecb
static char *
Packit 423ecb
xmlShellReadline(char *prompt) {
Packit 423ecb
#ifdef HAVE_LIBREADLINE
Packit 423ecb
    char *line_read;
Packit 423ecb
Packit 423ecb
    /* Get a line from the user. */
Packit 423ecb
    line_read = readline (prompt);
Packit 423ecb
Packit 423ecb
    /* If the line has any text in it, save it on the history. */
Packit 423ecb
    if (line_read && *line_read)
Packit 423ecb
	add_history (line_read);
Packit 423ecb
Packit 423ecb
    return (line_read);
Packit 423ecb
#else
Packit 423ecb
    char line_read[501];
Packit 423ecb
    char *ret;
Packit 423ecb
    int len;
Packit 423ecb
Packit 423ecb
    if (prompt != NULL)
Packit 423ecb
	fprintf(stdout, "%s", prompt);
Packit 423ecb
    fflush(stdout);
Packit 423ecb
    if (!fgets(line_read, 500, stdin))
Packit 423ecb
        return(NULL);
Packit 423ecb
    line_read[500] = 0;
Packit 423ecb
    len = strlen(line_read);
Packit 423ecb
    ret = (char *) malloc(len + 1);
Packit 423ecb
    if (ret != NULL) {
Packit 423ecb
	memcpy (ret, line_read, len + 1);
Packit 423ecb
    }
Packit 423ecb
    return(ret);
Packit 423ecb
#endif
Packit 423ecb
}
Packit 423ecb
#endif /* LIBXML_XPATH_ENABLED */
Packit 423ecb
#endif /* LIBXML_DEBUG_ENABLED */
Packit 423ecb
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *			I/O Interfaces					*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
Packit 423ecb
static int myRead(FILE *f, char * buf, int len) {
Packit 423ecb
    return(fread(buf, 1, len, f));
Packit 423ecb
}
Packit 423ecb
static void myClose(FILE *f) {
Packit 423ecb
  if (f != stdin) {
Packit 423ecb
    fclose(f);
Packit 423ecb
  }
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *			SAX based tests					*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
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
    XML_SAX2_MAGIC,
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
static int callbacks;
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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
    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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 (noout)
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 out[40];
Packit 423ecb
    int i;
Packit 423ecb
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (noout)
Packit 423ecb
	return;
Packit 423ecb
    for (i = 0;(i
Packit 423ecb
	out[i] = ch[i];
Packit 423ecb
    out[i] = 0;
Packit 423ecb
Packit 423ecb
    fprintf(stdout, "SAX.characters(%s, %d)\n", out, 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 (noout)
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 out[40];
Packit 423ecb
    int i;
Packit 423ecb
Packit 423ecb
    callbacks++;
Packit 423ecb
    if (noout)
Packit 423ecb
	return;
Packit 423ecb
    for (i = 0;(i
Packit 423ecb
	out[i] = ch[i];
Packit 423ecb
    out[i] = 0;
Packit 423ecb
    fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", out, 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 (noout)
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 (noout)
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 (noout)
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 LIBXML_ATTR_FORMAT(2,3)
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 (noout)
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 LIBXML_ATTR_FORMAT(2,3)
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 (noout)
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 LIBXML_ATTR_FORMAT(2,3)
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 (noout)
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 (noout)
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 (noout)
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
static void
Packit 423ecb
testSAX(const char *filename) {
Packit 423ecb
    xmlSAXHandlerPtr handler;
Packit 423ecb
    const char *user_data = "user_data"; /* mostly for debugging */
Packit 423ecb
    xmlParserInputBufferPtr buf = NULL;
Packit 423ecb
    xmlParserInputPtr inputStream;
Packit 423ecb
    xmlParserCtxtPtr ctxt = NULL;
Packit 423ecb
    xmlSAXHandlerPtr old_sax = NULL;
Packit 423ecb
Packit 423ecb
    callbacks = 0;
Packit 423ecb
Packit 423ecb
    if (noout) {
Packit 423ecb
        handler = emptySAXHandler;
Packit 423ecb
#ifdef LIBXML_SAX1_ENABLED
Packit 423ecb
    } else if (sax1) {
Packit 423ecb
        handler = debugSAXHandler;
Packit 423ecb
#endif
Packit 423ecb
    } else {
Packit 423ecb
        handler = debugSAX2Handler;
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
    /*
Packit 423ecb
     * it's not the simplest code but the most generic in term of I/O
Packit 423ecb
     */
Packit 423ecb
    buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);
Packit 423ecb
    if (buf == NULL) {
Packit 423ecb
        goto error;
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
    if (wxschemas != NULL) {
Packit 423ecb
        int ret;
Packit 423ecb
	xmlSchemaValidCtxtPtr vctxt;
Packit 423ecb
Packit 423ecb
	vctxt = xmlSchemaNewValidCtxt(wxschemas);
Packit 423ecb
	xmlSchemaSetValidErrors(vctxt,
Packit 423ecb
		(xmlSchemaValidityErrorFunc) fprintf,
Packit 423ecb
		(xmlSchemaValidityWarningFunc) fprintf,
Packit 423ecb
		stderr);
Packit 423ecb
	xmlSchemaValidateSetFilename(vctxt, filename);
Packit 423ecb
Packit 423ecb
	ret = xmlSchemaValidateStream(vctxt, buf, 0, handler,
Packit 423ecb
	                              (void *)user_data);
Packit 423ecb
	if (repeat == 0) {
Packit 423ecb
	    if (ret == 0) {
Packit 423ecb
		fprintf(stderr, "%s validates\n", filename);
Packit 423ecb
	    } else if (ret > 0) {
Packit 423ecb
		fprintf(stderr, "%s fails to validate\n", filename);
Packit 423ecb
		progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	    } else {
Packit 423ecb
		fprintf(stderr, "%s validation generated an internal error\n",
Packit 423ecb
		       filename);
Packit 423ecb
		progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
	xmlSchemaFreeValidCtxt(vctxt);
Packit 423ecb
    } else
Packit 423ecb
#endif
Packit 423ecb
    {
Packit 423ecb
	/*
Packit 423ecb
	 * Create the parser context amd hook the input
Packit 423ecb
	 */
Packit 423ecb
	ctxt = xmlNewParserCtxt();
Packit 423ecb
	if (ctxt == NULL) {
Packit 423ecb
	    xmlFreeParserInputBuffer(buf);
Packit 423ecb
	    goto error;
Packit 423ecb
	}
Packit 423ecb
	old_sax = ctxt->sax;
Packit 423ecb
	ctxt->sax = handler;
Packit 423ecb
	ctxt->userData = (void *) user_data;
Packit 423ecb
	inputStream = xmlNewIOInputStream(ctxt, buf, XML_CHAR_ENCODING_NONE);
Packit 423ecb
	if (inputStream == NULL) {
Packit 423ecb
	    xmlFreeParserInputBuffer(buf);
Packit 423ecb
	    goto error;
Packit 423ecb
	}
Packit 423ecb
	inputPush(ctxt, inputStream);
Packit 423ecb
Packit 423ecb
	/* do the parsing */
Packit 423ecb
	xmlParseDocument(ctxt);
Packit 423ecb
Packit 423ecb
	if (ctxt->myDoc != NULL) {
Packit 423ecb
	    fprintf(stderr, "SAX generated a doc !\n");
Packit 423ecb
	    xmlFreeDoc(ctxt->myDoc);
Packit 423ecb
	    ctxt->myDoc = NULL;
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
error:
Packit 423ecb
    if (ctxt != NULL) {
Packit 423ecb
        ctxt->sax = old_sax;
Packit 423ecb
        xmlFreeParserCtxt(ctxt);
Packit 423ecb
    }
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *			Stream Test processing				*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
static void processNode(xmlTextReaderPtr reader) {
Packit 423ecb
    const xmlChar *name, *value;
Packit 423ecb
    int type, empty;
Packit 423ecb
Packit 423ecb
    type = xmlTextReaderNodeType(reader);
Packit 423ecb
    empty = xmlTextReaderIsEmptyElement(reader);
Packit 423ecb
Packit 423ecb
    if (debug) {
Packit 423ecb
	name = xmlTextReaderConstName(reader);
Packit 423ecb
	if (name == NULL)
Packit 423ecb
	    name = BAD_CAST "--";
Packit 423ecb
Packit 423ecb
	value = xmlTextReaderConstValue(reader);
Packit 423ecb
Packit 423ecb
Packit 423ecb
	printf("%d %d %s %d %d",
Packit 423ecb
		xmlTextReaderDepth(reader),
Packit 423ecb
		type,
Packit 423ecb
		name,
Packit 423ecb
		empty,
Packit 423ecb
		xmlTextReaderHasValue(reader));
Packit 423ecb
	if (value == NULL)
Packit 423ecb
	    printf("\n");
Packit 423ecb
	else {
Packit 423ecb
	    printf(" %s\n", value);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
    if (patternc) {
Packit 423ecb
        xmlChar *path = NULL;
Packit 423ecb
        int match = -1;
Packit 423ecb
Packit 423ecb
	if (type == XML_READER_TYPE_ELEMENT) {
Packit 423ecb
	    /* do the check only on element start */
Packit 423ecb
	    match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader));
Packit 423ecb
Packit 423ecb
	    if (match) {
Packit 423ecb
#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
Packit 423ecb
		path = xmlGetNodePath(xmlTextReaderCurrentNode(reader));
Packit 423ecb
		printf("Node %s matches pattern %s\n", path, pattern);
Packit 423ecb
#else
Packit 423ecb
                printf("Node %s matches pattern %s\n",
Packit 423ecb
                       xmlTextReaderConstName(reader), pattern);
Packit 423ecb
#endif
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
	if (patstream != NULL) {
Packit 423ecb
	    int ret;
Packit 423ecb
Packit 423ecb
	    if (type == XML_READER_TYPE_ELEMENT) {
Packit 423ecb
		ret = xmlStreamPush(patstream,
Packit 423ecb
		                    xmlTextReaderConstLocalName(reader),
Packit 423ecb
				    xmlTextReaderConstNamespaceUri(reader));
Packit 423ecb
		if (ret < 0) {
Packit 423ecb
		    fprintf(stderr, "xmlStreamPush() failure\n");
Packit 423ecb
                    xmlFreeStreamCtxt(patstream);
Packit 423ecb
		    patstream = NULL;
Packit 423ecb
		} else if (ret != match) {
Packit 423ecb
#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
Packit 423ecb
		    if (path == NULL) {
Packit 423ecb
		        path = xmlGetNodePath(
Packit 423ecb
		                       xmlTextReaderCurrentNode(reader));
Packit 423ecb
		    }
Packit 423ecb
#endif
Packit 423ecb
		    fprintf(stderr,
Packit 423ecb
		            "xmlPatternMatch and xmlStreamPush disagree\n");
Packit 423ecb
                    if (path != NULL)
Packit 423ecb
                        fprintf(stderr, "  pattern %s node %s\n",
Packit 423ecb
                                pattern, path);
Packit 423ecb
                    else
Packit 423ecb
		        fprintf(stderr, "  pattern %s node %s\n",
Packit 423ecb
			    pattern, xmlTextReaderConstName(reader));
Packit 423ecb
		}
Packit 423ecb
Packit 423ecb
	    }
Packit 423ecb
	    if ((type == XML_READER_TYPE_END_ELEMENT) ||
Packit 423ecb
	        ((type == XML_READER_TYPE_ELEMENT) && (empty))) {
Packit 423ecb
	        ret = xmlStreamPop(patstream);
Packit 423ecb
		if (ret < 0) {
Packit 423ecb
		    fprintf(stderr, "xmlStreamPop() failure\n");
Packit 423ecb
                    xmlFreeStreamCtxt(patstream);
Packit 423ecb
		    patstream = NULL;
Packit 423ecb
		}
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
	if (path != NULL)
Packit 423ecb
	    xmlFree(path);
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static void streamFile(char *filename) {
Packit 423ecb
    xmlTextReaderPtr reader;
Packit 423ecb
    int ret;
Packit 423ecb
#ifdef HAVE_MMAP
Packit 423ecb
    int fd = -1;
Packit 423ecb
    struct stat info;
Packit 423ecb
    const char *base = NULL;
Packit 423ecb
    xmlParserInputBufferPtr input = NULL;
Packit 423ecb
Packit 423ecb
    if (memory) {
Packit 423ecb
	if (stat(filename, &info) < 0)
Packit 423ecb
	    return;
Packit 423ecb
	if ((fd = open(filename, O_RDONLY)) < 0)
Packit 423ecb
	    return;
Packit 423ecb
	base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
Packit 423ecb
	if (base == (void *) MAP_FAILED) {
Packit 423ecb
	    close(fd);
Packit 423ecb
	    fprintf(stderr, "mmap failure for file %s\n", filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_RDFILE;
Packit 423ecb
	    return;
Packit 423ecb
	}
Packit 423ecb
Packit 423ecb
	reader = xmlReaderForMemory(base, info.st_size, filename,
Packit 423ecb
	                            NULL, options);
Packit 423ecb
    } else
Packit 423ecb
#endif
Packit 423ecb
	reader = xmlReaderForFile(filename, NULL, options);
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
    if (pattern != NULL) {
Packit 423ecb
        patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
Packit 423ecb
	if (patternc == NULL) {
Packit 423ecb
	    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
		    "Pattern %s failed to compile\n", pattern);
Packit 423ecb
            progresult = XMLLINT_ERR_SCHEMAPAT;
Packit 423ecb
	    pattern = NULL;
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    if (patternc != NULL) {
Packit 423ecb
        patstream = xmlPatternGetStreamCtxt(patternc);
Packit 423ecb
	if (patstream != NULL) {
Packit 423ecb
	    ret = xmlStreamPush(patstream, NULL, NULL);
Packit 423ecb
	    if (ret < 0) {
Packit 423ecb
		fprintf(stderr, "xmlStreamPush() failure\n");
Packit 423ecb
		xmlFreeStreamCtxt(patstream);
Packit 423ecb
		patstream = NULL;
Packit 423ecb
            }
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
Packit 423ecb
    if (reader != NULL) {
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
	if (valid)
Packit 423ecb
	    xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
Packit 423ecb
	else
Packit 423ecb
#endif /* LIBXML_VALID_ENABLED */
Packit 423ecb
	    if (loaddtd)
Packit 423ecb
		xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1);
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
	if (relaxng != NULL) {
Packit 423ecb
	    if ((timing) && (!repeat)) {
Packit 423ecb
		startTimer();
Packit 423ecb
	    }
Packit 423ecb
	    ret = xmlTextReaderRelaxNGValidate(reader, relaxng);
Packit 423ecb
	    if (ret < 0) {
Packit 423ecb
		xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
			"Relax-NG schema %s failed to compile\n", relaxng);
Packit 423ecb
		progresult = XMLLINT_ERR_SCHEMACOMP;
Packit 423ecb
		relaxng = NULL;
Packit 423ecb
	    }
Packit 423ecb
	    if ((timing) && (!repeat)) {
Packit 423ecb
		endTimer("Compiling the schemas");
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
	if (schema != NULL) {
Packit 423ecb
	    if ((timing) && (!repeat)) {
Packit 423ecb
		startTimer();
Packit 423ecb
	    }
Packit 423ecb
	    ret = xmlTextReaderSchemaValidate(reader, schema);
Packit 423ecb
	    if (ret < 0) {
Packit 423ecb
		xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
			"XSD schema %s failed to compile\n", schema);
Packit 423ecb
		progresult = XMLLINT_ERR_SCHEMACOMP;
Packit 423ecb
		schema = NULL;
Packit 423ecb
	    }
Packit 423ecb
	    if ((timing) && (!repeat)) {
Packit 423ecb
		endTimer("Compiling the schemas");
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
	/*
Packit 423ecb
	 * Process all nodes in sequence
Packit 423ecb
	 */
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	ret = xmlTextReaderRead(reader);
Packit 423ecb
	while (ret == 1) {
Packit 423ecb
	    if ((debug)
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
	        || (patternc)
Packit 423ecb
#endif
Packit 423ecb
	       )
Packit 423ecb
		processNode(reader);
Packit 423ecb
	    ret = xmlTextReaderRead(reader);
Packit 423ecb
	}
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
	    if (relaxng != NULL)
Packit 423ecb
		endTimer("Parsing and validating");
Packit 423ecb
	    else
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
	    if (valid)
Packit 423ecb
		endTimer("Parsing and validating");
Packit 423ecb
	    else
Packit 423ecb
#endif
Packit 423ecb
	    endTimer("Parsing");
Packit 423ecb
	}
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
	if (valid) {
Packit 423ecb
	    if (xmlTextReaderIsValid(reader) != 1) {
Packit 423ecb
		xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
			"Document %s does not validate\n", filename);
Packit 423ecb
		progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
#endif /* LIBXML_VALID_ENABLED */
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
	if ((relaxng != NULL) || (schema != NULL)) {
Packit 423ecb
	    if (xmlTextReaderIsValid(reader) != 1) {
Packit 423ecb
		fprintf(stderr, "%s fails to validate\n", filename);
Packit 423ecb
		progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	    } else {
Packit 423ecb
		fprintf(stderr, "%s validates\n", filename);
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
#endif
Packit 423ecb
	/*
Packit 423ecb
	 * Done, cleanup and status
Packit 423ecb
	 */
Packit 423ecb
	xmlFreeTextReader(reader);
Packit 423ecb
	if (ret != 0) {
Packit 423ecb
	    fprintf(stderr, "%s : failed to parse\n", filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_UNCLASS;
Packit 423ecb
	}
Packit 423ecb
    } else {
Packit 423ecb
	fprintf(stderr, "Unable to open %s\n", filename);
Packit 423ecb
	progresult = XMLLINT_ERR_UNCLASS;
Packit 423ecb
    }
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
    if (patstream != NULL) {
Packit 423ecb
	xmlFreeStreamCtxt(patstream);
Packit 423ecb
	patstream = NULL;
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_MMAP
Packit 423ecb
    if (memory) {
Packit 423ecb
        xmlFreeParserInputBuffer(input);
Packit 423ecb
	munmap((char *) base, info.st_size);
Packit 423ecb
	close(fd);
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static void walkDoc(xmlDocPtr doc) {
Packit 423ecb
    xmlTextReaderPtr reader;
Packit 423ecb
    int ret;
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
    xmlNodePtr root;
Packit 423ecb
    const xmlChar *namespaces[22];
Packit 423ecb
    int i;
Packit 423ecb
    xmlNsPtr ns;
Packit 423ecb
Packit 423ecb
    root = xmlDocGetRootElement(doc);
Packit 423ecb
    if (root == NULL ) {
Packit 423ecb
        xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
                "Document does not have a root element");
Packit 423ecb
        progresult = XMLLINT_ERR_UNCLASS;
Packit 423ecb
        return;
Packit 423ecb
    }
Packit 423ecb
    for (ns = root->nsDef, i = 0;ns != NULL && i < 20;ns=ns->next) {
Packit 423ecb
        namespaces[i++] = ns->href;
Packit 423ecb
        namespaces[i++] = ns->prefix;
Packit 423ecb
    }
Packit 423ecb
    namespaces[i++] = NULL;
Packit 423ecb
    namespaces[i] = NULL;
Packit 423ecb
Packit 423ecb
    if (pattern != NULL) {
Packit 423ecb
        patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict,
Packit 423ecb
	                             0, &namespaces[0]);
Packit 423ecb
	if (patternc == NULL) {
Packit 423ecb
	    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
		    "Pattern %s failed to compile\n", pattern);
Packit 423ecb
            progresult = XMLLINT_ERR_SCHEMAPAT;
Packit 423ecb
	    pattern = NULL;
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    if (patternc != NULL) {
Packit 423ecb
        patstream = xmlPatternGetStreamCtxt(patternc);
Packit 423ecb
	if (patstream != NULL) {
Packit 423ecb
	    ret = xmlStreamPush(patstream, NULL, NULL);
Packit 423ecb
	    if (ret < 0) {
Packit 423ecb
		fprintf(stderr, "xmlStreamPush() failure\n");
Packit 423ecb
		xmlFreeStreamCtxt(patstream);
Packit 423ecb
		patstream = NULL;
Packit 423ecb
            }
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_PATTERN_ENABLED */
Packit 423ecb
    reader = xmlReaderWalker(doc);
Packit 423ecb
    if (reader != NULL) {
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	ret = xmlTextReaderRead(reader);
Packit 423ecb
	while (ret == 1) {
Packit 423ecb
	    if ((debug)
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
	        || (patternc)
Packit 423ecb
#endif
Packit 423ecb
	       )
Packit 423ecb
		processNode(reader);
Packit 423ecb
	    ret = xmlTextReaderRead(reader);
Packit 423ecb
	}
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    endTimer("walking through the doc");
Packit 423ecb
	}
Packit 423ecb
	xmlFreeTextReader(reader);
Packit 423ecb
	if (ret != 0) {
Packit 423ecb
	    fprintf(stderr, "failed to walk through the doc\n");
Packit 423ecb
	    progresult = XMLLINT_ERR_UNCLASS;
Packit 423ecb
	}
Packit 423ecb
    } else {
Packit 423ecb
	fprintf(stderr, "Failed to crate a reader from the document\n");
Packit 423ecb
	progresult = XMLLINT_ERR_UNCLASS;
Packit 423ecb
    }
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
    if (patstream != NULL) {
Packit 423ecb
	xmlFreeStreamCtxt(patstream);
Packit 423ecb
	patstream = NULL;
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
}
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_XPATH_ENABLED
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *			XPath Query                                     *
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
Packit 423ecb
static void doXPathDump(xmlXPathObjectPtr cur) {
Packit 423ecb
    switch(cur->type) {
Packit 423ecb
        case XPATH_NODESET: {
Packit 423ecb
            int i;
Packit 423ecb
            xmlNodePtr node;
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
            xmlSaveCtxtPtr ctxt;
Packit 423ecb
Packit 423ecb
            if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr <= 0)) {
Packit 423ecb
                fprintf(stderr, "XPath set is empty\n");
Packit 423ecb
                progresult = XMLLINT_ERR_XPATH;
Packit 423ecb
                break;
Packit 423ecb
            }
Packit 423ecb
            ctxt = xmlSaveToFd(1, NULL, 0);
Packit 423ecb
            if (ctxt == NULL) {
Packit 423ecb
                fprintf(stderr, "Out of memory for XPath\n");
Packit 423ecb
                progresult = XMLLINT_ERR_MEM;
Packit 423ecb
                return;
Packit 423ecb
            }
Packit 423ecb
            for (i = 0;i < cur->nodesetval->nodeNr;i++) {
Packit 423ecb
                node = cur->nodesetval->nodeTab[i];
Packit 423ecb
                xmlSaveTree(ctxt, node);
Packit 423ecb
            }
Packit 423ecb
            xmlSaveClose(ctxt);
Packit 423ecb
#else
Packit 423ecb
            printf("xpath returned %d nodes\n", cur->nodesetval->nodeNr);
Packit 423ecb
#endif
Packit 423ecb
	    break;
Packit 423ecb
        }
Packit 423ecb
        case XPATH_BOOLEAN:
Packit 423ecb
	    if (cur->boolval) printf("true");
Packit 423ecb
	    else printf("false");
Packit 423ecb
	    break;
Packit 423ecb
        case XPATH_NUMBER:
Packit 423ecb
	    switch (xmlXPathIsInf(cur->floatval)) {
Packit 423ecb
	    case 1:
Packit 423ecb
		printf("Infinity");
Packit 423ecb
		break;
Packit 423ecb
	    case -1:
Packit 423ecb
		printf("-Infinity");
Packit 423ecb
		break;
Packit 423ecb
	    default:
Packit 423ecb
		if (xmlXPathIsNaN(cur->floatval)) {
Packit 423ecb
		    printf("NaN");
Packit 423ecb
		} else {
Packit 423ecb
		    printf("%0g", cur->floatval);
Packit 423ecb
		}
Packit 423ecb
	    }
Packit 423ecb
	    break;
Packit 423ecb
        case XPATH_STRING:
Packit 423ecb
	    printf("%s", (const char *) cur->stringval);
Packit 423ecb
	    break;
Packit 423ecb
        case XPATH_UNDEFINED:
Packit 423ecb
	    fprintf(stderr, "XPath Object is uninitialized\n");
Packit 423ecb
            progresult = XMLLINT_ERR_XPATH;
Packit 423ecb
	    break;
Packit 423ecb
	default:
Packit 423ecb
	    fprintf(stderr, "XPath object of unexpected type\n");
Packit 423ecb
            progresult = XMLLINT_ERR_XPATH;
Packit 423ecb
	    break;
Packit 423ecb
    }
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static void doXPathQuery(xmlDocPtr doc, const char *query) {
Packit 423ecb
    xmlXPathContextPtr ctxt;
Packit 423ecb
    xmlXPathObjectPtr res;
Packit 423ecb
Packit 423ecb
    ctxt = xmlXPathNewContext(doc);
Packit 423ecb
    if (ctxt == NULL) {
Packit 423ecb
        fprintf(stderr, "Out of memory for XPath\n");
Packit 423ecb
        progresult = XMLLINT_ERR_MEM;
Packit 423ecb
        return;
Packit 423ecb
    }
Packit 423ecb
    ctxt->node = (xmlNodePtr) doc;
Packit 423ecb
    res = xmlXPathEval(BAD_CAST query, ctxt);
Packit 423ecb
    xmlXPathFreeContext(ctxt);
Packit 423ecb
Packit 423ecb
    if (res == NULL) {
Packit 423ecb
        fprintf(stderr, "XPath evaluation failure\n");
Packit 423ecb
        progresult = XMLLINT_ERR_XPATH;
Packit 423ecb
        return;
Packit 423ecb
    }
Packit 423ecb
    doXPathDump(res);
Packit 423ecb
    xmlXPathFreeObject(res);
Packit 423ecb
}
Packit 423ecb
#endif /* LIBXML_XPATH_ENABLED */
Packit 423ecb
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *			Tree Test processing				*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
Packit 423ecb
    xmlDocPtr doc = NULL;
Packit 423ecb
#ifdef LIBXML_TREE_ENABLED
Packit 423ecb
    xmlDocPtr tmp;
Packit 423ecb
#endif /* LIBXML_TREE_ENABLED */
Packit 423ecb
Packit 423ecb
    if ((timing) && (!repeat))
Packit 423ecb
	startTimer();
Packit 423ecb
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_TREE_ENABLED
Packit 423ecb
    if (filename == NULL) {
Packit 423ecb
	if (generate) {
Packit 423ecb
	    xmlNodePtr n;
Packit 423ecb
Packit 423ecb
	    doc = xmlNewDoc(BAD_CAST "1.0");
Packit 423ecb
	    n = xmlNewDocNode(doc, NULL, BAD_CAST "info", NULL);
Packit 423ecb
	    xmlNodeSetContent(n, BAD_CAST "abc");
Packit 423ecb
	    xmlDocSetRootElement(doc, n);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_TREE_ENABLED */
Packit 423ecb
#ifdef LIBXML_HTML_ENABLED
Packit 423ecb
#ifdef LIBXML_PUSH_ENABLED
Packit 423ecb
    else if ((html) && (push)) {
Packit 423ecb
        FILE *f;
Packit 423ecb
Packit 423ecb
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
Packit 423ecb
	f = fopen(filename, "rb");
Packit 423ecb
#elif defined(__OS400__)
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 res;
Packit 423ecb
            char chars[4096];
Packit 423ecb
            htmlParserCtxtPtr ctxt;
Packit 423ecb
Packit 423ecb
            res = fread(chars, 1, 4, f);
Packit 423ecb
            if (res > 0) {
Packit 423ecb
                ctxt = htmlCreatePushParserCtxt(NULL, NULL,
Packit 423ecb
                            chars, res, filename, XML_CHAR_ENCODING_NONE);
Packit 423ecb
                xmlCtxtUseOptions(ctxt, options);
Packit 423ecb
                while ((res = fread(chars, 1, pushsize, f)) > 0) {
Packit 423ecb
                    htmlParseChunk(ctxt, chars, res, 0);
Packit 423ecb
                }
Packit 423ecb
                htmlParseChunk(ctxt, chars, 0, 1);
Packit 423ecb
                doc = ctxt->myDoc;
Packit 423ecb
                htmlFreeParserCtxt(ctxt);
Packit 423ecb
            }
Packit 423ecb
            fclose(f);
Packit 423ecb
        }
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_PUSH_ENABLED */
Packit 423ecb
#ifdef HAVE_MMAP
Packit 423ecb
    else if ((html) && (memory)) {
Packit 423ecb
	int fd;
Packit 423ecb
	struct stat info;
Packit 423ecb
	const char *base;
Packit 423ecb
	if (stat(filename, &info) < 0)
Packit 423ecb
	    return;
Packit 423ecb
	if ((fd = open(filename, O_RDONLY)) < 0)
Packit 423ecb
	    return;
Packit 423ecb
	base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
Packit 423ecb
	if (base == (void *) MAP_FAILED) {
Packit 423ecb
	    close(fd);
Packit 423ecb
	    fprintf(stderr, "mmap failure for file %s\n", filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_RDFILE;
Packit 423ecb
	    return;
Packit 423ecb
	}
Packit 423ecb
Packit 423ecb
	doc = htmlReadMemory((char *) base, info.st_size, filename,
Packit 423ecb
	                     NULL, options);
Packit 423ecb
Packit 423ecb
	munmap((char *) base, info.st_size);
Packit 423ecb
	close(fd);
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
    else if (html) {
Packit 423ecb
	doc = htmlReadFile(filename, NULL, options);
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_HTML_ENABLED */
Packit 423ecb
    else {
Packit 423ecb
#ifdef LIBXML_PUSH_ENABLED
Packit 423ecb
	/*
Packit 423ecb
	 * build an XML tree from a string;
Packit 423ecb
	 */
Packit 423ecb
	if (push) {
Packit 423ecb
	    FILE *f;
Packit 423ecb
Packit 423ecb
	    /* '-' Usually means stdin -<sven@zen.org> */
Packit 423ecb
	    if ((filename[0] == '-') && (filename[1] == 0)) {
Packit 423ecb
	      f = stdin;
Packit 423ecb
	    } else {
Packit 423ecb
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
Packit 423ecb
		f = fopen(filename, "rb");
Packit 423ecb
#elif defined(__OS400__)
Packit 423ecb
		f = fopen(filename, "rb");
Packit 423ecb
#else
Packit 423ecb
		f = fopen(filename, "r");
Packit 423ecb
#endif
Packit 423ecb
	    }
Packit 423ecb
	    if (f != NULL) {
Packit 423ecb
		int ret;
Packit 423ecb
	        int res, size = 1024;
Packit 423ecb
	        char chars[1024];
Packit 423ecb
                xmlParserCtxtPtr ctxt;
Packit 423ecb
Packit 423ecb
		/* if (repeat) size = 1024; */
Packit 423ecb
		res = fread(chars, 1, 4, f);
Packit 423ecb
		if (res > 0) {
Packit 423ecb
		    ctxt = xmlCreatePushParserCtxt(NULL, NULL,
Packit 423ecb
		                chars, res, filename);
Packit 423ecb
		    xmlCtxtUseOptions(ctxt, options);
Packit 423ecb
		    while ((res = fread(chars, 1, size, f)) > 0) {
Packit 423ecb
			xmlParseChunk(ctxt, chars, res, 0);
Packit 423ecb
		    }
Packit 423ecb
		    xmlParseChunk(ctxt, chars, 0, 1);
Packit 423ecb
		    doc = ctxt->myDoc;
Packit 423ecb
		    ret = ctxt->wellFormed;
Packit 423ecb
		    xmlFreeParserCtxt(ctxt);
Packit 423ecb
		    if (!ret) {
Packit 423ecb
			xmlFreeDoc(doc);
Packit 423ecb
			doc = NULL;
Packit 423ecb
		    }
Packit 423ecb
	        }
Packit 423ecb
                if (f != stdin)
Packit 423ecb
                    fclose(f);
Packit 423ecb
	    }
Packit 423ecb
	} else
Packit 423ecb
#endif /* LIBXML_PUSH_ENABLED */
Packit 423ecb
        if (testIO) {
Packit 423ecb
	    if ((filename[0] == '-') && (filename[1] == 0)) {
Packit 423ecb
	        doc = xmlReadFd(0, NULL, NULL, options);
Packit 423ecb
	    } else {
Packit 423ecb
	        FILE *f;
Packit 423ecb
Packit 423ecb
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
Packit 423ecb
		f = fopen(filename, "rb");
Packit 423ecb
#elif defined(__OS400__)
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
		    if (rectxt == NULL)
Packit 423ecb
			doc = xmlReadIO((xmlInputReadCallback) myRead,
Packit 423ecb
					(xmlInputCloseCallback) myClose, f,
Packit 423ecb
					filename, NULL, options);
Packit 423ecb
		    else
Packit 423ecb
			doc = xmlCtxtReadIO(rectxt,
Packit 423ecb
			                (xmlInputReadCallback) myRead,
Packit 423ecb
					(xmlInputCloseCallback) myClose, f,
Packit 423ecb
					filename, NULL, options);
Packit 423ecb
		} else
Packit 423ecb
		    doc = NULL;
Packit 423ecb
	    }
Packit 423ecb
	} else if (htmlout) {
Packit 423ecb
	    xmlParserCtxtPtr ctxt;
Packit 423ecb
Packit 423ecb
	    if (rectxt == NULL)
Packit 423ecb
		ctxt = xmlNewParserCtxt();
Packit 423ecb
	    else
Packit 423ecb
	        ctxt = rectxt;
Packit 423ecb
	    if (ctxt == NULL) {
Packit 423ecb
	        doc = NULL;
Packit 423ecb
	    } else {
Packit 423ecb
	        ctxt->sax->error = xmlHTMLError;
Packit 423ecb
	        ctxt->sax->warning = xmlHTMLWarning;
Packit 423ecb
	        ctxt->vctxt.error = xmlHTMLValidityError;
Packit 423ecb
	        ctxt->vctxt.warning = xmlHTMLValidityWarning;
Packit 423ecb
Packit 423ecb
		doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
Packit 423ecb
Packit 423ecb
		if (rectxt == NULL)
Packit 423ecb
		    xmlFreeParserCtxt(ctxt);
Packit 423ecb
	    }
Packit 423ecb
#ifdef HAVE_MMAP
Packit 423ecb
	} else if (memory) {
Packit 423ecb
	    int fd;
Packit 423ecb
	    struct stat info;
Packit 423ecb
	    const char *base;
Packit 423ecb
	    if (stat(filename, &info) < 0)
Packit 423ecb
		return;
Packit 423ecb
	    if ((fd = open(filename, O_RDONLY)) < 0)
Packit 423ecb
		return;
Packit 423ecb
	    base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
Packit 423ecb
	    if (base == (void *) MAP_FAILED) {
Packit 423ecb
	        close(fd);
Packit 423ecb
	        fprintf(stderr, "mmap failure for file %s\n", filename);
Packit 423ecb
		progresult = XMLLINT_ERR_RDFILE;
Packit 423ecb
	        return;
Packit 423ecb
	    }
Packit 423ecb
Packit 423ecb
	    if (rectxt == NULL)
Packit 423ecb
		doc = xmlReadMemory((char *) base, info.st_size,
Packit 423ecb
		                    filename, NULL, options);
Packit 423ecb
	    else
Packit 423ecb
		doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size,
Packit 423ecb
			                filename, NULL, options);
Packit 423ecb
Packit 423ecb
	    munmap((char *) base, info.st_size);
Packit 423ecb
	    close(fd);
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
	} else if (valid) {
Packit 423ecb
	    xmlParserCtxtPtr ctxt = NULL;
Packit 423ecb
Packit 423ecb
	    if (rectxt == NULL)
Packit 423ecb
		ctxt = xmlNewParserCtxt();
Packit 423ecb
	    else
Packit 423ecb
	        ctxt = rectxt;
Packit 423ecb
	    if (ctxt == NULL) {
Packit 423ecb
	        doc = NULL;
Packit 423ecb
	    } else {
Packit 423ecb
		doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
Packit 423ecb
Packit 423ecb
		if (ctxt->valid == 0)
Packit 423ecb
		    progresult = XMLLINT_ERR_RDFILE;
Packit 423ecb
		if (rectxt == NULL)
Packit 423ecb
		    xmlFreeParserCtxt(ctxt);
Packit 423ecb
	    }
Packit 423ecb
#endif /* LIBXML_VALID_ENABLED */
Packit 423ecb
	} else {
Packit 423ecb
	    if (rectxt != NULL)
Packit 423ecb
	        doc = xmlCtxtReadFile(rectxt, filename, NULL, options);
Packit 423ecb
	    else {
Packit 423ecb
#ifdef LIBXML_SAX1_ENABLED
Packit 423ecb
                if (sax1)
Packit 423ecb
		    doc = xmlParseFile(filename);
Packit 423ecb
		else
Packit 423ecb
#endif /* LIBXML_SAX1_ENABLED */
Packit 423ecb
		doc = xmlReadFile(filename, NULL, options);
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
    /*
Packit 423ecb
     * If we don't have a document we might as well give up.  Do we
Packit 423ecb
     * want an error message here?  <sven@zen.org> */
Packit 423ecb
    if (doc == NULL) {
Packit 423ecb
	progresult = XMLLINT_ERR_UNCLASS;
Packit 423ecb
	return;
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
    if ((timing) && (!repeat)) {
Packit 423ecb
	endTimer("Parsing");
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
    /*
Packit 423ecb
     * Remove DOCTYPE nodes
Packit 423ecb
     */
Packit 423ecb
    if (dropdtd) {
Packit 423ecb
	xmlDtdPtr dtd;
Packit 423ecb
Packit 423ecb
	dtd = xmlGetIntSubset(doc);
Packit 423ecb
	if (dtd != NULL) {
Packit 423ecb
	    xmlUnlinkNode((xmlNodePtr)dtd);
Packit 423ecb
	    xmlFreeDtd(dtd);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_XINCLUDE_ENABLED
Packit 423ecb
    if (xinclude) {
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	if (xmlXIncludeProcessFlags(doc, options) < 0)
Packit 423ecb
	    progresult = XMLLINT_ERR_UNCLASS;
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    endTimer("Xinclude processing");
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_XPATH_ENABLED
Packit 423ecb
    if (xpathquery != NULL) {
Packit 423ecb
        doXPathQuery(doc, xpathquery);
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_DEBUG_ENABLED
Packit 423ecb
#ifdef LIBXML_XPATH_ENABLED
Packit 423ecb
    /*
Packit 423ecb
     * shell interaction
Packit 423ecb
     */
Packit 423ecb
    if (shell) {
Packit 423ecb
        xmlXPathOrderDocElems(doc);
Packit 423ecb
        xmlShell(doc, filename, xmlShellReadline, stdout);
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_TREE_ENABLED
Packit 423ecb
    /*
Packit 423ecb
     * test intermediate copy if needed.
Packit 423ecb
     */
Packit 423ecb
    if (copy) {
Packit 423ecb
        tmp = doc;
Packit 423ecb
	if (timing) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	doc = xmlCopyDoc(doc, 1);
Packit 423ecb
	if (timing) {
Packit 423ecb
	    endTimer("Copying");
Packit 423ecb
	}
Packit 423ecb
	if (timing) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	xmlFreeDoc(tmp);
Packit 423ecb
	if (timing) {
Packit 423ecb
	    endTimer("Freeing original");
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_TREE_ENABLED */
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
    if ((insert) && (!html)) {
Packit 423ecb
        const xmlChar* list[256];
Packit 423ecb
	int nb, i;
Packit 423ecb
	xmlNodePtr node;
Packit 423ecb
Packit 423ecb
	if (doc->children != NULL) {
Packit 423ecb
	    node = doc->children;
Packit 423ecb
	    while ((node != NULL) && (node->last == NULL)) node = node->next;
Packit 423ecb
	    if (node != NULL) {
Packit 423ecb
		nb = xmlValidGetValidElements(node->last, NULL, list, 256);
Packit 423ecb
		if (nb < 0) {
Packit 423ecb
		    fprintf(stderr, "could not get valid list of elements\n");
Packit 423ecb
		} else if (nb == 0) {
Packit 423ecb
		    fprintf(stderr, "No element can be inserted under root\n");
Packit 423ecb
		} else {
Packit 423ecb
		    fprintf(stderr, "%d element types can be inserted under root:\n",
Packit 423ecb
		           nb);
Packit 423ecb
		    for (i = 0;i < nb;i++) {
Packit 423ecb
			 fprintf(stderr, "%s\n", (char *) list[i]);
Packit 423ecb
		    }
Packit 423ecb
		}
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
    }else
Packit 423ecb
#endif /* LIBXML_VALID_ENABLED */
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
    if (walker) {
Packit 423ecb
        walkDoc(doc);
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
    if (noout == 0) {
Packit 423ecb
        int ret;
Packit 423ecb
Packit 423ecb
	/*
Packit 423ecb
	 * print it.
Packit 423ecb
	 */
Packit 423ecb
#ifdef LIBXML_DEBUG_ENABLED
Packit 423ecb
	if (!debug) {
Packit 423ecb
#endif
Packit 423ecb
	    if ((timing) && (!repeat)) {
Packit 423ecb
		startTimer();
Packit 423ecb
	    }
Packit 423ecb
#ifdef LIBXML_HTML_ENABLED
Packit 423ecb
            if ((html) && (!xmlout)) {
Packit 423ecb
		if (compress) {
Packit 423ecb
		    htmlSaveFile(output ? output : "-", doc);
Packit 423ecb
		}
Packit 423ecb
		else if (encoding != NULL) {
Packit 423ecb
		    if (format == 1) {
Packit 423ecb
			htmlSaveFileFormat(output ? output : "-", doc, encoding, 1);
Packit 423ecb
		    }
Packit 423ecb
		    else {
Packit 423ecb
			htmlSaveFileFormat(output ? output : "-", doc, encoding, 0);
Packit 423ecb
		    }
Packit 423ecb
		}
Packit 423ecb
		else if (format == 1) {
Packit 423ecb
		    htmlSaveFileFormat(output ? output : "-", doc, NULL, 1);
Packit 423ecb
		}
Packit 423ecb
		else {
Packit 423ecb
		    FILE *out;
Packit 423ecb
		    if (output == NULL)
Packit 423ecb
			out = stdout;
Packit 423ecb
		    else {
Packit 423ecb
			out = fopen(output,"wb");
Packit 423ecb
		    }
Packit 423ecb
		    if (out != NULL) {
Packit 423ecb
			if (htmlDocDump(out, doc) < 0)
Packit 423ecb
			    progresult = XMLLINT_ERR_OUT;
Packit 423ecb
Packit 423ecb
			if (output != NULL)
Packit 423ecb
			    fclose(out);
Packit 423ecb
		    } else {
Packit 423ecb
			fprintf(stderr, "failed to open %s\n", output);
Packit 423ecb
			progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		    }
Packit 423ecb
		}
Packit 423ecb
		if ((timing) && (!repeat)) {
Packit 423ecb
		    endTimer("Saving");
Packit 423ecb
		}
Packit 423ecb
	    } else
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_C14N_ENABLED
Packit 423ecb
            if (canonical) {
Packit 423ecb
	        xmlChar *result = NULL;
Packit 423ecb
		int size;
Packit 423ecb
Packit 423ecb
		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_0, NULL, 1, &result);
Packit 423ecb
		if (size >= 0) {
Packit 423ecb
		    if (write(1, result, size) == -1) {
Packit 423ecb
		        fprintf(stderr, "Can't write data\n");
Packit 423ecb
		    }
Packit 423ecb
		    xmlFree(result);
Packit 423ecb
		} else {
Packit 423ecb
		    fprintf(stderr, "Failed to canonicalize\n");
Packit 423ecb
		    progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		}
Packit 423ecb
	    } else if (canonical_11) {
Packit 423ecb
	        xmlChar *result = NULL;
Packit 423ecb
		int size;
Packit 423ecb
Packit 423ecb
		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_1, NULL, 1, &result);
Packit 423ecb
		if (size >= 0) {
Packit 423ecb
		    if (write(1, result, size) == -1) {
Packit 423ecb
		        fprintf(stderr, "Can't write data\n");
Packit 423ecb
		    }
Packit 423ecb
		    xmlFree(result);
Packit 423ecb
		} else {
Packit 423ecb
		    fprintf(stderr, "Failed to canonicalize\n");
Packit 423ecb
		    progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		}
Packit 423ecb
	    } else
Packit 423ecb
            if (exc_canonical) {
Packit 423ecb
	        xmlChar *result = NULL;
Packit 423ecb
		int size;
Packit 423ecb
Packit 423ecb
		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_EXCLUSIVE_1_0, NULL, 1, &result);
Packit 423ecb
		if (size >= 0) {
Packit 423ecb
		    if (write(1, result, size) == -1) {
Packit 423ecb
		        fprintf(stderr, "Can't write data\n");
Packit 423ecb
		    }
Packit 423ecb
		    xmlFree(result);
Packit 423ecb
		} else {
Packit 423ecb
		    fprintf(stderr, "Failed to canonicalize\n");
Packit 423ecb
		    progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		}
Packit 423ecb
	    } else
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_MMAP
Packit 423ecb
	    if (memory) {
Packit 423ecb
		xmlChar *result;
Packit 423ecb
		int len;
Packit 423ecb
Packit 423ecb
		if (encoding != NULL) {
Packit 423ecb
		    if (format == 1) {
Packit 423ecb
		        xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1);
Packit 423ecb
		    } else {
Packit 423ecb
			xmlDocDumpMemoryEnc(doc, &result, &len, encoding);
Packit 423ecb
		    }
Packit 423ecb
		} else {
Packit 423ecb
		    if (format == 1)
Packit 423ecb
			xmlDocDumpFormatMemory(doc, &result, &len, 1);
Packit 423ecb
		    else
Packit 423ecb
			xmlDocDumpMemory(doc, &result, &len;;
Packit 423ecb
		}
Packit 423ecb
		if (result == NULL) {
Packit 423ecb
		    fprintf(stderr, "Failed to save\n");
Packit 423ecb
		    progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		} else {
Packit 423ecb
		    if (write(1, result, len) == -1) {
Packit 423ecb
		        fprintf(stderr, "Can't write data\n");
Packit 423ecb
		    }
Packit 423ecb
		    xmlFree(result);
Packit 423ecb
		}
Packit 423ecb
Packit 423ecb
	    } else
Packit 423ecb
#endif /* HAVE_MMAP */
Packit 423ecb
	    if (compress) {
Packit 423ecb
		xmlSaveFile(output ? output : "-", doc);
Packit 423ecb
	    } else if (oldout) {
Packit 423ecb
	        if (encoding != NULL) {
Packit 423ecb
		    if (format == 1) {
Packit 423ecb
			ret = xmlSaveFormatFileEnc(output ? output : "-", doc,
Packit 423ecb
						   encoding, 1);
Packit 423ecb
		    }
Packit 423ecb
		    else {
Packit 423ecb
			ret = xmlSaveFileEnc(output ? output : "-", doc,
Packit 423ecb
			                     encoding);
Packit 423ecb
		    }
Packit 423ecb
		    if (ret < 0) {
Packit 423ecb
			fprintf(stderr, "failed save to %s\n",
Packit 423ecb
				output ? output : "-");
Packit 423ecb
			progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		    }
Packit 423ecb
		} else if (format == 1) {
Packit 423ecb
		    ret = xmlSaveFormatFile(output ? output : "-", doc, 1);
Packit 423ecb
		    if (ret < 0) {
Packit 423ecb
			fprintf(stderr, "failed save to %s\n",
Packit 423ecb
				output ? output : "-");
Packit 423ecb
			progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		    }
Packit 423ecb
		} else {
Packit 423ecb
		    FILE *out;
Packit 423ecb
		    if (output == NULL)
Packit 423ecb
			out = stdout;
Packit 423ecb
		    else {
Packit 423ecb
			out = fopen(output,"wb");
Packit 423ecb
		    }
Packit 423ecb
		    if (out != NULL) {
Packit 423ecb
			if (xmlDocDump(out, doc) < 0)
Packit 423ecb
			    progresult = XMLLINT_ERR_OUT;
Packit 423ecb
Packit 423ecb
			if (output != NULL)
Packit 423ecb
			    fclose(out);
Packit 423ecb
		    } else {
Packit 423ecb
			fprintf(stderr, "failed to open %s\n", output);
Packit 423ecb
			progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		    }
Packit 423ecb
		}
Packit 423ecb
	    } else {
Packit 423ecb
	        xmlSaveCtxtPtr ctxt;
Packit 423ecb
		int saveOpts = 0;
Packit 423ecb
Packit 423ecb
                if (format == 1)
Packit 423ecb
		    saveOpts |= XML_SAVE_FORMAT;
Packit 423ecb
                else if (format == 2)
Packit 423ecb
                    saveOpts |= XML_SAVE_WSNONSIG;
Packit 423ecb
Packit 423ecb
#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
Packit 423ecb
                if (xmlout)
Packit 423ecb
                    saveOpts |= XML_SAVE_AS_XML;
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
		if (output == NULL)
Packit 423ecb
		    ctxt = xmlSaveToFd(1, encoding, saveOpts);
Packit 423ecb
		else
Packit 423ecb
		    ctxt = xmlSaveToFilename(output, encoding, saveOpts);
Packit 423ecb
Packit 423ecb
		if (ctxt != NULL) {
Packit 423ecb
		    if (xmlSaveDoc(ctxt, doc) < 0) {
Packit 423ecb
			fprintf(stderr, "failed save to %s\n",
Packit 423ecb
				output ? output : "-");
Packit 423ecb
			progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		    }
Packit 423ecb
		    xmlSaveClose(ctxt);
Packit 423ecb
		} else {
Packit 423ecb
		    progresult = XMLLINT_ERR_OUT;
Packit 423ecb
		}
Packit 423ecb
	    }
Packit 423ecb
	    if ((timing) && (!repeat)) {
Packit 423ecb
		endTimer("Saving");
Packit 423ecb
	    }
Packit 423ecb
#ifdef LIBXML_DEBUG_ENABLED
Packit 423ecb
	} else {
Packit 423ecb
	    FILE *out;
Packit 423ecb
	    if (output == NULL)
Packit 423ecb
	        out = stdout;
Packit 423ecb
	    else {
Packit 423ecb
		out = fopen(output,"wb");
Packit 423ecb
	    }
Packit 423ecb
	    if (out != NULL) {
Packit 423ecb
		xmlDebugDumpDocument(out, doc);
Packit 423ecb
Packit 423ecb
		if (output != NULL)
Packit 423ecb
		    fclose(out);
Packit 423ecb
	    } else {
Packit 423ecb
		fprintf(stderr, "failed to open %s\n", output);
Packit 423ecb
		progresult = XMLLINT_ERR_OUT;
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
#endif
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_OUTPUT_ENABLED */
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
    /*
Packit 423ecb
     * A posteriori validation test
Packit 423ecb
     */
Packit 423ecb
    if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) {
Packit 423ecb
	xmlDtdPtr dtd;
Packit 423ecb
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	if (dtdvalid != NULL)
Packit 423ecb
	    dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid);
Packit 423ecb
	else
Packit 423ecb
	    dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL);
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    endTimer("Parsing DTD");
Packit 423ecb
	}
Packit 423ecb
	if (dtd == NULL) {
Packit 423ecb
	    if (dtdvalid != NULL)
Packit 423ecb
		xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
			"Could not parse DTD %s\n", dtdvalid);
Packit 423ecb
	    else
Packit 423ecb
		xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
			"Could not parse DTD %s\n", dtdvalidfpi);
Packit 423ecb
	    progresult = XMLLINT_ERR_DTD;
Packit 423ecb
	} else {
Packit 423ecb
	    xmlValidCtxtPtr cvp;
Packit 423ecb
Packit 423ecb
	    if ((cvp = xmlNewValidCtxt()) == NULL) {
Packit 423ecb
		xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
			"Couldn't allocate validation context\n");
Packit 423ecb
		exit(-1);
Packit 423ecb
	    }
Packit 423ecb
	    cvp->userData = (void *) stderr;
Packit 423ecb
	    cvp->error    = (xmlValidityErrorFunc) fprintf;
Packit 423ecb
	    cvp->warning  = (xmlValidityWarningFunc) fprintf;
Packit 423ecb
Packit 423ecb
	    if ((timing) && (!repeat)) {
Packit 423ecb
		startTimer();
Packit 423ecb
	    }
Packit 423ecb
	    if (!xmlValidateDtd(cvp, doc, dtd)) {
Packit 423ecb
		if (dtdvalid != NULL)
Packit 423ecb
		    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
			    "Document %s does not validate against %s\n",
Packit 423ecb
			    filename, dtdvalid);
Packit 423ecb
		else
Packit 423ecb
		    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
			    "Document %s does not validate against %s\n",
Packit 423ecb
			    filename, dtdvalidfpi);
Packit 423ecb
		progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	    }
Packit 423ecb
	    if ((timing) && (!repeat)) {
Packit 423ecb
		endTimer("Validating against DTD");
Packit 423ecb
	    }
Packit 423ecb
	    xmlFreeValidCtxt(cvp);
Packit 423ecb
	    xmlFreeDtd(dtd);
Packit 423ecb
	}
Packit 423ecb
    } else if (postvalid) {
Packit 423ecb
	xmlValidCtxtPtr cvp;
Packit 423ecb
Packit 423ecb
	if ((cvp = xmlNewValidCtxt()) == NULL) {
Packit 423ecb
	    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
		    "Couldn't allocate validation context\n");
Packit 423ecb
	    exit(-1);
Packit 423ecb
	}
Packit 423ecb
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	cvp->userData = (void *) stderr;
Packit 423ecb
	cvp->error    = (xmlValidityErrorFunc) fprintf;
Packit 423ecb
	cvp->warning  = (xmlValidityWarningFunc) fprintf;
Packit 423ecb
	if (!xmlValidateDocument(cvp, doc)) {
Packit 423ecb
	    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
		    "Document %s does not validate\n", filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	}
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    endTimer("Validating");
Packit 423ecb
	}
Packit 423ecb
	xmlFreeValidCtxt(cvp);
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_VALID_ENABLED */
Packit 423ecb
#ifdef LIBXML_SCHEMATRON_ENABLED
Packit 423ecb
    if (wxschematron != NULL) {
Packit 423ecb
	xmlSchematronValidCtxtPtr ctxt;
Packit 423ecb
	int ret;
Packit 423ecb
	int flag;
Packit 423ecb
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
Packit 423ecb
	if (debug)
Packit 423ecb
	    flag = XML_SCHEMATRON_OUT_XML;
Packit 423ecb
	else
Packit 423ecb
	    flag = XML_SCHEMATRON_OUT_TEXT;
Packit 423ecb
	if (noout)
Packit 423ecb
	    flag |= XML_SCHEMATRON_OUT_QUIET;
Packit 423ecb
	ctxt = xmlSchematronNewValidCtxt(wxschematron, flag);
Packit 423ecb
#if 0
Packit 423ecb
	xmlSchematronSetValidErrors(ctxt,
Packit 423ecb
		(xmlSchematronValidityErrorFunc) fprintf,
Packit 423ecb
		(xmlSchematronValidityWarningFunc) fprintf,
Packit 423ecb
		stderr);
Packit 423ecb
#endif
Packit 423ecb
	ret = xmlSchematronValidateDoc(ctxt, doc);
Packit 423ecb
	if (ret == 0) {
Packit 423ecb
	    fprintf(stderr, "%s validates\n", filename);
Packit 423ecb
	} else if (ret > 0) {
Packit 423ecb
	    fprintf(stderr, "%s fails to validate\n", filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	} else {
Packit 423ecb
	    fprintf(stderr, "%s validation generated an internal error\n",
Packit 423ecb
		   filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	}
Packit 423ecb
	xmlSchematronFreeValidCtxt(ctxt);
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    endTimer("Validating");
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
    if (relaxngschemas != NULL) {
Packit 423ecb
	xmlRelaxNGValidCtxtPtr ctxt;
Packit 423ecb
	int ret;
Packit 423ecb
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
Packit 423ecb
	ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
Packit 423ecb
	xmlRelaxNGSetValidErrors(ctxt,
Packit 423ecb
		(xmlRelaxNGValidityErrorFunc) fprintf,
Packit 423ecb
		(xmlRelaxNGValidityWarningFunc) fprintf,
Packit 423ecb
		stderr);
Packit 423ecb
	ret = xmlRelaxNGValidateDoc(ctxt, doc);
Packit 423ecb
	if (ret == 0) {
Packit 423ecb
	    fprintf(stderr, "%s validates\n", filename);
Packit 423ecb
	} else if (ret > 0) {
Packit 423ecb
	    fprintf(stderr, "%s fails to validate\n", filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	} else {
Packit 423ecb
	    fprintf(stderr, "%s validation generated an internal error\n",
Packit 423ecb
		   filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	}
Packit 423ecb
	xmlRelaxNGFreeValidCtxt(ctxt);
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    endTimer("Validating");
Packit 423ecb
	}
Packit 423ecb
    } else if (wxschemas != NULL) {
Packit 423ecb
	xmlSchemaValidCtxtPtr ctxt;
Packit 423ecb
	int ret;
Packit 423ecb
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
Packit 423ecb
	ctxt = xmlSchemaNewValidCtxt(wxschemas);
Packit 423ecb
	xmlSchemaSetValidErrors(ctxt,
Packit 423ecb
		(xmlSchemaValidityErrorFunc) fprintf,
Packit 423ecb
		(xmlSchemaValidityWarningFunc) fprintf,
Packit 423ecb
		stderr);
Packit 423ecb
	ret = xmlSchemaValidateDoc(ctxt, doc);
Packit 423ecb
	if (ret == 0) {
Packit 423ecb
	    fprintf(stderr, "%s validates\n", filename);
Packit 423ecb
	} else if (ret > 0) {
Packit 423ecb
	    fprintf(stderr, "%s fails to validate\n", filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	} else {
Packit 423ecb
	    fprintf(stderr, "%s validation generated an internal error\n",
Packit 423ecb
		   filename);
Packit 423ecb
	    progresult = XMLLINT_ERR_VALID;
Packit 423ecb
	}
Packit 423ecb
	xmlSchemaFreeValidCtxt(ctxt);
Packit 423ecb
	if ((timing) && (!repeat)) {
Packit 423ecb
	    endTimer("Validating");
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_DEBUG_ENABLED
Packit 423ecb
#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
Packit 423ecb
    if ((debugent) && (!html))
Packit 423ecb
	xmlDebugDumpEntities(stderr, doc);
Packit 423ecb
#endif
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
    /*
Packit 423ecb
     * free it.
Packit 423ecb
     */
Packit 423ecb
    if ((timing) && (!repeat)) {
Packit 423ecb
	startTimer();
Packit 423ecb
    }
Packit 423ecb
    xmlFreeDoc(doc);
Packit 423ecb
    if ((timing) && (!repeat)) {
Packit 423ecb
	endTimer("Freeing");
Packit 423ecb
    }
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
/************************************************************************
Packit 423ecb
 *									*
Packit 423ecb
 *			Usage and Main					*
Packit 423ecb
 *									*
Packit 423ecb
 ************************************************************************/
Packit 423ecb
Packit 423ecb
static void showVersion(const char *name) {
Packit 423ecb
    fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion);
Packit 423ecb
    fprintf(stderr, "   compiled with: ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_THREAD)) fprintf(stderr, "Threads ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_TREE)) fprintf(stderr, "Tree ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(stderr, "Output ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_PUSH)) fprintf(stderr, "Push ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_READER)) fprintf(stderr, "Reader ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(stderr, "Patterns ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_WRITER)) fprintf(stderr, "Writer ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_SAX1)) fprintf(stderr, "SAXv1 ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_VALID)) fprintf(stderr, "DTDValid ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_ICU)) fprintf(stderr, "ICU ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_DEBUG_MEM)) fprintf(stderr, "MemDebug ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_DEBUG_RUN)) fprintf(stderr, "RunDebug ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(stderr, "Zlib ");
Packit 423ecb
    if (xmlHasFeature(XML_WITH_LZMA)) fprintf(stderr, "Lzma ");
Packit 423ecb
    fprintf(stderr, "\n");
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static void usage(FILE *f, const char *name) {
Packit 423ecb
    fprintf(f, "Usage : %s [options] XMLfiles ...\n", name);
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
    fprintf(f, "\tParse the XML files and output the result of the parsing\n");
Packit 423ecb
#else
Packit 423ecb
    fprintf(f, "\tParse the XML files\n");
Packit 423ecb
#endif /* LIBXML_OUTPUT_ENABLED */
Packit 423ecb
    fprintf(f, "\t--version : display the version of the XML library used\n");
Packit 423ecb
#ifdef LIBXML_DEBUG_ENABLED
Packit 423ecb
    fprintf(f, "\t--debug : dump a debug tree of the in-memory document\n");
Packit 423ecb
    fprintf(f, "\t--shell : run a navigating shell\n");
Packit 423ecb
    fprintf(f, "\t--debugent : debug the entities defined in the document\n");
Packit 423ecb
#else
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
    fprintf(f, "\t--debug : dump the nodes content when using --stream\n");
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_TREE_ENABLED
Packit 423ecb
    fprintf(f, "\t--copy : used to test the internal copy implementation\n");
Packit 423ecb
#endif /* LIBXML_TREE_ENABLED */
Packit 423ecb
    fprintf(f, "\t--recover : output what was parsable on broken XML documents\n");
Packit 423ecb
    fprintf(f, "\t--huge : remove any internal arbitrary parser limits\n");
Packit 423ecb
    fprintf(f, "\t--noent : substitute entity references by their value\n");
Packit 423ecb
    fprintf(f, "\t--noenc : ignore any encoding specified inside the document\n");
Packit 423ecb
    fprintf(f, "\t--noout : don't output the result tree\n");
Packit 423ecb
    fprintf(f, "\t--path 'paths': provide a set of paths for resources\n");
Packit 423ecb
    fprintf(f, "\t--load-trace : print trace of all external entities loaded\n");
Packit 423ecb
    fprintf(f, "\t--nonet : refuse to fetch DTDs or entities over network\n");
Packit 423ecb
    fprintf(f, "\t--nocompact : do not generate compact text nodes\n");
Packit 423ecb
    fprintf(f, "\t--htmlout : output results as HTML\n");
Packit 423ecb
    fprintf(f, "\t--nowrap : do not put HTML doc wrapper\n");
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
    fprintf(f, "\t--valid : validate the document in addition to std well-formed check\n");
Packit 423ecb
    fprintf(f, "\t--postvalid : do a posteriori validation, i.e after parsing\n");
Packit 423ecb
    fprintf(f, "\t--dtdvalid URL : do a posteriori validation against a given DTD\n");
Packit 423ecb
    fprintf(f, "\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n");
Packit 423ecb
#endif /* LIBXML_VALID_ENABLED */
Packit 423ecb
    fprintf(f, "\t--timing : print some timings\n");
Packit 423ecb
    fprintf(f, "\t--output file or -o file: save to a given file\n");
Packit 423ecb
    fprintf(f, "\t--repeat : repeat 100 times, for timing or profiling\n");
Packit 423ecb
    fprintf(f, "\t--insert : ad-hoc test for valid insertions\n");
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
#ifdef HAVE_ZLIB_H
Packit 423ecb
    fprintf(f, "\t--compress : turn on gzip compression of output\n");
Packit 423ecb
#endif
Packit 423ecb
#endif /* LIBXML_OUTPUT_ENABLED */
Packit 423ecb
#ifdef LIBXML_HTML_ENABLED
Packit 423ecb
    fprintf(f, "\t--html : use the HTML parser\n");
Packit 423ecb
    fprintf(f, "\t--xmlout : force to use the XML serializer when using --html\n");
Packit 423ecb
    fprintf(f, "\t--nodefdtd : do not default HTML doctype\n");
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_PUSH_ENABLED
Packit 423ecb
    fprintf(f, "\t--push : use the push mode of the parser\n");
Packit 423ecb
    fprintf(f, "\t--pushsmall : use the push mode of the parser using tiny increments\n");
Packit 423ecb
#endif /* LIBXML_PUSH_ENABLED */
Packit 423ecb
#ifdef HAVE_MMAP
Packit 423ecb
    fprintf(f, "\t--memory : parse from memory\n");
Packit 423ecb
#endif
Packit 423ecb
    fprintf(f, "\t--maxmem nbbytes : limits memory allocation to nbbytes bytes\n");
Packit 423ecb
    fprintf(f, "\t--nowarning : do not emit warnings from parser/validator\n");
Packit 423ecb
    fprintf(f, "\t--noblanks : drop (ignorable?) blanks spaces\n");
Packit 423ecb
    fprintf(f, "\t--nocdata : replace cdata section with text nodes\n");
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
    fprintf(f, "\t--format : reformat/reindent the output\n");
Packit 423ecb
    fprintf(f, "\t--encode encoding : output in the given encoding\n");
Packit 423ecb
    fprintf(f, "\t--dropdtd : remove the DOCTYPE of the input docs\n");
Packit 423ecb
    fprintf(f, "\t--pretty STYLE : pretty-print in a particular style\n");
Packit 423ecb
    fprintf(f, "\t                 0 Do not pretty print\n");
Packit 423ecb
    fprintf(f, "\t                 1 Format the XML content, as --format\n");
Packit 423ecb
    fprintf(f, "\t                 2 Add whitespace inside tags, preserving content\n");
Packit 423ecb
#endif /* LIBXML_OUTPUT_ENABLED */
Packit 423ecb
    fprintf(f, "\t--c14n : save in W3C canonical format v1.0 (with comments)\n");
Packit 423ecb
    fprintf(f, "\t--c14n11 : save in W3C canonical format v1.1 (with comments)\n");
Packit 423ecb
    fprintf(f, "\t--exc-c14n : save in W3C exclusive canonical format (with comments)\n");
Packit 423ecb
#ifdef LIBXML_C14N_ENABLED
Packit 423ecb
#endif /* LIBXML_C14N_ENABLED */
Packit 423ecb
    fprintf(f, "\t--nsclean : remove redundant namespace declarations\n");
Packit 423ecb
    fprintf(f, "\t--testIO : test user I/O support\n");
Packit 423ecb
#ifdef LIBXML_CATALOG_ENABLED
Packit 423ecb
    fprintf(f, "\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n");
Packit 423ecb
    fprintf(f, "\t             otherwise XML Catalogs starting from \n");
Packit 423ecb
    fprintf(f, "\t         %s are activated by default\n", XML_XML_DEFAULT_CATALOG);
Packit 423ecb
    fprintf(f, "\t--nocatalogs: deactivate all catalogs\n");
Packit 423ecb
#endif
Packit 423ecb
    fprintf(f, "\t--auto : generate a small doc on the fly\n");
Packit 423ecb
#ifdef LIBXML_XINCLUDE_ENABLED
Packit 423ecb
    fprintf(f, "\t--xinclude : do XInclude processing\n");
Packit 423ecb
    fprintf(f, "\t--noxincludenode : same but do not generate XInclude nodes\n");
Packit 423ecb
    fprintf(f, "\t--nofixup-base-uris : do not fixup xml:base uris\n");
Packit 423ecb
#endif
Packit 423ecb
    fprintf(f, "\t--loaddtd : fetch external DTD\n");
Packit 423ecb
    fprintf(f, "\t--dtdattr : loaddtd + populate the tree with inherited attributes \n");
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
    fprintf(f, "\t--stream : use the streaming interface to process very large files\n");
Packit 423ecb
    fprintf(f, "\t--walker : create a reader and walk though the resulting doc\n");
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
    fprintf(f, "\t--pattern pattern_value : test the pattern support\n");
Packit 423ecb
#endif
Packit 423ecb
    fprintf(f, "\t--chkregister : verify the node registration code\n");
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
    fprintf(f, "\t--relaxng schema : do RelaxNG validation against the schema\n");
Packit 423ecb
    fprintf(f, "\t--schema schema : do validation against the WXS schema\n");
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_SCHEMATRON_ENABLED
Packit 423ecb
    fprintf(f, "\t--schematron schema : do validation against a schematron\n");
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_SAX1_ENABLED
Packit 423ecb
    fprintf(f, "\t--sax1: use the old SAX1 interfaces for processing\n");
Packit 423ecb
#endif
Packit 423ecb
    fprintf(f, "\t--sax: do not build a tree but work just at the SAX level\n");
Packit 423ecb
    fprintf(f, "\t--oldxml10: use XML-1.0 parsing rules before the 5th edition\n");
Packit 423ecb
#ifdef LIBXML_XPATH_ENABLED
Packit 423ecb
    fprintf(f, "\t--xpath expr: evaluate the XPath expression, imply --noout\n");
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
    fprintf(f, "\nLibxml project home page: http://xmlsoft.org/\n");
Packit 423ecb
    fprintf(f, "To report bugs or get some help check: http://xmlsoft.org/bugs.html\n");
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static void registerNode(xmlNodePtr node)
Packit 423ecb
{
Packit 423ecb
    node->_private = malloc(sizeof(long));
Packit 423ecb
    if (node->_private == NULL) {
Packit 423ecb
        fprintf(stderr, "Out of memory in xmllint:registerNode()\n");
Packit 423ecb
	exit(XMLLINT_ERR_MEM);
Packit 423ecb
    }
Packit 423ecb
    *(long*)node->_private = (long) 0x81726354;
Packit 423ecb
    nbregister++;
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static void deregisterNode(xmlNodePtr node)
Packit 423ecb
{
Packit 423ecb
    assert(node->_private != NULL);
Packit 423ecb
    assert(*(long*)node->_private == (long) 0x81726354);
Packit 423ecb
    free(node->_private);
Packit 423ecb
    nbregister--;
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
int
Packit 423ecb
main(int argc, char **argv) {
Packit 423ecb
    int i, acount;
Packit 423ecb
    int files = 0;
Packit 423ecb
    int version = 0;
Packit 423ecb
    const char* indent;
Packit 423ecb
Packit 423ecb
    if (argc <= 1) {
Packit 423ecb
	usage(stderr, argv[0]);
Packit 423ecb
	return(1);
Packit 423ecb
    }
Packit 423ecb
    LIBXML_TEST_VERSION
Packit 423ecb
    for (i = 1; i < argc ; i++) {
Packit 423ecb
	if (!strcmp(argv[i], "-"))
Packit 423ecb
	    break;
Packit 423ecb
Packit 423ecb
	if (argv[i][0] != '-')
Packit 423ecb
	    continue;
Packit 423ecb
	if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
Packit 423ecb
	    debug++;
Packit 423ecb
	else
Packit 423ecb
#ifdef LIBXML_DEBUG_ENABLED
Packit 423ecb
	if ((!strcmp(argv[i], "-shell")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--shell"))) {
Packit 423ecb
	    shell++;
Packit 423ecb
            noout = 1;
Packit 423ecb
        } else
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_TREE_ENABLED
Packit 423ecb
	if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
Packit 423ecb
	    copy++;
Packit 423ecb
	else
Packit 423ecb
#endif /* LIBXML_TREE_ENABLED */
Packit 423ecb
	if ((!strcmp(argv[i], "-recover")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--recover"))) {
Packit 423ecb
	    recovery++;
Packit 423ecb
	    options |= XML_PARSE_RECOVER;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-huge")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--huge"))) {
Packit 423ecb
	    options |= XML_PARSE_HUGE;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-noent")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--noent"))) {
Packit 423ecb
	    noent++;
Packit 423ecb
	    options |= XML_PARSE_NOENT;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-noenc")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--noenc"))) {
Packit 423ecb
	    noenc++;
Packit 423ecb
	    options |= XML_PARSE_IGNORE_ENC;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-nsclean")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--nsclean"))) {
Packit 423ecb
	    options |= XML_PARSE_NSCLEAN;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-nocdata")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--nocdata"))) {
Packit 423ecb
	    options |= XML_PARSE_NOCDATA;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-nodict")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--nodict"))) {
Packit 423ecb
	    options |= XML_PARSE_NODICT;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-version")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--version"))) {
Packit 423ecb
	    showVersion(argv[0]);
Packit 423ecb
	    version = 1;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-noout")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--noout")))
Packit 423ecb
	    noout++;
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-o")) ||
Packit 423ecb
	         (!strcmp(argv[i], "-output")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--output"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    output = argv[i];
Packit 423ecb
	}
Packit 423ecb
#endif /* LIBXML_OUTPUT_ENABLED */
Packit 423ecb
	else if ((!strcmp(argv[i], "-htmlout")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--htmlout")))
Packit 423ecb
	    htmlout++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-nowrap")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--nowrap")))
Packit 423ecb
	    nowrap++;
Packit 423ecb
#ifdef LIBXML_HTML_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-html")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--html"))) {
Packit 423ecb
	    html++;
Packit 423ecb
        }
Packit 423ecb
	else if ((!strcmp(argv[i], "-xmlout")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--xmlout"))) {
Packit 423ecb
	    xmlout++;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-nodefdtd")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--nodefdtd"))) {
Packit 423ecb
            nodefdtd++;
Packit 423ecb
	    options |= HTML_PARSE_NODEFDTD;
Packit 423ecb
        }
Packit 423ecb
#endif /* LIBXML_HTML_ENABLED */
Packit 423ecb
	else if ((!strcmp(argv[i], "-loaddtd")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--loaddtd"))) {
Packit 423ecb
	    loaddtd++;
Packit 423ecb
	    options |= XML_PARSE_DTDLOAD;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-dtdattr")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--dtdattr"))) {
Packit 423ecb
	    loaddtd++;
Packit 423ecb
	    dtdattrs++;
Packit 423ecb
	    options |= XML_PARSE_DTDATTR;
Packit 423ecb
	}
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-valid")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--valid"))) {
Packit 423ecb
	    valid++;
Packit 423ecb
	    options |= XML_PARSE_DTDVALID;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-postvalid")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--postvalid"))) {
Packit 423ecb
	    postvalid++;
Packit 423ecb
	    loaddtd++;
Packit 423ecb
	    options |= XML_PARSE_DTDLOAD;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-dtdvalid")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--dtdvalid"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    dtdvalid = argv[i];
Packit 423ecb
	    loaddtd++;
Packit 423ecb
	    options |= XML_PARSE_DTDLOAD;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--dtdvalidfpi"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    dtdvalidfpi = argv[i];
Packit 423ecb
	    loaddtd++;
Packit 423ecb
	    options |= XML_PARSE_DTDLOAD;
Packit 423ecb
        }
Packit 423ecb
#endif /* LIBXML_VALID_ENABLED */
Packit 423ecb
	else if ((!strcmp(argv[i], "-dropdtd")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--dropdtd")))
Packit 423ecb
	    dropdtd++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-insert")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--insert")))
Packit 423ecb
	    insert++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-timing")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--timing")))
Packit 423ecb
	    timing++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-auto")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--auto")))
Packit 423ecb
	    generate++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-repeat")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--repeat"))) {
Packit 423ecb
	    if (repeat)
Packit 423ecb
	        repeat *= 10;
Packit 423ecb
	    else
Packit 423ecb
	        repeat = 100;
Packit 423ecb
	}
Packit 423ecb
#ifdef LIBXML_PUSH_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-push")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--push")))
Packit 423ecb
	    push++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-pushsmall")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--pushsmall"))) {
Packit 423ecb
	    push++;
Packit 423ecb
            pushsize = 10;
Packit 423ecb
        }
Packit 423ecb
#endif /* LIBXML_PUSH_ENABLED */
Packit 423ecb
#ifdef HAVE_MMAP
Packit 423ecb
	else if ((!strcmp(argv[i], "-memory")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--memory")))
Packit 423ecb
	    memory++;
Packit 423ecb
#endif
Packit 423ecb
	else if ((!strcmp(argv[i], "-testIO")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--testIO")))
Packit 423ecb
	    testIO++;
Packit 423ecb
#ifdef LIBXML_XINCLUDE_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-xinclude")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--xinclude"))) {
Packit 423ecb
	    xinclude++;
Packit 423ecb
	    options |= XML_PARSE_XINCLUDE;
Packit 423ecb
	}
Packit 423ecb
	else if ((!strcmp(argv[i], "-noxincludenode")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--noxincludenode"))) {
Packit 423ecb
	    xinclude++;
Packit 423ecb
	    options |= XML_PARSE_XINCLUDE;
Packit 423ecb
	    options |= XML_PARSE_NOXINCNODE;
Packit 423ecb
	}
Packit 423ecb
	else if ((!strcmp(argv[i], "-nofixup-base-uris")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--nofixup-base-uris"))) {
Packit 423ecb
	    xinclude++;
Packit 423ecb
	    options |= XML_PARSE_XINCLUDE;
Packit 423ecb
	    options |= XML_PARSE_NOBASEFIX;
Packit 423ecb
	}
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
#ifdef HAVE_ZLIB_H
Packit 423ecb
	else if ((!strcmp(argv[i], "-compress")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--compress"))) {
Packit 423ecb
	    compress++;
Packit 423ecb
	    xmlSetCompressMode(9);
Packit 423ecb
        }
Packit 423ecb
#endif
Packit 423ecb
#endif /* LIBXML_OUTPUT_ENABLED */
Packit 423ecb
	else if ((!strcmp(argv[i], "-nowarning")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--nowarning"))) {
Packit 423ecb
	    xmlGetWarningsDefaultValue = 0;
Packit 423ecb
	    xmlPedanticParserDefault(0);
Packit 423ecb
	    options |= XML_PARSE_NOWARNING;
Packit 423ecb
        }
Packit 423ecb
	else if ((!strcmp(argv[i], "-pedantic")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--pedantic"))) {
Packit 423ecb
	    xmlGetWarningsDefaultValue = 1;
Packit 423ecb
	    xmlPedanticParserDefault(1);
Packit 423ecb
	    options |= XML_PARSE_PEDANTIC;
Packit 423ecb
        }
Packit 423ecb
#ifdef LIBXML_DEBUG_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-debugent")) ||
Packit 423ecb
		 (!strcmp(argv[i], "--debugent"))) {
Packit 423ecb
	    debugent++;
Packit 423ecb
	    xmlParserDebugEntities = 1;
Packit 423ecb
	}
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_C14N_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-c14n")) ||
Packit 423ecb
		 (!strcmp(argv[i], "--c14n"))) {
Packit 423ecb
	    canonical++;
Packit 423ecb
	    options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
Packit 423ecb
	}
Packit 423ecb
	else if ((!strcmp(argv[i], "-c14n11")) ||
Packit 423ecb
		 (!strcmp(argv[i], "--c14n11"))) {
Packit 423ecb
	    canonical_11++;
Packit 423ecb
	    options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
Packit 423ecb
	}
Packit 423ecb
	else if ((!strcmp(argv[i], "-exc-c14n")) ||
Packit 423ecb
		 (!strcmp(argv[i], "--exc-c14n"))) {
Packit 423ecb
	    exc_canonical++;
Packit 423ecb
	    options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
Packit 423ecb
	}
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_CATALOG_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-catalogs")) ||
Packit 423ecb
		 (!strcmp(argv[i], "--catalogs"))) {
Packit 423ecb
	    catalogs++;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-nocatalogs")) ||
Packit 423ecb
		 (!strcmp(argv[i], "--nocatalogs"))) {
Packit 423ecb
	    nocatalogs++;
Packit 423ecb
	}
Packit 423ecb
#endif
Packit 423ecb
	else if ((!strcmp(argv[i], "-encode")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--encode"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    encoding = argv[i];
Packit 423ecb
	    /*
Packit 423ecb
	     * OK it's for testing purposes
Packit 423ecb
	     */
Packit 423ecb
	    xmlAddEncodingAlias("UTF-8", "DVEnc");
Packit 423ecb
        }
Packit 423ecb
	else if ((!strcmp(argv[i], "-noblanks")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--noblanks"))) {
Packit 423ecb
	    noblanks++;
Packit 423ecb
	    xmlKeepBlanksDefault(0);
Packit 423ecb
	    options |= XML_PARSE_NOBLANKS;
Packit 423ecb
        }
Packit 423ecb
	else if ((!strcmp(argv[i], "-maxmem")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--maxmem"))) {
Packit 423ecb
	     i++;
Packit 423ecb
	     if (sscanf(argv[i], "%d", &maxmem) == 1) {
Packit 423ecb
	         xmlMemSetup(myFreeFunc, myMallocFunc, myReallocFunc,
Packit 423ecb
		             myStrdupFunc);
Packit 423ecb
	     } else {
Packit 423ecb
	         maxmem = 0;
Packit 423ecb
	     }
Packit 423ecb
        }
Packit 423ecb
	else if ((!strcmp(argv[i], "-format")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--format"))) {
Packit 423ecb
	     noblanks++;
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
	     format = 1;
Packit 423ecb
#endif /* LIBXML_OUTPUT_ENABLED */
Packit 423ecb
	     xmlKeepBlanksDefault(0);
Packit 423ecb
	}
Packit 423ecb
	else if ((!strcmp(argv[i], "-pretty")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--pretty"))) {
Packit 423ecb
	     i++;
Packit 423ecb
#ifdef LIBXML_OUTPUT_ENABLED
Packit 423ecb
       if (argv[i] != NULL) {
Packit 423ecb
	         format = atoi(argv[i]);
Packit 423ecb
	         if (format == 1) {
Packit 423ecb
	             noblanks++;
Packit 423ecb
	             xmlKeepBlanksDefault(0);
Packit 423ecb
	         }
Packit 423ecb
       }
Packit 423ecb
#endif /* LIBXML_OUTPUT_ENABLED */
Packit 423ecb
	}
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-stream")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--stream"))) {
Packit 423ecb
	     stream++;
Packit 423ecb
	}
Packit 423ecb
	else if ((!strcmp(argv[i], "-walker")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--walker"))) {
Packit 423ecb
	     walker++;
Packit 423ecb
             noout++;
Packit 423ecb
	}
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
#ifdef LIBXML_SAX1_ENABLED
Packit 423ecb
	else if ((!strcmp(argv[i], "-sax1")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--sax1"))) {
Packit 423ecb
	    sax1++;
Packit 423ecb
	    options |= XML_PARSE_SAX1;
Packit 423ecb
	}
Packit 423ecb
#endif /* LIBXML_SAX1_ENABLED */
Packit 423ecb
	else if ((!strcmp(argv[i], "-sax")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--sax"))) {
Packit 423ecb
	    sax++;
Packit 423ecb
	}
Packit 423ecb
	else if ((!strcmp(argv[i], "-chkregister")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--chkregister"))) {
Packit 423ecb
	    chkregister++;
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
	} else if ((!strcmp(argv[i], "-relaxng")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--relaxng"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    relaxng = argv[i];
Packit 423ecb
	    noent++;
Packit 423ecb
	    options |= XML_PARSE_NOENT;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-schema")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--schema"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    schema = argv[i];
Packit 423ecb
	    noent++;
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_SCHEMATRON_ENABLED
Packit 423ecb
	} else if ((!strcmp(argv[i], "-schematron")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--schematron"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    schematron = argv[i];
Packit 423ecb
	    noent++;
Packit 423ecb
#endif
Packit 423ecb
        } else if ((!strcmp(argv[i], "-nonet")) ||
Packit 423ecb
                   (!strcmp(argv[i], "--nonet"))) {
Packit 423ecb
	    options |= XML_PARSE_NONET;
Packit 423ecb
	    xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
Packit 423ecb
        } else if ((!strcmp(argv[i], "-nocompact")) ||
Packit 423ecb
                   (!strcmp(argv[i], "--nocompact"))) {
Packit 423ecb
	    options &= ~XML_PARSE_COMPACT;
Packit 423ecb
	} else if ((!strcmp(argv[i], "-load-trace")) ||
Packit 423ecb
	           (!strcmp(argv[i], "--load-trace"))) {
Packit 423ecb
	    load_trace++;
Packit 423ecb
        } else if ((!strcmp(argv[i], "-path")) ||
Packit 423ecb
                   (!strcmp(argv[i], "--path"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    parsePath(BAD_CAST argv[i]);
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
        } else if ((!strcmp(argv[i], "-pattern")) ||
Packit 423ecb
                   (!strcmp(argv[i], "--pattern"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    pattern = argv[i];
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_XPATH_ENABLED
Packit 423ecb
        } else if ((!strcmp(argv[i], "-xpath")) ||
Packit 423ecb
                   (!strcmp(argv[i], "--xpath"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    noout++;
Packit 423ecb
	    xpathquery = argv[i];
Packit 423ecb
#endif
Packit 423ecb
	} else if ((!strcmp(argv[i], "-oldxml10")) ||
Packit 423ecb
	           (!strcmp(argv[i], "--oldxml10"))) {
Packit 423ecb
	    oldxml10++;
Packit 423ecb
	    options |= XML_PARSE_OLD10;
Packit 423ecb
	} else {
Packit 423ecb
	    fprintf(stderr, "Unknown option %s\n", argv[i]);
Packit 423ecb
	    usage(stderr, argv[0]);
Packit 423ecb
	    return(1);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_CATALOG_ENABLED
Packit 423ecb
    if (nocatalogs == 0) {
Packit 423ecb
	if (catalogs) {
Packit 423ecb
	    const char *catal;
Packit 423ecb
Packit 423ecb
	    catal = getenv("SGML_CATALOG_FILES");
Packit 423ecb
	    if (catal != NULL) {
Packit 423ecb
		xmlLoadCatalogs(catal);
Packit 423ecb
	    } else {
Packit 423ecb
		fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n");
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_SAX1_ENABLED
Packit 423ecb
    if (sax1)
Packit 423ecb
        xmlSAXDefaultVersion(1);
Packit 423ecb
    else
Packit 423ecb
        xmlSAXDefaultVersion(2);
Packit 423ecb
#endif /* LIBXML_SAX1_ENABLED */
Packit 423ecb
Packit 423ecb
    if (chkregister) {
Packit 423ecb
	xmlRegisterNodeDefault(registerNode);
Packit 423ecb
	xmlDeregisterNodeDefault(deregisterNode);
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
    indent = getenv("XMLLINT_INDENT");
Packit 423ecb
    if(indent != NULL) {
Packit 423ecb
	xmlTreeIndentString = indent;
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
Packit 423ecb
    defaultEntityLoader = xmlGetExternalEntityLoader();
Packit 423ecb
    xmlSetExternalEntityLoader(xmllintExternalEntityLoader);
Packit 423ecb
Packit 423ecb
    xmlLineNumbersDefault(1);
Packit 423ecb
    if (loaddtd != 0)
Packit 423ecb
	xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
Packit 423ecb
    if (dtdattrs)
Packit 423ecb
	xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
Packit 423ecb
    if (noent != 0) xmlSubstituteEntitiesDefault(1);
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
    if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
Packit 423ecb
#endif /* LIBXML_VALID_ENABLED */
Packit 423ecb
    if ((htmlout) && (!nowrap)) {
Packit 423ecb
	xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
         "
Packit 423ecb
	xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
		"\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n");
Packit 423ecb
	xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
	 "<html><head><title>%s output</title></head>\n",
Packit 423ecb
		argv[0]);
Packit 423ecb
	xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
	 "<body bgcolor=\"#ffffff\">

%s output

\n",
Packit 423ecb
		argv[0]);
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_SCHEMATRON_ENABLED
Packit 423ecb
    if ((schematron != NULL) && (sax == 0)
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
        && (stream == 0)
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
	) {
Packit 423ecb
	xmlSchematronParserCtxtPtr ctxt;
Packit 423ecb
Packit 423ecb
        /* forces loading the DTDs */
Packit 423ecb
        xmlLoadExtDtdDefaultValue |= 1;
Packit 423ecb
	options |= XML_PARSE_DTDLOAD;
Packit 423ecb
	if (timing) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	ctxt = xmlSchematronNewParserCtxt(schematron);
Packit 423ecb
#if 0
Packit 423ecb
	xmlSchematronSetParserErrors(ctxt,
Packit 423ecb
		(xmlSchematronValidityErrorFunc) fprintf,
Packit 423ecb
		(xmlSchematronValidityWarningFunc) fprintf,
Packit 423ecb
		stderr);
Packit 423ecb
#endif
Packit 423ecb
	wxschematron = xmlSchematronParse(ctxt);
Packit 423ecb
	if (wxschematron == NULL) {
Packit 423ecb
	    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
		    "Schematron schema %s failed to compile\n", schematron);
Packit 423ecb
            progresult = XMLLINT_ERR_SCHEMACOMP;
Packit 423ecb
	    schematron = NULL;
Packit 423ecb
	}
Packit 423ecb
	xmlSchematronFreeParserCtxt(ctxt);
Packit 423ecb
	if (timing) {
Packit 423ecb
	    endTimer("Compiling the schemas");
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
    if ((relaxng != NULL) && (sax == 0)
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
        && (stream == 0)
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
	) {
Packit 423ecb
	xmlRelaxNGParserCtxtPtr ctxt;
Packit 423ecb
Packit 423ecb
        /* forces loading the DTDs */
Packit 423ecb
        xmlLoadExtDtdDefaultValue |= 1;
Packit 423ecb
	options |= XML_PARSE_DTDLOAD;
Packit 423ecb
	if (timing) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	ctxt = xmlRelaxNGNewParserCtxt(relaxng);
Packit 423ecb
	xmlRelaxNGSetParserErrors(ctxt,
Packit 423ecb
		(xmlRelaxNGValidityErrorFunc) fprintf,
Packit 423ecb
		(xmlRelaxNGValidityWarningFunc) fprintf,
Packit 423ecb
		stderr);
Packit 423ecb
	relaxngschemas = xmlRelaxNGParse(ctxt);
Packit 423ecb
	if (relaxngschemas == NULL) {
Packit 423ecb
	    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
		    "Relax-NG schema %s failed to compile\n", relaxng);
Packit 423ecb
            progresult = XMLLINT_ERR_SCHEMACOMP;
Packit 423ecb
	    relaxng = NULL;
Packit 423ecb
	}
Packit 423ecb
	xmlRelaxNGFreeParserCtxt(ctxt);
Packit 423ecb
	if (timing) {
Packit 423ecb
	    endTimer("Compiling the schemas");
Packit 423ecb
	}
Packit 423ecb
    } else if ((schema != NULL)
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
		&& (stream == 0)
Packit 423ecb
#endif
Packit 423ecb
	) {
Packit 423ecb
	xmlSchemaParserCtxtPtr ctxt;
Packit 423ecb
Packit 423ecb
	if (timing) {
Packit 423ecb
	    startTimer();
Packit 423ecb
	}
Packit 423ecb
	ctxt = xmlSchemaNewParserCtxt(schema);
Packit 423ecb
	xmlSchemaSetParserErrors(ctxt,
Packit 423ecb
		(xmlSchemaValidityErrorFunc) fprintf,
Packit 423ecb
		(xmlSchemaValidityWarningFunc) fprintf,
Packit 423ecb
		stderr);
Packit 423ecb
	wxschemas = xmlSchemaParse(ctxt);
Packit 423ecb
	if (wxschemas == NULL) {
Packit 423ecb
	    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
		    "WXS schema %s failed to compile\n", schema);
Packit 423ecb
            progresult = XMLLINT_ERR_SCHEMACOMP;
Packit 423ecb
	    schema = NULL;
Packit 423ecb
	}
Packit 423ecb
	xmlSchemaFreeParserCtxt(ctxt);
Packit 423ecb
	if (timing) {
Packit 423ecb
	    endTimer("Compiling the schemas");
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_SCHEMAS_ENABLED */
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
    if ((pattern != NULL)
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
        && (walker == 0)
Packit 423ecb
#endif
Packit 423ecb
	) {
Packit 423ecb
        patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
Packit 423ecb
	if (patternc == NULL) {
Packit 423ecb
	    xmlGenericError(xmlGenericErrorContext,
Packit 423ecb
		    "Pattern %s failed to compile\n", pattern);
Packit 423ecb
            progresult = XMLLINT_ERR_SCHEMAPAT;
Packit 423ecb
	    pattern = NULL;
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
#endif /* LIBXML_PATTERN_ENABLED */
Packit 423ecb
    for (i = 1; i < argc ; i++) {
Packit 423ecb
	if ((!strcmp(argv[i], "-encode")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--encode"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
        } else if ((!strcmp(argv[i], "-o")) ||
Packit 423ecb
                   (!strcmp(argv[i], "-output")) ||
Packit 423ecb
                   (!strcmp(argv[i], "--output"))) {
Packit 423ecb
            i++;
Packit 423ecb
	    continue;
Packit 423ecb
        }
Packit 423ecb
#ifdef LIBXML_VALID_ENABLED
Packit 423ecb
	if ((!strcmp(argv[i], "-dtdvalid")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--dtdvalid"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
        }
Packit 423ecb
	if ((!strcmp(argv[i], "-path")) ||
Packit 423ecb
                   (!strcmp(argv[i], "--path"))) {
Packit 423ecb
            i++;
Packit 423ecb
	    continue;
Packit 423ecb
        }
Packit 423ecb
	if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--dtdvalidfpi"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
        }
Packit 423ecb
#endif /* LIBXML_VALID_ENABLED */
Packit 423ecb
	if ((!strcmp(argv[i], "-relaxng")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--relaxng"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
        }
Packit 423ecb
	if ((!strcmp(argv[i], "-maxmem")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--maxmem"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
        }
Packit 423ecb
	if ((!strcmp(argv[i], "-pretty")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--pretty"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
        }
Packit 423ecb
	if ((!strcmp(argv[i], "-schema")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--schema"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
        }
Packit 423ecb
	if ((!strcmp(argv[i], "-schematron")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--schematron"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
        }
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
        if ((!strcmp(argv[i], "-pattern")) ||
Packit 423ecb
	    (!strcmp(argv[i], "--pattern"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
	}
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_XPATH_ENABLED
Packit 423ecb
        if ((!strcmp(argv[i], "-xpath")) ||
Packit 423ecb
	    (!strcmp(argv[i], "--xpath"))) {
Packit 423ecb
	    i++;
Packit 423ecb
	    continue;
Packit 423ecb
	}
Packit 423ecb
#endif
Packit 423ecb
	if ((timing) && (repeat))
Packit 423ecb
	    startTimer();
Packit 423ecb
	/* Remember file names.  "-" means stdin.  <sven@zen.org> */
Packit 423ecb
	if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0)) {
Packit 423ecb
	    if (repeat) {
Packit 423ecb
		xmlParserCtxtPtr ctxt = NULL;
Packit 423ecb
Packit 423ecb
		for (acount = 0;acount < repeat;acount++) {
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
		    if (stream != 0) {
Packit 423ecb
			streamFile(argv[i]);
Packit 423ecb
		    } else {
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
                        if (sax) {
Packit 423ecb
			    testSAX(argv[i]);
Packit 423ecb
			} else {
Packit 423ecb
			    if (ctxt == NULL)
Packit 423ecb
				ctxt = xmlNewParserCtxt();
Packit 423ecb
			    parseAndPrintFile(argv[i], ctxt);
Packit 423ecb
			}
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
		    }
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
		}
Packit 423ecb
		if (ctxt != NULL)
Packit 423ecb
		    xmlFreeParserCtxt(ctxt);
Packit 423ecb
	    } else {
Packit 423ecb
		nbregister = 0;
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
		if (stream != 0)
Packit 423ecb
		    streamFile(argv[i]);
Packit 423ecb
		else
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */
Packit 423ecb
                if (sax) {
Packit 423ecb
		    testSAX(argv[i]);
Packit 423ecb
		} else {
Packit 423ecb
		    parseAndPrintFile(argv[i], NULL);
Packit 423ecb
		}
Packit 423ecb
Packit 423ecb
                if ((chkregister) && (nbregister != 0)) {
Packit 423ecb
		    fprintf(stderr, "Registration count off: %d\n", nbregister);
Packit 423ecb
		    progresult = XMLLINT_ERR_RDREGIS;
Packit 423ecb
		}
Packit 423ecb
	    }
Packit 423ecb
	    files ++;
Packit 423ecb
	    if ((timing) && (repeat)) {
Packit 423ecb
		endTimer("%d iterations", repeat);
Packit 423ecb
	    }
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    if (generate)
Packit 423ecb
	parseAndPrintFile(NULL, NULL);
Packit 423ecb
    if ((htmlout) && (!nowrap)) {
Packit 423ecb
	xmlGenericError(xmlGenericErrorContext, "</body></html>\n");
Packit 423ecb
    }
Packit 423ecb
    if ((files == 0) && (!generate) && (version == 0)) {
Packit 423ecb
	usage(stderr, argv[0]);
Packit 423ecb
    }
Packit 423ecb
#ifdef LIBXML_SCHEMATRON_ENABLED
Packit 423ecb
    if (wxschematron != NULL)
Packit 423ecb
	xmlSchematronFree(wxschematron);
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_SCHEMAS_ENABLED
Packit 423ecb
    if (relaxngschemas != NULL)
Packit 423ecb
	xmlRelaxNGFree(relaxngschemas);
Packit 423ecb
    if (wxschemas != NULL)
Packit 423ecb
	xmlSchemaFree(wxschemas);
Packit 423ecb
    xmlRelaxNGCleanupTypes();
Packit 423ecb
#endif
Packit 423ecb
#ifdef LIBXML_PATTERN_ENABLED
Packit 423ecb
    if (patternc != NULL)
Packit 423ecb
        xmlFreePattern(patternc);
Packit 423ecb
#endif
Packit 423ecb
    xmlCleanupParser();
Packit 423ecb
    xmlMemoryDump();
Packit 423ecb
Packit 423ecb
    return(progresult);
Packit 423ecb
}
Packit 423ecb