|  | /* | 
|  | * xmllint.c : a small tester program for XML input. | 
|  | * | 
|  | * See Copyright for the status of this software. | 
|  | * | 
|  | * daniel@veillard.com | 
|  | */ | 
|  |  | 
|  | #include "libxml.h" | 
|  |  | 
|  | #include <string.h> | 
|  | #include <stdarg.h> | 
|  | #include <assert.h> | 
|  |  | 
|  | #if defined (_WIN32) && !defined(__CYGWIN__) | 
|  | #if defined (_MSC_VER) || defined(__BORLANDC__) | 
|  | #include <winsock2.h> | 
|  | #pragma comment(lib, "ws2_32.lib") | 
|  | #define gettimeofday(p1,p2) | 
|  | #endif /* _MSC_VER */ | 
|  | #endif /* _WIN32 */ | 
|  |  | 
|  | #ifdef HAVE_SYS_TIME_H | 
|  | #include <sys/time.h> | 
|  | #endif | 
|  | #ifdef HAVE_TIME_H | 
|  | #include <time.h> | 
|  | #endif | 
|  |  | 
|  | #ifdef __MINGW32__ | 
|  | #define _WINSOCKAPI_ | 
|  | #include <wsockcompat.h> | 
|  | #include <winsock2.h> | 
|  | #undef XML_SOCKLEN_T | 
|  | #define XML_SOCKLEN_T unsigned int | 
|  | #endif | 
|  |  | 
|  | #ifdef HAVE_SYS_TIMEB_H | 
|  | #include <sys/timeb.h> | 
|  | #endif | 
|  |  | 
|  | #ifdef HAVE_SYS_TYPES_H | 
|  | #include <sys/types.h> | 
|  | #endif | 
|  | #ifdef HAVE_SYS_STAT_H | 
|  | #include <sys/stat.h> | 
|  | #endif | 
|  | #ifdef HAVE_FCNTL_H | 
|  | #include <fcntl.h> | 
|  | #endif | 
|  | #ifdef HAVE_UNISTD_H | 
|  | #include <unistd.h> | 
|  | #endif | 
|  | #ifdef HAVE_SYS_MMAN_H | 
|  | #include <sys/mman.h> | 
|  | /* seems needed for Solaris */ | 
|  | #ifndef MAP_FAILED | 
|  | #define MAP_FAILED ((void *) -1) | 
|  | #endif | 
|  | #endif | 
|  | #ifdef HAVE_STDLIB_H | 
|  | #include <stdlib.h> | 
|  | #endif | 
|  | #ifdef HAVE_LIBREADLINE | 
|  | #include <readline/readline.h> | 
|  | #ifdef HAVE_LIBHISTORY | 
|  | #include <readline/history.h> | 
|  | #endif | 
|  | #endif | 
|  |  | 
|  | #include <libxml/xmlmemory.h> | 
|  | #include <libxml/parser.h> | 
|  | #include <libxml/parserInternals.h> | 
|  | #include <libxml/HTMLparser.h> | 
|  | #include <libxml/HTMLtree.h> | 
|  | #include <libxml/tree.h> | 
|  | #include <libxml/xpath.h> | 
|  | #include <libxml/debugXML.h> | 
|  | #include <libxml/xmlerror.h> | 
|  | #ifdef LIBXML_XINCLUDE_ENABLED | 
|  | #include <libxml/xinclude.h> | 
|  | #endif | 
|  | #ifdef LIBXML_CATALOG_ENABLED | 
|  | #include <libxml/catalog.h> | 
|  | #endif | 
|  | #include <libxml/globals.h> | 
|  | #include <libxml/xmlreader.h> | 
|  | #ifdef LIBXML_SCHEMATRON_ENABLED | 
|  | #include <libxml/schematron.h> | 
|  | #endif | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | #include <libxml/relaxng.h> | 
|  | #include <libxml/xmlschemas.h> | 
|  | #endif | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | #include <libxml/pattern.h> | 
|  | #endif | 
|  | #ifdef LIBXML_C14N_ENABLED | 
|  | #include <libxml/c14n.h> | 
|  | #endif | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | #include <libxml/xmlsave.h> | 
|  | #endif | 
|  |  | 
|  | #ifndef XML_XML_DEFAULT_CATALOG | 
|  | #define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog" | 
|  | #endif | 
|  |  | 
|  | typedef enum { | 
|  | XMLLINT_RETURN_OK = 0,	/* No error */ | 
|  | XMLLINT_ERR_UNCLASS = 1,	/* Unclassified */ | 
|  | XMLLINT_ERR_DTD = 2,	/* Error in DTD */ | 
|  | XMLLINT_ERR_VALID = 3,	/* Validation error */ | 
|  | XMLLINT_ERR_RDFILE = 4,	/* CtxtReadFile error */ | 
|  | XMLLINT_ERR_SCHEMACOMP = 5,	/* Schema compilation */ | 
|  | XMLLINT_ERR_OUT = 6,	/* Error writing output */ | 
|  | XMLLINT_ERR_SCHEMAPAT = 7,	/* Error in schema pattern */ | 
|  | XMLLINT_ERR_RDREGIS = 8,	/* Error in Reader registration */ | 
|  | XMLLINT_ERR_MEM = 9,	/* Out of memory error */ | 
|  | XMLLINT_ERR_XPATH = 10	/* XPath evaluation error */ | 
|  | } xmllintReturnCode; | 
|  | #ifdef LIBXML_DEBUG_ENABLED | 
|  | static int shell = 0; | 
|  | static int debugent = 0; | 
|  | #endif | 
|  | static int debug = 0; | 
|  | static int maxmem = 0; | 
|  | #ifdef LIBXML_TREE_ENABLED | 
|  | static int copy = 0; | 
|  | #endif /* LIBXML_TREE_ENABLED */ | 
|  | static int recovery = 0; | 
|  | static int noent = 0; | 
|  | static int noblanks = 0; | 
|  | static int noout = 0; | 
|  | static int nowrap = 0; | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | static int format = 0; | 
|  | static const char *output = NULL; | 
|  | static int compress = 0; | 
|  | static int oldout = 0; | 
|  | #endif /* LIBXML_OUTPUT_ENABLED */ | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | static int valid = 0; | 
|  | static int postvalid = 0; | 
|  | static char * dtdvalid = NULL; | 
|  | static char * dtdvalidfpi = NULL; | 
|  | #endif | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | static char * relaxng = NULL; | 
|  | static xmlRelaxNGPtr relaxngschemas = NULL; | 
|  | static char * schema = NULL; | 
|  | static xmlSchemaPtr wxschemas = NULL; | 
|  | #endif | 
|  | #ifdef LIBXML_SCHEMATRON_ENABLED | 
|  | static char * schematron = NULL; | 
|  | static xmlSchematronPtr wxschematron = NULL; | 
|  | #endif | 
|  | static int repeat = 0; | 
|  | static int insert = 0; | 
|  | #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED) | 
|  | static int html = 0; | 
|  | static int xmlout = 0; | 
|  | #endif | 
|  | static int htmlout = 0; | 
|  | #ifdef LIBXML_PUSH_ENABLED | 
|  | static int push = 0; | 
|  | #endif /* LIBXML_PUSH_ENABLED */ | 
|  | #ifdef HAVE_SYS_MMAN_H | 
|  | static int memory = 0; | 
|  | #endif | 
|  | static int testIO = 0; | 
|  | static char *encoding = NULL; | 
|  | #ifdef LIBXML_XINCLUDE_ENABLED | 
|  | static int xinclude = 0; | 
|  | #endif | 
|  | static int dtdattrs = 0; | 
|  | static int loaddtd = 0; | 
|  | static xmllintReturnCode progresult = XMLLINT_RETURN_OK; | 
|  | static int timing = 0; | 
|  | static int generate = 0; | 
|  | static int dropdtd = 0; | 
|  | #ifdef LIBXML_CATALOG_ENABLED | 
|  | static int catalogs = 0; | 
|  | static int nocatalogs = 0; | 
|  | #endif | 
|  | #ifdef LIBXML_C14N_ENABLED | 
|  | static int canonical = 0; | 
|  | static int canonical_11 = 0; | 
|  | static int exc_canonical = 0; | 
|  | #endif | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | static int stream = 0; | 
|  | static int walker = 0; | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | static int chkregister = 0; | 
|  | static int nbregister = 0; | 
|  | #ifdef LIBXML_SAX1_ENABLED | 
|  | static int sax1 = 0; | 
|  | #endif /* LIBXML_SAX1_ENABLED */ | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | static const char *pattern = NULL; | 
|  | static xmlPatternPtr patternc = NULL; | 
|  | static xmlStreamCtxtPtr patstream = NULL; | 
|  | #endif | 
|  | #ifdef LIBXML_XPATH_ENABLED | 
|  | static const char *xpathquery = NULL; | 
|  | #endif | 
|  | static int options = XML_PARSE_COMPACT; | 
|  | static int sax = 0; | 
|  | static int oldxml10 = 0; | 
|  |  | 
|  | /************************************************************************ | 
|  | *									* | 
|  | *		 Entity loading control and customization.		* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  | #define MAX_PATHS 64 | 
|  | #ifdef _WIN32 | 
|  | # define PATH_SEPARATOR ';' | 
|  | #else | 
|  | # define PATH_SEPARATOR ':' | 
|  | #endif | 
|  | static xmlChar *paths[MAX_PATHS + 1]; | 
|  | static int nbpaths = 0; | 
|  | static int load_trace = 0; | 
|  |  | 
|  | static | 
|  | void parsePath(const xmlChar *path) { | 
|  | const xmlChar *cur; | 
|  |  | 
|  | if (path == NULL) | 
|  | return; | 
|  | while (*path != 0) { | 
|  | if (nbpaths >= MAX_PATHS) { | 
|  | fprintf(stderr, "MAX_PATHS reached: too many paths\n"); | 
|  | return; | 
|  | } | 
|  | cur = path; | 
|  | while ((*cur == ' ') || (*cur == PATH_SEPARATOR)) | 
|  | cur++; | 
|  | path = cur; | 
|  | while ((*cur != 0) && (*cur != ' ') && (*cur != PATH_SEPARATOR)) | 
|  | cur++; | 
|  | if (cur != path) { | 
|  | paths[nbpaths] = xmlStrndup(path, cur - path); | 
|  | if (paths[nbpaths] != NULL) | 
|  | nbpaths++; | 
|  | path = cur; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | static xmlExternalEntityLoader defaultEntityLoader = NULL; | 
|  |  | 
|  | static xmlParserInputPtr | 
|  | xmllintExternalEntityLoader(const char *URL, const char *ID, | 
|  | xmlParserCtxtPtr ctxt) { | 
|  | xmlParserInputPtr ret; | 
|  | warningSAXFunc warning = NULL; | 
|  | errorSAXFunc err = NULL; | 
|  |  | 
|  | int i; | 
|  | const char *lastsegment = URL; | 
|  | const char *iter = URL; | 
|  |  | 
|  | if ((nbpaths > 0) && (iter != NULL)) { | 
|  | while (*iter != 0) { | 
|  | if (*iter == '/') | 
|  | lastsegment = iter + 1; | 
|  | iter++; | 
|  | } | 
|  | } | 
|  |  | 
|  | if ((ctxt != NULL) && (ctxt->sax != NULL)) { | 
|  | warning = ctxt->sax->warning; | 
|  | err = ctxt->sax->error; | 
|  | ctxt->sax->warning = NULL; | 
|  | ctxt->sax->error = NULL; | 
|  | } | 
|  |  | 
|  | if (defaultEntityLoader != NULL) { | 
|  | ret = defaultEntityLoader(URL, ID, ctxt); | 
|  | if (ret != NULL) { | 
|  | if (warning != NULL) | 
|  | ctxt->sax->warning = warning; | 
|  | if (err != NULL) | 
|  | ctxt->sax->error = err; | 
|  | if (load_trace) { | 
|  | fprintf \ | 
|  | (stderr, | 
|  | "Loaded URL=\"%s\" ID=\"%s\"\n", | 
|  | URL ? URL : "(null)", | 
|  | ID ? ID : "(null)"); | 
|  | } | 
|  | return(ret); | 
|  | } | 
|  | } | 
|  | for (i = 0;i < nbpaths;i++) { | 
|  | xmlChar *newURL; | 
|  |  | 
|  | newURL = xmlStrdup((const xmlChar *) paths[i]); | 
|  | newURL = xmlStrcat(newURL, (const xmlChar *) "/"); | 
|  | newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment); | 
|  | if (newURL != NULL) { | 
|  | ret = defaultEntityLoader((const char *)newURL, ID, ctxt); | 
|  | if (ret != NULL) { | 
|  | if (warning != NULL) | 
|  | ctxt->sax->warning = warning; | 
|  | if (err != NULL) | 
|  | ctxt->sax->error = err; | 
|  | if (load_trace) { | 
|  | fprintf \ | 
|  | (stderr, | 
|  | "Loaded URL=\"%s\" ID=\"%s\"\n", | 
|  | newURL, | 
|  | ID ? ID : "(null)"); | 
|  | } | 
|  | xmlFree(newURL); | 
|  | return(ret); | 
|  | } | 
|  | xmlFree(newURL); | 
|  | } | 
|  | } | 
|  | if (err != NULL) | 
|  | ctxt->sax->error = err; | 
|  | if (warning != NULL) { | 
|  | ctxt->sax->warning = warning; | 
|  | if (URL != NULL) | 
|  | warning(ctxt, "failed to load external entity \"%s\"\n", URL); | 
|  | else if (ID != NULL) | 
|  | warning(ctxt, "failed to load external entity \"%s\"\n", ID); | 
|  | } | 
|  | return(NULL); | 
|  | } | 
|  | /************************************************************************ | 
|  | *									* | 
|  | * Memory allocation consumption debugging				* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  |  | 
|  | static void | 
|  | OOM(void) | 
|  | { | 
|  | fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem); | 
|  | progresult = XMLLINT_ERR_MEM; | 
|  | } | 
|  |  | 
|  | static void | 
|  | myFreeFunc(void *mem) | 
|  | { | 
|  | xmlMemFree(mem); | 
|  | } | 
|  | static void * | 
|  | myMallocFunc(size_t size) | 
|  | { | 
|  | void *ret; | 
|  |  | 
|  | ret = xmlMemMalloc(size); | 
|  | if (ret != NULL) { | 
|  | if (xmlMemUsed() > maxmem) { | 
|  | OOM(); | 
|  | xmlMemFree(ret); | 
|  | return (NULL); | 
|  | } | 
|  | } | 
|  | return (ret); | 
|  | } | 
|  | static void * | 
|  | myReallocFunc(void *mem, size_t size) | 
|  | { | 
|  | void *ret; | 
|  |  | 
|  | ret = xmlMemRealloc(mem, size); | 
|  | if (ret != NULL) { | 
|  | if (xmlMemUsed() > maxmem) { | 
|  | OOM(); | 
|  | xmlMemFree(ret); | 
|  | return (NULL); | 
|  | } | 
|  | } | 
|  | return (ret); | 
|  | } | 
|  | static char * | 
|  | myStrdupFunc(const char *str) | 
|  | { | 
|  | char *ret; | 
|  |  | 
|  | ret = xmlMemoryStrdup(str); | 
|  | if (ret != NULL) { | 
|  | if (xmlMemUsed() > maxmem) { | 
|  | OOM(); | 
|  | xmlFree(ret); | 
|  | return (NULL); | 
|  | } | 
|  | } | 
|  | return (ret); | 
|  | } | 
|  | /************************************************************************ | 
|  | *									* | 
|  | * Internal timing routines to remove the necessity to have		* | 
|  | * unix-specific function calls.					* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  |  | 
|  | #ifndef HAVE_GETTIMEOFDAY | 
|  | #ifdef HAVE_SYS_TIMEB_H | 
|  | #ifdef HAVE_SYS_TIME_H | 
|  | #ifdef HAVE_FTIME | 
|  |  | 
|  | static int | 
|  | my_gettimeofday(struct timeval *tvp, void *tzp) | 
|  | { | 
|  | struct timeb timebuffer; | 
|  |  | 
|  | ftime(&timebuffer); | 
|  | if (tvp) { | 
|  | tvp->tv_sec = timebuffer.time; | 
|  | tvp->tv_usec = timebuffer.millitm * 1000L; | 
|  | } | 
|  | return (0); | 
|  | } | 
|  | #define HAVE_GETTIMEOFDAY 1 | 
|  | #define gettimeofday my_gettimeofday | 
|  |  | 
|  | #endif /* HAVE_FTIME */ | 
|  | #endif /* HAVE_SYS_TIME_H */ | 
|  | #endif /* HAVE_SYS_TIMEB_H */ | 
|  | #endif /* !HAVE_GETTIMEOFDAY */ | 
|  |  | 
|  | #if defined(HAVE_GETTIMEOFDAY) | 
|  | static struct timeval begin, end; | 
|  |  | 
|  | /* | 
|  | * startTimer: call where you want to start timing | 
|  | */ | 
|  | static void | 
|  | startTimer(void) | 
|  | { | 
|  | gettimeofday(&begin, NULL); | 
|  | } | 
|  |  | 
|  | /* | 
|  | * endTimer: call where you want to stop timing and to print out a | 
|  | *           message about the timing performed; format is a printf | 
|  | *           type argument | 
|  | */ | 
|  | static void XMLCDECL | 
|  | endTimer(const char *fmt, ...) | 
|  | { | 
|  | long msec; | 
|  | va_list ap; | 
|  |  | 
|  | gettimeofday(&end, NULL); | 
|  | msec = end.tv_sec - begin.tv_sec; | 
|  | msec *= 1000; | 
|  | msec += (end.tv_usec - begin.tv_usec) / 1000; | 
|  |  | 
|  | #ifndef HAVE_STDARG_H | 
|  | #error "endTimer required stdarg functions" | 
|  | #endif | 
|  | va_start(ap, fmt); | 
|  | vfprintf(stderr, fmt, ap); | 
|  | va_end(ap); | 
|  |  | 
|  | fprintf(stderr, " took %ld ms\n", msec); | 
|  | } | 
|  | #elif defined(HAVE_TIME_H) | 
|  | /* | 
|  | * No gettimeofday function, so we have to make do with calling clock. | 
|  | * This is obviously less accurate, but there's little we can do about | 
|  | * that. | 
|  | */ | 
|  | #ifndef CLOCKS_PER_SEC | 
|  | #define CLOCKS_PER_SEC 100 | 
|  | #endif | 
|  |  | 
|  | static clock_t begin, end; | 
|  | static void | 
|  | startTimer(void) | 
|  | { | 
|  | begin = clock(); | 
|  | } | 
|  | static void XMLCDECL | 
|  | endTimer(const char *fmt, ...) | 
|  | { | 
|  | long msec; | 
|  | va_list ap; | 
|  |  | 
|  | end = clock(); | 
|  | msec = ((end - begin) * 1000) / CLOCKS_PER_SEC; | 
|  |  | 
|  | #ifndef HAVE_STDARG_H | 
|  | #error "endTimer required stdarg functions" | 
|  | #endif | 
|  | va_start(ap, fmt); | 
|  | vfprintf(stderr, fmt, ap); | 
|  | va_end(ap); | 
|  | fprintf(stderr, " took %ld ms\n", msec); | 
|  | } | 
|  | #else | 
|  |  | 
|  | /* | 
|  | * We don't have a gettimeofday or time.h, so we just don't do timing | 
|  | */ | 
|  | static void | 
|  | startTimer(void) | 
|  | { | 
|  | /* | 
|  | * Do nothing | 
|  | */ | 
|  | } | 
|  | static void XMLCDECL | 
|  | endTimer(char *format, ...) | 
|  | { | 
|  | /* | 
|  | * We cannot do anything because we don't have a timing function | 
|  | */ | 
|  | #ifdef HAVE_STDARG_H | 
|  | va_start(ap, format); | 
|  | vfprintf(stderr, format, ap); | 
|  | va_end(ap); | 
|  | fprintf(stderr, " was not timed\n", msec); | 
|  | #else | 
|  | /* We don't have gettimeofday, time or stdarg.h, what crazy world is | 
|  | * this ?! | 
|  | */ | 
|  | #endif | 
|  | } | 
|  | #endif | 
|  | /************************************************************************ | 
|  | *									* | 
|  | *			HTML ouput					* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  | static char buffer[50000]; | 
|  |  | 
|  | static void | 
|  | xmlHTMLEncodeSend(void) { | 
|  | char *result; | 
|  |  | 
|  | result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer); | 
|  | if (result) { | 
|  | xmlGenericError(xmlGenericErrorContext, "%s", result); | 
|  | xmlFree(result); | 
|  | } | 
|  | buffer[0] = 0; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * xmlHTMLPrintFileInfo: | 
|  | * @input:  an xmlParserInputPtr input | 
|  | * | 
|  | * Displays the associated file and line informations for the current input | 
|  | */ | 
|  |  | 
|  | static void | 
|  | xmlHTMLPrintFileInfo(xmlParserInputPtr input) { | 
|  | int len; | 
|  | xmlGenericError(xmlGenericErrorContext, "<p>"); | 
|  |  | 
|  | len = strlen(buffer); | 
|  | if (input != NULL) { | 
|  | if (input->filename) { | 
|  | snprintf(&buffer[len], sizeof(buffer) - len, "%s:%d: ", input->filename, | 
|  | input->line); | 
|  | } else { | 
|  | snprintf(&buffer[len], sizeof(buffer) - len, "Entity: line %d: ", input->line); | 
|  | } | 
|  | } | 
|  | xmlHTMLEncodeSend(); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * xmlHTMLPrintFileContext: | 
|  | * @input:  an xmlParserInputPtr input | 
|  | * | 
|  | * Displays current context within the input content for error tracking | 
|  | */ | 
|  |  | 
|  | static void | 
|  | xmlHTMLPrintFileContext(xmlParserInputPtr input) { | 
|  | const xmlChar *cur, *base; | 
|  | int len; | 
|  | int n; | 
|  |  | 
|  | if (input == NULL) return; | 
|  | xmlGenericError(xmlGenericErrorContext, "<pre>\n"); | 
|  | cur = input->cur; | 
|  | base = input->base; | 
|  | while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) { | 
|  | cur--; | 
|  | } | 
|  | n = 0; | 
|  | while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r')) | 
|  | cur--; | 
|  | if ((*cur == '\n') || (*cur == '\r')) cur++; | 
|  | base = cur; | 
|  | n = 0; | 
|  | while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) { | 
|  | len = strlen(buffer); | 
|  | snprintf(&buffer[len], sizeof(buffer) - len, "%c", | 
|  | (unsigned char) *cur++); | 
|  | n++; | 
|  | } | 
|  | len = strlen(buffer); | 
|  | snprintf(&buffer[len], sizeof(buffer) - len, "\n"); | 
|  | cur = input->cur; | 
|  | while ((*cur == '\n') || (*cur == '\r')) | 
|  | cur--; | 
|  | n = 0; | 
|  | while ((cur != base) && (n++ < 80)) { | 
|  | len = strlen(buffer); | 
|  | snprintf(&buffer[len], sizeof(buffer) - len, " "); | 
|  | base++; | 
|  | } | 
|  | len = strlen(buffer); | 
|  | snprintf(&buffer[len], sizeof(buffer) - len, "^\n"); | 
|  | xmlHTMLEncodeSend(); | 
|  | xmlGenericError(xmlGenericErrorContext, "</pre>"); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * xmlHTMLError: | 
|  | * @ctx:  an XML parser context | 
|  | * @msg:  the message to display/transmit | 
|  | * @...:  extra parameters for the message display | 
|  | * | 
|  | * Display and format an error messages, gives file, line, position and | 
|  | * extra parameters. | 
|  | */ | 
|  | static void XMLCDECL | 
|  | xmlHTMLError(void *ctx, const char *msg, ...) | 
|  | { | 
|  | xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; | 
|  | xmlParserInputPtr input; | 
|  | va_list args; | 
|  | int len; | 
|  |  | 
|  | buffer[0] = 0; | 
|  | input = ctxt->input; | 
|  | if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { | 
|  | input = ctxt->inputTab[ctxt->inputNr - 2]; | 
|  | } | 
|  |  | 
|  | xmlHTMLPrintFileInfo(input); | 
|  |  | 
|  | xmlGenericError(xmlGenericErrorContext, "<b>error</b>: "); | 
|  | va_start(args, msg); | 
|  | len = strlen(buffer); | 
|  | vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args); | 
|  | va_end(args); | 
|  | xmlHTMLEncodeSend(); | 
|  | xmlGenericError(xmlGenericErrorContext, "</p>\n"); | 
|  |  | 
|  | xmlHTMLPrintFileContext(input); | 
|  | xmlHTMLEncodeSend(); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * xmlHTMLWarning: | 
|  | * @ctx:  an XML parser context | 
|  | * @msg:  the message to display/transmit | 
|  | * @...:  extra parameters for the message display | 
|  | * | 
|  | * Display and format a warning messages, gives file, line, position and | 
|  | * extra parameters. | 
|  | */ | 
|  | static void XMLCDECL | 
|  | xmlHTMLWarning(void *ctx, const char *msg, ...) | 
|  | { | 
|  | xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; | 
|  | xmlParserInputPtr input; | 
|  | va_list args; | 
|  | int len; | 
|  |  | 
|  | buffer[0] = 0; | 
|  | input = ctxt->input; | 
|  | if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) { | 
|  | input = ctxt->inputTab[ctxt->inputNr - 2]; | 
|  | } | 
|  |  | 
|  |  | 
|  | xmlHTMLPrintFileInfo(input); | 
|  |  | 
|  | xmlGenericError(xmlGenericErrorContext, "<b>warning</b>: "); | 
|  | va_start(args, msg); | 
|  | len = strlen(buffer); | 
|  | vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args); | 
|  | va_end(args); | 
|  | xmlHTMLEncodeSend(); | 
|  | xmlGenericError(xmlGenericErrorContext, "</p>\n"); | 
|  |  | 
|  | xmlHTMLPrintFileContext(input); | 
|  | xmlHTMLEncodeSend(); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * xmlHTMLValidityError: | 
|  | * @ctx:  an XML parser context | 
|  | * @msg:  the message to display/transmit | 
|  | * @...:  extra parameters for the message display | 
|  | * | 
|  | * Display and format an validity error messages, gives file, | 
|  | * line, position and extra parameters. | 
|  | */ | 
|  | static void XMLCDECL | 
|  | xmlHTMLValidityError(void *ctx, const char *msg, ...) | 
|  | { | 
|  | xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; | 
|  | xmlParserInputPtr input; | 
|  | va_list args; | 
|  | int len; | 
|  |  | 
|  | buffer[0] = 0; | 
|  | input = ctxt->input; | 
|  | if ((input->filename == NULL) && (ctxt->inputNr > 1)) | 
|  | input = ctxt->inputTab[ctxt->inputNr - 2]; | 
|  |  | 
|  | xmlHTMLPrintFileInfo(input); | 
|  |  | 
|  | xmlGenericError(xmlGenericErrorContext, "<b>validity error</b>: "); | 
|  | len = strlen(buffer); | 
|  | va_start(args, msg); | 
|  | vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args); | 
|  | va_end(args); | 
|  | xmlHTMLEncodeSend(); | 
|  | xmlGenericError(xmlGenericErrorContext, "</p>\n"); | 
|  |  | 
|  | xmlHTMLPrintFileContext(input); | 
|  | xmlHTMLEncodeSend(); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * xmlHTMLValidityWarning: | 
|  | * @ctx:  an XML parser context | 
|  | * @msg:  the message to display/transmit | 
|  | * @...:  extra parameters for the message display | 
|  | * | 
|  | * Display and format a validity warning messages, gives file, line, | 
|  | * position and extra parameters. | 
|  | */ | 
|  | static void XMLCDECL | 
|  | xmlHTMLValidityWarning(void *ctx, const char *msg, ...) | 
|  | { | 
|  | xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; | 
|  | xmlParserInputPtr input; | 
|  | va_list args; | 
|  | int len; | 
|  |  | 
|  | buffer[0] = 0; | 
|  | input = ctxt->input; | 
|  | if ((input->filename == NULL) && (ctxt->inputNr > 1)) | 
|  | input = ctxt->inputTab[ctxt->inputNr - 2]; | 
|  |  | 
|  | xmlHTMLPrintFileInfo(input); | 
|  |  | 
|  | xmlGenericError(xmlGenericErrorContext, "<b>validity warning</b>: "); | 
|  | va_start(args, msg); | 
|  | len = strlen(buffer); | 
|  | vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args); | 
|  | va_end(args); | 
|  | xmlHTMLEncodeSend(); | 
|  | xmlGenericError(xmlGenericErrorContext, "</p>\n"); | 
|  |  | 
|  | xmlHTMLPrintFileContext(input); | 
|  | xmlHTMLEncodeSend(); | 
|  | } | 
|  |  | 
|  | /************************************************************************ | 
|  | *									* | 
|  | *			Shell Interface					* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  | #ifdef LIBXML_DEBUG_ENABLED | 
|  | #ifdef LIBXML_XPATH_ENABLED | 
|  | /** | 
|  | * xmlShellReadline: | 
|  | * @prompt:  the prompt value | 
|  | * | 
|  | * Read a string | 
|  | * | 
|  | * Returns a pointer to it or NULL on EOF the caller is expected to | 
|  | *     free the returned string. | 
|  | */ | 
|  | static char * | 
|  | xmlShellReadline(char *prompt) { | 
|  | #ifdef HAVE_LIBREADLINE | 
|  | char *line_read; | 
|  |  | 
|  | /* Get a line from the user. */ | 
|  | line_read = readline (prompt); | 
|  |  | 
|  | /* If the line has any text in it, save it on the history. */ | 
|  | if (line_read && *line_read) | 
|  | add_history (line_read); | 
|  |  | 
|  | return (line_read); | 
|  | #else | 
|  | char line_read[501]; | 
|  | char *ret; | 
|  | int len; | 
|  |  | 
|  | if (prompt != NULL) | 
|  | fprintf(stdout, "%s", prompt); | 
|  | if (!fgets(line_read, 500, stdin)) | 
|  | return(NULL); | 
|  | line_read[500] = 0; | 
|  | len = strlen(line_read); | 
|  | ret = (char *) malloc(len + 1); | 
|  | if (ret != NULL) { | 
|  | memcpy (ret, line_read, len + 1); | 
|  | } | 
|  | return(ret); | 
|  | #endif | 
|  | } | 
|  | #endif /* LIBXML_XPATH_ENABLED */ | 
|  | #endif /* LIBXML_DEBUG_ENABLED */ | 
|  |  | 
|  | /************************************************************************ | 
|  | *									* | 
|  | *			I/O Interfaces					* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  |  | 
|  | static int myRead(FILE *f, char * buf, int len) { | 
|  | return(fread(buf, 1, len, f)); | 
|  | } | 
|  | static void myClose(FILE *f) { | 
|  | if (f != stdin) { | 
|  | fclose(f); | 
|  | } | 
|  | } | 
|  |  | 
|  | /************************************************************************ | 
|  | *									* | 
|  | *			SAX based tests					* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  |  | 
|  | /* | 
|  | * empty SAX block | 
|  | */ | 
|  | static xmlSAXHandler emptySAXHandlerStruct = { | 
|  | NULL, /* internalSubset */ | 
|  | NULL, /* isStandalone */ | 
|  | NULL, /* hasInternalSubset */ | 
|  | NULL, /* hasExternalSubset */ | 
|  | NULL, /* resolveEntity */ | 
|  | NULL, /* getEntity */ | 
|  | NULL, /* entityDecl */ | 
|  | NULL, /* notationDecl */ | 
|  | NULL, /* attributeDecl */ | 
|  | NULL, /* elementDecl */ | 
|  | NULL, /* unparsedEntityDecl */ | 
|  | NULL, /* setDocumentLocator */ | 
|  | NULL, /* startDocument */ | 
|  | NULL, /* endDocument */ | 
|  | NULL, /* startElement */ | 
|  | NULL, /* endElement */ | 
|  | NULL, /* reference */ | 
|  | NULL, /* characters */ | 
|  | NULL, /* ignorableWhitespace */ | 
|  | NULL, /* processingInstruction */ | 
|  | NULL, /* comment */ | 
|  | NULL, /* xmlParserWarning */ | 
|  | NULL, /* xmlParserError */ | 
|  | NULL, /* xmlParserError */ | 
|  | NULL, /* getParameterEntity */ | 
|  | NULL, /* cdataBlock; */ | 
|  | NULL, /* externalSubset; */ | 
|  | XML_SAX2_MAGIC, | 
|  | NULL, | 
|  | NULL, /* startElementNs */ | 
|  | NULL, /* endElementNs */ | 
|  | NULL  /* xmlStructuredErrorFunc */ | 
|  | }; | 
|  |  | 
|  | static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct; | 
|  | extern xmlSAXHandlerPtr debugSAXHandler; | 
|  | static int callbacks; | 
|  |  | 
|  | /** | 
|  | * isStandaloneDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * | 
|  | * Is this document tagged standalone ? | 
|  | * | 
|  | * Returns 1 if true | 
|  | */ | 
|  | static int | 
|  | isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return(0); | 
|  | fprintf(stdout, "SAX.isStandalone()\n"); | 
|  | return(0); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * hasInternalSubsetDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * | 
|  | * Does this document has an internal subset | 
|  | * | 
|  | * Returns 1 if true | 
|  | */ | 
|  | static int | 
|  | hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return(0); | 
|  | fprintf(stdout, "SAX.hasInternalSubset()\n"); | 
|  | return(0); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * hasExternalSubsetDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * | 
|  | * Does this document has an external subset | 
|  | * | 
|  | * Returns 1 if true | 
|  | */ | 
|  | static int | 
|  | hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return(0); | 
|  | fprintf(stdout, "SAX.hasExternalSubset()\n"); | 
|  | return(0); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * internalSubsetDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * | 
|  | * Does this document has an internal subset | 
|  | */ | 
|  | static void | 
|  | internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, | 
|  | const xmlChar *ExternalID, const xmlChar *SystemID) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.internalSubset(%s,", name); | 
|  | if (ExternalID == NULL) | 
|  | fprintf(stdout, " ,"); | 
|  | else | 
|  | fprintf(stdout, " %s,", ExternalID); | 
|  | if (SystemID == NULL) | 
|  | fprintf(stdout, " )\n"); | 
|  | else | 
|  | fprintf(stdout, " %s)\n", SystemID); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * externalSubsetDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * | 
|  | * Does this document has an external subset | 
|  | */ | 
|  | static void | 
|  | externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, | 
|  | const xmlChar *ExternalID, const xmlChar *SystemID) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.externalSubset(%s,", name); | 
|  | if (ExternalID == NULL) | 
|  | fprintf(stdout, " ,"); | 
|  | else | 
|  | fprintf(stdout, " %s,", ExternalID); | 
|  | if (SystemID == NULL) | 
|  | fprintf(stdout, " )\n"); | 
|  | else | 
|  | fprintf(stdout, " %s)\n", SystemID); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * resolveEntityDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @publicId: The public ID of the entity | 
|  | * @systemId: The system ID of the entity | 
|  | * | 
|  | * Special entity resolver, better left to the parser, it has | 
|  | * more context than the application layer. | 
|  | * The default behaviour is to NOT resolve the entities, in that case | 
|  | * the ENTITY_REF nodes are built in the structure (and the parameter | 
|  | * values). | 
|  | * | 
|  | * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. | 
|  | */ | 
|  | static xmlParserInputPtr | 
|  | resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return(NULL); | 
|  | /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */ | 
|  |  | 
|  |  | 
|  | fprintf(stdout, "SAX.resolveEntity("); | 
|  | if (publicId != NULL) | 
|  | fprintf(stdout, "%s", (char *)publicId); | 
|  | else | 
|  | fprintf(stdout, " "); | 
|  | if (systemId != NULL) | 
|  | fprintf(stdout, ", %s)\n", (char *)systemId); | 
|  | else | 
|  | fprintf(stdout, ", )\n"); | 
|  | return(NULL); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * getEntityDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name: The entity name | 
|  | * | 
|  | * Get an entity by name | 
|  | * | 
|  | * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. | 
|  | */ | 
|  | static xmlEntityPtr | 
|  | getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return(NULL); | 
|  | fprintf(stdout, "SAX.getEntity(%s)\n", name); | 
|  | return(NULL); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * getParameterEntityDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name: The entity name | 
|  | * | 
|  | * Get a parameter entity by name | 
|  | * | 
|  | * Returns the xmlParserInputPtr | 
|  | */ | 
|  | static xmlEntityPtr | 
|  | getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return(NULL); | 
|  | fprintf(stdout, "SAX.getParameterEntity(%s)\n", name); | 
|  | return(NULL); | 
|  | } | 
|  |  | 
|  |  | 
|  | /** | 
|  | * entityDeclDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name:  the entity name | 
|  | * @type:  the entity type | 
|  | * @publicId: The public ID of the entity | 
|  | * @systemId: The system ID of the entity | 
|  | * @content: the entity value (without processing). | 
|  | * | 
|  | * An entity definition has been parsed | 
|  | */ | 
|  | static void | 
|  | entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, | 
|  | const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) | 
|  | { | 
|  | const xmlChar *nullstr = BAD_CAST "(null)"; | 
|  | /* not all libraries handle printing null pointers nicely */ | 
|  | if (publicId == NULL) | 
|  | publicId = nullstr; | 
|  | if (systemId == NULL) | 
|  | systemId = nullstr; | 
|  | if (content == NULL) | 
|  | content = (xmlChar *)nullstr; | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n", | 
|  | name, type, publicId, systemId, content); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * attributeDeclDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name:  the attribute name | 
|  | * @type:  the attribute type | 
|  | * | 
|  | * An attribute definition has been parsed | 
|  | */ | 
|  | static void | 
|  | attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem, | 
|  | const xmlChar * name, int type, int def, | 
|  | const xmlChar * defaultValue, xmlEnumerationPtr tree) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | if (defaultValue == NULL) | 
|  | fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n", | 
|  | elem, name, type, def); | 
|  | else | 
|  | fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n", | 
|  | elem, name, type, def, defaultValue); | 
|  | xmlFreeEnumeration(tree); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * elementDeclDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name:  the element name | 
|  | * @type:  the element type | 
|  | * @content: the element value (without processing). | 
|  | * | 
|  | * An element definition has been parsed | 
|  | */ | 
|  | static void | 
|  | elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type, | 
|  | xmlElementContentPtr content ATTRIBUTE_UNUSED) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n", | 
|  | name, type); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * notationDeclDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name: The name of the notation | 
|  | * @publicId: The public ID of the entity | 
|  | * @systemId: The system ID of the entity | 
|  | * | 
|  | * What to do when a notation declaration has been parsed. | 
|  | */ | 
|  | static void | 
|  | notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, | 
|  | const xmlChar *publicId, const xmlChar *systemId) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n", | 
|  | (char *) name, (char *) publicId, (char *) systemId); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * unparsedEntityDeclDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name: The name of the entity | 
|  | * @publicId: The public ID of the entity | 
|  | * @systemId: The system ID of the entity | 
|  | * @notationName: the name of the notation | 
|  | * | 
|  | * What to do when an unparsed entity declaration is parsed | 
|  | */ | 
|  | static void | 
|  | unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, | 
|  | const xmlChar *publicId, const xmlChar *systemId, | 
|  | const xmlChar *notationName) | 
|  | { | 
|  | const xmlChar *nullstr = BAD_CAST "(null)"; | 
|  |  | 
|  | if (publicId == NULL) | 
|  | publicId = nullstr; | 
|  | if (systemId == NULL) | 
|  | systemId = nullstr; | 
|  | if (notationName == NULL) | 
|  | notationName = nullstr; | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n", | 
|  | (char *) name, (char *) publicId, (char *) systemId, | 
|  | (char *) notationName); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * setDocumentLocatorDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @loc: A SAX Locator | 
|  | * | 
|  | * Receive the document locator at startup, actually xmlDefaultSAXLocator | 
|  | * Everything is available on the context, so this is useless in our case. | 
|  | */ | 
|  | static void | 
|  | setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.setDocumentLocator()\n"); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * startDocumentDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * | 
|  | * called when the document start being processed. | 
|  | */ | 
|  | static void | 
|  | startDocumentDebug(void *ctx ATTRIBUTE_UNUSED) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.startDocument()\n"); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * endDocumentDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * | 
|  | * called when the document end has been detected. | 
|  | */ | 
|  | static void | 
|  | endDocumentDebug(void *ctx ATTRIBUTE_UNUSED) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.endDocument()\n"); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * startElementDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name:  The element name | 
|  | * | 
|  | * called when an opening tag has been processed. | 
|  | */ | 
|  | static void | 
|  | startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.startElement(%s", (char *) name); | 
|  | if (atts != NULL) { | 
|  | for (i = 0;(atts[i] != NULL);i++) { | 
|  | fprintf(stdout, ", %s='", atts[i++]); | 
|  | if (atts[i] != NULL) | 
|  | fprintf(stdout, "%s'", atts[i]); | 
|  | } | 
|  | } | 
|  | fprintf(stdout, ")\n"); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * endElementDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name:  The element name | 
|  | * | 
|  | * called when the end of an element has been detected. | 
|  | */ | 
|  | static void | 
|  | endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.endElement(%s)\n", (char *) name); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * charactersDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @ch:  a xmlChar string | 
|  | * @len: the number of xmlChar | 
|  | * | 
|  | * receiving some chars from the parser. | 
|  | * Question: how much at a time ??? | 
|  | */ | 
|  | static void | 
|  | charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) | 
|  | { | 
|  | char out[40]; | 
|  | int i; | 
|  |  | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | for (i = 0;(i<len) && (i < 30);i++) | 
|  | out[i] = ch[i]; | 
|  | out[i] = 0; | 
|  |  | 
|  | fprintf(stdout, "SAX.characters(%s, %d)\n", out, len); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * referenceDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name:  The entity name | 
|  | * | 
|  | * called when an entity reference is detected. | 
|  | */ | 
|  | static void | 
|  | referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.reference(%s)\n", name); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * ignorableWhitespaceDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @ch:  a xmlChar string | 
|  | * @start: the first char in the string | 
|  | * @len: the number of xmlChar | 
|  | * | 
|  | * receiving some ignorable whitespaces from the parser. | 
|  | * Question: how much at a time ??? | 
|  | */ | 
|  | static void | 
|  | ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) | 
|  | { | 
|  | char out[40]; | 
|  | int i; | 
|  |  | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | for (i = 0;(i<len) && (i < 30);i++) | 
|  | out[i] = ch[i]; | 
|  | out[i] = 0; | 
|  | fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", out, len); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * processingInstructionDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @target:  the target name | 
|  | * @data: the PI data's | 
|  | * @len: the number of xmlChar | 
|  | * | 
|  | * A processing instruction has been parsed. | 
|  | */ | 
|  | static void | 
|  | processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target, | 
|  | const xmlChar *data) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | if (data != NULL) | 
|  | fprintf(stdout, "SAX.processingInstruction(%s, %s)\n", | 
|  | (char *) target, (char *) data); | 
|  | else | 
|  | fprintf(stdout, "SAX.processingInstruction(%s, NULL)\n", | 
|  | (char *) target); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * cdataBlockDebug: | 
|  | * @ctx: the user data (XML parser context) | 
|  | * @value:  The pcdata content | 
|  | * @len:  the block length | 
|  | * | 
|  | * called when a pcdata block has been parsed | 
|  | */ | 
|  | static void | 
|  | cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.pcdata(%.20s, %d)\n", | 
|  | (char *) value, len); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * commentDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @value:  the comment content | 
|  | * | 
|  | * A comment has been parsed. | 
|  | */ | 
|  | static void | 
|  | commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.comment(%s)\n", value); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * warningDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @msg:  the message to display/transmit | 
|  | * @...:  extra parameters for the message display | 
|  | * | 
|  | * Display and format a warning messages, gives file, line, position and | 
|  | * extra parameters. | 
|  | */ | 
|  | static void XMLCDECL | 
|  | warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) | 
|  | { | 
|  | va_list args; | 
|  |  | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | va_start(args, msg); | 
|  | fprintf(stdout, "SAX.warning: "); | 
|  | vfprintf(stdout, msg, args); | 
|  | va_end(args); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * errorDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @msg:  the message to display/transmit | 
|  | * @...:  extra parameters for the message display | 
|  | * | 
|  | * Display and format a error messages, gives file, line, position and | 
|  | * extra parameters. | 
|  | */ | 
|  | static void XMLCDECL | 
|  | errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) | 
|  | { | 
|  | va_list args; | 
|  |  | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | va_start(args, msg); | 
|  | fprintf(stdout, "SAX.error: "); | 
|  | vfprintf(stdout, msg, args); | 
|  | va_end(args); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * fatalErrorDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @msg:  the message to display/transmit | 
|  | * @...:  extra parameters for the message display | 
|  | * | 
|  | * Display and format a fatalError messages, gives file, line, position and | 
|  | * extra parameters. | 
|  | */ | 
|  | static void XMLCDECL | 
|  | fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) | 
|  | { | 
|  | va_list args; | 
|  |  | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | va_start(args, msg); | 
|  | fprintf(stdout, "SAX.fatalError: "); | 
|  | vfprintf(stdout, msg, args); | 
|  | va_end(args); | 
|  | } | 
|  |  | 
|  | static xmlSAXHandler debugSAXHandlerStruct = { | 
|  | internalSubsetDebug, | 
|  | isStandaloneDebug, | 
|  | hasInternalSubsetDebug, | 
|  | hasExternalSubsetDebug, | 
|  | resolveEntityDebug, | 
|  | getEntityDebug, | 
|  | entityDeclDebug, | 
|  | notationDeclDebug, | 
|  | attributeDeclDebug, | 
|  | elementDeclDebug, | 
|  | unparsedEntityDeclDebug, | 
|  | setDocumentLocatorDebug, | 
|  | startDocumentDebug, | 
|  | endDocumentDebug, | 
|  | startElementDebug, | 
|  | endElementDebug, | 
|  | referenceDebug, | 
|  | charactersDebug, | 
|  | ignorableWhitespaceDebug, | 
|  | processingInstructionDebug, | 
|  | commentDebug, | 
|  | warningDebug, | 
|  | errorDebug, | 
|  | fatalErrorDebug, | 
|  | getParameterEntityDebug, | 
|  | cdataBlockDebug, | 
|  | externalSubsetDebug, | 
|  | 1, | 
|  | NULL, | 
|  | NULL, | 
|  | NULL, | 
|  | NULL | 
|  | }; | 
|  |  | 
|  | xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct; | 
|  |  | 
|  | /* | 
|  | * SAX2 specific callbacks | 
|  | */ | 
|  | /** | 
|  | * startElementNsDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name:  The element name | 
|  | * | 
|  | * called when an opening tag has been processed. | 
|  | */ | 
|  | static void | 
|  | startElementNsDebug(void *ctx ATTRIBUTE_UNUSED, | 
|  | const xmlChar *localname, | 
|  | const xmlChar *prefix, | 
|  | const xmlChar *URI, | 
|  | int nb_namespaces, | 
|  | const xmlChar **namespaces, | 
|  | int nb_attributes, | 
|  | int nb_defaulted, | 
|  | const xmlChar **attributes) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.startElementNs(%s", (char *) localname); | 
|  | if (prefix == NULL) | 
|  | fprintf(stdout, ", NULL"); | 
|  | else | 
|  | fprintf(stdout, ", %s", (char *) prefix); | 
|  | if (URI == NULL) | 
|  | fprintf(stdout, ", NULL"); | 
|  | else | 
|  | fprintf(stdout, ", '%s'", (char *) URI); | 
|  | fprintf(stdout, ", %d", nb_namespaces); | 
|  |  | 
|  | if (namespaces != NULL) { | 
|  | for (i = 0;i < nb_namespaces * 2;i++) { | 
|  | fprintf(stdout, ", xmlns"); | 
|  | if (namespaces[i] != NULL) | 
|  | fprintf(stdout, ":%s", namespaces[i]); | 
|  | i++; | 
|  | fprintf(stdout, "='%s'", namespaces[i]); | 
|  | } | 
|  | } | 
|  | fprintf(stdout, ", %d, %d", nb_attributes, nb_defaulted); | 
|  | if (attributes != NULL) { | 
|  | for (i = 0;i < nb_attributes * 5;i += 5) { | 
|  | if (attributes[i + 1] != NULL) | 
|  | fprintf(stdout, ", %s:%s='", attributes[i + 1], attributes[i]); | 
|  | else | 
|  | fprintf(stdout, ", %s='", attributes[i]); | 
|  | fprintf(stdout, "%.4s...', %d", attributes[i + 3], | 
|  | (int)(attributes[i + 4] - attributes[i + 3])); | 
|  | } | 
|  | } | 
|  | fprintf(stdout, ")\n"); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * endElementDebug: | 
|  | * @ctxt:  An XML parser context | 
|  | * @name:  The element name | 
|  | * | 
|  | * called when the end of an element has been detected. | 
|  | */ | 
|  | static void | 
|  | endElementNsDebug(void *ctx ATTRIBUTE_UNUSED, | 
|  | const xmlChar *localname, | 
|  | const xmlChar *prefix, | 
|  | const xmlChar *URI) | 
|  | { | 
|  | callbacks++; | 
|  | if (noout) | 
|  | return; | 
|  | fprintf(stdout, "SAX.endElementNs(%s", (char *) localname); | 
|  | if (prefix == NULL) | 
|  | fprintf(stdout, ", NULL"); | 
|  | else | 
|  | fprintf(stdout, ", %s", (char *) prefix); | 
|  | if (URI == NULL) | 
|  | fprintf(stdout, ", NULL)\n"); | 
|  | else | 
|  | fprintf(stdout, ", '%s')\n", (char *) URI); | 
|  | } | 
|  |  | 
|  | static xmlSAXHandler debugSAX2HandlerStruct = { | 
|  | internalSubsetDebug, | 
|  | isStandaloneDebug, | 
|  | hasInternalSubsetDebug, | 
|  | hasExternalSubsetDebug, | 
|  | resolveEntityDebug, | 
|  | getEntityDebug, | 
|  | entityDeclDebug, | 
|  | notationDeclDebug, | 
|  | attributeDeclDebug, | 
|  | elementDeclDebug, | 
|  | unparsedEntityDeclDebug, | 
|  | setDocumentLocatorDebug, | 
|  | startDocumentDebug, | 
|  | endDocumentDebug, | 
|  | NULL, | 
|  | NULL, | 
|  | referenceDebug, | 
|  | charactersDebug, | 
|  | ignorableWhitespaceDebug, | 
|  | processingInstructionDebug, | 
|  | commentDebug, | 
|  | warningDebug, | 
|  | errorDebug, | 
|  | fatalErrorDebug, | 
|  | getParameterEntityDebug, | 
|  | cdataBlockDebug, | 
|  | externalSubsetDebug, | 
|  | XML_SAX2_MAGIC, | 
|  | NULL, | 
|  | startElementNsDebug, | 
|  | endElementNsDebug, | 
|  | NULL | 
|  | }; | 
|  |  | 
|  | static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct; | 
|  |  | 
|  | static void | 
|  | testSAX(const char *filename) { | 
|  | xmlSAXHandlerPtr handler; | 
|  | const char *user_data = "user_data"; /* mostly for debugging */ | 
|  | xmlParserInputBufferPtr buf = NULL; | 
|  | xmlParserInputPtr inputStream; | 
|  | xmlParserCtxtPtr ctxt = NULL; | 
|  | xmlSAXHandlerPtr old_sax = NULL; | 
|  |  | 
|  | callbacks = 0; | 
|  |  | 
|  | if (noout) { | 
|  | handler = emptySAXHandler; | 
|  | #ifdef LIBXML_SAX1_ENABLED | 
|  | } else if (sax1) { | 
|  | handler = debugSAXHandler; | 
|  | #endif | 
|  | } else { | 
|  | handler = debugSAX2Handler; | 
|  | } | 
|  |  | 
|  | /* | 
|  | * it's not the simplest code but the most generic in term of I/O | 
|  | */ | 
|  | buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE); | 
|  | if (buf == NULL) { | 
|  | goto error; | 
|  | } | 
|  |  | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | if (wxschemas != NULL) { | 
|  | int ret; | 
|  | xmlSchemaValidCtxtPtr vctxt; | 
|  |  | 
|  | vctxt = xmlSchemaNewValidCtxt(wxschemas); | 
|  | xmlSchemaSetValidErrors(vctxt, | 
|  | (xmlSchemaValidityErrorFunc) fprintf, | 
|  | (xmlSchemaValidityWarningFunc) fprintf, | 
|  | stderr); | 
|  |  | 
|  | ret = xmlSchemaValidateStream(vctxt, buf, 0, handler, | 
|  | (void *)user_data); | 
|  | if (repeat == 0) { | 
|  | if (ret == 0) { | 
|  | fprintf(stderr, "%s validates\n", filename); | 
|  | } else if (ret > 0) { | 
|  | fprintf(stderr, "%s fails to validate\n", filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } else { | 
|  | fprintf(stderr, "%s validation generated an internal error\n", | 
|  | filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } | 
|  | } | 
|  | xmlSchemaFreeValidCtxt(vctxt); | 
|  | } else | 
|  | #endif | 
|  | { | 
|  | /* | 
|  | * Create the parser context amd hook the input | 
|  | */ | 
|  | ctxt = xmlNewParserCtxt(); | 
|  | if (ctxt == NULL) { | 
|  | xmlFreeParserInputBuffer(buf); | 
|  | goto error; | 
|  | } | 
|  | old_sax = ctxt->sax; | 
|  | ctxt->sax = handler; | 
|  | ctxt->userData = (void *) user_data; | 
|  | inputStream = xmlNewIOInputStream(ctxt, buf, XML_CHAR_ENCODING_NONE); | 
|  | if (inputStream == NULL) { | 
|  | xmlFreeParserInputBuffer(buf); | 
|  | goto error; | 
|  | } | 
|  | inputPush(ctxt, inputStream); | 
|  |  | 
|  | /* do the parsing */ | 
|  | xmlParseDocument(ctxt); | 
|  |  | 
|  | if (ctxt->myDoc != NULL) { | 
|  | fprintf(stderr, "SAX generated a doc !\n"); | 
|  | xmlFreeDoc(ctxt->myDoc); | 
|  | ctxt->myDoc = NULL; | 
|  | } | 
|  | } | 
|  |  | 
|  | error: | 
|  | if (ctxt != NULL) { | 
|  | ctxt->sax = old_sax; | 
|  | xmlFreeParserCtxt(ctxt); | 
|  | } | 
|  | } | 
|  |  | 
|  | /************************************************************************ | 
|  | *									* | 
|  | *			Stream Test processing				* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | static void processNode(xmlTextReaderPtr reader) { | 
|  | const xmlChar *name, *value; | 
|  | int type, empty; | 
|  |  | 
|  | type = xmlTextReaderNodeType(reader); | 
|  | empty = xmlTextReaderIsEmptyElement(reader); | 
|  |  | 
|  | if (debug) { | 
|  | name = xmlTextReaderConstName(reader); | 
|  | if (name == NULL) | 
|  | name = BAD_CAST "--"; | 
|  |  | 
|  | value = xmlTextReaderConstValue(reader); | 
|  |  | 
|  |  | 
|  | printf("%d %d %s %d %d", | 
|  | xmlTextReaderDepth(reader), | 
|  | type, | 
|  | name, | 
|  | empty, | 
|  | xmlTextReaderHasValue(reader)); | 
|  | if (value == NULL) | 
|  | printf("\n"); | 
|  | else { | 
|  | printf(" %s\n", value); | 
|  | } | 
|  | } | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | if (patternc) { | 
|  | xmlChar *path = NULL; | 
|  | int match = -1; | 
|  |  | 
|  | if (type == XML_READER_TYPE_ELEMENT) { | 
|  | /* do the check only on element start */ | 
|  | match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader)); | 
|  |  | 
|  | if (match) { | 
|  | #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) | 
|  | path = xmlGetNodePath(xmlTextReaderCurrentNode(reader)); | 
|  | printf("Node %s matches pattern %s\n", path, pattern); | 
|  | #else | 
|  | printf("Node %s matches pattern %s\n", | 
|  | xmlTextReaderConstName(reader), pattern); | 
|  | #endif | 
|  | } | 
|  | } | 
|  | if (patstream != NULL) { | 
|  | int ret; | 
|  |  | 
|  | if (type == XML_READER_TYPE_ELEMENT) { | 
|  | ret = xmlStreamPush(patstream, | 
|  | xmlTextReaderConstLocalName(reader), | 
|  | xmlTextReaderConstNamespaceUri(reader)); | 
|  | if (ret < 0) { | 
|  | fprintf(stderr, "xmlStreamPush() failure\n"); | 
|  | xmlFreeStreamCtxt(patstream); | 
|  | patstream = NULL; | 
|  | } else if (ret != match) { | 
|  | #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) | 
|  | if (path == NULL) { | 
|  | path = xmlGetNodePath( | 
|  | xmlTextReaderCurrentNode(reader)); | 
|  | } | 
|  | #endif | 
|  | fprintf(stderr, | 
|  | "xmlPatternMatch and xmlStreamPush disagree\n"); | 
|  | if (path != NULL) | 
|  | fprintf(stderr, "  pattern %s node %s\n", | 
|  | pattern, path); | 
|  | else | 
|  | fprintf(stderr, "  pattern %s node %s\n", | 
|  | pattern, xmlTextReaderConstName(reader)); | 
|  | } | 
|  |  | 
|  | } | 
|  | if ((type == XML_READER_TYPE_END_ELEMENT) || | 
|  | ((type == XML_READER_TYPE_ELEMENT) && (empty))) { | 
|  | ret = xmlStreamPop(patstream); | 
|  | if (ret < 0) { | 
|  | fprintf(stderr, "xmlStreamPop() failure\n"); | 
|  | xmlFreeStreamCtxt(patstream); | 
|  | patstream = NULL; | 
|  | } | 
|  | } | 
|  | } | 
|  | if (path != NULL) | 
|  | xmlFree(path); | 
|  | } | 
|  | #endif | 
|  | } | 
|  |  | 
|  | static void streamFile(char *filename) { | 
|  | xmlTextReaderPtr reader; | 
|  | int ret; | 
|  | #ifdef HAVE_SYS_MMAN_H | 
|  | int fd = -1; | 
|  | struct stat info; | 
|  | const char *base = NULL; | 
|  | xmlParserInputBufferPtr input = NULL; | 
|  |  | 
|  | if (memory) { | 
|  | if (stat(filename, &info) < 0) | 
|  | return; | 
|  | if ((fd = open(filename, O_RDONLY)) < 0) | 
|  | return; | 
|  | base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; | 
|  | if (base == (void *) MAP_FAILED) | 
|  | return; | 
|  |  | 
|  | reader = xmlReaderForMemory(base, info.st_size, filename, | 
|  | NULL, options); | 
|  | } else | 
|  | #endif | 
|  | reader = xmlReaderForFile(filename, NULL, options); | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | if (pattern != NULL) { | 
|  | patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL); | 
|  | if (patternc == NULL) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Pattern %s failed to compile\n", pattern); | 
|  | progresult = XMLLINT_ERR_SCHEMAPAT; | 
|  | pattern = NULL; | 
|  | } | 
|  | } | 
|  | if (patternc != NULL) { | 
|  | patstream = xmlPatternGetStreamCtxt(patternc); | 
|  | if (patstream != NULL) { | 
|  | ret = xmlStreamPush(patstream, NULL, NULL); | 
|  | if (ret < 0) { | 
|  | fprintf(stderr, "xmlStreamPush() failure\n"); | 
|  | xmlFreeStreamCtxt(patstream); | 
|  | patstream = NULL; | 
|  | } | 
|  | } | 
|  | } | 
|  | #endif | 
|  |  | 
|  |  | 
|  | if (reader != NULL) { | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | if (valid) | 
|  | xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1); | 
|  | else | 
|  | #endif /* LIBXML_VALID_ENABLED */ | 
|  | xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1); | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | if (relaxng != NULL) { | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | ret = xmlTextReaderRelaxNGValidate(reader, relaxng); | 
|  | if (ret < 0) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Relax-NG schema %s failed to compile\n", relaxng); | 
|  | progresult = XMLLINT_ERR_SCHEMACOMP; | 
|  | relaxng = NULL; | 
|  | } | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Compiling the schemas"); | 
|  | } | 
|  | } | 
|  | if (schema != NULL) { | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | ret = xmlTextReaderSchemaValidate(reader, schema); | 
|  | if (ret < 0) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "XSD schema %s failed to compile\n", schema); | 
|  | progresult = XMLLINT_ERR_SCHEMACOMP; | 
|  | schema = NULL; | 
|  | } | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Compiling the schemas"); | 
|  | } | 
|  | } | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | * Process all nodes in sequence | 
|  | */ | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | ret = xmlTextReaderRead(reader); | 
|  | while (ret == 1) { | 
|  | if ((debug) | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | || (patternc) | 
|  | #endif | 
|  | ) | 
|  | processNode(reader); | 
|  | ret = xmlTextReaderRead(reader); | 
|  | } | 
|  | if ((timing) && (!repeat)) { | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | if (relaxng != NULL) | 
|  | endTimer("Parsing and validating"); | 
|  | else | 
|  | #endif | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | if (valid) | 
|  | endTimer("Parsing and validating"); | 
|  | else | 
|  | #endif | 
|  | endTimer("Parsing"); | 
|  | } | 
|  |  | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | if (valid) { | 
|  | if (xmlTextReaderIsValid(reader) != 1) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Document %s does not validate\n", filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } | 
|  | } | 
|  | #endif /* LIBXML_VALID_ENABLED */ | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | if ((relaxng != NULL) || (schema != NULL)) { | 
|  | if (xmlTextReaderIsValid(reader) != 1) { | 
|  | fprintf(stderr, "%s fails to validate\n", filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } else { | 
|  | fprintf(stderr, "%s validates\n", filename); | 
|  | } | 
|  | } | 
|  | #endif | 
|  | /* | 
|  | * Done, cleanup and status | 
|  | */ | 
|  | xmlFreeTextReader(reader); | 
|  | if (ret != 0) { | 
|  | fprintf(stderr, "%s : failed to parse\n", filename); | 
|  | progresult = XMLLINT_ERR_UNCLASS; | 
|  | } | 
|  | } else { | 
|  | fprintf(stderr, "Unable to open %s\n", filename); | 
|  | progresult = XMLLINT_ERR_UNCLASS; | 
|  | } | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | if (patstream != NULL) { | 
|  | xmlFreeStreamCtxt(patstream); | 
|  | patstream = NULL; | 
|  | } | 
|  | #endif | 
|  | #ifdef HAVE_SYS_MMAN_H | 
|  | if (memory) { | 
|  | xmlFreeParserInputBuffer(input); | 
|  | munmap((char *) base, info.st_size); | 
|  | close(fd); | 
|  | } | 
|  | #endif | 
|  | } | 
|  |  | 
|  | static void walkDoc(xmlDocPtr doc) { | 
|  | xmlTextReaderPtr reader; | 
|  | int ret; | 
|  |  | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | xmlNodePtr root; | 
|  | const xmlChar *namespaces[22]; | 
|  | int i; | 
|  | xmlNsPtr ns; | 
|  |  | 
|  | root = xmlDocGetRootElement(doc); | 
|  | for (ns = root->nsDef, i = 0;ns != NULL && i < 20;ns=ns->next) { | 
|  | namespaces[i++] = ns->href; | 
|  | namespaces[i++] = ns->prefix; | 
|  | } | 
|  | namespaces[i++] = NULL; | 
|  | namespaces[i] = NULL; | 
|  |  | 
|  | if (pattern != NULL) { | 
|  | patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict, | 
|  | 0, &namespaces[0]); | 
|  | if (patternc == NULL) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Pattern %s failed to compile\n", pattern); | 
|  | progresult = XMLLINT_ERR_SCHEMAPAT; | 
|  | pattern = NULL; | 
|  | } | 
|  | } | 
|  | if (patternc != NULL) { | 
|  | patstream = xmlPatternGetStreamCtxt(patternc); | 
|  | if (patstream != NULL) { | 
|  | ret = xmlStreamPush(patstream, NULL, NULL); | 
|  | if (ret < 0) { | 
|  | fprintf(stderr, "xmlStreamPush() failure\n"); | 
|  | xmlFreeStreamCtxt(patstream); | 
|  | patstream = NULL; | 
|  | } | 
|  | } | 
|  | } | 
|  | #endif /* LIBXML_PATTERN_ENABLED */ | 
|  | reader = xmlReaderWalker(doc); | 
|  | if (reader != NULL) { | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | ret = xmlTextReaderRead(reader); | 
|  | while (ret == 1) { | 
|  | if ((debug) | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | || (patternc) | 
|  | #endif | 
|  | ) | 
|  | processNode(reader); | 
|  | ret = xmlTextReaderRead(reader); | 
|  | } | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("walking through the doc"); | 
|  | } | 
|  | xmlFreeTextReader(reader); | 
|  | if (ret != 0) { | 
|  | fprintf(stderr, "failed to walk through the doc\n"); | 
|  | progresult = XMLLINT_ERR_UNCLASS; | 
|  | } | 
|  | } else { | 
|  | fprintf(stderr, "Failed to crate a reader from the document\n"); | 
|  | progresult = XMLLINT_ERR_UNCLASS; | 
|  | } | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | if (patstream != NULL) { | 
|  | xmlFreeStreamCtxt(patstream); | 
|  | patstream = NULL; | 
|  | } | 
|  | #endif | 
|  | } | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  |  | 
|  | #ifdef LIBXML_XPATH_ENABLED | 
|  | /************************************************************************ | 
|  | *									* | 
|  | *			XPath Query                                     * | 
|  | *									* | 
|  | ************************************************************************/ | 
|  |  | 
|  | static void doXPathDump(xmlXPathObjectPtr cur) { | 
|  | switch(cur->type) { | 
|  | case XPATH_NODESET: { | 
|  | int i; | 
|  | xmlNodePtr node; | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | xmlSaveCtxtPtr ctxt; | 
|  |  | 
|  | if (cur->nodesetval->nodeNr <= 0) { | 
|  | fprintf(stderr, "XPath set is empty\n"); | 
|  | progresult = XMLLINT_ERR_XPATH; | 
|  | break; | 
|  | } | 
|  | ctxt = xmlSaveToFd(1, NULL, 0); | 
|  | if (ctxt == NULL) { | 
|  | fprintf(stderr, "Out of memory for XPath\n"); | 
|  | progresult = XMLLINT_ERR_MEM; | 
|  | return; | 
|  | } | 
|  | for (i = 0;i < cur->nodesetval->nodeNr;i++) { | 
|  | node = cur->nodesetval->nodeTab[i]; | 
|  | xmlSaveTree(ctxt, node); | 
|  | } | 
|  | xmlSaveClose(ctxt); | 
|  | #else | 
|  | printf("xpath returned %d nodes\n", cur->nodesetval->nodeNr); | 
|  | #endif | 
|  | break; | 
|  | } | 
|  | case XPATH_BOOLEAN: | 
|  | if (cur->boolval) printf("true"); | 
|  | else printf("false"); | 
|  | break; | 
|  | case XPATH_NUMBER: | 
|  | switch (xmlXPathIsInf(cur->floatval)) { | 
|  | case 1: | 
|  | printf("Infinity"); | 
|  | break; | 
|  | case -1: | 
|  | printf("-Infinity"); | 
|  | break; | 
|  | default: | 
|  | if (xmlXPathIsNaN(cur->floatval)) { | 
|  | printf("NaN"); | 
|  | } else { | 
|  | printf("%0g", cur->floatval); | 
|  | } | 
|  | } | 
|  | break; | 
|  | case XPATH_STRING: | 
|  | printf("%s", (const char *) cur->stringval); | 
|  | break; | 
|  | case XPATH_UNDEFINED: | 
|  | fprintf(stderr, "XPath Object is uninitialized\n"); | 
|  | progresult = XMLLINT_ERR_XPATH; | 
|  | break; | 
|  | default: | 
|  | fprintf(stderr, "XPath object of unexpected type\n"); | 
|  | progresult = XMLLINT_ERR_XPATH; | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | static void doXPathQuery(xmlDocPtr doc, const char *query) { | 
|  | xmlXPathContextPtr ctxt; | 
|  | xmlXPathObjectPtr res; | 
|  |  | 
|  | ctxt = xmlXPathNewContext(doc); | 
|  | if (ctxt == NULL) { | 
|  | fprintf(stderr, "Out of memory for XPath\n"); | 
|  | progresult = XMLLINT_ERR_MEM; | 
|  | return; | 
|  | } | 
|  | ctxt->node = xmlDocGetRootElement(doc); | 
|  | res = xmlXPathEval(BAD_CAST query, ctxt); | 
|  | xmlXPathFreeContext(ctxt); | 
|  |  | 
|  | if (res == NULL) { | 
|  | fprintf(stderr, "XPath evaluation failure\n"); | 
|  | progresult = XMLLINT_ERR_XPATH; | 
|  | return; | 
|  | } | 
|  | doXPathDump(res); | 
|  | xmlXPathFreeObject(res); | 
|  | } | 
|  | #endif /* LIBXML_XPATH_ENABLED */ | 
|  |  | 
|  | /************************************************************************ | 
|  | *									* | 
|  | *			Tree Test processing				* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  | static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) { | 
|  | xmlDocPtr doc = NULL; | 
|  | #ifdef LIBXML_TREE_ENABLED | 
|  | xmlDocPtr tmp; | 
|  | #endif /* LIBXML_TREE_ENABLED */ | 
|  |  | 
|  | if ((timing) && (!repeat)) | 
|  | startTimer(); | 
|  |  | 
|  |  | 
|  | #ifdef LIBXML_TREE_ENABLED | 
|  | if (filename == NULL) { | 
|  | if (generate) { | 
|  | xmlNodePtr n; | 
|  |  | 
|  | doc = xmlNewDoc(BAD_CAST "1.0"); | 
|  | n = xmlNewDocNode(doc, NULL, BAD_CAST "info", NULL); | 
|  | xmlNodeSetContent(n, BAD_CAST "abc"); | 
|  | xmlDocSetRootElement(doc, n); | 
|  | } | 
|  | } | 
|  | #endif /* LIBXML_TREE_ENABLED */ | 
|  | #ifdef LIBXML_HTML_ENABLED | 
|  | #ifdef LIBXML_PUSH_ENABLED | 
|  | else if ((html) && (push)) { | 
|  | FILE *f; | 
|  |  | 
|  | #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) | 
|  | f = fopen(filename, "rb"); | 
|  | #else | 
|  | f = fopen(filename, "r"); | 
|  | #endif | 
|  | if (f != NULL) { | 
|  | int res, size = 3; | 
|  | char chars[4096]; | 
|  | htmlParserCtxtPtr ctxt; | 
|  |  | 
|  | /* if (repeat) */ | 
|  | size = 4096; | 
|  | res = fread(chars, 1, 4, f); | 
|  | if (res > 0) { | 
|  | ctxt = htmlCreatePushParserCtxt(NULL, NULL, | 
|  | chars, res, filename, XML_CHAR_ENCODING_NONE); | 
|  | while ((res = fread(chars, 1, size, f)) > 0) { | 
|  | htmlParseChunk(ctxt, chars, res, 0); | 
|  | } | 
|  | htmlParseChunk(ctxt, chars, 0, 1); | 
|  | doc = ctxt->myDoc; | 
|  | htmlFreeParserCtxt(ctxt); | 
|  | } | 
|  | fclose(f); | 
|  | } | 
|  | } | 
|  | #endif /* LIBXML_PUSH_ENABLED */ | 
|  | #ifdef HAVE_SYS_MMAN_H | 
|  | else if ((html) && (memory)) { | 
|  | int fd; | 
|  | struct stat info; | 
|  | const char *base; | 
|  | if (stat(filename, &info) < 0) | 
|  | return; | 
|  | if ((fd = open(filename, O_RDONLY)) < 0) | 
|  | return; | 
|  | base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; | 
|  | if (base == (void *) MAP_FAILED) | 
|  | return; | 
|  |  | 
|  | doc = htmlReadMemory((char *) base, info.st_size, filename, | 
|  | NULL, options); | 
|  |  | 
|  | munmap((char *) base, info.st_size); | 
|  | close(fd); | 
|  | } | 
|  | #endif | 
|  | else if (html) { | 
|  | doc = htmlReadFile(filename, NULL, options); | 
|  | } | 
|  | #endif /* LIBXML_HTML_ENABLED */ | 
|  | else { | 
|  | #ifdef LIBXML_PUSH_ENABLED | 
|  | /* | 
|  | * build an XML tree from a string; | 
|  | */ | 
|  | if (push) { | 
|  | FILE *f; | 
|  |  | 
|  | /* '-' Usually means stdin -<sven@zen.org> */ | 
|  | if ((filename[0] == '-') && (filename[1] == 0)) { | 
|  | f = stdin; | 
|  | } else { | 
|  | #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) | 
|  | f = fopen(filename, "rb"); | 
|  | #else | 
|  | f = fopen(filename, "r"); | 
|  | #endif | 
|  | } | 
|  | if (f != NULL) { | 
|  | int ret; | 
|  | int res, size = 1024; | 
|  | char chars[1024]; | 
|  | xmlParserCtxtPtr ctxt; | 
|  |  | 
|  | /* if (repeat) size = 1024; */ | 
|  | res = fread(chars, 1, 4, f); | 
|  | if (res > 0) { | 
|  | ctxt = xmlCreatePushParserCtxt(NULL, NULL, | 
|  | chars, res, filename); | 
|  | xmlCtxtUseOptions(ctxt, options); | 
|  | while ((res = fread(chars, 1, size, f)) > 0) { | 
|  | xmlParseChunk(ctxt, chars, res, 0); | 
|  | } | 
|  | xmlParseChunk(ctxt, chars, 0, 1); | 
|  | doc = ctxt->myDoc; | 
|  | ret = ctxt->wellFormed; | 
|  | xmlFreeParserCtxt(ctxt); | 
|  | if (!ret) { | 
|  | xmlFreeDoc(doc); | 
|  | doc = NULL; | 
|  | } | 
|  | } | 
|  | if (f != stdin) | 
|  | fclose(f); | 
|  | } | 
|  | } else | 
|  | #endif /* LIBXML_PUSH_ENABLED */ | 
|  | if (testIO) { | 
|  | if ((filename[0] == '-') && (filename[1] == 0)) { | 
|  | doc = xmlReadFd(0, NULL, NULL, options); | 
|  | } else { | 
|  | FILE *f; | 
|  |  | 
|  | #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) | 
|  | f = fopen(filename, "rb"); | 
|  | #else | 
|  | f = fopen(filename, "r"); | 
|  | #endif | 
|  | if (f != NULL) { | 
|  | if (rectxt == NULL) | 
|  | doc = xmlReadIO((xmlInputReadCallback) myRead, | 
|  | (xmlInputCloseCallback) myClose, f, | 
|  | filename, NULL, options); | 
|  | else | 
|  | doc = xmlCtxtReadIO(rectxt, | 
|  | (xmlInputReadCallback) myRead, | 
|  | (xmlInputCloseCallback) myClose, f, | 
|  | filename, NULL, options); | 
|  | } else | 
|  | doc = NULL; | 
|  | } | 
|  | } else if (htmlout) { | 
|  | xmlParserCtxtPtr ctxt; | 
|  |  | 
|  | if (rectxt == NULL) | 
|  | ctxt = xmlNewParserCtxt(); | 
|  | else | 
|  | ctxt = rectxt; | 
|  | if (ctxt == NULL) { | 
|  | doc = NULL; | 
|  | } else { | 
|  | ctxt->sax->error = xmlHTMLError; | 
|  | ctxt->sax->warning = xmlHTMLWarning; | 
|  | ctxt->vctxt.error = xmlHTMLValidityError; | 
|  | ctxt->vctxt.warning = xmlHTMLValidityWarning; | 
|  |  | 
|  | doc = xmlCtxtReadFile(ctxt, filename, NULL, options); | 
|  |  | 
|  | if (rectxt == NULL) | 
|  | xmlFreeParserCtxt(ctxt); | 
|  | } | 
|  | #ifdef HAVE_SYS_MMAN_H | 
|  | } else if (memory) { | 
|  | int fd; | 
|  | struct stat info; | 
|  | const char *base; | 
|  | if (stat(filename, &info) < 0) | 
|  | return; | 
|  | if ((fd = open(filename, O_RDONLY)) < 0) | 
|  | return; | 
|  | base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ; | 
|  | if (base == (void *) MAP_FAILED) | 
|  | return; | 
|  |  | 
|  | if (rectxt == NULL) | 
|  | doc = xmlReadMemory((char *) base, info.st_size, | 
|  | filename, NULL, options); | 
|  | else | 
|  | doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size, | 
|  | filename, NULL, options); | 
|  |  | 
|  | munmap((char *) base, info.st_size); | 
|  | close(fd); | 
|  | #endif | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | } else if (valid) { | 
|  | xmlParserCtxtPtr ctxt = NULL; | 
|  |  | 
|  | if (rectxt == NULL) | 
|  | ctxt = xmlNewParserCtxt(); | 
|  | else | 
|  | ctxt = rectxt; | 
|  | if (ctxt == NULL) { | 
|  | doc = NULL; | 
|  | } else { | 
|  | doc = xmlCtxtReadFile(ctxt, filename, NULL, options); | 
|  |  | 
|  | if (ctxt->valid == 0) | 
|  | progresult = XMLLINT_ERR_RDFILE; | 
|  | if (rectxt == NULL) | 
|  | xmlFreeParserCtxt(ctxt); | 
|  | } | 
|  | #endif /* LIBXML_VALID_ENABLED */ | 
|  | } else { | 
|  | if (rectxt != NULL) | 
|  | doc = xmlCtxtReadFile(rectxt, filename, NULL, options); | 
|  | else { | 
|  | #ifdef LIBXML_SAX1_ENABLED | 
|  | if (sax1) | 
|  | doc = xmlParseFile(filename); | 
|  | else | 
|  | #endif /* LIBXML_SAX1_ENABLED */ | 
|  | doc = xmlReadFile(filename, NULL, options); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | /* | 
|  | * If we don't have a document we might as well give up.  Do we | 
|  | * want an error message here?  <sven@zen.org> */ | 
|  | if (doc == NULL) { | 
|  | progresult = XMLLINT_ERR_UNCLASS; | 
|  | return; | 
|  | } | 
|  |  | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Parsing"); | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Remove DOCTYPE nodes | 
|  | */ | 
|  | if (dropdtd) { | 
|  | xmlDtdPtr dtd; | 
|  |  | 
|  | dtd = xmlGetIntSubset(doc); | 
|  | if (dtd != NULL) { | 
|  | xmlUnlinkNode((xmlNodePtr)dtd); | 
|  | xmlFreeDtd(dtd); | 
|  | } | 
|  | } | 
|  |  | 
|  | #ifdef LIBXML_XINCLUDE_ENABLED | 
|  | if (xinclude) { | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | if (xmlXIncludeProcessFlags(doc, options) < 0) | 
|  | progresult = XMLLINT_ERR_UNCLASS; | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Xinclude processing"); | 
|  | } | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifdef LIBXML_XPATH_ENABLED | 
|  | if (xpathquery != NULL) { | 
|  | doXPathQuery(doc, xpathquery); | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifdef LIBXML_DEBUG_ENABLED | 
|  | #ifdef LIBXML_XPATH_ENABLED | 
|  | /* | 
|  | * shell interaction | 
|  | */ | 
|  | if (shell) { | 
|  | xmlXPathOrderDocElems(doc); | 
|  | xmlShell(doc, filename, xmlShellReadline, stdout); | 
|  | } | 
|  | #endif | 
|  | #endif | 
|  |  | 
|  | #ifdef LIBXML_TREE_ENABLED | 
|  | /* | 
|  | * test intermediate copy if needed. | 
|  | */ | 
|  | if (copy) { | 
|  | tmp = doc; | 
|  | if (timing) { | 
|  | startTimer(); | 
|  | } | 
|  | doc = xmlCopyDoc(doc, 1); | 
|  | if (timing) { | 
|  | endTimer("Copying"); | 
|  | } | 
|  | if (timing) { | 
|  | startTimer(); | 
|  | } | 
|  | xmlFreeDoc(tmp); | 
|  | if (timing) { | 
|  | endTimer("Freeing original"); | 
|  | } | 
|  | } | 
|  | #endif /* LIBXML_TREE_ENABLED */ | 
|  |  | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | if ((insert) && (!html)) { | 
|  | const xmlChar* list[256]; | 
|  | int nb, i; | 
|  | xmlNodePtr node; | 
|  |  | 
|  | if (doc->children != NULL) { | 
|  | node = doc->children; | 
|  | while ((node != NULL) && (node->last == NULL)) node = node->next; | 
|  | if (node != NULL) { | 
|  | nb = xmlValidGetValidElements(node->last, NULL, list, 256); | 
|  | if (nb < 0) { | 
|  | fprintf(stderr, "could not get valid list of elements\n"); | 
|  | } else if (nb == 0) { | 
|  | fprintf(stderr, "No element can be inserted under root\n"); | 
|  | } else { | 
|  | fprintf(stderr, "%d element types can be inserted under root:\n", | 
|  | nb); | 
|  | for (i = 0;i < nb;i++) { | 
|  | fprintf(stderr, "%s\n", (char *) list[i]); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | }else | 
|  | #endif /* LIBXML_VALID_ENABLED */ | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | if (walker) { | 
|  | walkDoc(doc); | 
|  | } | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | if (noout == 0) { | 
|  | int ret; | 
|  |  | 
|  | /* | 
|  | * print it. | 
|  | */ | 
|  | #ifdef LIBXML_DEBUG_ENABLED | 
|  | if (!debug) { | 
|  | #endif | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | #ifdef LIBXML_HTML_ENABLED | 
|  | if ((html) && (!xmlout)) { | 
|  | if (compress) { | 
|  | htmlSaveFile(output ? output : "-", doc); | 
|  | } | 
|  | else if (encoding != NULL) { | 
|  | if ( format ) { | 
|  | htmlSaveFileFormat(output ? output : "-", doc, encoding, 1); | 
|  | } | 
|  | else { | 
|  | htmlSaveFileFormat(output ? output : "-", doc, encoding, 0); | 
|  | } | 
|  | } | 
|  | else if (format) { | 
|  | htmlSaveFileFormat(output ? output : "-", doc, NULL, 1); | 
|  | } | 
|  | else { | 
|  | FILE *out; | 
|  | if (output == NULL) | 
|  | out = stdout; | 
|  | else { | 
|  | out = fopen(output,"wb"); | 
|  | } | 
|  | if (out != NULL) { | 
|  | if (htmlDocDump(out, doc) < 0) | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  |  | 
|  | if (output != NULL) | 
|  | fclose(out); | 
|  | } else { | 
|  | fprintf(stderr, "failed to open %s\n", output); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | } | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Saving"); | 
|  | } | 
|  | } else | 
|  | #endif | 
|  | #ifdef LIBXML_C14N_ENABLED | 
|  | if (canonical) { | 
|  | xmlChar *result = NULL; | 
|  | int size; | 
|  |  | 
|  | size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_0, NULL, 1, &result); | 
|  | if (size >= 0) { | 
|  | write(1, result, size); | 
|  | xmlFree(result); | 
|  | } else { | 
|  | fprintf(stderr, "Failed to canonicalize\n"); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | } else if (canonical) { | 
|  | xmlChar *result = NULL; | 
|  | int size; | 
|  |  | 
|  | size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_1, NULL, 1, &result); | 
|  | if (size >= 0) { | 
|  | write(1, result, size); | 
|  | xmlFree(result); | 
|  | } else { | 
|  | fprintf(stderr, "Failed to canonicalize\n"); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | } else | 
|  | if (exc_canonical) { | 
|  | xmlChar *result = NULL; | 
|  | int size; | 
|  |  | 
|  | size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_EXCLUSIVE_1_0, NULL, 1, &result); | 
|  | if (size >= 0) { | 
|  | write(1, result, size); | 
|  | xmlFree(result); | 
|  | } else { | 
|  | fprintf(stderr, "Failed to canonicalize\n"); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | } else | 
|  | #endif | 
|  | #ifdef HAVE_SYS_MMAN_H | 
|  | if (memory) { | 
|  | xmlChar *result; | 
|  | int len; | 
|  |  | 
|  | if (encoding != NULL) { | 
|  | if ( format ) { | 
|  | xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1); | 
|  | } else { | 
|  | xmlDocDumpMemoryEnc(doc, &result, &len, encoding); | 
|  | } | 
|  | } else { | 
|  | if (format) | 
|  | xmlDocDumpFormatMemory(doc, &result, &len, 1); | 
|  | else | 
|  | xmlDocDumpMemory(doc, &result, &len); | 
|  | } | 
|  | if (result == NULL) { | 
|  | fprintf(stderr, "Failed to save\n"); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } else { | 
|  | write(1, result, len); | 
|  | xmlFree(result); | 
|  | } | 
|  |  | 
|  | } else | 
|  | #endif /* HAVE_SYS_MMAN_H */ | 
|  | if (compress) { | 
|  | xmlSaveFile(output ? output : "-", doc); | 
|  | } else if (oldout) { | 
|  | if (encoding != NULL) { | 
|  | if ( format ) { | 
|  | ret = xmlSaveFormatFileEnc(output ? output : "-", doc, | 
|  | encoding, 1); | 
|  | } | 
|  | else { | 
|  | ret = xmlSaveFileEnc(output ? output : "-", doc, | 
|  | encoding); | 
|  | } | 
|  | if (ret < 0) { | 
|  | fprintf(stderr, "failed save to %s\n", | 
|  | output ? output : "-"); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | } else if (format) { | 
|  | ret = xmlSaveFormatFile(output ? output : "-", doc, 1); | 
|  | if (ret < 0) { | 
|  | fprintf(stderr, "failed save to %s\n", | 
|  | output ? output : "-"); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | } else { | 
|  | FILE *out; | 
|  | if (output == NULL) | 
|  | out = stdout; | 
|  | else { | 
|  | out = fopen(output,"wb"); | 
|  | } | 
|  | if (out != NULL) { | 
|  | if (xmlDocDump(out, doc) < 0) | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  |  | 
|  | if (output != NULL) | 
|  | fclose(out); | 
|  | } else { | 
|  | fprintf(stderr, "failed to open %s\n", output); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | } | 
|  | } else { | 
|  | xmlSaveCtxtPtr ctxt; | 
|  | int saveOpts = 0; | 
|  |  | 
|  | if (format) | 
|  | saveOpts |= XML_SAVE_FORMAT; | 
|  |  | 
|  | #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED) | 
|  | if (xmlout) | 
|  | saveOpts |= XML_SAVE_AS_XML; | 
|  | #endif | 
|  |  | 
|  | if (output == NULL) | 
|  | ctxt = xmlSaveToFd(1, encoding, saveOpts); | 
|  | else | 
|  | ctxt = xmlSaveToFilename(output, encoding, saveOpts); | 
|  |  | 
|  | if (ctxt != NULL) { | 
|  | if (xmlSaveDoc(ctxt, doc) < 0) { | 
|  | fprintf(stderr, "failed save to %s\n", | 
|  | output ? output : "-"); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | xmlSaveClose(ctxt); | 
|  | } else { | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | } | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Saving"); | 
|  | } | 
|  | #ifdef LIBXML_DEBUG_ENABLED | 
|  | } else { | 
|  | FILE *out; | 
|  | if (output == NULL) | 
|  | out = stdout; | 
|  | else { | 
|  | out = fopen(output,"wb"); | 
|  | } | 
|  | if (out != NULL) { | 
|  | xmlDebugDumpDocument(out, doc); | 
|  |  | 
|  | if (output != NULL) | 
|  | fclose(out); | 
|  | } else { | 
|  | fprintf(stderr, "failed to open %s\n", output); | 
|  | progresult = XMLLINT_ERR_OUT; | 
|  | } | 
|  | } | 
|  | #endif | 
|  | } | 
|  | #endif /* LIBXML_OUTPUT_ENABLED */ | 
|  |  | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | /* | 
|  | * A posteriori validation test | 
|  | */ | 
|  | if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) { | 
|  | xmlDtdPtr dtd; | 
|  |  | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | if (dtdvalid != NULL) | 
|  | dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid); | 
|  | else | 
|  | dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL); | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Parsing DTD"); | 
|  | } | 
|  | if (dtd == NULL) { | 
|  | if (dtdvalid != NULL) | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Could not parse DTD %s\n", dtdvalid); | 
|  | else | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Could not parse DTD %s\n", dtdvalidfpi); | 
|  | progresult = XMLLINT_ERR_DTD; | 
|  | } else { | 
|  | xmlValidCtxtPtr cvp; | 
|  |  | 
|  | if ((cvp = xmlNewValidCtxt()) == NULL) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Couldn't allocate validation context\n"); | 
|  | exit(-1); | 
|  | } | 
|  | cvp->userData = (void *) stderr; | 
|  | cvp->error    = (xmlValidityErrorFunc) fprintf; | 
|  | cvp->warning  = (xmlValidityWarningFunc) fprintf; | 
|  |  | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | if (!xmlValidateDtd(cvp, doc, dtd)) { | 
|  | if (dtdvalid != NULL) | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Document %s does not validate against %s\n", | 
|  | filename, dtdvalid); | 
|  | else | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Document %s does not validate against %s\n", | 
|  | filename, dtdvalidfpi); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Validating against DTD"); | 
|  | } | 
|  | xmlFreeValidCtxt(cvp); | 
|  | xmlFreeDtd(dtd); | 
|  | } | 
|  | } else if (postvalid) { | 
|  | xmlValidCtxtPtr cvp; | 
|  |  | 
|  | if ((cvp = xmlNewValidCtxt()) == NULL) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Couldn't allocate validation context\n"); | 
|  | exit(-1); | 
|  | } | 
|  |  | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | cvp->userData = (void *) stderr; | 
|  | cvp->error    = (xmlValidityErrorFunc) fprintf; | 
|  | cvp->warning  = (xmlValidityWarningFunc) fprintf; | 
|  | if (!xmlValidateDocument(cvp, doc)) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Document %s does not validate\n", filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Validating"); | 
|  | } | 
|  | xmlFreeValidCtxt(cvp); | 
|  | } | 
|  | #endif /* LIBXML_VALID_ENABLED */ | 
|  | #ifdef LIBXML_SCHEMATRON_ENABLED | 
|  | if (wxschematron != NULL) { | 
|  | xmlSchematronValidCtxtPtr ctxt; | 
|  | int ret; | 
|  | int flag; | 
|  |  | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  |  | 
|  | if (debug) | 
|  | flag = XML_SCHEMATRON_OUT_XML; | 
|  | else | 
|  | flag = XML_SCHEMATRON_OUT_TEXT; | 
|  | if (noout) | 
|  | flag |= XML_SCHEMATRON_OUT_QUIET; | 
|  | ctxt = xmlSchematronNewValidCtxt(wxschematron, flag); | 
|  | #if 0 | 
|  | xmlSchematronSetValidErrors(ctxt, | 
|  | (xmlSchematronValidityErrorFunc) fprintf, | 
|  | (xmlSchematronValidityWarningFunc) fprintf, | 
|  | stderr); | 
|  | #endif | 
|  | ret = xmlSchematronValidateDoc(ctxt, doc); | 
|  | if (ret == 0) { | 
|  | fprintf(stderr, "%s validates\n", filename); | 
|  | } else if (ret > 0) { | 
|  | fprintf(stderr, "%s fails to validate\n", filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } else { | 
|  | fprintf(stderr, "%s validation generated an internal error\n", | 
|  | filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } | 
|  | xmlSchematronFreeValidCtxt(ctxt); | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Validating"); | 
|  | } | 
|  | } | 
|  | #endif | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | if (relaxngschemas != NULL) { | 
|  | xmlRelaxNGValidCtxtPtr ctxt; | 
|  | int ret; | 
|  |  | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  |  | 
|  | ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas); | 
|  | xmlRelaxNGSetValidErrors(ctxt, | 
|  | (xmlRelaxNGValidityErrorFunc) fprintf, | 
|  | (xmlRelaxNGValidityWarningFunc) fprintf, | 
|  | stderr); | 
|  | ret = xmlRelaxNGValidateDoc(ctxt, doc); | 
|  | if (ret == 0) { | 
|  | fprintf(stderr, "%s validates\n", filename); | 
|  | } else if (ret > 0) { | 
|  | fprintf(stderr, "%s fails to validate\n", filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } else { | 
|  | fprintf(stderr, "%s validation generated an internal error\n", | 
|  | filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } | 
|  | xmlRelaxNGFreeValidCtxt(ctxt); | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Validating"); | 
|  | } | 
|  | } else if (wxschemas != NULL) { | 
|  | xmlSchemaValidCtxtPtr ctxt; | 
|  | int ret; | 
|  |  | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  |  | 
|  | ctxt = xmlSchemaNewValidCtxt(wxschemas); | 
|  | xmlSchemaSetValidErrors(ctxt, | 
|  | (xmlSchemaValidityErrorFunc) fprintf, | 
|  | (xmlSchemaValidityWarningFunc) fprintf, | 
|  | stderr); | 
|  | ret = xmlSchemaValidateDoc(ctxt, doc); | 
|  | if (ret == 0) { | 
|  | fprintf(stderr, "%s validates\n", filename); | 
|  | } else if (ret > 0) { | 
|  | fprintf(stderr, "%s fails to validate\n", filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } else { | 
|  | fprintf(stderr, "%s validation generated an internal error\n", | 
|  | filename); | 
|  | progresult = XMLLINT_ERR_VALID; | 
|  | } | 
|  | xmlSchemaFreeValidCtxt(ctxt); | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Validating"); | 
|  | } | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifdef LIBXML_DEBUG_ENABLED | 
|  | #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED) | 
|  | if ((debugent) && (!html)) | 
|  | xmlDebugDumpEntities(stderr, doc); | 
|  | #endif | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | * free it. | 
|  | */ | 
|  | if ((timing) && (!repeat)) { | 
|  | startTimer(); | 
|  | } | 
|  | xmlFreeDoc(doc); | 
|  | if ((timing) && (!repeat)) { | 
|  | endTimer("Freeing"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /************************************************************************ | 
|  | *									* | 
|  | *			Usage and Main					* | 
|  | *									* | 
|  | ************************************************************************/ | 
|  |  | 
|  | static void showVersion(const char *name) { | 
|  | fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion); | 
|  | fprintf(stderr, "   compiled with: "); | 
|  | if (xmlHasFeature(XML_WITH_THREAD)) fprintf(stderr, "Threads "); | 
|  | if (xmlHasFeature(XML_WITH_TREE)) fprintf(stderr, "Tree "); | 
|  | if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(stderr, "Output "); | 
|  | if (xmlHasFeature(XML_WITH_PUSH)) fprintf(stderr, "Push "); | 
|  | if (xmlHasFeature(XML_WITH_READER)) fprintf(stderr, "Reader "); | 
|  | if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(stderr, "Patterns "); | 
|  | if (xmlHasFeature(XML_WITH_WRITER)) fprintf(stderr, "Writer "); | 
|  | if (xmlHasFeature(XML_WITH_SAX1)) fprintf(stderr, "SAXv1 "); | 
|  | if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP "); | 
|  | if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP "); | 
|  | if (xmlHasFeature(XML_WITH_VALID)) fprintf(stderr, "DTDValid "); | 
|  | if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML "); | 
|  | if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy "); | 
|  | if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N "); | 
|  | if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog "); | 
|  | if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath "); | 
|  | if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer "); | 
|  | if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude "); | 
|  | if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv "); | 
|  | if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X "); | 
|  | if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode "); | 
|  | if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps "); | 
|  | if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata "); | 
|  | if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr "); | 
|  | if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas "); | 
|  | if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron "); | 
|  | if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules "); | 
|  | if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug "); | 
|  | if (xmlHasFeature(XML_WITH_DEBUG_MEM)) fprintf(stderr, "MemDebug "); | 
|  | if (xmlHasFeature(XML_WITH_DEBUG_RUN)) fprintf(stderr, "RunDebug "); | 
|  | if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(stderr, "Zlib "); | 
|  | fprintf(stderr, "\n"); | 
|  | } | 
|  |  | 
|  | static void usage(const char *name) { | 
|  | printf("Usage : %s [options] XMLfiles ...\n", name); | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | printf("\tParse the XML files and output the result of the parsing\n"); | 
|  | #else | 
|  | printf("\tParse the XML files\n"); | 
|  | #endif /* LIBXML_OUTPUT_ENABLED */ | 
|  | printf("\t--version : display the version of the XML library used\n"); | 
|  | #ifdef LIBXML_DEBUG_ENABLED | 
|  | printf("\t--debug : dump a debug tree of the in-memory document\n"); | 
|  | printf("\t--shell : run a navigating shell\n"); | 
|  | printf("\t--debugent : debug the entities defined in the document\n"); | 
|  | #else | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | printf("\t--debug : dump the nodes content when using --stream\n"); | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | #endif | 
|  | #ifdef LIBXML_TREE_ENABLED | 
|  | printf("\t--copy : used to test the internal copy implementation\n"); | 
|  | #endif /* LIBXML_TREE_ENABLED */ | 
|  | printf("\t--recover : output what was parsable on broken XML documents\n"); | 
|  | printf("\t--huge : remove any internal arbitrary parser limits\n"); | 
|  | printf("\t--noent : substitute entity references by their value\n"); | 
|  | printf("\t--noout : don't output the result tree\n"); | 
|  | printf("\t--path 'paths': provide a set of paths for resources\n"); | 
|  | printf("\t--load-trace : print trace of all external entites loaded\n"); | 
|  | printf("\t--nonet : refuse to fetch DTDs or entities over network\n"); | 
|  | printf("\t--nocompact : do not generate compact text nodes\n"); | 
|  | printf("\t--htmlout : output results as HTML\n"); | 
|  | printf("\t--nowrap : do not put HTML doc wrapper\n"); | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | printf("\t--valid : validate the document in addition to std well-formed check\n"); | 
|  | printf("\t--postvalid : do a posteriori validation, i.e after parsing\n"); | 
|  | printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n"); | 
|  | printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n"); | 
|  | #endif /* LIBXML_VALID_ENABLED */ | 
|  | printf("\t--timing : print some timings\n"); | 
|  | printf("\t--output file or -o file: save to a given file\n"); | 
|  | printf("\t--repeat : repeat 100 times, for timing or profiling\n"); | 
|  | printf("\t--insert : ad-hoc test for valid insertions\n"); | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | #ifdef HAVE_ZLIB_H | 
|  | printf("\t--compress : turn on gzip compression of output\n"); | 
|  | #endif | 
|  | #endif /* LIBXML_OUTPUT_ENABLED */ | 
|  | #ifdef LIBXML_HTML_ENABLED | 
|  | printf("\t--html : use the HTML parser\n"); | 
|  | printf("\t--xmlout : force to use the XML serializer when using --html\n"); | 
|  | #endif | 
|  | #ifdef LIBXML_PUSH_ENABLED | 
|  | printf("\t--push : use the push mode of the parser\n"); | 
|  | #endif /* LIBXML_PUSH_ENABLED */ | 
|  | #ifdef HAVE_SYS_MMAN_H | 
|  | printf("\t--memory : parse from memory\n"); | 
|  | #endif | 
|  | printf("\t--maxmem nbbytes : limits memory allocation to nbbytes bytes\n"); | 
|  | printf("\t--nowarning : do not emit warnings from parser/validator\n"); | 
|  | printf("\t--noblanks : drop (ignorable?) blanks spaces\n"); | 
|  | printf("\t--nocdata : replace cdata section with text nodes\n"); | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | printf("\t--format : reformat/reindent the input\n"); | 
|  | printf("\t--encode encoding : output in the given encoding\n"); | 
|  | printf("\t--dropdtd : remove the DOCTYPE of the input docs\n"); | 
|  | #endif /* LIBXML_OUTPUT_ENABLED */ | 
|  | printf("\t--c14n : save in W3C canonical format v1.0 (with comments)\n"); | 
|  | printf("\t--c14n11 : save in W3C canonical format v1.1 (with comments)\n"); | 
|  | printf("\t--exc-c14n : save in W3C exclusive canonical format (with comments)\n"); | 
|  | #ifdef LIBXML_C14N_ENABLED | 
|  | #endif /* LIBXML_C14N_ENABLED */ | 
|  | printf("\t--nsclean : remove redundant namespace declarations\n"); | 
|  | printf("\t--testIO : test user I/O support\n"); | 
|  | #ifdef LIBXML_CATALOG_ENABLED | 
|  | printf("\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n"); | 
|  | printf("\t             otherwise XML Catalogs starting from \n"); | 
|  | printf("\t         %s are activated by default\n", XML_XML_DEFAULT_CATALOG); | 
|  | printf("\t--nocatalogs: deactivate all catalogs\n"); | 
|  | #endif | 
|  | printf("\t--auto : generate a small doc on the fly\n"); | 
|  | #ifdef LIBXML_XINCLUDE_ENABLED | 
|  | printf("\t--xinclude : do XInclude processing\n"); | 
|  | printf("\t--noxincludenode : same but do not generate XInclude nodes\n"); | 
|  | printf("\t--nofixup-base-uris : do not fixup xml:base uris\n"); | 
|  | #endif | 
|  | printf("\t--loaddtd : fetch external DTD\n"); | 
|  | printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n"); | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | printf("\t--stream : use the streaming interface to process very large files\n"); | 
|  | printf("\t--walker : create a reader and walk though the resulting doc\n"); | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | printf("\t--pattern pattern_value : test the pattern support\n"); | 
|  | #endif | 
|  | printf("\t--chkregister : verify the node registration code\n"); | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | printf("\t--relaxng schema : do RelaxNG validation against the schema\n"); | 
|  | printf("\t--schema schema : do validation against the WXS schema\n"); | 
|  | #endif | 
|  | #ifdef LIBXML_SCHEMATRON_ENABLED | 
|  | printf("\t--schematron schema : do validation against a schematron\n"); | 
|  | #endif | 
|  | #ifdef LIBXML_SAX1_ENABLED | 
|  | printf("\t--sax1: use the old SAX1 interfaces for processing\n"); | 
|  | #endif | 
|  | printf("\t--sax: do not build a tree but work just at the SAX level\n"); | 
|  | printf("\t--oldxml10: use XML-1.0 parsing rules before the 5th edition\n"); | 
|  | #ifdef LIBXML_XPATH_ENABLED | 
|  | printf("\t--xpath expr: evaluate the XPath expression, inply --noout\n"); | 
|  | #endif | 
|  |  | 
|  | printf("\nLibxml project home page: http://xmlsoft.org/\n"); | 
|  | printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n"); | 
|  | } | 
|  |  | 
|  | static void registerNode(xmlNodePtr node) | 
|  | { | 
|  | node->_private = malloc(sizeof(long)); | 
|  | *(long*)node->_private = (long) 0x81726354; | 
|  | nbregister++; | 
|  | } | 
|  |  | 
|  | static void deregisterNode(xmlNodePtr node) | 
|  | { | 
|  | assert(node->_private != NULL); | 
|  | assert(*(long*)node->_private == (long) 0x81726354); | 
|  | free(node->_private); | 
|  | nbregister--; | 
|  | } | 
|  |  | 
|  | int | 
|  | main(int argc, char **argv) { | 
|  | int i, acount; | 
|  | int files = 0; | 
|  | int version = 0; | 
|  | const char* indent; | 
|  |  | 
|  | if (argc <= 1) { | 
|  | usage(argv[0]); | 
|  | return(1); | 
|  | } | 
|  | LIBXML_TEST_VERSION | 
|  | for (i = 1; i < argc ; i++) { | 
|  | if (!strcmp(argv[i], "-")) | 
|  | break; | 
|  |  | 
|  | if (argv[i][0] != '-') | 
|  | continue; | 
|  | if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) | 
|  | debug++; | 
|  | else | 
|  | #ifdef LIBXML_DEBUG_ENABLED | 
|  | if ((!strcmp(argv[i], "-shell")) || | 
|  | (!strcmp(argv[i], "--shell"))) { | 
|  | shell++; | 
|  | noout = 1; | 
|  | } else | 
|  | #endif | 
|  | #ifdef LIBXML_TREE_ENABLED | 
|  | if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy"))) | 
|  | copy++; | 
|  | else | 
|  | #endif /* LIBXML_TREE_ENABLED */ | 
|  | if ((!strcmp(argv[i], "-recover")) || | 
|  | (!strcmp(argv[i], "--recover"))) { | 
|  | recovery++; | 
|  | options |= XML_PARSE_RECOVER; | 
|  | } else if ((!strcmp(argv[i], "-huge")) || | 
|  | (!strcmp(argv[i], "--huge"))) { | 
|  | options |= XML_PARSE_HUGE; | 
|  | } else if ((!strcmp(argv[i], "-noent")) || | 
|  | (!strcmp(argv[i], "--noent"))) { | 
|  | noent++; | 
|  | options |= XML_PARSE_NOENT; | 
|  | } else if ((!strcmp(argv[i], "-nsclean")) || | 
|  | (!strcmp(argv[i], "--nsclean"))) { | 
|  | options |= XML_PARSE_NSCLEAN; | 
|  | } else if ((!strcmp(argv[i], "-nocdata")) || | 
|  | (!strcmp(argv[i], "--nocdata"))) { | 
|  | options |= XML_PARSE_NOCDATA; | 
|  | } else if ((!strcmp(argv[i], "-nodict")) || | 
|  | (!strcmp(argv[i], "--nodict"))) { | 
|  | options |= XML_PARSE_NODICT; | 
|  | } else if ((!strcmp(argv[i], "-version")) || | 
|  | (!strcmp(argv[i], "--version"))) { | 
|  | showVersion(argv[0]); | 
|  | version = 1; | 
|  | } else if ((!strcmp(argv[i], "-noout")) || | 
|  | (!strcmp(argv[i], "--noout"))) | 
|  | noout++; | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | else if ((!strcmp(argv[i], "-o")) || | 
|  | (!strcmp(argv[i], "-output")) || | 
|  | (!strcmp(argv[i], "--output"))) { | 
|  | i++; | 
|  | output = argv[i]; | 
|  | } | 
|  | #endif /* LIBXML_OUTPUT_ENABLED */ | 
|  | else if ((!strcmp(argv[i], "-htmlout")) || | 
|  | (!strcmp(argv[i], "--htmlout"))) | 
|  | htmlout++; | 
|  | else if ((!strcmp(argv[i], "-nowrap")) || | 
|  | (!strcmp(argv[i], "--nowrap"))) | 
|  | nowrap++; | 
|  | #ifdef LIBXML_HTML_ENABLED | 
|  | else if ((!strcmp(argv[i], "-html")) || | 
|  | (!strcmp(argv[i], "--html"))) { | 
|  | html++; | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-xmlout")) || | 
|  | (!strcmp(argv[i], "--xmlout"))) { | 
|  | xmlout++; | 
|  | } | 
|  | #endif /* LIBXML_HTML_ENABLED */ | 
|  | else if ((!strcmp(argv[i], "-loaddtd")) || | 
|  | (!strcmp(argv[i], "--loaddtd"))) { | 
|  | loaddtd++; | 
|  | options |= XML_PARSE_DTDLOAD; | 
|  | } else if ((!strcmp(argv[i], "-dtdattr")) || | 
|  | (!strcmp(argv[i], "--dtdattr"))) { | 
|  | loaddtd++; | 
|  | dtdattrs++; | 
|  | options |= XML_PARSE_DTDATTR; | 
|  | } | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | else if ((!strcmp(argv[i], "-valid")) || | 
|  | (!strcmp(argv[i], "--valid"))) { | 
|  | valid++; | 
|  | options |= XML_PARSE_DTDVALID; | 
|  | } else if ((!strcmp(argv[i], "-postvalid")) || | 
|  | (!strcmp(argv[i], "--postvalid"))) { | 
|  | postvalid++; | 
|  | loaddtd++; | 
|  | options |= XML_PARSE_DTDLOAD; | 
|  | } else if ((!strcmp(argv[i], "-dtdvalid")) || | 
|  | (!strcmp(argv[i], "--dtdvalid"))) { | 
|  | i++; | 
|  | dtdvalid = argv[i]; | 
|  | loaddtd++; | 
|  | options |= XML_PARSE_DTDLOAD; | 
|  | } else if ((!strcmp(argv[i], "-dtdvalidfpi")) || | 
|  | (!strcmp(argv[i], "--dtdvalidfpi"))) { | 
|  | i++; | 
|  | dtdvalidfpi = argv[i]; | 
|  | loaddtd++; | 
|  | options |= XML_PARSE_DTDLOAD; | 
|  | } | 
|  | #endif /* LIBXML_VALID_ENABLED */ | 
|  | else if ((!strcmp(argv[i], "-dropdtd")) || | 
|  | (!strcmp(argv[i], "--dropdtd"))) | 
|  | dropdtd++; | 
|  | else if ((!strcmp(argv[i], "-insert")) || | 
|  | (!strcmp(argv[i], "--insert"))) | 
|  | insert++; | 
|  | else if ((!strcmp(argv[i], "-timing")) || | 
|  | (!strcmp(argv[i], "--timing"))) | 
|  | timing++; | 
|  | else if ((!strcmp(argv[i], "-auto")) || | 
|  | (!strcmp(argv[i], "--auto"))) | 
|  | generate++; | 
|  | else if ((!strcmp(argv[i], "-repeat")) || | 
|  | (!strcmp(argv[i], "--repeat"))) { | 
|  | if (repeat) | 
|  | repeat *= 10; | 
|  | else | 
|  | repeat = 100; | 
|  | } | 
|  | #ifdef LIBXML_PUSH_ENABLED | 
|  | else if ((!strcmp(argv[i], "-push")) || | 
|  | (!strcmp(argv[i], "--push"))) | 
|  | push++; | 
|  | #endif /* LIBXML_PUSH_ENABLED */ | 
|  | #ifdef HAVE_SYS_MMAN_H | 
|  | else if ((!strcmp(argv[i], "-memory")) || | 
|  | (!strcmp(argv[i], "--memory"))) | 
|  | memory++; | 
|  | #endif | 
|  | else if ((!strcmp(argv[i], "-testIO")) || | 
|  | (!strcmp(argv[i], "--testIO"))) | 
|  | testIO++; | 
|  | #ifdef LIBXML_XINCLUDE_ENABLED | 
|  | else if ((!strcmp(argv[i], "-xinclude")) || | 
|  | (!strcmp(argv[i], "--xinclude"))) { | 
|  | xinclude++; | 
|  | options |= XML_PARSE_XINCLUDE; | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-noxincludenode")) || | 
|  | (!strcmp(argv[i], "--noxincludenode"))) { | 
|  | xinclude++; | 
|  | options |= XML_PARSE_XINCLUDE; | 
|  | options |= XML_PARSE_NOXINCNODE; | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-nofixup-base-uris")) || | 
|  | (!strcmp(argv[i], "--nofixup-base-uris"))) { | 
|  | xinclude++; | 
|  | options |= XML_PARSE_XINCLUDE; | 
|  | options |= XML_PARSE_NOBASEFIX; | 
|  | } | 
|  | #endif | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | #ifdef HAVE_ZLIB_H | 
|  | else if ((!strcmp(argv[i], "-compress")) || | 
|  | (!strcmp(argv[i], "--compress"))) { | 
|  | compress++; | 
|  | xmlSetCompressMode(9); | 
|  | } | 
|  | #endif | 
|  | #endif /* LIBXML_OUTPUT_ENABLED */ | 
|  | else if ((!strcmp(argv[i], "-nowarning")) || | 
|  | (!strcmp(argv[i], "--nowarning"))) { | 
|  | xmlGetWarningsDefaultValue = 0; | 
|  | xmlPedanticParserDefault(0); | 
|  | options |= XML_PARSE_NOWARNING; | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-pedantic")) || | 
|  | (!strcmp(argv[i], "--pedantic"))) { | 
|  | xmlGetWarningsDefaultValue = 1; | 
|  | xmlPedanticParserDefault(1); | 
|  | options |= XML_PARSE_PEDANTIC; | 
|  | } | 
|  | #ifdef LIBXML_DEBUG_ENABLED | 
|  | else if ((!strcmp(argv[i], "-debugent")) || | 
|  | (!strcmp(argv[i], "--debugent"))) { | 
|  | debugent++; | 
|  | xmlParserDebugEntities = 1; | 
|  | } | 
|  | #endif | 
|  | #ifdef LIBXML_C14N_ENABLED | 
|  | else if ((!strcmp(argv[i], "-c14n")) || | 
|  | (!strcmp(argv[i], "--c14n"))) { | 
|  | canonical++; | 
|  | options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD; | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-c14n11")) || | 
|  | (!strcmp(argv[i], "--c14n11"))) { | 
|  | canonical_11++; | 
|  | options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD; | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-exc-c14n")) || | 
|  | (!strcmp(argv[i], "--exc-c14n"))) { | 
|  | exc_canonical++; | 
|  | options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD; | 
|  | } | 
|  | #endif | 
|  | #ifdef LIBXML_CATALOG_ENABLED | 
|  | else if ((!strcmp(argv[i], "-catalogs")) || | 
|  | (!strcmp(argv[i], "--catalogs"))) { | 
|  | catalogs++; | 
|  | } else if ((!strcmp(argv[i], "-nocatalogs")) || | 
|  | (!strcmp(argv[i], "--nocatalogs"))) { | 
|  | nocatalogs++; | 
|  | } | 
|  | #endif | 
|  | else if ((!strcmp(argv[i], "-encode")) || | 
|  | (!strcmp(argv[i], "--encode"))) { | 
|  | i++; | 
|  | encoding = argv[i]; | 
|  | /* | 
|  | * OK it's for testing purposes | 
|  | */ | 
|  | xmlAddEncodingAlias("UTF-8", "DVEnc"); | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-noblanks")) || | 
|  | (!strcmp(argv[i], "--noblanks"))) { | 
|  | noblanks++; | 
|  | xmlKeepBlanksDefault(0); | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-maxmem")) || | 
|  | (!strcmp(argv[i], "--maxmem"))) { | 
|  | i++; | 
|  | if (sscanf(argv[i], "%d", &maxmem) == 1) { | 
|  | xmlMemSetup(myFreeFunc, myMallocFunc, myReallocFunc, | 
|  | myStrdupFunc); | 
|  | } else { | 
|  | maxmem = 0; | 
|  | } | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-format")) || | 
|  | (!strcmp(argv[i], "--format"))) { | 
|  | noblanks++; | 
|  | #ifdef LIBXML_OUTPUT_ENABLED | 
|  | format++; | 
|  | #endif /* LIBXML_OUTPUT_ENABLED */ | 
|  | xmlKeepBlanksDefault(0); | 
|  | } | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | else if ((!strcmp(argv[i], "-stream")) || | 
|  | (!strcmp(argv[i], "--stream"))) { | 
|  | stream++; | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-walker")) || | 
|  | (!strcmp(argv[i], "--walker"))) { | 
|  | walker++; | 
|  | noout++; | 
|  | } | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | #ifdef LIBXML_SAX1_ENABLED | 
|  | else if ((!strcmp(argv[i], "-sax1")) || | 
|  | (!strcmp(argv[i], "--sax1"))) { | 
|  | sax1++; | 
|  | options |= XML_PARSE_SAX1; | 
|  | } | 
|  | #endif /* LIBXML_SAX1_ENABLED */ | 
|  | else if ((!strcmp(argv[i], "-sax")) || | 
|  | (!strcmp(argv[i], "--sax"))) { | 
|  | sax++; | 
|  | } | 
|  | else if ((!strcmp(argv[i], "-chkregister")) || | 
|  | (!strcmp(argv[i], "--chkregister"))) { | 
|  | chkregister++; | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | } else if ((!strcmp(argv[i], "-relaxng")) || | 
|  | (!strcmp(argv[i], "--relaxng"))) { | 
|  | i++; | 
|  | relaxng = argv[i]; | 
|  | noent++; | 
|  | options |= XML_PARSE_NOENT; | 
|  | } else if ((!strcmp(argv[i], "-schema")) || | 
|  | (!strcmp(argv[i], "--schema"))) { | 
|  | i++; | 
|  | schema = argv[i]; | 
|  | noent++; | 
|  | #endif | 
|  | #ifdef LIBXML_SCHEMATRON_ENABLED | 
|  | } else if ((!strcmp(argv[i], "-schematron")) || | 
|  | (!strcmp(argv[i], "--schematron"))) { | 
|  | i++; | 
|  | schematron = argv[i]; | 
|  | noent++; | 
|  | #endif | 
|  | } else if ((!strcmp(argv[i], "-nonet")) || | 
|  | (!strcmp(argv[i], "--nonet"))) { | 
|  | options |= XML_PARSE_NONET; | 
|  | xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader); | 
|  | } else if ((!strcmp(argv[i], "-nocompact")) || | 
|  | (!strcmp(argv[i], "--nocompact"))) { | 
|  | options &= ~XML_PARSE_COMPACT; | 
|  | } else if ((!strcmp(argv[i], "-load-trace")) || | 
|  | (!strcmp(argv[i], "--load-trace"))) { | 
|  | load_trace++; | 
|  | } else if ((!strcmp(argv[i], "-path")) || | 
|  | (!strcmp(argv[i], "--path"))) { | 
|  | i++; | 
|  | parsePath(BAD_CAST argv[i]); | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | } else if ((!strcmp(argv[i], "-pattern")) || | 
|  | (!strcmp(argv[i], "--pattern"))) { | 
|  | i++; | 
|  | pattern = argv[i]; | 
|  | #endif | 
|  | #ifdef LIBXML_XPATH_ENABLED | 
|  | } else if ((!strcmp(argv[i], "-xpath")) || | 
|  | (!strcmp(argv[i], "--xpath"))) { | 
|  | i++; | 
|  | noout++; | 
|  | xpathquery = argv[i]; | 
|  | #endif | 
|  | } else if ((!strcmp(argv[i], "-oldxml10")) || | 
|  | (!strcmp(argv[i], "--oldxml10"))) { | 
|  | oldxml10++; | 
|  | options |= XML_PARSE_OLD10; | 
|  | } else { | 
|  | fprintf(stderr, "Unknown option %s\n", argv[i]); | 
|  | usage(argv[0]); | 
|  | return(1); | 
|  | } | 
|  | } | 
|  |  | 
|  | #ifdef LIBXML_CATALOG_ENABLED | 
|  | if (nocatalogs == 0) { | 
|  | if (catalogs) { | 
|  | const char *catal; | 
|  |  | 
|  | catal = getenv("SGML_CATALOG_FILES"); | 
|  | if (catal != NULL) { | 
|  | xmlLoadCatalogs(catal); | 
|  | } else { | 
|  | fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n"); | 
|  | } | 
|  | } | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifdef LIBXML_SAX1_ENABLED | 
|  | if (sax1) | 
|  | xmlSAXDefaultVersion(1); | 
|  | else | 
|  | xmlSAXDefaultVersion(2); | 
|  | #endif /* LIBXML_SAX1_ENABLED */ | 
|  |  | 
|  | if (chkregister) { | 
|  | xmlRegisterNodeDefault(registerNode); | 
|  | xmlDeregisterNodeDefault(deregisterNode); | 
|  | } | 
|  |  | 
|  | indent = getenv("XMLLINT_INDENT"); | 
|  | if(indent != NULL) { | 
|  | xmlTreeIndentString = indent; | 
|  | } | 
|  |  | 
|  |  | 
|  | defaultEntityLoader = xmlGetExternalEntityLoader(); | 
|  | xmlSetExternalEntityLoader(xmllintExternalEntityLoader); | 
|  |  | 
|  | xmlLineNumbersDefault(1); | 
|  | if (loaddtd != 0) | 
|  | xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS; | 
|  | if (dtdattrs) | 
|  | xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS; | 
|  | if (noent != 0) xmlSubstituteEntitiesDefault(1); | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | if (valid != 0) xmlDoValidityCheckingDefaultValue = 1; | 
|  | #endif /* LIBXML_VALID_ENABLED */ | 
|  | if ((htmlout) && (!nowrap)) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n"); | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n"); | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "<html><head><title>%s output</title></head>\n", | 
|  | argv[0]); | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n", | 
|  | argv[0]); | 
|  | } | 
|  |  | 
|  | #ifdef LIBXML_SCHEMATRON_ENABLED | 
|  | if ((schematron != NULL) && (sax == 0) | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | && (stream == 0) | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | ) { | 
|  | xmlSchematronParserCtxtPtr ctxt; | 
|  |  | 
|  | /* forces loading the DTDs */ | 
|  | xmlLoadExtDtdDefaultValue |= 1; | 
|  | options |= XML_PARSE_DTDLOAD; | 
|  | if (timing) { | 
|  | startTimer(); | 
|  | } | 
|  | ctxt = xmlSchematronNewParserCtxt(schematron); | 
|  | #if 0 | 
|  | xmlSchematronSetParserErrors(ctxt, | 
|  | (xmlSchematronValidityErrorFunc) fprintf, | 
|  | (xmlSchematronValidityWarningFunc) fprintf, | 
|  | stderr); | 
|  | #endif | 
|  | wxschematron = xmlSchematronParse(ctxt); | 
|  | if (wxschematron == NULL) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Schematron schema %s failed to compile\n", schematron); | 
|  | progresult = XMLLINT_ERR_SCHEMACOMP; | 
|  | schematron = NULL; | 
|  | } | 
|  | xmlSchematronFreeParserCtxt(ctxt); | 
|  | if (timing) { | 
|  | endTimer("Compiling the schemas"); | 
|  | } | 
|  | } | 
|  | #endif | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | if ((relaxng != NULL) && (sax == 0) | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | && (stream == 0) | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | ) { | 
|  | xmlRelaxNGParserCtxtPtr ctxt; | 
|  |  | 
|  | /* forces loading the DTDs */ | 
|  | xmlLoadExtDtdDefaultValue |= 1; | 
|  | options |= XML_PARSE_DTDLOAD; | 
|  | if (timing) { | 
|  | startTimer(); | 
|  | } | 
|  | ctxt = xmlRelaxNGNewParserCtxt(relaxng); | 
|  | xmlRelaxNGSetParserErrors(ctxt, | 
|  | (xmlRelaxNGValidityErrorFunc) fprintf, | 
|  | (xmlRelaxNGValidityWarningFunc) fprintf, | 
|  | stderr); | 
|  | relaxngschemas = xmlRelaxNGParse(ctxt); | 
|  | if (relaxngschemas == NULL) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Relax-NG schema %s failed to compile\n", relaxng); | 
|  | progresult = XMLLINT_ERR_SCHEMACOMP; | 
|  | relaxng = NULL; | 
|  | } | 
|  | xmlRelaxNGFreeParserCtxt(ctxt); | 
|  | if (timing) { | 
|  | endTimer("Compiling the schemas"); | 
|  | } | 
|  | } else if ((schema != NULL) | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | && (stream == 0) | 
|  | #endif | 
|  | ) { | 
|  | xmlSchemaParserCtxtPtr ctxt; | 
|  |  | 
|  | if (timing) { | 
|  | startTimer(); | 
|  | } | 
|  | ctxt = xmlSchemaNewParserCtxt(schema); | 
|  | xmlSchemaSetParserErrors(ctxt, | 
|  | (xmlSchemaValidityErrorFunc) fprintf, | 
|  | (xmlSchemaValidityWarningFunc) fprintf, | 
|  | stderr); | 
|  | wxschemas = xmlSchemaParse(ctxt); | 
|  | if (wxschemas == NULL) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "WXS schema %s failed to compile\n", schema); | 
|  | progresult = XMLLINT_ERR_SCHEMACOMP; | 
|  | schema = NULL; | 
|  | } | 
|  | xmlSchemaFreeParserCtxt(ctxt); | 
|  | if (timing) { | 
|  | endTimer("Compiling the schemas"); | 
|  | } | 
|  | } | 
|  | #endif /* LIBXML_SCHEMAS_ENABLED */ | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | if ((pattern != NULL) | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | && (walker == 0) | 
|  | #endif | 
|  | ) { | 
|  | patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL); | 
|  | if (patternc == NULL) { | 
|  | xmlGenericError(xmlGenericErrorContext, | 
|  | "Pattern %s failed to compile\n", pattern); | 
|  | progresult = XMLLINT_ERR_SCHEMAPAT; | 
|  | pattern = NULL; | 
|  | } | 
|  | } | 
|  | #endif /* LIBXML_PATTERN_ENABLED */ | 
|  | for (i = 1; i < argc ; i++) { | 
|  | if ((!strcmp(argv[i], "-encode")) || | 
|  | (!strcmp(argv[i], "--encode"))) { | 
|  | i++; | 
|  | continue; | 
|  | } else if ((!strcmp(argv[i], "-o")) || | 
|  | (!strcmp(argv[i], "-output")) || | 
|  | (!strcmp(argv[i], "--output"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | #ifdef LIBXML_VALID_ENABLED | 
|  | if ((!strcmp(argv[i], "-dtdvalid")) || | 
|  | (!strcmp(argv[i], "--dtdvalid"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | if ((!strcmp(argv[i], "-path")) || | 
|  | (!strcmp(argv[i], "--path"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | if ((!strcmp(argv[i], "-dtdvalidfpi")) || | 
|  | (!strcmp(argv[i], "--dtdvalidfpi"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | #endif /* LIBXML_VALID_ENABLED */ | 
|  | if ((!strcmp(argv[i], "-relaxng")) || | 
|  | (!strcmp(argv[i], "--relaxng"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | if ((!strcmp(argv[i], "-maxmem")) || | 
|  | (!strcmp(argv[i], "--maxmem"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | if ((!strcmp(argv[i], "-schema")) || | 
|  | (!strcmp(argv[i], "--schema"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | if ((!strcmp(argv[i], "-schematron")) || | 
|  | (!strcmp(argv[i], "--schematron"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | if ((!strcmp(argv[i], "-pattern")) || | 
|  | (!strcmp(argv[i], "--pattern"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | #endif | 
|  | #ifdef LIBXML_XPATH_ENABLED | 
|  | if ((!strcmp(argv[i], "-xpath")) || | 
|  | (!strcmp(argv[i], "--xpath"))) { | 
|  | i++; | 
|  | continue; | 
|  | } | 
|  | #endif | 
|  | if ((timing) && (repeat)) | 
|  | startTimer(); | 
|  | /* Remember file names.  "-" means stdin.  <sven@zen.org> */ | 
|  | if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0)) { | 
|  | if (repeat) { | 
|  | xmlParserCtxtPtr ctxt = NULL; | 
|  |  | 
|  | for (acount = 0;acount < repeat;acount++) { | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | if (stream != 0) { | 
|  | streamFile(argv[i]); | 
|  | } else { | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | if (sax) { | 
|  | testSAX(argv[i]); | 
|  | } else { | 
|  | if (ctxt == NULL) | 
|  | ctxt = xmlNewParserCtxt(); | 
|  | parseAndPrintFile(argv[i], ctxt); | 
|  | } | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | } | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | } | 
|  | if (ctxt != NULL) | 
|  | xmlFreeParserCtxt(ctxt); | 
|  | } else { | 
|  | nbregister = 0; | 
|  |  | 
|  | #ifdef LIBXML_READER_ENABLED | 
|  | if (stream != 0) | 
|  | streamFile(argv[i]); | 
|  | else | 
|  | #endif /* LIBXML_READER_ENABLED */ | 
|  | if (sax) { | 
|  | testSAX(argv[i]); | 
|  | } else { | 
|  | parseAndPrintFile(argv[i], NULL); | 
|  | } | 
|  |  | 
|  | if ((chkregister) && (nbregister != 0)) { | 
|  | fprintf(stderr, "Registration count off: %d\n", nbregister); | 
|  | progresult = XMLLINT_ERR_RDREGIS; | 
|  | } | 
|  | } | 
|  | files ++; | 
|  | if ((timing) && (repeat)) { | 
|  | endTimer("%d iterations", repeat); | 
|  | } | 
|  | } | 
|  | } | 
|  | if (generate) | 
|  | parseAndPrintFile(NULL, NULL); | 
|  | if ((htmlout) && (!nowrap)) { | 
|  | xmlGenericError(xmlGenericErrorContext, "</body></html>\n"); | 
|  | } | 
|  | if ((files == 0) && (!generate) && (version == 0)) { | 
|  | usage(argv[0]); | 
|  | } | 
|  | #ifdef LIBXML_SCHEMATRON_ENABLED | 
|  | if (wxschematron != NULL) | 
|  | xmlSchematronFree(wxschematron); | 
|  | #endif | 
|  | #ifdef LIBXML_SCHEMAS_ENABLED | 
|  | if (relaxngschemas != NULL) | 
|  | xmlRelaxNGFree(relaxngschemas); | 
|  | if (wxschemas != NULL) | 
|  | xmlSchemaFree(wxschemas); | 
|  | xmlRelaxNGCleanupTypes(); | 
|  | #endif | 
|  | #ifdef LIBXML_PATTERN_ENABLED | 
|  | if (patternc != NULL) | 
|  | xmlFreePattern(patternc); | 
|  | #endif | 
|  | xmlCleanupParser(); | 
|  | xmlMemoryDump(); | 
|  |  | 
|  | return(progresult); | 
|  | } | 
|  |  |