15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmllint.c : a small tester program for XML input.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_WIN32) && !defined(__CYGWIN__)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (_MSC_VER) || defined(__BORLANDC__)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <winsock2.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma comment(lib, "ws2_32.lib")
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define gettimeofday(p1,p2)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* _MSC_VER */
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* _WIN32 */
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TIME_H
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/time.h>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_TIME_H
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <time.h>
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __MINGW32__
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _WINSOCKAPI_
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <wsockcompat.h>
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <winsock2.h>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef XML_SOCKLEN_T
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_SOCKLEN_T unsigned int
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TIMEB_H
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/timeb.h>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TYPES_H
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h>
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_STAT_H
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/stat.h>
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_FCNTL_H
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h>
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_UNISTD_H
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h>
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/mman.h>
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* seems needed for Solaris */
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MAP_FAILED
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAP_FAILED ((void *) -1)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_LIBREADLINE
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <readline/readline.h>
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_LIBHISTORY
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <readline/history.h>
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h>
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h>
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/HTMLparser.h>
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/HTMLtree.h>
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h>
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xpath.h>
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/debugXML.h>
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h>
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xinclude.h>
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/catalog.h>
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h>
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlreader.h>
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMATRON_ENABLED
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/schematron.h>
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/relaxng.h>
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlschemas.h>
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/pattern.h>
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_C14N_ENABLED
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/c14n.h>
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlsave.h>
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef XML_XML_DEFAULT_CATALOG
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_RETURN_OK = 0,	/* No error */
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_UNCLASS = 1,	/* Unclassified */
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_DTD = 2,	/* Error in DTD */
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_VALID = 3,	/* Validation error */
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_RDFILE = 4,	/* CtxtReadFile error */
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_SCHEMACOMP = 5,	/* Schema compilation */
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_OUT = 6,	/* Error writing output */
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_SCHEMAPAT = 7,	/* Error in schema pattern */
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_RDREGIS = 8,	/* Error in Reader registration */
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_MEM = 9,	/* Out of memory error */
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XMLLINT_ERR_XPATH = 10	/* XPath evaluation error */
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmllintReturnCode;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int shell = 0;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int debugent = 0;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int debug = 0;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int maxmem = 0;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int copy = 0;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int recovery = 0;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int noent = 0;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int noblanks = 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int noout = 0;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nowrap = 0;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int format = 0;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *output = NULL;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int compress = 0;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int oldout = 0;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int valid = 0;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int postvalid = 0;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char * dtdvalid = NULL;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char * dtdvalidfpi = NULL;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char * relaxng = NULL;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlRelaxNGPtr relaxngschemas = NULL;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char * schema = NULL;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchemaPtr wxschemas = NULL;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMATRON_ENABLED
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char * schematron = NULL;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSchematronPtr wxschematron = NULL;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int repeat = 0;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int insert = 0;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int html = 0;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlout = 0;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int htmlout = 0;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PUSH_ENABLED
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int push = 0;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_PUSH_ENABLED */
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int memory = 0;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int testIO = 0;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *encoding = NULL;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xinclude = 0;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int dtdattrs = 0;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int loaddtd = 0;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmllintReturnCode progresult = XMLLINT_RETURN_OK;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int timing = 0;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int generate = 0;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int dropdtd = 0;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int catalogs = 0;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nocatalogs = 0;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_C14N_ENABLED
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int canonical = 0;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int canonical_11 = 0;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int exc_canonical = 0;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int stream = 0;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int walker = 0;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int chkregister = 0;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nbregister = 0;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sax1 = 0;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SAX1_ENABLED */
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *pattern = NULL;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlPatternPtr patternc = NULL;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlStreamCtxtPtr patstream = NULL;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *xpathquery = NULL;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int options = XML_PARSE_COMPACT;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sax = 0;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int oldxml10 = 0;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		 Entity loading control and customization.		*
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_PATHS 64
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PATH_SEPARATOR ';'
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PATH_SEPARATOR ':'
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar *paths[MAX_PATHS + 1];
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int nbpaths = 0;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int load_trace = 0;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void parsePath(const xmlChar *path) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (path == NULL)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (*path != 0) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nbpaths >= MAX_PATHS) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "MAX_PATHS reached: too many paths\n");
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = path;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((*cur == ' ') || (*cur == PATH_SEPARATOR))
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur++;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	path = cur;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((*cur != 0) && (*cur != ' ') && (*cur != PATH_SEPARATOR))
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur++;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur != path) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    paths[nbpaths] = xmlStrndup(path, cur - path);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (paths[nbpaths] != NULL)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nbpaths++;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    path = cur;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlExternalEntityLoader defaultEntityLoader = NULL;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlParserInputPtr
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmllintExternalEntityLoader(const char *URL, const char *ID,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlParserCtxtPtr ctxt) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr ret;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    warningSAXFunc warning = NULL;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    errorSAXFunc err = NULL;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *lastsegment = URL;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *iter = URL;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nbpaths > 0) && (iter != NULL)) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (*iter != 0) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*iter == '/')
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastsegment = iter + 1;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    iter++;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ctxt != NULL) && (ctxt->sax != NULL)) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	warning = ctxt->sax->warning;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	err = ctxt->sax->error;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->sax->warning = NULL;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->sax->error = NULL;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (defaultEntityLoader != NULL) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = defaultEntityLoader(URL, ID, ctxt);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != NULL) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (warning != NULL)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ctxt->sax->warning = warning;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (err != NULL)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ctxt->sax->error = err;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (load_trace) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf \
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(stderr,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "Loaded URL=\"%s\" ID=\"%s\"\n",
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 URL ? URL : "(null)",
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 ID ? ID : "(null)");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ret);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;i < nbpaths;i++) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *newURL;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	newURL = xmlStrdup((const xmlChar *) paths[i]);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	newURL = xmlStrcat(newURL, (const xmlChar *) "/");
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (newURL != NULL) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = defaultEntityLoader((const char *)newURL, ID, ctxt);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret != NULL) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (warning != NULL)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ctxt->sax->warning = warning;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (err != NULL)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ctxt->sax->error = err;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (load_trace) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf \
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(stderr,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "Loaded URL=\"%s\" ID=\"%s\"\n",
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 newURL,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 ID ? ID : "(null)");
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(newURL);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(ret);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(newURL);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (err != NULL)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->sax->error = err;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (warning != NULL) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->sax->warning = warning;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (URL != NULL)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    warning(ctxt, "failed to load external entity \"%s\"\n", URL);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (ID != NULL)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    warning(ctxt, "failed to load external entity \"%s\"\n", ID);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Memory allocation consumption debugging				*
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OOM(void)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    progresult = XMLLINT_ERR_MEM;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)myFreeFunc(void *mem)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlMemFree(mem);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)myMallocFunc(size_t size)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *ret;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlMemMalloc(size);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlMemUsed() > maxmem) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OOM();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlMemFree(ret);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)myReallocFunc(void *mem, size_t size)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *ret;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlMemRealloc(mem, size);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlMemUsed() > maxmem) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OOM();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlMemFree(ret);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)myStrdupFunc(const char *str)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *ret;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlMemoryStrdup(str);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlMemUsed() > maxmem) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OOM();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlFree(ret);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Internal timing routines to remove the necessity to have		*
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * unix-specific function calls.					*
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HAVE_GETTIMEOFDAY
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TIMEB_H
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TIME_H
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_FTIME
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)my_gettimeofday(struct timeval *tvp, void *tzp)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct timeb timebuffer;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ftime(&timebuffer);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (tvp) {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tvp->tv_sec = timebuffer.time;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tvp->tv_usec = timebuffer.millitm * 1000L;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HAVE_GETTIMEOFDAY 1
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define gettimeofday my_gettimeofday
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_FTIME */
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_SYS_TIME_H */
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_SYS_TIMEB_H */
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !HAVE_GETTIMEOFDAY */
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE_GETTIMEOFDAY)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct timeval begin, end;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * startTimer: call where you want to start timing
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)startTimer(void)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gettimeofday(&begin, NULL);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * endTimer: call where you want to stop timing and to print out a
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *           message about the timing performed; format is a printf
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *           type argument
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endTimer(const char *fmt, ...)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long msec;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list ap;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gettimeofday(&end, NULL);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msec = end.tv_sec - begin.tv_sec;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msec *= 1000;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msec += (end.tv_usec - begin.tv_usec) / 1000;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HAVE_STDARG_H
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error "endTimer required stdarg functions"
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(ap, fmt);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vfprintf(stderr, fmt, ap);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(ap);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, " took %ld ms\n", msec);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(HAVE_TIME_H)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * No gettimeofday function, so we have to make do with calling clock.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is obviously less accurate, but there's little we can do about
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CLOCKS_PER_SEC
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLOCKS_PER_SEC 100
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static clock_t begin, end;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)startTimer(void)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    begin = clock();
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endTimer(const char *fmt, ...)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long msec;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list ap;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    end = clock();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msec = ((end - begin) * 1000) / CLOCKS_PER_SEC;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HAVE_STDARG_H
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error "endTimer required stdarg functions"
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(ap, fmt);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vfprintf(stderr, fmt, ap);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(ap);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, " took %ld ms\n", msec);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We don't have a gettimeofday or time.h, so we just don't do timing
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)startTimer(void)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do nothing
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endTimer(char *format, ...)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * We cannot do anything because we don't have a timing function
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDARG_H
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(ap, format);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vfprintf(stderr, format, ap);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(ap);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, " was not timed\n", msec);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* We don't have gettimeofday, time or stdarg.h, what crazy world is
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * this ?!
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			HTML ouput					*
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char buffer[50000];
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlHTMLEncodeSend(void) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *result;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext, "%s", result);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(result);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer[0] = 0;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlHTMLPrintFileInfo:
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input:  an xmlParserInputPtr input
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Displays the associated file and line informations for the current input
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlHTMLPrintFileInfo(xmlParserInputPtr input) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "<p>");
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(buffer);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (input != NULL) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (input->filename) {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf(&buffer[len], sizeof(buffer) - len, "%s:%d: ", input->filename,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    input->line);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf(&buffer[len], sizeof(buffer) - len, "Entity: line %d: ", input->line);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlHTMLPrintFileContext:
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input:  an xmlParserInputPtr input
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Displays current context within the input content for error tracking
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlHTMLPrintFileContext(xmlParserInputPtr input) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur, *base;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int n;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (input == NULL) return;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "<pre>\n");
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = input->cur;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = input->base;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur--;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = 0;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur--;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*cur == '\n') || (*cur == '\r')) cur++;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = cur;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = 0;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len = strlen(buffer);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        snprintf(&buffer[len], sizeof(buffer) - len, "%c",
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (unsigned char) *cur++);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	n++;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(buffer);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    snprintf(&buffer[len], sizeof(buffer) - len, "\n");
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = input->cur;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((*cur == '\n') || (*cur == '\r'))
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur--;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = 0;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((cur != base) && (n++ < 80)) {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len = strlen(buffer);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        snprintf(&buffer[len], sizeof(buffer) - len, " ");
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base++;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(buffer);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    snprintf(&buffer[len], sizeof(buffer) - len, "^\n");
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "</pre>");
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlHTMLError:
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format an error messages, gives file, line, position and
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extra parameters.
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlHTMLError(void *ctx, const char *msg, ...)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer[0] = 0;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input = ctxt->input;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input = ctxt->inputTab[ctxt->inputNr - 2];
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLPrintFileInfo(input);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "<b>error</b>: ");
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(args, msg);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(buffer);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(args);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "</p>\n");
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLPrintFileContext(input);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlHTMLWarning:
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format a warning messages, gives file, line, position and
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extra parameters.
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlHTMLWarning(void *ctx, const char *msg, ...)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer[0] = 0;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input = ctxt->input;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input = ctxt->inputTab[ctxt->inputNr - 2];
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLPrintFileInfo(input);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "<b>warning</b>: ");
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(args, msg);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(buffer);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(args);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "</p>\n");
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLPrintFileContext(input);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlHTMLValidityError:
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format an validity error messages, gives file,
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * line, position and extra parameters.
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlHTMLValidityError(void *ctx, const char *msg, ...)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer[0] = 0;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input = ctxt->input;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((input->filename == NULL) && (ctxt->inputNr > 1))
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input = ctxt->inputTab[ctxt->inputNr - 2];
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLPrintFileInfo(input);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "<b>validity error</b>: ");
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(buffer);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(args, msg);
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(args);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "</p>\n");
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLPrintFileContext(input);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    progresult = XMLLINT_ERR_VALID;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlHTMLValidityWarning:
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx:  an XML parser context
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format a validity warning messages, gives file, line,
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * position and extra parameters.
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlHTMLValidityWarning(void *ctx, const char *msg, ...)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr input;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer[0] = 0;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input = ctxt->input;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((input->filename == NULL) && (ctxt->inputNr > 1))
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input = ctxt->inputTab[ctxt->inputNr - 2];
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLPrintFileInfo(input);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "<b>validity warning</b>: ");
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(args, msg);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(buffer);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(args);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext, "</p>\n");
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLPrintFileContext(input);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlHTMLEncodeSend();
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Shell Interface					*
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlShellReadline:
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prompt:  the prompt value
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read a string
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to it or NULL on EOF the caller is expected to
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     free the returned string.
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlShellReadline(char *prompt) {
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_LIBREADLINE
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *line_read;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Get a line from the user. */
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line_read = readline (prompt);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If the line has any text in it, save it on the history. */
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (line_read && *line_read)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	add_history (line_read);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (line_read);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char line_read[501];
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *ret;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prompt != NULL)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, "%s", prompt);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!fgets(line_read, 500, stdin))
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line_read[500] = 0;
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = strlen(line_read);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (char *) malloc(len + 1);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret != NULL) {
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memcpy (ret, line_read, len + 1);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_DEBUG_ENABLED */
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			I/O Interfaces					*
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int myRead(FILE *f, char * buf, int len) {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(fread(buf, 1, len, f));
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void myClose(FILE *f) {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (f != stdin) {
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fclose(f);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			SAX based tests					*
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * empty SAX block
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSAXHandler emptySAXHandlerStruct = {
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* internalSubset */
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* isStandalone */
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* hasInternalSubset */
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* hasExternalSubset */
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* resolveEntity */
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* getEntity */
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* entityDecl */
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* notationDecl */
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* attributeDecl */
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* elementDecl */
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* unparsedEntityDecl */
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* setDocumentLocator */
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* startDocument */
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* endDocument */
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* startElement */
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* endElement */
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* reference */
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* characters */
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* ignorableWhitespace */
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* processingInstruction */
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* comment */
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* xmlParserWarning */
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* xmlParserError */
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* xmlParserError */
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* getParameterEntity */
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* cdataBlock; */
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* externalSubset; */
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_SAX2_MAGIC,
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* startElementNs */
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL, /* endElementNs */
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL  /* xmlStructuredErrorFunc */
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern xmlSAXHandlerPtr debugSAXHandler;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int callbacks;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * isStandaloneDebug:
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Is this document tagged standalone ?
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if true
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.isStandalone()\n");
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hasInternalSubsetDebug:
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Does this document has an internal subset
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if true
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.hasInternalSubset()\n");
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hasExternalSubsetDebug:
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Does this document has an external subset
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if true
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.hasExternalSubset()\n");
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * internalSubsetDebug:
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Does this document has an internal subset
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       const xmlChar *ExternalID, const xmlChar *SystemID)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.internalSubset(%s,", name);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ExternalID == NULL)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, " ,");
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, " %s,", ExternalID);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (SystemID == NULL)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, " )\n");
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, " %s)\n", SystemID);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * externalSubsetDebug:
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Does this document has an external subset
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       const xmlChar *ExternalID, const xmlChar *SystemID)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.externalSubset(%s,", name);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ExternalID == NULL)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, " ,");
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, " %s,", ExternalID);
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (SystemID == NULL)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, " )\n");
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, " %s)\n", SystemID);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * resolveEntityDebug:
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @publicId: The public ID of the entity
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @systemId: The system ID of the entity
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Special entity resolver, better left to the parser, it has
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * more context than the application layer.
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The default behaviour is to NOT resolve the entities, in that case
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the ENTITY_REF nodes are built in the structure (and the parameter
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * values).
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlParserInputPtr
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.resolveEntity(");
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (publicId != NULL)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, "%s", (char *)publicId);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, " ");
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (systemId != NULL)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", %s)\n", (char *)systemId);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", )\n");
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * getEntityDebug:
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: The entity name
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get an entity by name
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.getEntity(%s)\n", name);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * getParameterEntityDebug:
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: The entity name
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get a parameter entity by name
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlParserInputPtr
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * entityDeclDebug:
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the entity name
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the entity type
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @publicId: The public ID of the entity
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @systemId: The system ID of the entity
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content: the entity value (without processing).
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * An entity definition has been parsed
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar *nullstr = BAD_CAST "(null)";
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* not all libraries handle printing null pointers nicely */
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (publicId == NULL)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        publicId = nullstr;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (systemId == NULL)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        systemId = nullstr;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content == NULL)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content = (xmlChar *)nullstr;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name, type, publicId, systemId, content);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attributeDeclDebug:
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the attribute type
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * An attribute definition has been parsed
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const xmlChar * name, int type, int def,
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const xmlChar * defaultValue, xmlEnumerationPtr tree)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (defaultValue == NULL)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                elem, name, type, def);
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                elem, name, type, def, defaultValue);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeEnumeration(tree);
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * elementDeclDebug:
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the element name
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type:  the element type
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content: the element value (without processing).
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * An element definition has been parsed
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlElementContentPtr content ATTRIBUTE_UNUSED)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name, type);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notationDeclDebug:
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: The name of the notation
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @publicId: The public ID of the entity
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @systemId: The system ID of the entity
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * What to do when a notation declaration has been parsed.
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     const xmlChar *publicId, const xmlChar *systemId)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (char *) name, (char *) publicId, (char *) systemId);
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * unparsedEntityDeclDebug:
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: The name of the entity
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @publicId: The public ID of the entity
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @systemId: The system ID of the entity
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @notationName: the name of the notation
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * What to do when an unparsed entity declaration is parsed
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *publicId, const xmlChar *systemId,
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *notationName)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar *nullstr = BAD_CAST "(null)";
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (publicId == NULL)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        publicId = nullstr;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (systemId == NULL)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        systemId = nullstr;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (notationName == NULL)
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        notationName = nullstr;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (char *) name, (char *) publicId, (char *) systemId,
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (char *) notationName);
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * setDocumentLocatorDebug:
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @loc: A SAX Locator
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Receive the document locator at startup, actually xmlDefaultSAXLocator
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Everything is available on the context, so this is useless in our case.
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.setDocumentLocator()\n");
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * startDocumentDebug:
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when the document start being processed.
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.startDocument()\n");
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * endDocumentDebug:
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when the document end has been detected.
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.endDocument()\n");
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * startElementDebug:
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  The element name
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when an opening tag has been processed.
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.startElement(%s", (char *) name);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (atts != NULL) {
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (i = 0;(atts[i] != NULL);i++) {
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stdout, ", %s='", atts[i++]);
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (atts[i] != NULL)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        fprintf(stdout, "%s'", atts[i]);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, ")\n");
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * endElementDebug:
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  The element name
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when the end of an element has been detected.
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * charactersDebug:
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ch:  a xmlChar string
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the number of xmlChar
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * receiving some chars from the parser.
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Question: how much at a time ???
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char out[40];
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;(i<len) && (i < 30);i++)
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out[i] = ch[i];
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out[i] = 0;
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.characters(%s, %d)\n", out, len);
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * referenceDebug:
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  The entity name
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when an entity reference is detected.
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.reference(%s)\n", name);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ignorableWhitespaceDebug:
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ch:  a xmlChar string
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @start: the first char in the string
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the number of xmlChar
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * receiving some ignorable whitespaces from the parser.
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Question: how much at a time ???
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char out[40];
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 0;(i<len) && (i < 30);i++)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	out[i] = ch[i];
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out[i] = 0;
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", out, len);
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * processingInstructionDebug:
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target:  the target name
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: the PI data's
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the number of xmlChar
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A processing instruction has been parsed.
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const xmlChar *data)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data != NULL)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(char *) target, (char *) data);
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, "SAX.processingInstruction(%s, NULL)\n",
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(char *) target);
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cdataBlockDebug:
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctx: the user data (XML parser context)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  The pcdata content
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the block length
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when a pcdata block has been parsed
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.pcdata(%.20s, %d)\n",
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (char *) value, len);
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * commentDebug:
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the comment content
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A comment has been parsed.
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.comment(%s)\n", value);
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * warningDebug:
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format a warning messages, gives file, line, position and
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extra parameters.
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(args, msg);
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.warning: ");
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vfprintf(stdout, msg, args);
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(args);
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * errorDebug:
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format a error messages, gives file, line, position and
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extra parameters.
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(args, msg);
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.error: ");
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vfprintf(stdout, msg, args);
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(args);
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fatalErrorDebug:
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg:  the message to display/transmit
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @...:  extra parameters for the message display
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Display and format a fatalError messages, gives file, line, position and
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extra parameters.
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void XMLCDECL
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_list args;
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(args, msg);
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.fatalError: ");
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vfprintf(stdout, msg, args);
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(args);
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSAXHandler debugSAXHandlerStruct = {
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internalSubsetDebug,
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isStandaloneDebug,
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hasInternalSubsetDebug,
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hasExternalSubsetDebug,
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resolveEntityDebug,
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getEntityDebug,
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entityDeclDebug,
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notationDeclDebug,
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attributeDeclDebug,
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elementDeclDebug,
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unparsedEntityDeclDebug,
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setDocumentLocatorDebug,
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    startDocumentDebug,
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    endDocumentDebug,
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    startElementDebug,
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    endElementDebug,
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    referenceDebug,
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    charactersDebug,
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ignorableWhitespaceDebug,
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    processingInstructionDebug,
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    commentDebug,
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    warningDebug,
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    errorDebug,
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fatalErrorDebug,
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getParameterEntityDebug,
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdataBlockDebug,
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    externalSubsetDebug,
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1,
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SAX2 specific callbacks
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * startElementNsDebug:
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  The element name
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when an opening tag has been processed.
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const xmlChar *localname,
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const xmlChar *prefix,
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const xmlChar *URI,
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    int nb_namespaces,
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar **namespaces,
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    int nb_attributes,
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    int nb_defaulted,
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    const xmlChar **attributes)
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.startElementNs(%s", (char *) localname);
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prefix == NULL)
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", NULL");
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", %s", (char *) prefix);
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URI == NULL)
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", NULL");
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", '%s'", (char *) URI);
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, ", %d", nb_namespaces);
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (namespaces != NULL) {
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (i = 0;i < nb_namespaces * 2;i++) {
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stdout, ", xmlns");
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (namespaces[i] != NULL)
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        fprintf(stdout, ":%s", namespaces[i]);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stdout, "='%s'", namespaces[i]);
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, ", %d, %d", nb_attributes, nb_defaulted);
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attributes != NULL) {
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (i = 0;i < nb_attributes * 5;i += 5) {
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (attributes[i + 1] != NULL)
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stdout, ", %s:%s='", attributes[i + 1], attributes[i]);
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stdout, ", %s='", attributes[i]);
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stdout, "%.4s...', %d", attributes[i + 3],
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (int)(attributes[i + 4] - attributes[i + 3]));
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, ")\n");
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * endElementDebug:
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt:  An XML parser context
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  The element name
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called when the end of an element has been detected.
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const xmlChar *localname,
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const xmlChar *prefix,
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const xmlChar *URI)
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks++;
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "SAX.endElementNs(%s", (char *) localname);
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prefix == NULL)
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", NULL");
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", %s", (char *) prefix);
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (URI == NULL)
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", NULL)\n");
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stdout, ", '%s')\n", (char *) URI);
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSAXHandler debugSAX2HandlerStruct = {
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internalSubsetDebug,
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isStandaloneDebug,
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hasInternalSubsetDebug,
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hasExternalSubsetDebug,
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resolveEntityDebug,
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getEntityDebug,
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entityDeclDebug,
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notationDeclDebug,
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attributeDeclDebug,
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elementDeclDebug,
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unparsedEntityDeclDebug,
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setDocumentLocatorDebug,
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    startDocumentDebug,
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    endDocumentDebug,
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    referenceDebug,
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    charactersDebug,
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ignorableWhitespaceDebug,
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    processingInstructionDebug,
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    commentDebug,
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    warningDebug,
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    errorDebug,
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fatalErrorDebug,
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getParameterEntityDebug,
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cdataBlockDebug,
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    externalSubsetDebug,
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_SAX2_MAGIC,
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    startElementNsDebug,
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    endElementNsDebug,
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct;
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testSAX(const char *filename) {
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr handler;
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *user_data = "user_data"; /* mostly for debugging */
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr buf = NULL;
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputPtr inputStream;
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserCtxtPtr ctxt = NULL;
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSAXHandlerPtr old_sax = NULL;
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks = 0;
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout) {
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handler = emptySAXHandler;
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (sax1) {
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handler = debugSAXHandler;
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handler = debugSAX2Handler;
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * it's not the simplest code but the most generic in term of I/O
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto error;
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wxschemas != NULL) {
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int ret;
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaValidCtxtPtr vctxt;
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	vctxt = xmlSchemaNewValidCtxt(wxschemas);
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetValidErrors(vctxt,
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaValidityErrorFunc) fprintf,
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaValidityWarningFunc) fprintf,
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stderr);
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaValidateStream(vctxt, buf, 0, handler,
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                              (void *)user_data);
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (repeat == 0) {
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret == 0) {
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "%s validates\n", filename);
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (ret > 0) {
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "%s fails to validate\n", filename);
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		progresult = XMLLINT_ERR_VALID;
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "%s validation generated an internal error\n",
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       filename);
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		progresult = XMLLINT_ERR_VALID;
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValidCtxt(vctxt);
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Create the parser context amd hook the input
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = xmlNewParserCtxt();
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt == NULL) {
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeParserInputBuffer(buf);
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto error;
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	old_sax = ctxt->sax;
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->sax = handler;
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt->userData = (void *) user_data;
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	inputStream = xmlNewIOInputStream(ctxt, buf, XML_CHAR_ENCODING_NONE);
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (inputStream == NULL) {
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeParserInputBuffer(buf);
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto error;
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	inputPush(ctxt, inputStream);
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* do the parsing */
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlParseDocument(ctxt);
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt->myDoc != NULL) {
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "SAX generated a doc !\n");
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeDoc(ctxt->myDoc);
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ctxt->myDoc = NULL;
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error:
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt != NULL) {
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt->sax = old_sax;
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeParserCtxt(ctxt);
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Stream Test processing				*
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void processNode(xmlTextReaderPtr reader) {
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *name, *value;
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type, empty;
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = xmlTextReaderNodeType(reader);
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    empty = xmlTextReaderIsEmptyElement(reader);
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (debug) {
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	name = xmlTextReaderConstName(reader);
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (name == NULL)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    name = BAD_CAST "--";
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	value = xmlTextReaderConstValue(reader);
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	printf("%d %d %s %d %d",
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlTextReaderDepth(reader),
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		type,
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		name,
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		empty,
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlTextReaderHasValue(reader));
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (value == NULL)
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("\n");
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf(" %s\n", value);
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (patternc) {
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlChar *path = NULL;
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int match = -1;
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (type == XML_READER_TYPE_ELEMENT) {
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* do the check only on element start */
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader));
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (match) {
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		path = xmlGetNodePath(xmlTextReaderCurrentNode(reader));
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("Node %s matches pattern %s\n", path, pattern);
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                printf("Node %s matches pattern %s\n",
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       xmlTextReaderConstName(reader), pattern);
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (patstream != NULL) {
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int ret;
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (type == XML_READER_TYPE_ELEMENT) {
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlStreamPush(patstream,
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                    xmlTextReaderConstLocalName(reader),
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlTextReaderConstNamespaceUri(reader));
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "xmlStreamPush() failure\n");
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlFreeStreamCtxt(patstream);
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    patstream = NULL;
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (ret != match) {
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (path == NULL) {
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        path = xmlGetNodePath(
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                       xmlTextReaderCurrentNode(reader));
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr,
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		            "xmlPatternMatch and xmlStreamPush disagree\n");
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (path != NULL)
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        fprintf(stderr, "  pattern %s node %s\n",
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                pattern, path);
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    else
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        fprintf(stderr, "  pattern %s node %s\n",
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    pattern, xmlTextReaderConstName(reader));
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((type == XML_READER_TYPE_END_ELEMENT) ||
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ((type == XML_READER_TYPE_ELEMENT) && (empty))) {
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ret = xmlStreamPop(patstream);
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret < 0) {
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "xmlStreamPop() failure\n");
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlFreeStreamCtxt(patstream);
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    patstream = NULL;
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (path != NULL)
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(path);
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void streamFile(char *filename) {
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlTextReaderPtr reader;
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int fd = -1;
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct stat info;
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *base = NULL;
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlParserInputBufferPtr input = NULL;
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (memory) {
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (stat(filename, &info) < 0)
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((fd = open(filename, O_RDONLY)) < 0)
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (base == (void *) MAP_FAILED)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	reader = xmlReaderForMemory(base, info.st_size, filename,
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                            NULL, options);
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	reader = xmlReaderForFile(filename, NULL, options);
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pattern != NULL) {
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (patternc == NULL) {
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Pattern %s failed to compile\n", pattern);
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            progresult = XMLLINT_ERR_SCHEMAPAT;
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    pattern = NULL;
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (patternc != NULL) {
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        patstream = xmlPatternGetStreamCtxt(patternc);
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (patstream != NULL) {
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlStreamPush(patstream, NULL, NULL);
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "xmlStreamPush() failure\n");
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeStreamCtxt(patstream);
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		patstream = NULL;
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reader != NULL) {
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (valid)
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1);
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (relaxng != NULL) {
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((timing) && (!repeat)) {
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		startTimer();
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlTextReaderRelaxNGValidate(reader, relaxng);
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Relax-NG schema %s failed to compile\n", relaxng);
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		progresult = XMLLINT_ERR_SCHEMACOMP;
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		relaxng = NULL;
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((timing) && (!repeat)) {
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		endTimer("Compiling the schemas");
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (schema != NULL) {
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((timing) && (!repeat)) {
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		startTimer();
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlTextReaderSchemaValidate(reader, schema);
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"XSD schema %s failed to compile\n", schema);
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		progresult = XMLLINT_ERR_SCHEMACOMP;
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		schema = NULL;
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((timing) && (!repeat)) {
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		endTimer("Compiling the schemas");
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Process all nodes in sequence
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlTextReaderRead(reader);
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (ret == 1) {
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((debug)
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        || (patternc)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       )
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		processNode(reader);
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlTextReaderRead(reader);
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (relaxng != NULL)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		endTimer("Parsing and validating");
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (valid)
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		endTimer("Parsing and validating");
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Parsing");
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (valid) {
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlTextReaderIsValid(reader) != 1) {
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Document %s does not validate\n", filename);
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		progresult = XMLLINT_ERR_VALID;
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((relaxng != NULL) || (schema != NULL)) {
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlTextReaderIsValid(reader) != 1) {
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "%s fails to validate\n", filename);
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		progresult = XMLLINT_ERR_VALID;
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "%s validates\n", filename);
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Done, cleanup and status
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeTextReader(reader);
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s : failed to parse\n", filename);
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_UNCLASS;
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stderr, "Unable to open %s\n", filename);
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	progresult = XMLLINT_ERR_UNCLASS;
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (patstream != NULL) {
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeStreamCtxt(patstream);
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	patstream = NULL;
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (memory) {
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeParserInputBuffer(input);
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	munmap((char *) base, info.st_size);
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	close(fd);
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void walkDoc(xmlDocPtr doc) {
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlTextReaderPtr reader;
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr root;
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *namespaces[22];
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root = xmlDocGetRootElement(doc);
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (ns = root->nsDef, i = 0;ns != NULL && i < 20;ns=ns->next) {
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        namespaces[i++] = ns->href;
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        namespaces[i++] = ns->prefix;
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespaces[i++] = NULL;
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespaces[i] = NULL;
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pattern != NULL) {
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict,
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                             0, &namespaces[0]);
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (patternc == NULL) {
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Pattern %s failed to compile\n", pattern);
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            progresult = XMLLINT_ERR_SCHEMAPAT;
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    pattern = NULL;
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (patternc != NULL) {
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        patstream = xmlPatternGetStreamCtxt(patternc);
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (patstream != NULL) {
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlStreamPush(patstream, NULL, NULL);
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ret < 0) {
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "xmlStreamPush() failure\n");
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeStreamCtxt(patstream);
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		patstream = NULL;
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_PATTERN_ENABLED */
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reader = xmlReaderWalker(doc);
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reader != NULL) {
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlTextReaderRead(reader);
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (ret == 1) {
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((debug)
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        || (patternc)
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       )
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		processNode(reader);
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlTextReaderRead(reader);
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("walking through the doc");
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeTextReader(reader);
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0) {
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "failed to walk through the doc\n");
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_UNCLASS;
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	fprintf(stderr, "Failed to crate a reader from the document\n");
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	progresult = XMLLINT_ERR_UNCLASS;
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (patstream != NULL) {
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeStreamCtxt(patstream);
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	patstream = NULL;
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			XPath Query                                     *
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void doXPathDump(xmlXPathObjectPtr cur) {
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch(cur->type) {
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_NODESET: {
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int i;
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlNodePtr node;
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlSaveCtxtPtr ctxt;
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur->nodesetval->nodeNr <= 0) {
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(stderr, "XPath set is empty\n");
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                progresult = XMLLINT_ERR_XPATH;
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ctxt = xmlSaveToFd(1, NULL, 0);
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (ctxt == NULL) {
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fprintf(stderr, "Out of memory for XPath\n");
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                progresult = XMLLINT_ERR_MEM;
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return;
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0;i < cur->nodesetval->nodeNr;i++) {
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                node = cur->nodesetval->nodeTab[i];
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlSaveTree(ctxt, node);
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlSaveClose(ctxt);
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            printf("xpath returned %d nodes\n", cur->nodesetval->nodeNr);
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_BOOLEAN:
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->boolval) printf("true");
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else printf("false");
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_NUMBER:
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (xmlXPathIsInf(cur->floatval)) {
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case 1:
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("Infinity");
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case -1:
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("-Infinity");
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlXPathIsNaN(cur->floatval)) {
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("NaN");
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    printf("%0g", cur->floatval);
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_STRING:
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("%s", (const char *) cur->stringval);
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XPATH_UNDEFINED:
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "XPath Object is uninitialized\n");
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            progresult = XMLLINT_ERR_XPATH;
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "XPath object of unexpected type\n");
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            progresult = XMLLINT_ERR_XPATH;
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void doXPathQuery(xmlDocPtr doc, const char *query) {
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathContextPtr ctxt;
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathObjectPtr res;
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt = xmlXPathNewContext(doc);
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL) {
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "Out of memory for XPath\n");
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        progresult = XMLLINT_ERR_MEM;
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctxt->node = xmlDocGetRootElement(doc);
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = xmlXPathEval(BAD_CAST query, ctxt);
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeContext(ctxt);
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res == NULL) {
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stderr, "XPath evaluation failure\n");
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        progresult = XMLLINT_ERR_XPATH;
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doXPathDump(res);
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlXPathFreeObject(res);
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_XPATH_ENABLED */
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Tree Test processing				*
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc = NULL;
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr tmp;
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((timing) && (!repeat))
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	startTimer();
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filename == NULL) {
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (generate) {
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodePtr n;
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc = xmlNewDoc(BAD_CAST "1.0");
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    n = xmlNewDocNode(doc, NULL, BAD_CAST "info", NULL);
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeSetContent(n, BAD_CAST "abc");
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDocSetRootElement(doc, n);
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PUSH_ENABLED
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((html) && (push)) {
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FILE *f;
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	f = fopen(filename, "rb");
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	f = fopen(filename, "r");
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (f != NULL) {
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int res, size = 3;
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            char chars[4096];
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            htmlParserCtxtPtr ctxt;
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* if (repeat) */
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                size = 4096;
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            res = fread(chars, 1, 4, f);
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (res > 0) {
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ctxt = htmlCreatePushParserCtxt(NULL, NULL,
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            chars, res, filename, XML_CHAR_ENCODING_NONE);
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while ((res = fread(chars, 1, size, f)) > 0) {
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    htmlParseChunk(ctxt, chars, res, 0);
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                htmlParseChunk(ctxt, chars, 0, 1);
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                doc = ctxt->myDoc;
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                htmlFreeParserCtxt(ctxt);
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fclose(f);
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_PUSH_ENABLED */
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((html) && (memory)) {
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int fd;
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct stat info;
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const char *base;
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (stat(filename, &info) < 0)
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((fd = open(filename, O_RDONLY)) < 0)
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (base == (void *) MAP_FAILED)
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc = htmlReadMemory((char *) base, info.st_size, filename,
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                     NULL, options);
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	munmap((char *) base, info.st_size);
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	close(fd);
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (html) {
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc = htmlReadFile(filename, NULL, options);
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_HTML_ENABLED */
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else {
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PUSH_ENABLED
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * build an XML tree from a string;
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (push) {
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FILE *f;
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* '-' Usually means stdin -<sven@zen.org> */
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((filename[0] == '-') && (filename[1] == 0)) {
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      f = stdin;
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		f = fopen(filename, "rb");
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		f = fopen(filename, "r");
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (f != NULL) {
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int ret;
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        int res, size = 1024;
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        char chars[1024];
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlParserCtxtPtr ctxt;
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* if (repeat) size = 1024; */
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		res = fread(chars, 1, 4, f);
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (res > 0) {
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ctxt = xmlCreatePushParserCtxt(NULL, NULL,
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                chars, res, filename);
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlCtxtUseOptions(ctxt, options);
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while ((res = fread(chars, 1, size, f)) > 0) {
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlParseChunk(ctxt, chars, res, 0);
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlParseChunk(ctxt, chars, 0, 1);
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    doc = ctxt->myDoc;
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = ctxt->wellFormed;
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFreeParserCtxt(ctxt);
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (!ret) {
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFreeDoc(doc);
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			doc = NULL;
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        }
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (f != stdin)
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    fclose(f);
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_PUSH_ENABLED */
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (testIO) {
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((filename[0] == '-') && (filename[1] == 0)) {
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        doc = xmlReadFd(0, NULL, NULL, options);
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        FILE *f;
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		f = fopen(filename, "rb");
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		f = fopen(filename, "r");
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (f != NULL) {
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (rectxt == NULL)
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			doc = xmlReadIO((xmlInputReadCallback) myRead,
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					(xmlInputCloseCallback) myClose, f,
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					filename, NULL, options);
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			doc = xmlCtxtReadIO(rectxt,
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			                (xmlInputReadCallback) myRead,
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					(xmlInputCloseCallback) myClose, f,
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					filename, NULL, options);
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    doc = NULL;
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (htmlout) {
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlParserCtxtPtr ctxt;
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (rectxt == NULL)
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ctxt = xmlNewParserCtxt();
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ctxt = rectxt;
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ctxt == NULL) {
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        doc = NULL;
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ctxt->sax->error = xmlHTMLError;
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ctxt->sax->warning = xmlHTMLWarning;
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ctxt->vctxt.error = xmlHTMLValidityError;
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ctxt->vctxt.warning = xmlHTMLValidityWarning;
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (rectxt == NULL)
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFreeParserCtxt(ctxt);
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (memory) {
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int fd;
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    struct stat info;
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const char *base;
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (stat(filename, &info) < 0)
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return;
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((fd = open(filename, O_RDONLY)) < 0)
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return;
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (base == (void *) MAP_FAILED)
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        return;
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (rectxt == NULL)
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc = xmlReadMemory((char *) base, info.st_size,
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                    filename, NULL, options);
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size,
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			                filename, NULL, options);
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    munmap((char *) base, info.st_size);
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    close(fd);
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (valid) {
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlParserCtxtPtr ctxt = NULL;
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (rectxt == NULL)
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ctxt = xmlNewParserCtxt();
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ctxt = rectxt;
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ctxt == NULL) {
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        doc = NULL;
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ctxt->valid == 0)
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    progresult = XMLLINT_ERR_RDFILE;
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (rectxt == NULL)
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFreeParserCtxt(ctxt);
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (rectxt != NULL)
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        doc = xmlCtxtReadFile(rectxt, filename, NULL, options);
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else {
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (sax1)
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    doc = xmlParseFile(filename);
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SAX1_ENABLED */
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc = xmlReadFile(filename, NULL, options);
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * If we don't have a document we might as well give up.  Do we
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * want an error message here?  <sven@zen.org> */
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) {
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	progresult = XMLLINT_ERR_UNCLASS;
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((timing) && (!repeat)) {
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	endTimer("Parsing");
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Remove DOCTYPE nodes
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dropdtd) {
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDtdPtr dtd;
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dtd = xmlGetIntSubset(doc);
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (dtd != NULL) {
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlUnlinkNode((xmlNodePtr)dtd);
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeDtd(dtd);
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xinclude) {
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlXIncludeProcessFlags(doc, options) < 0)
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_UNCLASS;
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Xinclude processing");
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xpathquery != NULL) {
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        doXPathQuery(doc, xpathquery);
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * shell interaction
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (shell) {
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlXPathOrderDocElems(doc);
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlShell(doc, filename, xmlShellReadline, stdout);
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * test intermediate copy if needed.
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (copy) {
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tmp = doc;
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc = xmlCopyDoc(doc, 1);
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Copying");
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc(tmp);
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Freeing original");
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((insert) && (!html)) {
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const xmlChar* list[256];
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int nb, i;
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr node;
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc->children != NULL) {
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = doc->children;
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((node != NULL) && (node->last == NULL)) node = node->next;
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node != NULL) {
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nb = xmlValidGetValidElements(node->last, NULL, list, 256);
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (nb < 0) {
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "could not get valid list of elements\n");
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (nb == 0) {
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "No element can be inserted under root\n");
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "%d element types can be inserted under root:\n",
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		           nb);
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (i = 0;i < nb;i++) {
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 fprintf(stderr, "%s\n", (char *) list[i]);
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (walker) {
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        walkDoc(doc);
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noout == 0) {
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int ret;
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * print it.
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!debug) {
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((timing) && (!repeat)) {
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		startTimer();
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((html) && (!xmlout)) {
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (compress) {
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    htmlSaveFile(output ? output : "-", doc);
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else if (encoding != NULL) {
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ( format ) {
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			htmlSaveFileFormat(output ? output : "-", doc, encoding, 1);
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			htmlSaveFileFormat(output ? output : "-", doc, encoding, 0);
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else if (format) {
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    htmlSaveFileFormat(output ? output : "-", doc, NULL, 1);
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else {
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FILE *out;
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (output == NULL)
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			out = stdout;
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			out = fopen(output,"wb");
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (out != NULL) {
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (htmlDocDump(out, doc) < 0)
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    progresult = XMLLINT_ERR_OUT;
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (output != NULL)
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    fclose(out);
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(stderr, "failed to open %s\n", output);
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			progresult = XMLLINT_ERR_OUT;
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((timing) && (!repeat)) {
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    endTimer("Saving");
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_C14N_ENABLED
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (canonical) {
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlChar *result = NULL;
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int size;
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_0, NULL, 1, &result);
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (size >= 0) {
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    write(1, result, size);
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(result);
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "Failed to canonicalize\n");
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    progresult = XMLLINT_ERR_OUT;
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (canonical) {
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlChar *result = NULL;
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int size;
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_1, NULL, 1, &result);
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (size >= 0) {
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    write(1, result, size);
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(result);
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "Failed to canonicalize\n");
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    progresult = XMLLINT_ERR_OUT;
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (exc_canonical) {
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlChar *result = NULL;
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int size;
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_EXCLUSIVE_1_0, NULL, 1, &result);
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (size >= 0) {
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    write(1, result, size);
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(result);
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "Failed to canonicalize\n");
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    progresult = XMLLINT_ERR_OUT;
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (memory) {
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *result;
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int len;
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (encoding != NULL) {
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ( format ) {
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1);
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlDocDumpMemoryEnc(doc, &result, &len, encoding);
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (format)
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlDocDumpFormatMemory(doc, &result, &len, 1);
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlDocDumpMemory(doc, &result, &len);
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (result == NULL) {
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "Failed to save\n");
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    progresult = XMLLINT_ERR_OUT;
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    write(1, result, len);
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(result);
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_SYS_MMAN_H */
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (compress) {
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSaveFile(output ? output : "-", doc);
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if (oldout) {
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (encoding != NULL) {
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ( format ) {
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlSaveFormatFileEnc(output ? output : "-", doc,
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						   encoding, 1);
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret = xmlSaveFileEnc(output ? output : "-", doc,
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			                     encoding);
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret < 0) {
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(stderr, "failed save to %s\n",
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				output ? output : "-");
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			progresult = XMLLINT_ERR_OUT;
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else if (format) {
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ret = xmlSaveFormatFile(output ? output : "-", doc, 1);
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ret < 0) {
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(stderr, "failed save to %s\n",
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				output ? output : "-");
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			progresult = XMLLINT_ERR_OUT;
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    FILE *out;
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (output == NULL)
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			out = stdout;
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			out = fopen(output,"wb");
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (out != NULL) {
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDocDump(out, doc) < 0)
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    progresult = XMLLINT_ERR_OUT;
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (output != NULL)
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    fclose(out);
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(stderr, "failed to open %s\n", output);
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			progresult = XMLLINT_ERR_OUT;
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlSaveCtxtPtr ctxt;
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int saveOpts = 0;
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (format)
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    saveOpts |= XML_SAVE_FORMAT;
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (xmlout)
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    saveOpts |= XML_SAVE_AS_XML;
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (output == NULL)
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ctxt = xmlSaveToFd(1, encoding, saveOpts);
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ctxt = xmlSaveToFilename(output, encoding, saveOpts);
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ctxt != NULL) {
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlSaveDoc(ctxt, doc) < 0) {
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			fprintf(stderr, "failed save to %s\n",
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				output ? output : "-");
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			progresult = XMLLINT_ERR_OUT;
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlSaveClose(ctxt);
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    progresult = XMLLINT_ERR_OUT;
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((timing) && (!repeat)) {
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		endTimer("Saving");
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FILE *out;
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (output == NULL)
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        out = stdout;
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else {
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out = fopen(output,"wb");
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (out != NULL) {
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlDebugDumpDocument(out, doc);
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (output != NULL)
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fclose(out);
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "failed to open %s\n", output);
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		progresult = XMLLINT_ERR_OUT;
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * A posteriori validation test
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) {
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDtdPtr dtd;
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (dtdvalid != NULL)
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid);
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL);
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Parsing DTD");
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (dtd == NULL) {
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (dtdvalid != NULL)
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Could not parse DTD %s\n", dtdvalid);
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Could not parse DTD %s\n", dtdvalidfpi);
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_DTD;
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlValidCtxtPtr cvp;
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cvp = xmlNewValidCtxt()) == NULL) {
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGenericError(xmlGenericErrorContext,
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			"Couldn't allocate validation context\n");
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		exit(-1);
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cvp->userData = (void *) stderr;
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cvp->error    = (xmlValidityErrorFunc) fprintf;
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cvp->warning  = (xmlValidityWarningFunc) fprintf;
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((timing) && (!repeat)) {
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		startTimer();
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!xmlValidateDtd(cvp, doc, dtd)) {
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (dtdvalid != NULL)
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError(xmlGenericErrorContext,
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "Document %s does not validate against %s\n",
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    filename, dtdvalid);
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlGenericError(xmlGenericErrorContext,
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    "Document %s does not validate against %s\n",
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    filename, dtdvalidfpi);
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		progresult = XMLLINT_ERR_VALID;
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((timing) && (!repeat)) {
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		endTimer("Validating against DTD");
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeValidCtxt(cvp);
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeDtd(dtd);
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (postvalid) {
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlValidCtxtPtr cvp;
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cvp = xmlNewValidCtxt()) == NULL) {
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Couldn't allocate validation context\n");
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    exit(-1);
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cvp->userData = (void *) stderr;
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cvp->error    = (xmlValidityErrorFunc) fprintf;
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cvp->warning  = (xmlValidityWarningFunc) fprintf;
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!xmlValidateDocument(cvp, doc)) {
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Document %s does not validate\n", filename);
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_VALID;
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Validating");
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeValidCtxt(cvp);
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMATRON_ENABLED
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wxschematron != NULL) {
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchematronValidCtxtPtr ctxt;
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int ret;
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int flag;
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (debug)
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    flag = XML_SCHEMATRON_OUT_XML;
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    flag = XML_SCHEMATRON_OUT_TEXT;
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (noout)
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    flag |= XML_SCHEMATRON_OUT_QUIET;
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = xmlSchematronNewValidCtxt(wxschematron, flag);
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchematronSetValidErrors(ctxt,
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchematronValidityErrorFunc) fprintf,
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchematronValidityWarningFunc) fprintf,
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stderr);
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchematronValidateDoc(ctxt, doc);
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == 0) {
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s validates\n", filename);
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (ret > 0) {
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s fails to validate\n", filename);
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_VALID;
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s validation generated an internal error\n",
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   filename);
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_VALID;
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchematronFreeValidCtxt(ctxt);
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Validating");
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (relaxngschemas != NULL) {
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRelaxNGValidCtxtPtr ctxt;
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int ret;
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRelaxNGSetValidErrors(ctxt,
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlRelaxNGValidityErrorFunc) fprintf,
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlRelaxNGValidityWarningFunc) fprintf,
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stderr);
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlRelaxNGValidateDoc(ctxt, doc);
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == 0) {
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s validates\n", filename);
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (ret > 0) {
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s fails to validate\n", filename);
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_VALID;
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s validation generated an internal error\n",
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   filename);
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_VALID;
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRelaxNGFreeValidCtxt(ctxt);
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Validating");
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (wxschemas != NULL) {
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaValidCtxtPtr ctxt;
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int ret;
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = xmlSchemaNewValidCtxt(wxschemas);
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetValidErrors(ctxt,
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaValidityErrorFunc) fprintf,
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaValidityWarningFunc) fprintf,
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stderr);
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlSchemaValidateDoc(ctxt, doc);
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == 0) {
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s validates\n", filename);
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (ret > 0) {
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s fails to validate\n", filename);
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_VALID;
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "%s validation generated an internal error\n",
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   filename);
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    progresult = XMLLINT_ERR_VALID;
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeValidCtxt(ctxt);
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (!repeat)) {
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Validating");
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((debugent) && (!html))
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDebugDumpEntities(stderr, doc);
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * free it.
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((timing) && (!repeat)) {
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	startTimer();
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeDoc(doc);
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((timing) && (!repeat)) {
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	endTimer("Freeing");
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Usage and Main					*
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void showVersion(const char *name) {
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion);
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "   compiled with: ");
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_THREAD)) fprintf(stderr, "Threads ");
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_TREE)) fprintf(stderr, "Tree ");
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(stderr, "Output ");
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_PUSH)) fprintf(stderr, "Push ");
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_READER)) fprintf(stderr, "Reader ");
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(stderr, "Patterns ");
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_WRITER)) fprintf(stderr, "Writer ");
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_SAX1)) fprintf(stderr, "SAXv1 ");
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP ");
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP ");
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_VALID)) fprintf(stderr, "DTDValid ");
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML ");
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy ");
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N ");
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog ");
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath ");
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer ");
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude ");
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv ");
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X ");
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode ");
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps ");
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata ");
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr ");
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas ");
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron ");
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules ");
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug ");
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_DEBUG_MEM)) fprintf(stderr, "MemDebug ");
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_DEBUG_RUN)) fprintf(stderr, "RunDebug ");
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(stderr, "Zlib ");
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "\n");
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void usage(const char *name) {
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("Usage : %s [options] XMLfiles ...\n", name);
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\tParse the XML files and output the result of the parsing\n");
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\tParse the XML files\n");
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--version : display the version of the XML library used\n");
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--debug : dump a debug tree of the in-memory document\n");
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--shell : run a navigating shell\n");
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--debugent : debug the entities defined in the document\n");
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--debug : dump the nodes content when using --stream\n");
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--copy : used to test the internal copy implementation\n");
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--recover : output what was parsable on broken XML documents\n");
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--huge : remove any internal arbitrary parser limits\n");
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--noent : substitute entity references by their value\n");
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--noout : don't output the result tree\n");
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--path 'paths': provide a set of paths for resources\n");
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--load-trace : print trace of all external entites loaded\n");
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--nonet : refuse to fetch DTDs or entities over network\n");
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--nocompact : do not generate compact text nodes\n");
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--htmlout : output results as HTML\n");
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--nowrap : do not put HTML doc wrapper\n");
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--valid : validate the document in addition to std well-formed check\n");
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--postvalid : do a posteriori validation, i.e after parsing\n");
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n");
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n");
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--timing : print some timings\n");
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--output file or -o file: save to a given file\n");
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--repeat : repeat 100 times, for timing or profiling\n");
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--insert : ad-hoc test for valid insertions\n");
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--compress : turn on gzip compression of output\n");
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--html : use the HTML parser\n");
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--xmlout : force to use the XML serializer when using --html\n");
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PUSH_ENABLED
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--push : use the push mode of the parser\n");
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_PUSH_ENABLED */
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--memory : parse from memory\n");
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--maxmem nbbytes : limits memory allocation to nbbytes bytes\n");
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--nowarning : do not emit warnings from parser/validator\n");
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--noblanks : drop (ignorable?) blanks spaces\n");
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--nocdata : replace cdata section with text nodes\n");
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--format : reformat/reindent the input\n");
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--encode encoding : output in the given encoding\n");
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--dropdtd : remove the DOCTYPE of the input docs\n");
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--c14n : save in W3C canonical format v1.0 (with comments)\n");
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--c14n11 : save in W3C canonical format v1.1 (with comments)\n");
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--exc-c14n : save in W3C exclusive canonical format (with comments)\n");
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_C14N_ENABLED
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_C14N_ENABLED */
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--nsclean : remove redundant namespace declarations\n");
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--testIO : test user I/O support\n");
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n");
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t             otherwise XML Catalogs starting from \n");
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t         %s are activated by default\n", XML_XML_DEFAULT_CATALOG);
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--nocatalogs: deactivate all catalogs\n");
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--auto : generate a small doc on the fly\n");
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--xinclude : do XInclude processing\n");
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--noxincludenode : same but do not generate XInclude nodes\n");
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--nofixup-base-uris : do not fixup xml:base uris\n");
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--loaddtd : fetch external DTD\n");
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n");
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--stream : use the streaming interface to process very large files\n");
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--walker : create a reader and walk though the resulting doc\n");
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--pattern pattern_value : test the pattern support\n");
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--chkregister : verify the node registration code\n");
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--relaxng schema : do RelaxNG validation against the schema\n");
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--schema schema : do validation against the WXS schema\n");
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMATRON_ENABLED
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--schematron schema : do validation against a schematron\n");
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--sax1: use the old SAX1 interfaces for processing\n");
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--sax: do not build a tree but work just at the SAX level\n");
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--oldxml10: use XML-1.0 parsing rules before the 5th edition\n");
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\t--xpath expr: evaluate the XPath expression, inply --noout\n");
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("\nLibxml project home page: http://xmlsoft.org/\n");
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n");
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void registerNode(xmlNodePtr node)
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node->_private = malloc(sizeof(long));
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *(long*)node->_private = (long) 0x81726354;
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nbregister++;
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void deregisterNode(xmlNodePtr node)
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(node->_private != NULL);
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(*(long*)node->_private == (long) 0x81726354);
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    free(node->_private);
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nbregister--;
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)main(int argc, char **argv) {
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, acount;
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int files = 0;
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int version = 0;
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* indent;
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (argc <= 1) {
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	usage(argv[0]);
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LIBXML_TEST_VERSION
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 1; i < argc ; i++) {
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!strcmp(argv[i], "-"))
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (argv[i][0] != '-')
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    debug++;
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-shell")) ||
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--shell"))) {
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    shell++;
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            noout = 1;
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    copy++;
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-recover")) ||
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--recover"))) {
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    recovery++;
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_RECOVER;
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-huge")) ||
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--huge"))) {
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_HUGE;
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-noent")) ||
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--noent"))) {
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    noent++;
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NOENT;
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-nsclean")) ||
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--nsclean"))) {
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NSCLEAN;
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-nocdata")) ||
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--nocdata"))) {
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NOCDATA;
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-nodict")) ||
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--nodict"))) {
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NODICT;
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-version")) ||
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--version"))) {
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    showVersion(argv[0]);
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    version = 1;
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-noout")) ||
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--noout")))
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    noout++;
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-o")) ||
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "-output")) ||
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--output"))) {
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    output = argv[i];
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-htmlout")) ||
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--htmlout")))
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    htmlout++;
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-nowrap")) ||
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--nowrap")))
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nowrap++;
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-html")) ||
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--html"))) {
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    html++;
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-xmlout")) ||
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--xmlout"))) {
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlout++;
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_HTML_ENABLED */
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-loaddtd")) ||
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--loaddtd"))) {
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    loaddtd++;
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_DTDLOAD;
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-dtdattr")) ||
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--dtdattr"))) {
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    loaddtd++;
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dtdattrs++;
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_DTDATTR;
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-valid")) ||
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--valid"))) {
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    valid++;
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_DTDVALID;
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-postvalid")) ||
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--postvalid"))) {
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    postvalid++;
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    loaddtd++;
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_DTDLOAD;
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-dtdvalid")) ||
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--dtdvalid"))) {
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dtdvalid = argv[i];
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    loaddtd++;
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_DTDLOAD;
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--dtdvalidfpi"))) {
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dtdvalidfpi = argv[i];
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    loaddtd++;
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_DTDLOAD;
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-dropdtd")) ||
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--dropdtd")))
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    dropdtd++;
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-insert")) ||
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--insert")))
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    insert++;
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-timing")) ||
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--timing")))
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    timing++;
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-auto")) ||
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--auto")))
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    generate++;
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-repeat")) ||
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--repeat"))) {
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (repeat)
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        repeat *= 10;
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        repeat = 100;
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PUSH_ENABLED
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-push")) ||
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--push")))
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    push++;
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_PUSH_ENABLED */
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-memory")) ||
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--memory")))
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    memory++;
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-testIO")) ||
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--testIO")))
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    testIO++;
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-xinclude")) ||
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--xinclude"))) {
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xinclude++;
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_XINCLUDE;
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-noxincludenode")) ||
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--noxincludenode"))) {
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xinclude++;
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_XINCLUDE;
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NOXINCNODE;
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-nofixup-base-uris")) ||
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--nofixup-base-uris"))) {
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xinclude++;
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_XINCLUDE;
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NOBASEFIX;
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-compress")) ||
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--compress"))) {
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    compress++;
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSetCompressMode(9);
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-nowarning")) ||
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--nowarning"))) {
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGetWarningsDefaultValue = 0;
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlPedanticParserDefault(0);
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NOWARNING;
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-pedantic")) ||
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--pedantic"))) {
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGetWarningsDefaultValue = 1;
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlPedanticParserDefault(1);
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_PEDANTIC;
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-debugent")) ||
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (!strcmp(argv[i], "--debugent"))) {
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    debugent++;
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlParserDebugEntities = 1;
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_C14N_ENABLED
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-c14n")) ||
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (!strcmp(argv[i], "--c14n"))) {
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    canonical++;
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-c14n11")) ||
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (!strcmp(argv[i], "--c14n11"))) {
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    canonical_11++;
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-exc-c14n")) ||
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (!strcmp(argv[i], "--exc-c14n"))) {
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    exc_canonical++;
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-catalogs")) ||
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (!strcmp(argv[i], "--catalogs"))) {
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    catalogs++;
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-nocatalogs")) ||
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (!strcmp(argv[i], "--nocatalogs"))) {
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nocatalogs++;
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-encode")) ||
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--encode"))) {
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    encoding = argv[i];
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * OK it's for testing purposes
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAddEncodingAlias("UTF-8", "DVEnc");
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-noblanks")) ||
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--noblanks"))) {
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     noblanks++;
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     xmlKeepBlanksDefault(0);
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-maxmem")) ||
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--maxmem"))) {
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     i++;
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     if (sscanf(argv[i], "%d", &maxmem) == 1) {
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         xmlMemSetup(myFreeFunc, myMallocFunc, myReallocFunc,
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		             myStrdupFunc);
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     } else {
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         maxmem = 0;
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     }
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-format")) ||
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--format"))) {
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     noblanks++;
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     format++;
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     xmlKeepBlanksDefault(0);
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-stream")) ||
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--stream"))) {
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     stream++;
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-walker")) ||
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--walker"))) {
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     walker++;
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             noout++;
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-sax1")) ||
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--sax1"))) {
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sax1++;
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_SAX1;
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SAX1_ENABLED */
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-sax")) ||
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--sax"))) {
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    sax++;
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((!strcmp(argv[i], "-chkregister")) ||
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--chkregister"))) {
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    chkregister++;
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-relaxng")) ||
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--relaxng"))) {
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    relaxng = argv[i];
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    noent++;
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NOENT;
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-schema")) ||
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--schema"))) {
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schema = argv[i];
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    noent++;
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMATRON_ENABLED
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-schematron")) ||
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--schematron"))) {
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schematron = argv[i];
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    noent++;
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((!strcmp(argv[i], "-nonet")) ||
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (!strcmp(argv[i], "--nonet"))) {
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_NONET;
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((!strcmp(argv[i], "-nocompact")) ||
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (!strcmp(argv[i], "--nocompact"))) {
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options &= ~XML_PARSE_COMPACT;
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-load-trace")) ||
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	           (!strcmp(argv[i], "--load-trace"))) {
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    load_trace++;
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((!strcmp(argv[i], "-path")) ||
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (!strcmp(argv[i], "--path"))) {
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parsePath(BAD_CAST argv[i]);
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((!strcmp(argv[i], "-pattern")) ||
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (!strcmp(argv[i], "--pattern"))) {
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    pattern = argv[i];
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((!strcmp(argv[i], "-xpath")) ||
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (!strcmp(argv[i], "--xpath"))) {
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    noout++;
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xpathquery = argv[i];
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((!strcmp(argv[i], "-oldxml10")) ||
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	           (!strcmp(argv[i], "--oldxml10"))) {
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    oldxml10++;
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    options |= XML_PARSE_OLD10;
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    fprintf(stderr, "Unknown option %s\n", argv[i]);
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    usage(argv[0]);
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_CATALOG_ENABLED
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nocatalogs == 0) {
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (catalogs) {
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const char *catal;
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    catal = getenv("SGML_CATALOG_FILES");
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (catal != NULL) {
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlLoadCatalogs(catal);
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n");
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SAX1_ENABLED
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sax1)
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSAXDefaultVersion(1);
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSAXDefaultVersion(2);
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SAX1_ENABLED */
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (chkregister) {
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefault(registerNode);
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDeregisterNodeDefault(deregisterNode);
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    indent = getenv("XMLLINT_INDENT");
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(indent != NULL) {
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeIndentString = indent;
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defaultEntityLoader = xmlGetExternalEntityLoader();
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSetExternalEntityLoader(xmllintExternalEntityLoader);
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlLineNumbersDefault(1);
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (loaddtd != 0)
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtdattrs)
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (noent != 0) xmlSubstituteEntitiesDefault(1);
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((htmlout) && (!nowrap)) {
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n");
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n");
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 "<html><head><title>%s output</title></head>\n",
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		argv[0]);
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n",
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		argv[0]);
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMATRON_ENABLED
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((schematron != NULL) && (sax == 0)
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && (stream == 0)
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	) {
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchematronParserCtxtPtr ctxt;
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* forces loading the DTDs */
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlLoadExtDtdDefaultValue |= 1;
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	options |= XML_PARSE_DTDLOAD;
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = xmlSchematronNewParserCtxt(schematron);
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchematronSetParserErrors(ctxt,
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchematronValidityErrorFunc) fprintf,
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchematronValidityWarningFunc) fprintf,
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stderr);
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	wxschematron = xmlSchematronParse(ctxt);
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (wxschematron == NULL) {
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Schematron schema %s failed to compile\n", schematron);
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            progresult = XMLLINT_ERR_SCHEMACOMP;
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schematron = NULL;
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchematronFreeParserCtxt(ctxt);
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Compiling the schemas");
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((relaxng != NULL) && (sax == 0)
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && (stream == 0)
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	) {
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRelaxNGParserCtxtPtr ctxt;
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* forces loading the DTDs */
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlLoadExtDtdDefaultValue |= 1;
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	options |= XML_PARSE_DTDLOAD;
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = xmlRelaxNGNewParserCtxt(relaxng);
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRelaxNGSetParserErrors(ctxt,
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlRelaxNGValidityErrorFunc) fprintf,
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlRelaxNGValidityWarningFunc) fprintf,
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stderr);
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	relaxngschemas = xmlRelaxNGParse(ctxt);
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (relaxngschemas == NULL) {
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Relax-NG schema %s failed to compile\n", relaxng);
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            progresult = XMLLINT_ERR_SCHEMACOMP;
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    relaxng = NULL;
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRelaxNGFreeParserCtxt(ctxt);
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Compiling the schemas");
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((schema != NULL)
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&& (stream == 0)
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	) {
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaParserCtxtPtr ctxt;
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ctxt = xmlSchemaNewParserCtxt(schema);
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaSetParserErrors(ctxt,
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaValidityErrorFunc) fprintf,
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlSchemaValidityWarningFunc) fprintf,
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stderr);
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	wxschemas = xmlSchemaParse(ctxt);
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (wxschemas == NULL) {
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "WXS schema %s failed to compile\n", schema);
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            progresult = XMLLINT_ERR_SCHEMACOMP;
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schema = NULL;
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFreeParserCtxt(ctxt);
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (timing) {
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    endTimer("Compiling the schemas");
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_SCHEMAS_ENABLED */
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((pattern != NULL)
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && (walker == 0)
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	) {
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (patternc == NULL) {
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "Pattern %s failed to compile\n", pattern);
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            progresult = XMLLINT_ERR_SCHEMAPAT;
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    pattern = NULL;
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_PATTERN_ENABLED */
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = 1; i < argc ; i++) {
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-encode")) ||
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--encode"))) {
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((!strcmp(argv[i], "-o")) ||
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (!strcmp(argv[i], "-output")) ||
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (!strcmp(argv[i], "--output"))) {
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            i++;
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_VALID_ENABLED
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-dtdvalid")) ||
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--dtdvalid"))) {
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-path")) ||
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (!strcmp(argv[i], "--path"))) {
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            i++;
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--dtdvalidfpi"))) {
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_VALID_ENABLED */
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-relaxng")) ||
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--relaxng"))) {
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-maxmem")) ||
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--maxmem"))) {
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-schema")) ||
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--schema"))) {
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!strcmp(argv[i], "-schematron")) ||
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (!strcmp(argv[i], "--schematron"))) {
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((!strcmp(argv[i], "-pattern")) ||
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--pattern"))) {
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPATH_ENABLED
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((!strcmp(argv[i], "-xpath")) ||
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!strcmp(argv[i], "--xpath"))) {
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((timing) && (repeat))
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    startTimer();
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Remember file names.  "-" means stdin.  <sven@zen.org> */
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0)) {
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (repeat) {
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlParserCtxtPtr ctxt = NULL;
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (acount = 0;acount < repeat;acount++) {
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (stream != 0) {
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			streamFile(argv[i]);
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (sax) {
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    testSAX(argv[i]);
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else {
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (ctxt == NULL)
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				ctxt = xmlNewParserCtxt();
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parseAndPrintFile(argv[i], ctxt);
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ctxt != NULL)
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFreeParserCtxt(ctxt);
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nbregister = 0;
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (stream != 0)
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    streamFile(argv[i]);
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (sax) {
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    testSAX(argv[i]);
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parseAndPrintFile(argv[i], NULL);
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if ((chkregister) && (nbregister != 0)) {
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    fprintf(stderr, "Registration count off: %d\n", nbregister);
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    progresult = XMLLINT_ERR_RDREGIS;
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    files ++;
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((timing) && (repeat)) {
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		endTimer("%d iterations", repeat);
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (generate)
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parseAndPrintFile(NULL, NULL);
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((htmlout) && (!nowrap)) {
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext, "</body></html>\n");
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((files == 0) && (!generate) && (version == 0)) {
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	usage(argv[0]);
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMATRON_ENABLED
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wxschematron != NULL)
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchematronFree(wxschematron);
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_SCHEMAS_ENABLED
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (relaxngschemas != NULL)
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRelaxNGFree(relaxngschemas);
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wxschemas != NULL)
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSchemaFree(wxschemas);
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlRelaxNGCleanupTypes();
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_PATTERN_ENABLED
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (patternc != NULL)
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreePattern(patternc);
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlCleanupParser();
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlMemoryDump();
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(progresult);
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3723