File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / xmllint.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:37:57 2012 UTC (12 years, 4 months ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_7_8, HEAD
libxml2

    1: /*
    2:  * xmllint.c : a small tester program for XML input.
    3:  *
    4:  * See Copyright for the status of this software.
    5:  *
    6:  * daniel@veillard.com
    7:  */
    8: 
    9: #include "libxml.h"
   10: 
   11: #include <string.h>
   12: #include <stdarg.h>
   13: #include <assert.h>
   14: 
   15: #if defined (_WIN32) && !defined(__CYGWIN__)
   16: #if defined (_MSC_VER) || defined(__BORLANDC__)
   17: #include <winsock2.h>
   18: #pragma comment(lib, "ws2_32.lib")
   19: #define gettimeofday(p1,p2)
   20: #endif /* _MSC_VER */
   21: #endif /* _WIN32 */
   22: 
   23: #ifdef HAVE_SYS_TIME_H
   24: #include <sys/time.h>
   25: #endif
   26: #ifdef HAVE_TIME_H
   27: #include <time.h>
   28: #endif
   29: 
   30: #ifdef __MINGW32__
   31: #define _WINSOCKAPI_
   32: #include <wsockcompat.h>
   33: #include <winsock2.h>
   34: #undef XML_SOCKLEN_T
   35: #define XML_SOCKLEN_T unsigned int
   36: #endif
   37: 
   38: #ifdef HAVE_SYS_TIMEB_H
   39: #include <sys/timeb.h>
   40: #endif
   41: 
   42: #ifdef HAVE_SYS_TYPES_H
   43: #include <sys/types.h>
   44: #endif
   45: #ifdef HAVE_SYS_STAT_H
   46: #include <sys/stat.h>
   47: #endif
   48: #ifdef HAVE_FCNTL_H
   49: #include <fcntl.h>
   50: #endif
   51: #ifdef HAVE_UNISTD_H
   52: #include <unistd.h>
   53: #endif
   54: #ifdef HAVE_SYS_MMAN_H
   55: #include <sys/mman.h>
   56: /* seems needed for Solaris */
   57: #ifndef MAP_FAILED
   58: #define MAP_FAILED ((void *) -1)
   59: #endif
   60: #endif
   61: #ifdef HAVE_STDLIB_H
   62: #include <stdlib.h>
   63: #endif
   64: #ifdef HAVE_LIBREADLINE
   65: #include <readline/readline.h>
   66: #ifdef HAVE_LIBHISTORY
   67: #include <readline/history.h>
   68: #endif
   69: #endif
   70: 
   71: #include <libxml/xmlmemory.h>
   72: #include <libxml/parser.h>
   73: #include <libxml/parserInternals.h>
   74: #include <libxml/HTMLparser.h>
   75: #include <libxml/HTMLtree.h>
   76: #include <libxml/tree.h>
   77: #include <libxml/xpath.h>
   78: #include <libxml/debugXML.h>
   79: #include <libxml/xmlerror.h>
   80: #ifdef LIBXML_XINCLUDE_ENABLED
   81: #include <libxml/xinclude.h>
   82: #endif
   83: #ifdef LIBXML_CATALOG_ENABLED
   84: #include <libxml/catalog.h>
   85: #endif
   86: #include <libxml/globals.h>
   87: #include <libxml/xmlreader.h>
   88: #ifdef LIBXML_SCHEMATRON_ENABLED
   89: #include <libxml/schematron.h>
   90: #endif
   91: #ifdef LIBXML_SCHEMAS_ENABLED
   92: #include <libxml/relaxng.h>
   93: #include <libxml/xmlschemas.h>
   94: #endif
   95: #ifdef LIBXML_PATTERN_ENABLED
   96: #include <libxml/pattern.h>
   97: #endif
   98: #ifdef LIBXML_C14N_ENABLED
   99: #include <libxml/c14n.h>
  100: #endif
  101: #ifdef LIBXML_OUTPUT_ENABLED
  102: #include <libxml/xmlsave.h>
  103: #endif
  104: 
  105: #ifndef XML_XML_DEFAULT_CATALOG
  106: #define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
  107: #endif
  108: 
  109: typedef enum {
  110:     XMLLINT_RETURN_OK = 0,	/* No error */
  111:     XMLLINT_ERR_UNCLASS = 1,	/* Unclassified */
  112:     XMLLINT_ERR_DTD = 2,	/* Error in DTD */
  113:     XMLLINT_ERR_VALID = 3,	/* Validation error */
  114:     XMLLINT_ERR_RDFILE = 4,	/* CtxtReadFile error */
  115:     XMLLINT_ERR_SCHEMACOMP = 5,	/* Schema compilation */
  116:     XMLLINT_ERR_OUT = 6,	/* Error writing output */
  117:     XMLLINT_ERR_SCHEMAPAT = 7,	/* Error in schema pattern */
  118:     XMLLINT_ERR_RDREGIS = 8,	/* Error in Reader registration */
  119:     XMLLINT_ERR_MEM = 9,	/* Out of memory error */
  120:     XMLLINT_ERR_XPATH = 10	/* XPath evaluation error */
  121: } xmllintReturnCode;
  122: #ifdef LIBXML_DEBUG_ENABLED
  123: static int shell = 0;
  124: static int debugent = 0;
  125: #endif
  126: static int debug = 0;
  127: static int maxmem = 0;
  128: #ifdef LIBXML_TREE_ENABLED
  129: static int copy = 0;
  130: #endif /* LIBXML_TREE_ENABLED */
  131: static int recovery = 0;
  132: static int noent = 0;
  133: static int noblanks = 0;
  134: static int noout = 0;
  135: static int nowrap = 0;
  136: #ifdef LIBXML_OUTPUT_ENABLED
  137: static int format = 0;
  138: static const char *output = NULL;
  139: static int compress = 0;
  140: static int oldout = 0;
  141: #endif /* LIBXML_OUTPUT_ENABLED */
  142: #ifdef LIBXML_VALID_ENABLED
  143: static int valid = 0;
  144: static int postvalid = 0;
  145: static char * dtdvalid = NULL;
  146: static char * dtdvalidfpi = NULL;
  147: #endif
  148: #ifdef LIBXML_SCHEMAS_ENABLED
  149: static char * relaxng = NULL;
  150: static xmlRelaxNGPtr relaxngschemas = NULL;
  151: static char * schema = NULL;
  152: static xmlSchemaPtr wxschemas = NULL;
  153: #endif
  154: #ifdef LIBXML_SCHEMATRON_ENABLED
  155: static char * schematron = NULL;
  156: static xmlSchematronPtr wxschematron = NULL;
  157: #endif
  158: static int repeat = 0;
  159: static int insert = 0;
  160: #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
  161: static int html = 0;
  162: static int xmlout = 0;
  163: #endif
  164: static int htmlout = 0;
  165: #if defined(LIBXML_HTML_ENABLED)
  166: static int nodefdtd = 0;
  167: #endif
  168: #ifdef LIBXML_PUSH_ENABLED
  169: static int push = 0;
  170: #endif /* LIBXML_PUSH_ENABLED */
  171: #ifdef HAVE_SYS_MMAN_H
  172: static int memory = 0;
  173: #endif
  174: static int testIO = 0;
  175: static char *encoding = NULL;
  176: #ifdef LIBXML_XINCLUDE_ENABLED
  177: static int xinclude = 0;
  178: #endif
  179: static int dtdattrs = 0;
  180: static int loaddtd = 0;
  181: static xmllintReturnCode progresult = XMLLINT_RETURN_OK;
  182: static int timing = 0;
  183: static int generate = 0;
  184: static int dropdtd = 0;
  185: #ifdef LIBXML_CATALOG_ENABLED
  186: static int catalogs = 0;
  187: static int nocatalogs = 0;
  188: #endif
  189: #ifdef LIBXML_C14N_ENABLED
  190: static int canonical = 0;
  191: static int canonical_11 = 0;
  192: static int exc_canonical = 0;
  193: #endif
  194: #ifdef LIBXML_READER_ENABLED
  195: static int stream = 0;
  196: static int walker = 0;
  197: #endif /* LIBXML_READER_ENABLED */
  198: static int chkregister = 0;
  199: static int nbregister = 0;
  200: #ifdef LIBXML_SAX1_ENABLED
  201: static int sax1 = 0;
  202: #endif /* LIBXML_SAX1_ENABLED */
  203: #ifdef LIBXML_PATTERN_ENABLED
  204: static const char *pattern = NULL;
  205: static xmlPatternPtr patternc = NULL;
  206: static xmlStreamCtxtPtr patstream = NULL;
  207: #endif
  208: #ifdef LIBXML_XPATH_ENABLED
  209: static const char *xpathquery = NULL;
  210: #endif
  211: static int options = XML_PARSE_COMPACT;
  212: static int sax = 0;
  213: static int oldxml10 = 0;
  214: 
  215: /************************************************************************
  216:  *									*
  217:  *		 Entity loading control and customization.		*
  218:  *									*
  219:  ************************************************************************/
  220: #define MAX_PATHS 64
  221: #ifdef _WIN32
  222: # define PATH_SEPARATOR ';'
  223: #else
  224: # define PATH_SEPARATOR ':'
  225: #endif
  226: static xmlChar *paths[MAX_PATHS + 1];
  227: static int nbpaths = 0;
  228: static int load_trace = 0;
  229: 
  230: static
  231: void parsePath(const xmlChar *path) {
  232:     const xmlChar *cur;
  233: 
  234:     if (path == NULL)
  235: 	return;
  236:     while (*path != 0) {
  237: 	if (nbpaths >= MAX_PATHS) {
  238: 	    fprintf(stderr, "MAX_PATHS reached: too many paths\n");
  239: 	    return;
  240: 	}
  241: 	cur = path;
  242: 	while ((*cur == ' ') || (*cur == PATH_SEPARATOR))
  243: 	    cur++;
  244: 	path = cur;
  245: 	while ((*cur != 0) && (*cur != ' ') && (*cur != PATH_SEPARATOR))
  246: 	    cur++;
  247: 	if (cur != path) {
  248: 	    paths[nbpaths] = xmlStrndup(path, cur - path);
  249: 	    if (paths[nbpaths] != NULL)
  250: 		nbpaths++;
  251: 	    path = cur;
  252: 	}
  253:     }
  254: }
  255: 
  256: static xmlExternalEntityLoader defaultEntityLoader = NULL;
  257: 
  258: static xmlParserInputPtr
  259: xmllintExternalEntityLoader(const char *URL, const char *ID,
  260: 			     xmlParserCtxtPtr ctxt) {
  261:     xmlParserInputPtr ret;
  262:     warningSAXFunc warning = NULL;
  263:     errorSAXFunc err = NULL;
  264: 
  265:     int i;
  266:     const char *lastsegment = URL;
  267:     const char *iter = URL;
  268: 
  269:     if ((nbpaths > 0) && (iter != NULL)) {
  270: 	while (*iter != 0) {
  271: 	    if (*iter == '/')
  272: 		lastsegment = iter + 1;
  273: 	    iter++;
  274: 	}
  275:     }
  276: 
  277:     if ((ctxt != NULL) && (ctxt->sax != NULL)) {
  278: 	warning = ctxt->sax->warning;
  279: 	err = ctxt->sax->error;
  280: 	ctxt->sax->warning = NULL;
  281: 	ctxt->sax->error = NULL;
  282:     }
  283: 
  284:     if (defaultEntityLoader != NULL) {
  285: 	ret = defaultEntityLoader(URL, ID, ctxt);
  286: 	if (ret != NULL) {
  287: 	    if (warning != NULL)
  288: 		ctxt->sax->warning = warning;
  289: 	    if (err != NULL)
  290: 		ctxt->sax->error = err;
  291: 	    if (load_trace) {
  292: 		fprintf \
  293: 			(stderr,
  294: 			 "Loaded URL=\"%s\" ID=\"%s\"\n",
  295: 			 URL ? URL : "(null)",
  296: 			 ID ? ID : "(null)");
  297: 	    }
  298: 	    return(ret);
  299: 	}
  300:     }
  301:     for (i = 0;i < nbpaths;i++) {
  302: 	xmlChar *newURL;
  303: 
  304: 	newURL = xmlStrdup((const xmlChar *) paths[i]);
  305: 	newURL = xmlStrcat(newURL, (const xmlChar *) "/");
  306: 	newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment);
  307: 	if (newURL != NULL) {
  308: 	    ret = defaultEntityLoader((const char *)newURL, ID, ctxt);
  309: 	    if (ret != NULL) {
  310: 		if (warning != NULL)
  311: 		    ctxt->sax->warning = warning;
  312: 		if (err != NULL)
  313: 		    ctxt->sax->error = err;
  314: 		if (load_trace) {
  315: 		    fprintf \
  316: 			(stderr,
  317: 			 "Loaded URL=\"%s\" ID=\"%s\"\n",
  318: 			 newURL,
  319: 			 ID ? ID : "(null)");
  320: 		}
  321: 		xmlFree(newURL);
  322: 		return(ret);
  323: 	    }
  324: 	    xmlFree(newURL);
  325: 	}
  326:     }
  327:     if (err != NULL)
  328:         ctxt->sax->error = err;
  329:     if (warning != NULL) {
  330: 	ctxt->sax->warning = warning;
  331: 	if (URL != NULL)
  332: 	    warning(ctxt, "failed to load external entity \"%s\"\n", URL);
  333: 	else if (ID != NULL)
  334: 	    warning(ctxt, "failed to load external entity \"%s\"\n", ID);
  335:     }
  336:     return(NULL);
  337: }
  338: /************************************************************************
  339:  *									*
  340:  * Memory allocation consumption debugging				*
  341:  *									*
  342:  ************************************************************************/
  343: 
  344: static void
  345: OOM(void)
  346: {
  347:     fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem);
  348:     progresult = XMLLINT_ERR_MEM;
  349: }
  350: 
  351: static void
  352: myFreeFunc(void *mem)
  353: {
  354:     xmlMemFree(mem);
  355: }
  356: static void *
  357: myMallocFunc(size_t size)
  358: {
  359:     void *ret;
  360: 
  361:     ret = xmlMemMalloc(size);
  362:     if (ret != NULL) {
  363:         if (xmlMemUsed() > maxmem) {
  364:             OOM();
  365:             xmlMemFree(ret);
  366:             return (NULL);
  367:         }
  368:     }
  369:     return (ret);
  370: }
  371: static void *
  372: myReallocFunc(void *mem, size_t size)
  373: {
  374:     void *ret;
  375: 
  376:     ret = xmlMemRealloc(mem, size);
  377:     if (ret != NULL) {
  378:         if (xmlMemUsed() > maxmem) {
  379:             OOM();
  380:             xmlMemFree(ret);
  381:             return (NULL);
  382:         }
  383:     }
  384:     return (ret);
  385: }
  386: static char *
  387: myStrdupFunc(const char *str)
  388: {
  389:     char *ret;
  390: 
  391:     ret = xmlMemoryStrdup(str);
  392:     if (ret != NULL) {
  393:         if (xmlMemUsed() > maxmem) {
  394:             OOM();
  395:             xmlFree(ret);
  396:             return (NULL);
  397:         }
  398:     }
  399:     return (ret);
  400: }
  401: /************************************************************************
  402:  *									*
  403:  * Internal timing routines to remove the necessity to have		*
  404:  * unix-specific function calls.					*
  405:  *									*
  406:  ************************************************************************/
  407: 
  408: #ifndef HAVE_GETTIMEOFDAY
  409: #ifdef HAVE_SYS_TIMEB_H
  410: #ifdef HAVE_SYS_TIME_H
  411: #ifdef HAVE_FTIME
  412: 
  413: static int
  414: my_gettimeofday(struct timeval *tvp, void *tzp)
  415: {
  416: 	struct timeb timebuffer;
  417: 
  418: 	ftime(&timebuffer);
  419: 	if (tvp) {
  420: 		tvp->tv_sec = timebuffer.time;
  421: 		tvp->tv_usec = timebuffer.millitm * 1000L;
  422: 	}
  423: 	return (0);
  424: }
  425: #define HAVE_GETTIMEOFDAY 1
  426: #define gettimeofday my_gettimeofday
  427: 
  428: #endif /* HAVE_FTIME */
  429: #endif /* HAVE_SYS_TIME_H */
  430: #endif /* HAVE_SYS_TIMEB_H */
  431: #endif /* !HAVE_GETTIMEOFDAY */
  432: 
  433: #if defined(HAVE_GETTIMEOFDAY)
  434: static struct timeval begin, end;
  435: 
  436: /*
  437:  * startTimer: call where you want to start timing
  438:  */
  439: static void
  440: startTimer(void)
  441: {
  442:     gettimeofday(&begin, NULL);
  443: }
  444: 
  445: /*
  446:  * endTimer: call where you want to stop timing and to print out a
  447:  *           message about the timing performed; format is a printf
  448:  *           type argument
  449:  */
  450: static void XMLCDECL
  451: endTimer(const char *fmt, ...)
  452: {
  453:     long msec;
  454:     va_list ap;
  455: 
  456:     gettimeofday(&end, NULL);
  457:     msec = end.tv_sec - begin.tv_sec;
  458:     msec *= 1000;
  459:     msec += (end.tv_usec - begin.tv_usec) / 1000;
  460: 
  461: #ifndef HAVE_STDARG_H
  462: #error "endTimer required stdarg functions"
  463: #endif
  464:     va_start(ap, fmt);
  465:     vfprintf(stderr, fmt, ap);
  466:     va_end(ap);
  467: 
  468:     fprintf(stderr, " took %ld ms\n", msec);
  469: }
  470: #elif defined(HAVE_TIME_H)
  471: /*
  472:  * No gettimeofday function, so we have to make do with calling clock.
  473:  * This is obviously less accurate, but there's little we can do about
  474:  * that.
  475:  */
  476: #ifndef CLOCKS_PER_SEC
  477: #define CLOCKS_PER_SEC 100
  478: #endif
  479: 
  480: static clock_t begin, end;
  481: static void
  482: startTimer(void)
  483: {
  484:     begin = clock();
  485: }
  486: static void XMLCDECL
  487: endTimer(const char *fmt, ...)
  488: {
  489:     long msec;
  490:     va_list ap;
  491: 
  492:     end = clock();
  493:     msec = ((end - begin) * 1000) / CLOCKS_PER_SEC;
  494: 
  495: #ifndef HAVE_STDARG_H
  496: #error "endTimer required stdarg functions"
  497: #endif
  498:     va_start(ap, fmt);
  499:     vfprintf(stderr, fmt, ap);
  500:     va_end(ap);
  501:     fprintf(stderr, " took %ld ms\n", msec);
  502: }
  503: #else
  504: 
  505: /*
  506:  * We don't have a gettimeofday or time.h, so we just don't do timing
  507:  */
  508: static void
  509: startTimer(void)
  510: {
  511:     /*
  512:      * Do nothing
  513:      */
  514: }
  515: static void XMLCDECL
  516: endTimer(char *format, ...)
  517: {
  518:     /*
  519:      * We cannot do anything because we don't have a timing function
  520:      */
  521: #ifdef HAVE_STDARG_H
  522:     va_start(ap, format);
  523:     vfprintf(stderr, format, ap);
  524:     va_end(ap);
  525:     fprintf(stderr, " was not timed\n", msec);
  526: #else
  527:     /* We don't have gettimeofday, time or stdarg.h, what crazy world is
  528:      * this ?!
  529:      */
  530: #endif
  531: }
  532: #endif
  533: /************************************************************************
  534:  *									*
  535:  *			HTML ouput					*
  536:  *									*
  537:  ************************************************************************/
  538: static char buffer[50000];
  539: 
  540: static void
  541: xmlHTMLEncodeSend(void) {
  542:     char *result;
  543: 
  544:     result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer);
  545:     if (result) {
  546: 	xmlGenericError(xmlGenericErrorContext, "%s", result);
  547: 	xmlFree(result);
  548:     }
  549:     buffer[0] = 0;
  550: }
  551: 
  552: /**
  553:  * xmlHTMLPrintFileInfo:
  554:  * @input:  an xmlParserInputPtr input
  555:  *
  556:  * Displays the associated file and line informations for the current input
  557:  */
  558: 
  559: static void
  560: xmlHTMLPrintFileInfo(xmlParserInputPtr input) {
  561:     int len;
  562:     xmlGenericError(xmlGenericErrorContext, "<p>");
  563: 
  564:     len = strlen(buffer);
  565:     if (input != NULL) {
  566: 	if (input->filename) {
  567: 	    snprintf(&buffer[len], sizeof(buffer) - len, "%s:%d: ", input->filename,
  568: 		    input->line);
  569: 	} else {
  570: 	    snprintf(&buffer[len], sizeof(buffer) - len, "Entity: line %d: ", input->line);
  571: 	}
  572:     }
  573:     xmlHTMLEncodeSend();
  574: }
  575: 
  576: /**
  577:  * xmlHTMLPrintFileContext:
  578:  * @input:  an xmlParserInputPtr input
  579:  *
  580:  * Displays current context within the input content for error tracking
  581:  */
  582: 
  583: static void
  584: xmlHTMLPrintFileContext(xmlParserInputPtr input) {
  585:     const xmlChar *cur, *base;
  586:     int len;
  587:     int n;
  588: 
  589:     if (input == NULL) return;
  590:     xmlGenericError(xmlGenericErrorContext, "<pre>\n");
  591:     cur = input->cur;
  592:     base = input->base;
  593:     while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
  594: 	cur--;
  595:     }
  596:     n = 0;
  597:     while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
  598:         cur--;
  599:     if ((*cur == '\n') || (*cur == '\r')) cur++;
  600:     base = cur;
  601:     n = 0;
  602:     while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
  603: 	len = strlen(buffer);
  604:         snprintf(&buffer[len], sizeof(buffer) - len, "%c",
  605: 		    (unsigned char) *cur++);
  606: 	n++;
  607:     }
  608:     len = strlen(buffer);
  609:     snprintf(&buffer[len], sizeof(buffer) - len, "\n");
  610:     cur = input->cur;
  611:     while ((*cur == '\n') || (*cur == '\r'))
  612: 	cur--;
  613:     n = 0;
  614:     while ((cur != base) && (n++ < 80)) {
  615: 	len = strlen(buffer);
  616:         snprintf(&buffer[len], sizeof(buffer) - len, " ");
  617:         base++;
  618:     }
  619:     len = strlen(buffer);
  620:     snprintf(&buffer[len], sizeof(buffer) - len, "^\n");
  621:     xmlHTMLEncodeSend();
  622:     xmlGenericError(xmlGenericErrorContext, "</pre>");
  623: }
  624: 
  625: /**
  626:  * xmlHTMLError:
  627:  * @ctx:  an XML parser context
  628:  * @msg:  the message to display/transmit
  629:  * @...:  extra parameters for the message display
  630:  *
  631:  * Display and format an error messages, gives file, line, position and
  632:  * extra parameters.
  633:  */
  634: static void XMLCDECL
  635: xmlHTMLError(void *ctx, const char *msg, ...)
  636: {
  637:     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
  638:     xmlParserInputPtr input;
  639:     va_list args;
  640:     int len;
  641: 
  642:     buffer[0] = 0;
  643:     input = ctxt->input;
  644:     if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
  645:         input = ctxt->inputTab[ctxt->inputNr - 2];
  646:     }
  647: 
  648:     xmlHTMLPrintFileInfo(input);
  649: 
  650:     xmlGenericError(xmlGenericErrorContext, "<b>error</b>: ");
  651:     va_start(args, msg);
  652:     len = strlen(buffer);
  653:     vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
  654:     va_end(args);
  655:     xmlHTMLEncodeSend();
  656:     xmlGenericError(xmlGenericErrorContext, "</p>\n");
  657: 
  658:     xmlHTMLPrintFileContext(input);
  659:     xmlHTMLEncodeSend();
  660: }
  661: 
  662: /**
  663:  * xmlHTMLWarning:
  664:  * @ctx:  an XML parser context
  665:  * @msg:  the message to display/transmit
  666:  * @...:  extra parameters for the message display
  667:  *
  668:  * Display and format a warning messages, gives file, line, position and
  669:  * extra parameters.
  670:  */
  671: static void XMLCDECL
  672: xmlHTMLWarning(void *ctx, const char *msg, ...)
  673: {
  674:     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
  675:     xmlParserInputPtr input;
  676:     va_list args;
  677:     int len;
  678: 
  679:     buffer[0] = 0;
  680:     input = ctxt->input;
  681:     if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
  682:         input = ctxt->inputTab[ctxt->inputNr - 2];
  683:     }
  684: 
  685: 
  686:     xmlHTMLPrintFileInfo(input);
  687: 
  688:     xmlGenericError(xmlGenericErrorContext, "<b>warning</b>: ");
  689:     va_start(args, msg);
  690:     len = strlen(buffer);
  691:     vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
  692:     va_end(args);
  693:     xmlHTMLEncodeSend();
  694:     xmlGenericError(xmlGenericErrorContext, "</p>\n");
  695: 
  696:     xmlHTMLPrintFileContext(input);
  697:     xmlHTMLEncodeSend();
  698: }
  699: 
  700: /**
  701:  * xmlHTMLValidityError:
  702:  * @ctx:  an XML parser context
  703:  * @msg:  the message to display/transmit
  704:  * @...:  extra parameters for the message display
  705:  *
  706:  * Display and format an validity error messages, gives file,
  707:  * line, position and extra parameters.
  708:  */
  709: static void XMLCDECL
  710: xmlHTMLValidityError(void *ctx, const char *msg, ...)
  711: {
  712:     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
  713:     xmlParserInputPtr input;
  714:     va_list args;
  715:     int len;
  716: 
  717:     buffer[0] = 0;
  718:     input = ctxt->input;
  719:     if ((input->filename == NULL) && (ctxt->inputNr > 1))
  720:         input = ctxt->inputTab[ctxt->inputNr - 2];
  721: 
  722:     xmlHTMLPrintFileInfo(input);
  723: 
  724:     xmlGenericError(xmlGenericErrorContext, "<b>validity error</b>: ");
  725:     len = strlen(buffer);
  726:     va_start(args, msg);
  727:     vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
  728:     va_end(args);
  729:     xmlHTMLEncodeSend();
  730:     xmlGenericError(xmlGenericErrorContext, "</p>\n");
  731: 
  732:     xmlHTMLPrintFileContext(input);
  733:     xmlHTMLEncodeSend();
  734:     progresult = XMLLINT_ERR_VALID;
  735: }
  736: 
  737: /**
  738:  * xmlHTMLValidityWarning:
  739:  * @ctx:  an XML parser context
  740:  * @msg:  the message to display/transmit
  741:  * @...:  extra parameters for the message display
  742:  *
  743:  * Display and format a validity warning messages, gives file, line,
  744:  * position and extra parameters.
  745:  */
  746: static void XMLCDECL
  747: xmlHTMLValidityWarning(void *ctx, const char *msg, ...)
  748: {
  749:     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
  750:     xmlParserInputPtr input;
  751:     va_list args;
  752:     int len;
  753: 
  754:     buffer[0] = 0;
  755:     input = ctxt->input;
  756:     if ((input->filename == NULL) && (ctxt->inputNr > 1))
  757:         input = ctxt->inputTab[ctxt->inputNr - 2];
  758: 
  759:     xmlHTMLPrintFileInfo(input);
  760: 
  761:     xmlGenericError(xmlGenericErrorContext, "<b>validity warning</b>: ");
  762:     va_start(args, msg);
  763:     len = strlen(buffer);
  764:     vsnprintf(&buffer[len],  sizeof(buffer) - len, msg, args);
  765:     va_end(args);
  766:     xmlHTMLEncodeSend();
  767:     xmlGenericError(xmlGenericErrorContext, "</p>\n");
  768: 
  769:     xmlHTMLPrintFileContext(input);
  770:     xmlHTMLEncodeSend();
  771: }
  772: 
  773: /************************************************************************
  774:  *									*
  775:  *			Shell Interface					*
  776:  *									*
  777:  ************************************************************************/
  778: #ifdef LIBXML_DEBUG_ENABLED
  779: #ifdef LIBXML_XPATH_ENABLED
  780: /**
  781:  * xmlShellReadline:
  782:  * @prompt:  the prompt value
  783:  *
  784:  * Read a string
  785:  *
  786:  * Returns a pointer to it or NULL on EOF the caller is expected to
  787:  *     free the returned string.
  788:  */
  789: static char *
  790: xmlShellReadline(char *prompt) {
  791: #ifdef HAVE_LIBREADLINE
  792:     char *line_read;
  793: 
  794:     /* Get a line from the user. */
  795:     line_read = readline (prompt);
  796: 
  797:     /* If the line has any text in it, save it on the history. */
  798:     if (line_read && *line_read)
  799: 	add_history (line_read);
  800: 
  801:     return (line_read);
  802: #else
  803:     char line_read[501];
  804:     char *ret;
  805:     int len;
  806: 
  807:     if (prompt != NULL)
  808: 	fprintf(stdout, "%s", prompt);
  809:     if (!fgets(line_read, 500, stdin))
  810:         return(NULL);
  811:     line_read[500] = 0;
  812:     len = strlen(line_read);
  813:     ret = (char *) malloc(len + 1);
  814:     if (ret != NULL) {
  815: 	memcpy (ret, line_read, len + 1);
  816:     }
  817:     return(ret);
  818: #endif
  819: }
  820: #endif /* LIBXML_XPATH_ENABLED */
  821: #endif /* LIBXML_DEBUG_ENABLED */
  822: 
  823: /************************************************************************
  824:  *									*
  825:  *			I/O Interfaces					*
  826:  *									*
  827:  ************************************************************************/
  828: 
  829: static int myRead(FILE *f, char * buf, int len) {
  830:     return(fread(buf, 1, len, f));
  831: }
  832: static void myClose(FILE *f) {
  833:   if (f != stdin) {
  834:     fclose(f);
  835:   }
  836: }
  837: 
  838: /************************************************************************
  839:  *									*
  840:  *			SAX based tests					*
  841:  *									*
  842:  ************************************************************************/
  843: 
  844: /*
  845:  * empty SAX block
  846:  */
  847: static xmlSAXHandler emptySAXHandlerStruct = {
  848:     NULL, /* internalSubset */
  849:     NULL, /* isStandalone */
  850:     NULL, /* hasInternalSubset */
  851:     NULL, /* hasExternalSubset */
  852:     NULL, /* resolveEntity */
  853:     NULL, /* getEntity */
  854:     NULL, /* entityDecl */
  855:     NULL, /* notationDecl */
  856:     NULL, /* attributeDecl */
  857:     NULL, /* elementDecl */
  858:     NULL, /* unparsedEntityDecl */
  859:     NULL, /* setDocumentLocator */
  860:     NULL, /* startDocument */
  861:     NULL, /* endDocument */
  862:     NULL, /* startElement */
  863:     NULL, /* endElement */
  864:     NULL, /* reference */
  865:     NULL, /* characters */
  866:     NULL, /* ignorableWhitespace */
  867:     NULL, /* processingInstruction */
  868:     NULL, /* comment */
  869:     NULL, /* xmlParserWarning */
  870:     NULL, /* xmlParserError */
  871:     NULL, /* xmlParserError */
  872:     NULL, /* getParameterEntity */
  873:     NULL, /* cdataBlock; */
  874:     NULL, /* externalSubset; */
  875:     XML_SAX2_MAGIC,
  876:     NULL,
  877:     NULL, /* startElementNs */
  878:     NULL, /* endElementNs */
  879:     NULL  /* xmlStructuredErrorFunc */
  880: };
  881: 
  882: static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
  883: extern xmlSAXHandlerPtr debugSAXHandler;
  884: static int callbacks;
  885: 
  886: /**
  887:  * isStandaloneDebug:
  888:  * @ctxt:  An XML parser context
  889:  *
  890:  * Is this document tagged standalone ?
  891:  *
  892:  * Returns 1 if true
  893:  */
  894: static int
  895: isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
  896: {
  897:     callbacks++;
  898:     if (noout)
  899: 	return(0);
  900:     fprintf(stdout, "SAX.isStandalone()\n");
  901:     return(0);
  902: }
  903: 
  904: /**
  905:  * hasInternalSubsetDebug:
  906:  * @ctxt:  An XML parser context
  907:  *
  908:  * Does this document has an internal subset
  909:  *
  910:  * Returns 1 if true
  911:  */
  912: static int
  913: hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
  914: {
  915:     callbacks++;
  916:     if (noout)
  917: 	return(0);
  918:     fprintf(stdout, "SAX.hasInternalSubset()\n");
  919:     return(0);
  920: }
  921: 
  922: /**
  923:  * hasExternalSubsetDebug:
  924:  * @ctxt:  An XML parser context
  925:  *
  926:  * Does this document has an external subset
  927:  *
  928:  * Returns 1 if true
  929:  */
  930: static int
  931: hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
  932: {
  933:     callbacks++;
  934:     if (noout)
  935: 	return(0);
  936:     fprintf(stdout, "SAX.hasExternalSubset()\n");
  937:     return(0);
  938: }
  939: 
  940: /**
  941:  * internalSubsetDebug:
  942:  * @ctxt:  An XML parser context
  943:  *
  944:  * Does this document has an internal subset
  945:  */
  946: static void
  947: internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
  948: 	       const xmlChar *ExternalID, const xmlChar *SystemID)
  949: {
  950:     callbacks++;
  951:     if (noout)
  952: 	return;
  953:     fprintf(stdout, "SAX.internalSubset(%s,", name);
  954:     if (ExternalID == NULL)
  955: 	fprintf(stdout, " ,");
  956:     else
  957: 	fprintf(stdout, " %s,", ExternalID);
  958:     if (SystemID == NULL)
  959: 	fprintf(stdout, " )\n");
  960:     else
  961: 	fprintf(stdout, " %s)\n", SystemID);
  962: }
  963: 
  964: /**
  965:  * externalSubsetDebug:
  966:  * @ctxt:  An XML parser context
  967:  *
  968:  * Does this document has an external subset
  969:  */
  970: static void
  971: externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
  972: 	       const xmlChar *ExternalID, const xmlChar *SystemID)
  973: {
  974:     callbacks++;
  975:     if (noout)
  976: 	return;
  977:     fprintf(stdout, "SAX.externalSubset(%s,", name);
  978:     if (ExternalID == NULL)
  979: 	fprintf(stdout, " ,");
  980:     else
  981: 	fprintf(stdout, " %s,", ExternalID);
  982:     if (SystemID == NULL)
  983: 	fprintf(stdout, " )\n");
  984:     else
  985: 	fprintf(stdout, " %s)\n", SystemID);
  986: }
  987: 
  988: /**
  989:  * resolveEntityDebug:
  990:  * @ctxt:  An XML parser context
  991:  * @publicId: The public ID of the entity
  992:  * @systemId: The system ID of the entity
  993:  *
  994:  * Special entity resolver, better left to the parser, it has
  995:  * more context than the application layer.
  996:  * The default behaviour is to NOT resolve the entities, in that case
  997:  * the ENTITY_REF nodes are built in the structure (and the parameter
  998:  * values).
  999:  *
 1000:  * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
 1001:  */
 1002: static xmlParserInputPtr
 1003: resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
 1004: {
 1005:     callbacks++;
 1006:     if (noout)
 1007: 	return(NULL);
 1008:     /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
 1009: 
 1010: 
 1011:     fprintf(stdout, "SAX.resolveEntity(");
 1012:     if (publicId != NULL)
 1013: 	fprintf(stdout, "%s", (char *)publicId);
 1014:     else
 1015: 	fprintf(stdout, " ");
 1016:     if (systemId != NULL)
 1017: 	fprintf(stdout, ", %s)\n", (char *)systemId);
 1018:     else
 1019: 	fprintf(stdout, ", )\n");
 1020:     return(NULL);
 1021: }
 1022: 
 1023: /**
 1024:  * getEntityDebug:
 1025:  * @ctxt:  An XML parser context
 1026:  * @name: The entity name
 1027:  *
 1028:  * Get an entity by name
 1029:  *
 1030:  * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
 1031:  */
 1032: static xmlEntityPtr
 1033: getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
 1034: {
 1035:     callbacks++;
 1036:     if (noout)
 1037: 	return(NULL);
 1038:     fprintf(stdout, "SAX.getEntity(%s)\n", name);
 1039:     return(NULL);
 1040: }
 1041: 
 1042: /**
 1043:  * getParameterEntityDebug:
 1044:  * @ctxt:  An XML parser context
 1045:  * @name: The entity name
 1046:  *
 1047:  * Get a parameter entity by name
 1048:  *
 1049:  * Returns the xmlParserInputPtr
 1050:  */
 1051: static xmlEntityPtr
 1052: getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
 1053: {
 1054:     callbacks++;
 1055:     if (noout)
 1056: 	return(NULL);
 1057:     fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
 1058:     return(NULL);
 1059: }
 1060: 
 1061: 
 1062: /**
 1063:  * entityDeclDebug:
 1064:  * @ctxt:  An XML parser context
 1065:  * @name:  the entity name
 1066:  * @type:  the entity type
 1067:  * @publicId: The public ID of the entity
 1068:  * @systemId: The system ID of the entity
 1069:  * @content: the entity value (without processing).
 1070:  *
 1071:  * An entity definition has been parsed
 1072:  */
 1073: static void
 1074: entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
 1075:           const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
 1076: {
 1077: const xmlChar *nullstr = BAD_CAST "(null)";
 1078:     /* not all libraries handle printing null pointers nicely */
 1079:     if (publicId == NULL)
 1080:         publicId = nullstr;
 1081:     if (systemId == NULL)
 1082:         systemId = nullstr;
 1083:     if (content == NULL)
 1084:         content = (xmlChar *)nullstr;
 1085:     callbacks++;
 1086:     if (noout)
 1087: 	return;
 1088:     fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
 1089:             name, type, publicId, systemId, content);
 1090: }
 1091: 
 1092: /**
 1093:  * attributeDeclDebug:
 1094:  * @ctxt:  An XML parser context
 1095:  * @name:  the attribute name
 1096:  * @type:  the attribute type
 1097:  *
 1098:  * An attribute definition has been parsed
 1099:  */
 1100: static void
 1101: attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
 1102:                    const xmlChar * name, int type, int def,
 1103:                    const xmlChar * defaultValue, xmlEnumerationPtr tree)
 1104: {
 1105:     callbacks++;
 1106:     if (noout)
 1107:         return;
 1108:     if (defaultValue == NULL)
 1109:         fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
 1110:                 elem, name, type, def);
 1111:     else
 1112:         fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
 1113:                 elem, name, type, def, defaultValue);
 1114:     xmlFreeEnumeration(tree);
 1115: }
 1116: 
 1117: /**
 1118:  * elementDeclDebug:
 1119:  * @ctxt:  An XML parser context
 1120:  * @name:  the element name
 1121:  * @type:  the element type
 1122:  * @content: the element value (without processing).
 1123:  *
 1124:  * An element definition has been parsed
 1125:  */
 1126: static void
 1127: elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
 1128: 	    xmlElementContentPtr content ATTRIBUTE_UNUSED)
 1129: {
 1130:     callbacks++;
 1131:     if (noout)
 1132: 	return;
 1133:     fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
 1134:             name, type);
 1135: }
 1136: 
 1137: /**
 1138:  * notationDeclDebug:
 1139:  * @ctxt:  An XML parser context
 1140:  * @name: The name of the notation
 1141:  * @publicId: The public ID of the entity
 1142:  * @systemId: The system ID of the entity
 1143:  *
 1144:  * What to do when a notation declaration has been parsed.
 1145:  */
 1146: static void
 1147: notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
 1148: 	     const xmlChar *publicId, const xmlChar *systemId)
 1149: {
 1150:     callbacks++;
 1151:     if (noout)
 1152: 	return;
 1153:     fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
 1154:             (char *) name, (char *) publicId, (char *) systemId);
 1155: }
 1156: 
 1157: /**
 1158:  * unparsedEntityDeclDebug:
 1159:  * @ctxt:  An XML parser context
 1160:  * @name: The name of the entity
 1161:  * @publicId: The public ID of the entity
 1162:  * @systemId: The system ID of the entity
 1163:  * @notationName: the name of the notation
 1164:  *
 1165:  * What to do when an unparsed entity declaration is parsed
 1166:  */
 1167: static void
 1168: unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
 1169: 		   const xmlChar *publicId, const xmlChar *systemId,
 1170: 		   const xmlChar *notationName)
 1171: {
 1172: const xmlChar *nullstr = BAD_CAST "(null)";
 1173: 
 1174:     if (publicId == NULL)
 1175:         publicId = nullstr;
 1176:     if (systemId == NULL)
 1177:         systemId = nullstr;
 1178:     if (notationName == NULL)
 1179:         notationName = nullstr;
 1180:     callbacks++;
 1181:     if (noout)
 1182: 	return;
 1183:     fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
 1184:             (char *) name, (char *) publicId, (char *) systemId,
 1185: 	    (char *) notationName);
 1186: }
 1187: 
 1188: /**
 1189:  * setDocumentLocatorDebug:
 1190:  * @ctxt:  An XML parser context
 1191:  * @loc: A SAX Locator
 1192:  *
 1193:  * Receive the document locator at startup, actually xmlDefaultSAXLocator
 1194:  * Everything is available on the context, so this is useless in our case.
 1195:  */
 1196: static void
 1197: setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
 1198: {
 1199:     callbacks++;
 1200:     if (noout)
 1201: 	return;
 1202:     fprintf(stdout, "SAX.setDocumentLocator()\n");
 1203: }
 1204: 
 1205: /**
 1206:  * startDocumentDebug:
 1207:  * @ctxt:  An XML parser context
 1208:  *
 1209:  * called when the document start being processed.
 1210:  */
 1211: static void
 1212: startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
 1213: {
 1214:     callbacks++;
 1215:     if (noout)
 1216: 	return;
 1217:     fprintf(stdout, "SAX.startDocument()\n");
 1218: }
 1219: 
 1220: /**
 1221:  * endDocumentDebug:
 1222:  * @ctxt:  An XML parser context
 1223:  *
 1224:  * called when the document end has been detected.
 1225:  */
 1226: static void
 1227: endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
 1228: {
 1229:     callbacks++;
 1230:     if (noout)
 1231: 	return;
 1232:     fprintf(stdout, "SAX.endDocument()\n");
 1233: }
 1234: 
 1235: /**
 1236:  * startElementDebug:
 1237:  * @ctxt:  An XML parser context
 1238:  * @name:  The element name
 1239:  *
 1240:  * called when an opening tag has been processed.
 1241:  */
 1242: static void
 1243: startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
 1244: {
 1245:     int i;
 1246: 
 1247:     callbacks++;
 1248:     if (noout)
 1249: 	return;
 1250:     fprintf(stdout, "SAX.startElement(%s", (char *) name);
 1251:     if (atts != NULL) {
 1252:         for (i = 0;(atts[i] != NULL);i++) {
 1253: 	    fprintf(stdout, ", %s='", atts[i++]);
 1254: 	    if (atts[i] != NULL)
 1255: 	        fprintf(stdout, "%s'", atts[i]);
 1256: 	}
 1257:     }
 1258:     fprintf(stdout, ")\n");
 1259: }
 1260: 
 1261: /**
 1262:  * endElementDebug:
 1263:  * @ctxt:  An XML parser context
 1264:  * @name:  The element name
 1265:  *
 1266:  * called when the end of an element has been detected.
 1267:  */
 1268: static void
 1269: endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
 1270: {
 1271:     callbacks++;
 1272:     if (noout)
 1273: 	return;
 1274:     fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
 1275: }
 1276: 
 1277: /**
 1278:  * charactersDebug:
 1279:  * @ctxt:  An XML parser context
 1280:  * @ch:  a xmlChar string
 1281:  * @len: the number of xmlChar
 1282:  *
 1283:  * receiving some chars from the parser.
 1284:  * Question: how much at a time ???
 1285:  */
 1286: static void
 1287: charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
 1288: {
 1289:     char out[40];
 1290:     int i;
 1291: 
 1292:     callbacks++;
 1293:     if (noout)
 1294: 	return;
 1295:     for (i = 0;(i<len) && (i < 30);i++)
 1296: 	out[i] = ch[i];
 1297:     out[i] = 0;
 1298: 
 1299:     fprintf(stdout, "SAX.characters(%s, %d)\n", out, len);
 1300: }
 1301: 
 1302: /**
 1303:  * referenceDebug:
 1304:  * @ctxt:  An XML parser context
 1305:  * @name:  The entity name
 1306:  *
 1307:  * called when an entity reference is detected.
 1308:  */
 1309: static void
 1310: referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
 1311: {
 1312:     callbacks++;
 1313:     if (noout)
 1314: 	return;
 1315:     fprintf(stdout, "SAX.reference(%s)\n", name);
 1316: }
 1317: 
 1318: /**
 1319:  * ignorableWhitespaceDebug:
 1320:  * @ctxt:  An XML parser context
 1321:  * @ch:  a xmlChar string
 1322:  * @start: the first char in the string
 1323:  * @len: the number of xmlChar
 1324:  *
 1325:  * receiving some ignorable whitespaces from the parser.
 1326:  * Question: how much at a time ???
 1327:  */
 1328: static void
 1329: ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
 1330: {
 1331:     char out[40];
 1332:     int i;
 1333: 
 1334:     callbacks++;
 1335:     if (noout)
 1336: 	return;
 1337:     for (i = 0;(i<len) && (i < 30);i++)
 1338: 	out[i] = ch[i];
 1339:     out[i] = 0;
 1340:     fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", out, len);
 1341: }
 1342: 
 1343: /**
 1344:  * processingInstructionDebug:
 1345:  * @ctxt:  An XML parser context
 1346:  * @target:  the target name
 1347:  * @data: the PI data's
 1348:  * @len: the number of xmlChar
 1349:  *
 1350:  * A processing instruction has been parsed.
 1351:  */
 1352: static void
 1353: processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
 1354:                       const xmlChar *data)
 1355: {
 1356:     callbacks++;
 1357:     if (noout)
 1358: 	return;
 1359:     if (data != NULL)
 1360: 	fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
 1361: 		(char *) target, (char *) data);
 1362:     else
 1363: 	fprintf(stdout, "SAX.processingInstruction(%s, NULL)\n",
 1364: 		(char *) target);
 1365: }
 1366: 
 1367: /**
 1368:  * cdataBlockDebug:
 1369:  * @ctx: the user data (XML parser context)
 1370:  * @value:  The pcdata content
 1371:  * @len:  the block length
 1372:  *
 1373:  * called when a pcdata block has been parsed
 1374:  */
 1375: static void
 1376: cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len)
 1377: {
 1378:     callbacks++;
 1379:     if (noout)
 1380: 	return;
 1381:     fprintf(stdout, "SAX.pcdata(%.20s, %d)\n",
 1382: 	    (char *) value, len);
 1383: }
 1384: 
 1385: /**
 1386:  * commentDebug:
 1387:  * @ctxt:  An XML parser context
 1388:  * @value:  the comment content
 1389:  *
 1390:  * A comment has been parsed.
 1391:  */
 1392: static void
 1393: commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
 1394: {
 1395:     callbacks++;
 1396:     if (noout)
 1397: 	return;
 1398:     fprintf(stdout, "SAX.comment(%s)\n", value);
 1399: }
 1400: 
 1401: /**
 1402:  * warningDebug:
 1403:  * @ctxt:  An XML parser context
 1404:  * @msg:  the message to display/transmit
 1405:  * @...:  extra parameters for the message display
 1406:  *
 1407:  * Display and format a warning messages, gives file, line, position and
 1408:  * extra parameters.
 1409:  */
 1410: static void XMLCDECL
 1411: warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
 1412: {
 1413:     va_list args;
 1414: 
 1415:     callbacks++;
 1416:     if (noout)
 1417: 	return;
 1418:     va_start(args, msg);
 1419:     fprintf(stdout, "SAX.warning: ");
 1420:     vfprintf(stdout, msg, args);
 1421:     va_end(args);
 1422: }
 1423: 
 1424: /**
 1425:  * errorDebug:
 1426:  * @ctxt:  An XML parser context
 1427:  * @msg:  the message to display/transmit
 1428:  * @...:  extra parameters for the message display
 1429:  *
 1430:  * Display and format a error messages, gives file, line, position and
 1431:  * extra parameters.
 1432:  */
 1433: static void XMLCDECL
 1434: errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
 1435: {
 1436:     va_list args;
 1437: 
 1438:     callbacks++;
 1439:     if (noout)
 1440: 	return;
 1441:     va_start(args, msg);
 1442:     fprintf(stdout, "SAX.error: ");
 1443:     vfprintf(stdout, msg, args);
 1444:     va_end(args);
 1445: }
 1446: 
 1447: /**
 1448:  * fatalErrorDebug:
 1449:  * @ctxt:  An XML parser context
 1450:  * @msg:  the message to display/transmit
 1451:  * @...:  extra parameters for the message display
 1452:  *
 1453:  * Display and format a fatalError messages, gives file, line, position and
 1454:  * extra parameters.
 1455:  */
 1456: static void XMLCDECL
 1457: fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
 1458: {
 1459:     va_list args;
 1460: 
 1461:     callbacks++;
 1462:     if (noout)
 1463: 	return;
 1464:     va_start(args, msg);
 1465:     fprintf(stdout, "SAX.fatalError: ");
 1466:     vfprintf(stdout, msg, args);
 1467:     va_end(args);
 1468: }
 1469: 
 1470: static xmlSAXHandler debugSAXHandlerStruct = {
 1471:     internalSubsetDebug,
 1472:     isStandaloneDebug,
 1473:     hasInternalSubsetDebug,
 1474:     hasExternalSubsetDebug,
 1475:     resolveEntityDebug,
 1476:     getEntityDebug,
 1477:     entityDeclDebug,
 1478:     notationDeclDebug,
 1479:     attributeDeclDebug,
 1480:     elementDeclDebug,
 1481:     unparsedEntityDeclDebug,
 1482:     setDocumentLocatorDebug,
 1483:     startDocumentDebug,
 1484:     endDocumentDebug,
 1485:     startElementDebug,
 1486:     endElementDebug,
 1487:     referenceDebug,
 1488:     charactersDebug,
 1489:     ignorableWhitespaceDebug,
 1490:     processingInstructionDebug,
 1491:     commentDebug,
 1492:     warningDebug,
 1493:     errorDebug,
 1494:     fatalErrorDebug,
 1495:     getParameterEntityDebug,
 1496:     cdataBlockDebug,
 1497:     externalSubsetDebug,
 1498:     1,
 1499:     NULL,
 1500:     NULL,
 1501:     NULL,
 1502:     NULL
 1503: };
 1504: 
 1505: xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
 1506: 
 1507: /*
 1508:  * SAX2 specific callbacks
 1509:  */
 1510: /**
 1511:  * startElementNsDebug:
 1512:  * @ctxt:  An XML parser context
 1513:  * @name:  The element name
 1514:  *
 1515:  * called when an opening tag has been processed.
 1516:  */
 1517: static void
 1518: startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
 1519:                     const xmlChar *localname,
 1520:                     const xmlChar *prefix,
 1521:                     const xmlChar *URI,
 1522: 		    int nb_namespaces,
 1523: 		    const xmlChar **namespaces,
 1524: 		    int nb_attributes,
 1525: 		    int nb_defaulted,
 1526: 		    const xmlChar **attributes)
 1527: {
 1528:     int i;
 1529: 
 1530:     callbacks++;
 1531:     if (noout)
 1532: 	return;
 1533:     fprintf(stdout, "SAX.startElementNs(%s", (char *) localname);
 1534:     if (prefix == NULL)
 1535: 	fprintf(stdout, ", NULL");
 1536:     else
 1537: 	fprintf(stdout, ", %s", (char *) prefix);
 1538:     if (URI == NULL)
 1539: 	fprintf(stdout, ", NULL");
 1540:     else
 1541: 	fprintf(stdout, ", '%s'", (char *) URI);
 1542:     fprintf(stdout, ", %d", nb_namespaces);
 1543: 
 1544:     if (namespaces != NULL) {
 1545:         for (i = 0;i < nb_namespaces * 2;i++) {
 1546: 	    fprintf(stdout, ", xmlns");
 1547: 	    if (namespaces[i] != NULL)
 1548: 	        fprintf(stdout, ":%s", namespaces[i]);
 1549: 	    i++;
 1550: 	    fprintf(stdout, "='%s'", namespaces[i]);
 1551: 	}
 1552:     }
 1553:     fprintf(stdout, ", %d, %d", nb_attributes, nb_defaulted);
 1554:     if (attributes != NULL) {
 1555:         for (i = 0;i < nb_attributes * 5;i += 5) {
 1556: 	    if (attributes[i + 1] != NULL)
 1557: 		fprintf(stdout, ", %s:%s='", attributes[i + 1], attributes[i]);
 1558: 	    else
 1559: 		fprintf(stdout, ", %s='", attributes[i]);
 1560: 	    fprintf(stdout, "%.4s...', %d", attributes[i + 3],
 1561: 		    (int)(attributes[i + 4] - attributes[i + 3]));
 1562: 	}
 1563:     }
 1564:     fprintf(stdout, ")\n");
 1565: }
 1566: 
 1567: /**
 1568:  * endElementDebug:
 1569:  * @ctxt:  An XML parser context
 1570:  * @name:  The element name
 1571:  *
 1572:  * called when the end of an element has been detected.
 1573:  */
 1574: static void
 1575: endElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
 1576:                   const xmlChar *localname,
 1577:                   const xmlChar *prefix,
 1578:                   const xmlChar *URI)
 1579: {
 1580:     callbacks++;
 1581:     if (noout)
 1582: 	return;
 1583:     fprintf(stdout, "SAX.endElementNs(%s", (char *) localname);
 1584:     if (prefix == NULL)
 1585: 	fprintf(stdout, ", NULL");
 1586:     else
 1587: 	fprintf(stdout, ", %s", (char *) prefix);
 1588:     if (URI == NULL)
 1589: 	fprintf(stdout, ", NULL)\n");
 1590:     else
 1591: 	fprintf(stdout, ", '%s')\n", (char *) URI);
 1592: }
 1593: 
 1594: static xmlSAXHandler debugSAX2HandlerStruct = {
 1595:     internalSubsetDebug,
 1596:     isStandaloneDebug,
 1597:     hasInternalSubsetDebug,
 1598:     hasExternalSubsetDebug,
 1599:     resolveEntityDebug,
 1600:     getEntityDebug,
 1601:     entityDeclDebug,
 1602:     notationDeclDebug,
 1603:     attributeDeclDebug,
 1604:     elementDeclDebug,
 1605:     unparsedEntityDeclDebug,
 1606:     setDocumentLocatorDebug,
 1607:     startDocumentDebug,
 1608:     endDocumentDebug,
 1609:     NULL,
 1610:     NULL,
 1611:     referenceDebug,
 1612:     charactersDebug,
 1613:     ignorableWhitespaceDebug,
 1614:     processingInstructionDebug,
 1615:     commentDebug,
 1616:     warningDebug,
 1617:     errorDebug,
 1618:     fatalErrorDebug,
 1619:     getParameterEntityDebug,
 1620:     cdataBlockDebug,
 1621:     externalSubsetDebug,
 1622:     XML_SAX2_MAGIC,
 1623:     NULL,
 1624:     startElementNsDebug,
 1625:     endElementNsDebug,
 1626:     NULL
 1627: };
 1628: 
 1629: static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct;
 1630: 
 1631: static void
 1632: testSAX(const char *filename) {
 1633:     xmlSAXHandlerPtr handler;
 1634:     const char *user_data = "user_data"; /* mostly for debugging */
 1635:     xmlParserInputBufferPtr buf = NULL;
 1636:     xmlParserInputPtr inputStream;
 1637:     xmlParserCtxtPtr ctxt = NULL;
 1638:     xmlSAXHandlerPtr old_sax = NULL;
 1639: 
 1640:     callbacks = 0;
 1641: 
 1642:     if (noout) {
 1643:         handler = emptySAXHandler;
 1644: #ifdef LIBXML_SAX1_ENABLED
 1645:     } else if (sax1) {
 1646:         handler = debugSAXHandler;
 1647: #endif
 1648:     } else {
 1649:         handler = debugSAX2Handler;
 1650:     }
 1651: 
 1652:     /*
 1653:      * it's not the simplest code but the most generic in term of I/O
 1654:      */
 1655:     buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);
 1656:     if (buf == NULL) {
 1657:         goto error;
 1658:     }
 1659: 
 1660: #ifdef LIBXML_SCHEMAS_ENABLED
 1661:     if (wxschemas != NULL) {
 1662:         int ret;
 1663: 	xmlSchemaValidCtxtPtr vctxt;
 1664: 
 1665: 	vctxt = xmlSchemaNewValidCtxt(wxschemas);
 1666: 	xmlSchemaSetValidErrors(vctxt,
 1667: 		(xmlSchemaValidityErrorFunc) fprintf,
 1668: 		(xmlSchemaValidityWarningFunc) fprintf,
 1669: 		stderr);
 1670: 
 1671: 	ret = xmlSchemaValidateStream(vctxt, buf, 0, handler,
 1672: 	                              (void *)user_data);
 1673: 	if (repeat == 0) {
 1674: 	    if (ret == 0) {
 1675: 		fprintf(stderr, "%s validates\n", filename);
 1676: 	    } else if (ret > 0) {
 1677: 		fprintf(stderr, "%s fails to validate\n", filename);
 1678: 		progresult = XMLLINT_ERR_VALID;
 1679: 	    } else {
 1680: 		fprintf(stderr, "%s validation generated an internal error\n",
 1681: 		       filename);
 1682: 		progresult = XMLLINT_ERR_VALID;
 1683: 	    }
 1684: 	}
 1685: 	xmlSchemaFreeValidCtxt(vctxt);
 1686:     } else
 1687: #endif
 1688:     {
 1689: 	/*
 1690: 	 * Create the parser context amd hook the input
 1691: 	 */
 1692: 	ctxt = xmlNewParserCtxt();
 1693: 	if (ctxt == NULL) {
 1694: 	    xmlFreeParserInputBuffer(buf);
 1695: 	    goto error;
 1696: 	}
 1697: 	old_sax = ctxt->sax;
 1698: 	ctxt->sax = handler;
 1699: 	ctxt->userData = (void *) user_data;
 1700: 	inputStream = xmlNewIOInputStream(ctxt, buf, XML_CHAR_ENCODING_NONE);
 1701: 	if (inputStream == NULL) {
 1702: 	    xmlFreeParserInputBuffer(buf);
 1703: 	    goto error;
 1704: 	}
 1705: 	inputPush(ctxt, inputStream);
 1706: 
 1707: 	/* do the parsing */
 1708: 	xmlParseDocument(ctxt);
 1709: 
 1710: 	if (ctxt->myDoc != NULL) {
 1711: 	    fprintf(stderr, "SAX generated a doc !\n");
 1712: 	    xmlFreeDoc(ctxt->myDoc);
 1713: 	    ctxt->myDoc = NULL;
 1714: 	}
 1715:     }
 1716: 
 1717: error:
 1718:     if (ctxt != NULL) {
 1719:         ctxt->sax = old_sax;
 1720:         xmlFreeParserCtxt(ctxt);
 1721:     }
 1722: }
 1723: 
 1724: /************************************************************************
 1725:  *									*
 1726:  *			Stream Test processing				*
 1727:  *									*
 1728:  ************************************************************************/
 1729: #ifdef LIBXML_READER_ENABLED
 1730: static void processNode(xmlTextReaderPtr reader) {
 1731:     const xmlChar *name, *value;
 1732:     int type, empty;
 1733: 
 1734:     type = xmlTextReaderNodeType(reader);
 1735:     empty = xmlTextReaderIsEmptyElement(reader);
 1736: 
 1737:     if (debug) {
 1738: 	name = xmlTextReaderConstName(reader);
 1739: 	if (name == NULL)
 1740: 	    name = BAD_CAST "--";
 1741: 
 1742: 	value = xmlTextReaderConstValue(reader);
 1743: 
 1744: 
 1745: 	printf("%d %d %s %d %d",
 1746: 		xmlTextReaderDepth(reader),
 1747: 		type,
 1748: 		name,
 1749: 		empty,
 1750: 		xmlTextReaderHasValue(reader));
 1751: 	if (value == NULL)
 1752: 	    printf("\n");
 1753: 	else {
 1754: 	    printf(" %s\n", value);
 1755: 	}
 1756:     }
 1757: #ifdef LIBXML_PATTERN_ENABLED
 1758:     if (patternc) {
 1759:         xmlChar *path = NULL;
 1760:         int match = -1;
 1761: 
 1762: 	if (type == XML_READER_TYPE_ELEMENT) {
 1763: 	    /* do the check only on element start */
 1764: 	    match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader));
 1765: 
 1766: 	    if (match) {
 1767: #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
 1768: 		path = xmlGetNodePath(xmlTextReaderCurrentNode(reader));
 1769: 		printf("Node %s matches pattern %s\n", path, pattern);
 1770: #else
 1771:                 printf("Node %s matches pattern %s\n",
 1772:                        xmlTextReaderConstName(reader), pattern);
 1773: #endif
 1774: 	    }
 1775: 	}
 1776: 	if (patstream != NULL) {
 1777: 	    int ret;
 1778: 
 1779: 	    if (type == XML_READER_TYPE_ELEMENT) {
 1780: 		ret = xmlStreamPush(patstream,
 1781: 		                    xmlTextReaderConstLocalName(reader),
 1782: 				    xmlTextReaderConstNamespaceUri(reader));
 1783: 		if (ret < 0) {
 1784: 		    fprintf(stderr, "xmlStreamPush() failure\n");
 1785:                     xmlFreeStreamCtxt(patstream);
 1786: 		    patstream = NULL;
 1787: 		} else if (ret != match) {
 1788: #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
 1789: 		    if (path == NULL) {
 1790: 		        path = xmlGetNodePath(
 1791: 		                       xmlTextReaderCurrentNode(reader));
 1792: 		    }
 1793: #endif
 1794: 		    fprintf(stderr,
 1795: 		            "xmlPatternMatch and xmlStreamPush disagree\n");
 1796:                     if (path != NULL)
 1797:                         fprintf(stderr, "  pattern %s node %s\n",
 1798:                                 pattern, path);
 1799:                     else
 1800: 		        fprintf(stderr, "  pattern %s node %s\n",
 1801: 			    pattern, xmlTextReaderConstName(reader));
 1802: 		}
 1803: 
 1804: 	    }
 1805: 	    if ((type == XML_READER_TYPE_END_ELEMENT) ||
 1806: 	        ((type == XML_READER_TYPE_ELEMENT) && (empty))) {
 1807: 	        ret = xmlStreamPop(patstream);
 1808: 		if (ret < 0) {
 1809: 		    fprintf(stderr, "xmlStreamPop() failure\n");
 1810:                     xmlFreeStreamCtxt(patstream);
 1811: 		    patstream = NULL;
 1812: 		}
 1813: 	    }
 1814: 	}
 1815: 	if (path != NULL)
 1816: 	    xmlFree(path);
 1817:     }
 1818: #endif
 1819: }
 1820: 
 1821: static void streamFile(char *filename) {
 1822:     xmlTextReaderPtr reader;
 1823:     int ret;
 1824: #ifdef HAVE_SYS_MMAN_H
 1825:     int fd = -1;
 1826:     struct stat info;
 1827:     const char *base = NULL;
 1828:     xmlParserInputBufferPtr input = NULL;
 1829: 
 1830:     if (memory) {
 1831: 	if (stat(filename, &info) < 0)
 1832: 	    return;
 1833: 	if ((fd = open(filename, O_RDONLY)) < 0)
 1834: 	    return;
 1835: 	base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
 1836: 	if (base == (void *) MAP_FAILED)
 1837: 	    return;
 1838: 
 1839: 	reader = xmlReaderForMemory(base, info.st_size, filename,
 1840: 	                            NULL, options);
 1841:     } else
 1842: #endif
 1843: 	reader = xmlReaderForFile(filename, NULL, options);
 1844: #ifdef LIBXML_PATTERN_ENABLED
 1845:     if (pattern != NULL) {
 1846:         patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
 1847: 	if (patternc == NULL) {
 1848: 	    xmlGenericError(xmlGenericErrorContext,
 1849: 		    "Pattern %s failed to compile\n", pattern);
 1850:             progresult = XMLLINT_ERR_SCHEMAPAT;
 1851: 	    pattern = NULL;
 1852: 	}
 1853:     }
 1854:     if (patternc != NULL) {
 1855:         patstream = xmlPatternGetStreamCtxt(patternc);
 1856: 	if (patstream != NULL) {
 1857: 	    ret = xmlStreamPush(patstream, NULL, NULL);
 1858: 	    if (ret < 0) {
 1859: 		fprintf(stderr, "xmlStreamPush() failure\n");
 1860: 		xmlFreeStreamCtxt(patstream);
 1861: 		patstream = NULL;
 1862:             }
 1863: 	}
 1864:     }
 1865: #endif
 1866: 
 1867: 
 1868:     if (reader != NULL) {
 1869: #ifdef LIBXML_VALID_ENABLED
 1870: 	if (valid)
 1871: 	    xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
 1872: 	else
 1873: #endif /* LIBXML_VALID_ENABLED */
 1874: 	    xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1);
 1875: #ifdef LIBXML_SCHEMAS_ENABLED
 1876: 	if (relaxng != NULL) {
 1877: 	    if ((timing) && (!repeat)) {
 1878: 		startTimer();
 1879: 	    }
 1880: 	    ret = xmlTextReaderRelaxNGValidate(reader, relaxng);
 1881: 	    if (ret < 0) {
 1882: 		xmlGenericError(xmlGenericErrorContext,
 1883: 			"Relax-NG schema %s failed to compile\n", relaxng);
 1884: 		progresult = XMLLINT_ERR_SCHEMACOMP;
 1885: 		relaxng = NULL;
 1886: 	    }
 1887: 	    if ((timing) && (!repeat)) {
 1888: 		endTimer("Compiling the schemas");
 1889: 	    }
 1890: 	}
 1891: 	if (schema != NULL) {
 1892: 	    if ((timing) && (!repeat)) {
 1893: 		startTimer();
 1894: 	    }
 1895: 	    ret = xmlTextReaderSchemaValidate(reader, schema);
 1896: 	    if (ret < 0) {
 1897: 		xmlGenericError(xmlGenericErrorContext,
 1898: 			"XSD schema %s failed to compile\n", schema);
 1899: 		progresult = XMLLINT_ERR_SCHEMACOMP;
 1900: 		schema = NULL;
 1901: 	    }
 1902: 	    if ((timing) && (!repeat)) {
 1903: 		endTimer("Compiling the schemas");
 1904: 	    }
 1905: 	}
 1906: #endif
 1907: 
 1908: 	/*
 1909: 	 * Process all nodes in sequence
 1910: 	 */
 1911: 	if ((timing) && (!repeat)) {
 1912: 	    startTimer();
 1913: 	}
 1914: 	ret = xmlTextReaderRead(reader);
 1915: 	while (ret == 1) {
 1916: 	    if ((debug)
 1917: #ifdef LIBXML_PATTERN_ENABLED
 1918: 	        || (patternc)
 1919: #endif
 1920: 	       )
 1921: 		processNode(reader);
 1922: 	    ret = xmlTextReaderRead(reader);
 1923: 	}
 1924: 	if ((timing) && (!repeat)) {
 1925: #ifdef LIBXML_SCHEMAS_ENABLED
 1926: 	    if (relaxng != NULL)
 1927: 		endTimer("Parsing and validating");
 1928: 	    else
 1929: #endif
 1930: #ifdef LIBXML_VALID_ENABLED
 1931: 	    if (valid)
 1932: 		endTimer("Parsing and validating");
 1933: 	    else
 1934: #endif
 1935: 	    endTimer("Parsing");
 1936: 	}
 1937: 
 1938: #ifdef LIBXML_VALID_ENABLED
 1939: 	if (valid) {
 1940: 	    if (xmlTextReaderIsValid(reader) != 1) {
 1941: 		xmlGenericError(xmlGenericErrorContext,
 1942: 			"Document %s does not validate\n", filename);
 1943: 		progresult = XMLLINT_ERR_VALID;
 1944: 	    }
 1945: 	}
 1946: #endif /* LIBXML_VALID_ENABLED */
 1947: #ifdef LIBXML_SCHEMAS_ENABLED
 1948: 	if ((relaxng != NULL) || (schema != NULL)) {
 1949: 	    if (xmlTextReaderIsValid(reader) != 1) {
 1950: 		fprintf(stderr, "%s fails to validate\n", filename);
 1951: 		progresult = XMLLINT_ERR_VALID;
 1952: 	    } else {
 1953: 		fprintf(stderr, "%s validates\n", filename);
 1954: 	    }
 1955: 	}
 1956: #endif
 1957: 	/*
 1958: 	 * Done, cleanup and status
 1959: 	 */
 1960: 	xmlFreeTextReader(reader);
 1961: 	if (ret != 0) {
 1962: 	    fprintf(stderr, "%s : failed to parse\n", filename);
 1963: 	    progresult = XMLLINT_ERR_UNCLASS;
 1964: 	}
 1965:     } else {
 1966: 	fprintf(stderr, "Unable to open %s\n", filename);
 1967: 	progresult = XMLLINT_ERR_UNCLASS;
 1968:     }
 1969: #ifdef LIBXML_PATTERN_ENABLED
 1970:     if (patstream != NULL) {
 1971: 	xmlFreeStreamCtxt(patstream);
 1972: 	patstream = NULL;
 1973:     }
 1974: #endif
 1975: #ifdef HAVE_SYS_MMAN_H
 1976:     if (memory) {
 1977:         xmlFreeParserInputBuffer(input);
 1978: 	munmap((char *) base, info.st_size);
 1979: 	close(fd);
 1980:     }
 1981: #endif
 1982: }
 1983: 
 1984: static void walkDoc(xmlDocPtr doc) {
 1985:     xmlTextReaderPtr reader;
 1986:     int ret;
 1987: 
 1988: #ifdef LIBXML_PATTERN_ENABLED
 1989:     xmlNodePtr root;
 1990:     const xmlChar *namespaces[22];
 1991:     int i;
 1992:     xmlNsPtr ns;
 1993: 
 1994:     root = xmlDocGetRootElement(doc);
 1995:     for (ns = root->nsDef, i = 0;ns != NULL && i < 20;ns=ns->next) {
 1996:         namespaces[i++] = ns->href;
 1997:         namespaces[i++] = ns->prefix;
 1998:     }
 1999:     namespaces[i++] = NULL;
 2000:     namespaces[i] = NULL;
 2001: 
 2002:     if (pattern != NULL) {
 2003:         patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict,
 2004: 	                             0, &namespaces[0]);
 2005: 	if (patternc == NULL) {
 2006: 	    xmlGenericError(xmlGenericErrorContext,
 2007: 		    "Pattern %s failed to compile\n", pattern);
 2008:             progresult = XMLLINT_ERR_SCHEMAPAT;
 2009: 	    pattern = NULL;
 2010: 	}
 2011:     }
 2012:     if (patternc != NULL) {
 2013:         patstream = xmlPatternGetStreamCtxt(patternc);
 2014: 	if (patstream != NULL) {
 2015: 	    ret = xmlStreamPush(patstream, NULL, NULL);
 2016: 	    if (ret < 0) {
 2017: 		fprintf(stderr, "xmlStreamPush() failure\n");
 2018: 		xmlFreeStreamCtxt(patstream);
 2019: 		patstream = NULL;
 2020:             }
 2021: 	}
 2022:     }
 2023: #endif /* LIBXML_PATTERN_ENABLED */
 2024:     reader = xmlReaderWalker(doc);
 2025:     if (reader != NULL) {
 2026: 	if ((timing) && (!repeat)) {
 2027: 	    startTimer();
 2028: 	}
 2029: 	ret = xmlTextReaderRead(reader);
 2030: 	while (ret == 1) {
 2031: 	    if ((debug)
 2032: #ifdef LIBXML_PATTERN_ENABLED
 2033: 	        || (patternc)
 2034: #endif
 2035: 	       )
 2036: 		processNode(reader);
 2037: 	    ret = xmlTextReaderRead(reader);
 2038: 	}
 2039: 	if ((timing) && (!repeat)) {
 2040: 	    endTimer("walking through the doc");
 2041: 	}
 2042: 	xmlFreeTextReader(reader);
 2043: 	if (ret != 0) {
 2044: 	    fprintf(stderr, "failed to walk through the doc\n");
 2045: 	    progresult = XMLLINT_ERR_UNCLASS;
 2046: 	}
 2047:     } else {
 2048: 	fprintf(stderr, "Failed to crate a reader from the document\n");
 2049: 	progresult = XMLLINT_ERR_UNCLASS;
 2050:     }
 2051: #ifdef LIBXML_PATTERN_ENABLED
 2052:     if (patstream != NULL) {
 2053: 	xmlFreeStreamCtxt(patstream);
 2054: 	patstream = NULL;
 2055:     }
 2056: #endif
 2057: }
 2058: #endif /* LIBXML_READER_ENABLED */
 2059: 
 2060: #ifdef LIBXML_XPATH_ENABLED
 2061: /************************************************************************
 2062:  *									*
 2063:  *			XPath Query                                     *
 2064:  *									*
 2065:  ************************************************************************/
 2066: 
 2067: static void doXPathDump(xmlXPathObjectPtr cur) {
 2068:     switch(cur->type) {
 2069:         case XPATH_NODESET: {
 2070:             int i;
 2071:             xmlNodePtr node;
 2072: #ifdef LIBXML_OUTPUT_ENABLED
 2073:             xmlSaveCtxtPtr ctxt;
 2074: 
 2075:             if (cur->nodesetval->nodeNr <= 0) {
 2076:                 fprintf(stderr, "XPath set is empty\n");
 2077:                 progresult = XMLLINT_ERR_XPATH;
 2078:                 break;
 2079:             }
 2080:             ctxt = xmlSaveToFd(1, NULL, 0);
 2081:             if (ctxt == NULL) {
 2082:                 fprintf(stderr, "Out of memory for XPath\n");
 2083:                 progresult = XMLLINT_ERR_MEM;
 2084:                 return;
 2085:             }
 2086:             for (i = 0;i < cur->nodesetval->nodeNr;i++) {
 2087:                 node = cur->nodesetval->nodeTab[i];
 2088:                 xmlSaveTree(ctxt, node);
 2089:             }
 2090:             xmlSaveClose(ctxt);
 2091: #else
 2092:             printf("xpath returned %d nodes\n", cur->nodesetval->nodeNr);
 2093: #endif
 2094: 	    break;
 2095:         }
 2096:         case XPATH_BOOLEAN:
 2097: 	    if (cur->boolval) printf("true");
 2098: 	    else printf("false");
 2099: 	    break;
 2100:         case XPATH_NUMBER:
 2101: 	    switch (xmlXPathIsInf(cur->floatval)) {
 2102: 	    case 1:
 2103: 		printf("Infinity");
 2104: 		break;
 2105: 	    case -1:
 2106: 		printf("-Infinity");
 2107: 		break;
 2108: 	    default:
 2109: 		if (xmlXPathIsNaN(cur->floatval)) {
 2110: 		    printf("NaN");
 2111: 		} else {
 2112: 		    printf("%0g", cur->floatval);
 2113: 		}
 2114: 	    }
 2115: 	    break;
 2116:         case XPATH_STRING:
 2117: 	    printf("%s", (const char *) cur->stringval);
 2118: 	    break;
 2119:         case XPATH_UNDEFINED:
 2120: 	    fprintf(stderr, "XPath Object is uninitialized\n");
 2121:             progresult = XMLLINT_ERR_XPATH;
 2122: 	    break;
 2123: 	default:
 2124: 	    fprintf(stderr, "XPath object of unexpected type\n");
 2125:             progresult = XMLLINT_ERR_XPATH;
 2126: 	    break;
 2127:     }
 2128: }
 2129: 
 2130: static void doXPathQuery(xmlDocPtr doc, const char *query) {
 2131:     xmlXPathContextPtr ctxt;
 2132:     xmlXPathObjectPtr res;
 2133: 
 2134:     ctxt = xmlXPathNewContext(doc);
 2135:     if (ctxt == NULL) {
 2136:         fprintf(stderr, "Out of memory for XPath\n");
 2137:         progresult = XMLLINT_ERR_MEM;
 2138:         return;
 2139:     }
 2140:     ctxt->node = xmlDocGetRootElement(doc);
 2141:     res = xmlXPathEval(BAD_CAST query, ctxt);
 2142:     xmlXPathFreeContext(ctxt);
 2143: 
 2144:     if (res == NULL) {
 2145:         fprintf(stderr, "XPath evaluation failure\n");
 2146:         progresult = XMLLINT_ERR_XPATH;
 2147:         return;
 2148:     }
 2149:     doXPathDump(res);
 2150:     xmlXPathFreeObject(res);
 2151: }
 2152: #endif /* LIBXML_XPATH_ENABLED */
 2153: 
 2154: /************************************************************************
 2155:  *									*
 2156:  *			Tree Test processing				*
 2157:  *									*
 2158:  ************************************************************************/
 2159: static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
 2160:     xmlDocPtr doc = NULL;
 2161: #ifdef LIBXML_TREE_ENABLED
 2162:     xmlDocPtr tmp;
 2163: #endif /* LIBXML_TREE_ENABLED */
 2164: 
 2165:     if ((timing) && (!repeat))
 2166: 	startTimer();
 2167: 
 2168: 
 2169: #ifdef LIBXML_TREE_ENABLED
 2170:     if (filename == NULL) {
 2171: 	if (generate) {
 2172: 	    xmlNodePtr n;
 2173: 
 2174: 	    doc = xmlNewDoc(BAD_CAST "1.0");
 2175: 	    n = xmlNewDocNode(doc, NULL, BAD_CAST "info", NULL);
 2176: 	    xmlNodeSetContent(n, BAD_CAST "abc");
 2177: 	    xmlDocSetRootElement(doc, n);
 2178: 	}
 2179:     }
 2180: #endif /* LIBXML_TREE_ENABLED */
 2181: #ifdef LIBXML_HTML_ENABLED
 2182: #ifdef LIBXML_PUSH_ENABLED
 2183:     else if ((html) && (push)) {
 2184:         FILE *f;
 2185: 
 2186: #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
 2187: 	f = fopen(filename, "rb");
 2188: #else
 2189: 	f = fopen(filename, "r");
 2190: #endif
 2191:         if (f != NULL) {
 2192:             int res, size = 3;
 2193:             char chars[4096];
 2194:             htmlParserCtxtPtr ctxt;
 2195: 
 2196:             /* if (repeat) */
 2197:                 size = 4096;
 2198:             res = fread(chars, 1, 4, f);
 2199:             if (res > 0) {
 2200:                 ctxt = htmlCreatePushParserCtxt(NULL, NULL,
 2201:                             chars, res, filename, XML_CHAR_ENCODING_NONE);
 2202:                 while ((res = fread(chars, 1, size, f)) > 0) {
 2203:                     htmlParseChunk(ctxt, chars, res, 0);
 2204:                 }
 2205:                 htmlParseChunk(ctxt, chars, 0, 1);
 2206:                 doc = ctxt->myDoc;
 2207:                 htmlFreeParserCtxt(ctxt);
 2208:             }
 2209:             fclose(f);
 2210:         }
 2211:     }
 2212: #endif /* LIBXML_PUSH_ENABLED */
 2213: #ifdef HAVE_SYS_MMAN_H
 2214:     else if ((html) && (memory)) {
 2215: 	int fd;
 2216: 	struct stat info;
 2217: 	const char *base;
 2218: 	if (stat(filename, &info) < 0)
 2219: 	    return;
 2220: 	if ((fd = open(filename, O_RDONLY)) < 0)
 2221: 	    return;
 2222: 	base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
 2223: 	if (base == (void *) MAP_FAILED)
 2224: 	    return;
 2225: 
 2226: 	doc = htmlReadMemory((char *) base, info.st_size, filename,
 2227: 	                     NULL, options);
 2228: 
 2229: 	munmap((char *) base, info.st_size);
 2230: 	close(fd);
 2231:     }
 2232: #endif
 2233:     else if (html) {
 2234: 	doc = htmlReadFile(filename, NULL, options);
 2235:     }
 2236: #endif /* LIBXML_HTML_ENABLED */
 2237:     else {
 2238: #ifdef LIBXML_PUSH_ENABLED
 2239: 	/*
 2240: 	 * build an XML tree from a string;
 2241: 	 */
 2242: 	if (push) {
 2243: 	    FILE *f;
 2244: 
 2245: 	    /* '-' Usually means stdin -<sven@zen.org> */
 2246: 	    if ((filename[0] == '-') && (filename[1] == 0)) {
 2247: 	      f = stdin;
 2248: 	    } else {
 2249: #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
 2250: 		f = fopen(filename, "rb");
 2251: #else
 2252: 		f = fopen(filename, "r");
 2253: #endif
 2254: 	    }
 2255: 	    if (f != NULL) {
 2256: 		int ret;
 2257: 	        int res, size = 1024;
 2258: 	        char chars[1024];
 2259:                 xmlParserCtxtPtr ctxt;
 2260: 
 2261: 		/* if (repeat) size = 1024; */
 2262: 		res = fread(chars, 1, 4, f);
 2263: 		if (res > 0) {
 2264: 		    ctxt = xmlCreatePushParserCtxt(NULL, NULL,
 2265: 		                chars, res, filename);
 2266: 		    xmlCtxtUseOptions(ctxt, options);
 2267: 		    while ((res = fread(chars, 1, size, f)) > 0) {
 2268: 			xmlParseChunk(ctxt, chars, res, 0);
 2269: 		    }
 2270: 		    xmlParseChunk(ctxt, chars, 0, 1);
 2271: 		    doc = ctxt->myDoc;
 2272: 		    ret = ctxt->wellFormed;
 2273: 		    xmlFreeParserCtxt(ctxt);
 2274: 		    if (!ret) {
 2275: 			xmlFreeDoc(doc);
 2276: 			doc = NULL;
 2277: 		    }
 2278: 	        }
 2279:                 if (f != stdin)
 2280:                     fclose(f);
 2281: 	    }
 2282: 	} else
 2283: #endif /* LIBXML_PUSH_ENABLED */
 2284:         if (testIO) {
 2285: 	    if ((filename[0] == '-') && (filename[1] == 0)) {
 2286: 	        doc = xmlReadFd(0, NULL, NULL, options);
 2287: 	    } else {
 2288: 	        FILE *f;
 2289: 
 2290: #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
 2291: 		f = fopen(filename, "rb");
 2292: #else
 2293: 		f = fopen(filename, "r");
 2294: #endif
 2295: 		if (f != NULL) {
 2296: 		    if (rectxt == NULL)
 2297: 			doc = xmlReadIO((xmlInputReadCallback) myRead,
 2298: 					(xmlInputCloseCallback) myClose, f,
 2299: 					filename, NULL, options);
 2300: 		    else
 2301: 			doc = xmlCtxtReadIO(rectxt,
 2302: 			                (xmlInputReadCallback) myRead,
 2303: 					(xmlInputCloseCallback) myClose, f,
 2304: 					filename, NULL, options);
 2305: 		} else
 2306: 		    doc = NULL;
 2307: 	    }
 2308: 	} else if (htmlout) {
 2309: 	    xmlParserCtxtPtr ctxt;
 2310: 
 2311: 	    if (rectxt == NULL)
 2312: 		ctxt = xmlNewParserCtxt();
 2313: 	    else
 2314: 	        ctxt = rectxt;
 2315: 	    if (ctxt == NULL) {
 2316: 	        doc = NULL;
 2317: 	    } else {
 2318: 	        ctxt->sax->error = xmlHTMLError;
 2319: 	        ctxt->sax->warning = xmlHTMLWarning;
 2320: 	        ctxt->vctxt.error = xmlHTMLValidityError;
 2321: 	        ctxt->vctxt.warning = xmlHTMLValidityWarning;
 2322: 
 2323: 		doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
 2324: 
 2325: 		if (rectxt == NULL)
 2326: 		    xmlFreeParserCtxt(ctxt);
 2327: 	    }
 2328: #ifdef HAVE_SYS_MMAN_H
 2329: 	} else if (memory) {
 2330: 	    int fd;
 2331: 	    struct stat info;
 2332: 	    const char *base;
 2333: 	    if (stat(filename, &info) < 0)
 2334: 		return;
 2335: 	    if ((fd = open(filename, O_RDONLY)) < 0)
 2336: 		return;
 2337: 	    base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
 2338: 	    if (base == (void *) MAP_FAILED)
 2339: 	        return;
 2340: 
 2341: 	    if (rectxt == NULL)
 2342: 		doc = xmlReadMemory((char *) base, info.st_size,
 2343: 		                    filename, NULL, options);
 2344: 	    else
 2345: 		doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size,
 2346: 			                filename, NULL, options);
 2347: 
 2348: 	    munmap((char *) base, info.st_size);
 2349: 	    close(fd);
 2350: #endif
 2351: #ifdef LIBXML_VALID_ENABLED
 2352: 	} else if (valid) {
 2353: 	    xmlParserCtxtPtr ctxt = NULL;
 2354: 
 2355: 	    if (rectxt == NULL)
 2356: 		ctxt = xmlNewParserCtxt();
 2357: 	    else
 2358: 	        ctxt = rectxt;
 2359: 	    if (ctxt == NULL) {
 2360: 	        doc = NULL;
 2361: 	    } else {
 2362: 		doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
 2363: 
 2364: 		if (ctxt->valid == 0)
 2365: 		    progresult = XMLLINT_ERR_RDFILE;
 2366: 		if (rectxt == NULL)
 2367: 		    xmlFreeParserCtxt(ctxt);
 2368: 	    }
 2369: #endif /* LIBXML_VALID_ENABLED */
 2370: 	} else {
 2371: 	    if (rectxt != NULL)
 2372: 	        doc = xmlCtxtReadFile(rectxt, filename, NULL, options);
 2373: 	    else {
 2374: #ifdef LIBXML_SAX1_ENABLED
 2375:                 if (sax1)
 2376: 		    doc = xmlParseFile(filename);
 2377: 		else
 2378: #endif /* LIBXML_SAX1_ENABLED */
 2379: 		doc = xmlReadFile(filename, NULL, options);
 2380: 	    }
 2381: 	}
 2382:     }
 2383: 
 2384:     /*
 2385:      * If we don't have a document we might as well give up.  Do we
 2386:      * want an error message here?  <sven@zen.org> */
 2387:     if (doc == NULL) {
 2388: 	progresult = XMLLINT_ERR_UNCLASS;
 2389: 	return;
 2390:     }
 2391: 
 2392:     if ((timing) && (!repeat)) {
 2393: 	endTimer("Parsing");
 2394:     }
 2395: 
 2396:     /*
 2397:      * Remove DOCTYPE nodes
 2398:      */
 2399:     if (dropdtd) {
 2400: 	xmlDtdPtr dtd;
 2401: 
 2402: 	dtd = xmlGetIntSubset(doc);
 2403: 	if (dtd != NULL) {
 2404: 	    xmlUnlinkNode((xmlNodePtr)dtd);
 2405: 	    xmlFreeDtd(dtd);
 2406: 	}
 2407:     }
 2408: 
 2409: #ifdef LIBXML_XINCLUDE_ENABLED
 2410:     if (xinclude) {
 2411: 	if ((timing) && (!repeat)) {
 2412: 	    startTimer();
 2413: 	}
 2414: 	if (xmlXIncludeProcessFlags(doc, options) < 0)
 2415: 	    progresult = XMLLINT_ERR_UNCLASS;
 2416: 	if ((timing) && (!repeat)) {
 2417: 	    endTimer("Xinclude processing");
 2418: 	}
 2419:     }
 2420: #endif
 2421: 
 2422: #ifdef LIBXML_XPATH_ENABLED
 2423:     if (xpathquery != NULL) {
 2424:         doXPathQuery(doc, xpathquery);
 2425:     }
 2426: #endif
 2427: 
 2428: #ifdef LIBXML_DEBUG_ENABLED
 2429: #ifdef LIBXML_XPATH_ENABLED
 2430:     /*
 2431:      * shell interaction
 2432:      */
 2433:     if (shell) {
 2434:         xmlXPathOrderDocElems(doc);
 2435:         xmlShell(doc, filename, xmlShellReadline, stdout);
 2436:     }
 2437: #endif
 2438: #endif
 2439: 
 2440: #ifdef LIBXML_TREE_ENABLED
 2441:     /*
 2442:      * test intermediate copy if needed.
 2443:      */
 2444:     if (copy) {
 2445:         tmp = doc;
 2446: 	if (timing) {
 2447: 	    startTimer();
 2448: 	}
 2449: 	doc = xmlCopyDoc(doc, 1);
 2450: 	if (timing) {
 2451: 	    endTimer("Copying");
 2452: 	}
 2453: 	if (timing) {
 2454: 	    startTimer();
 2455: 	}
 2456: 	xmlFreeDoc(tmp);
 2457: 	if (timing) {
 2458: 	    endTimer("Freeing original");
 2459: 	}
 2460:     }
 2461: #endif /* LIBXML_TREE_ENABLED */
 2462: 
 2463: #ifdef LIBXML_VALID_ENABLED
 2464:     if ((insert) && (!html)) {
 2465:         const xmlChar* list[256];
 2466: 	int nb, i;
 2467: 	xmlNodePtr node;
 2468: 
 2469: 	if (doc->children != NULL) {
 2470: 	    node = doc->children;
 2471: 	    while ((node != NULL) && (node->last == NULL)) node = node->next;
 2472: 	    if (node != NULL) {
 2473: 		nb = xmlValidGetValidElements(node->last, NULL, list, 256);
 2474: 		if (nb < 0) {
 2475: 		    fprintf(stderr, "could not get valid list of elements\n");
 2476: 		} else if (nb == 0) {
 2477: 		    fprintf(stderr, "No element can be inserted under root\n");
 2478: 		} else {
 2479: 		    fprintf(stderr, "%d element types can be inserted under root:\n",
 2480: 		           nb);
 2481: 		    for (i = 0;i < nb;i++) {
 2482: 			 fprintf(stderr, "%s\n", (char *) list[i]);
 2483: 		    }
 2484: 		}
 2485: 	    }
 2486: 	}
 2487:     }else
 2488: #endif /* LIBXML_VALID_ENABLED */
 2489: #ifdef LIBXML_READER_ENABLED
 2490:     if (walker) {
 2491:         walkDoc(doc);
 2492:     }
 2493: #endif /* LIBXML_READER_ENABLED */
 2494: #ifdef LIBXML_OUTPUT_ENABLED
 2495:     if (noout == 0) {
 2496:         int ret;
 2497: 
 2498: 	/*
 2499: 	 * print it.
 2500: 	 */
 2501: #ifdef LIBXML_DEBUG_ENABLED
 2502: 	if (!debug) {
 2503: #endif
 2504: 	    if ((timing) && (!repeat)) {
 2505: 		startTimer();
 2506: 	    }
 2507: #ifdef LIBXML_HTML_ENABLED
 2508:             if ((html) && (!xmlout)) {
 2509: 		if (compress) {
 2510: 		    htmlSaveFile(output ? output : "-", doc);
 2511: 		}
 2512: 		else if (encoding != NULL) {
 2513: 		    if (format == 1) {
 2514: 			htmlSaveFileFormat(output ? output : "-", doc, encoding, 1);
 2515: 		    }
 2516: 		    else {
 2517: 			htmlSaveFileFormat(output ? output : "-", doc, encoding, 0);
 2518: 		    }
 2519: 		}
 2520: 		else if (format == 1) {
 2521: 		    htmlSaveFileFormat(output ? output : "-", doc, NULL, 1);
 2522: 		}
 2523: 		else {
 2524: 		    FILE *out;
 2525: 		    if (output == NULL)
 2526: 			out = stdout;
 2527: 		    else {
 2528: 			out = fopen(output,"wb");
 2529: 		    }
 2530: 		    if (out != NULL) {
 2531: 			if (htmlDocDump(out, doc) < 0)
 2532: 			    progresult = XMLLINT_ERR_OUT;
 2533: 
 2534: 			if (output != NULL)
 2535: 			    fclose(out);
 2536: 		    } else {
 2537: 			fprintf(stderr, "failed to open %s\n", output);
 2538: 			progresult = XMLLINT_ERR_OUT;
 2539: 		    }
 2540: 		}
 2541: 		if ((timing) && (!repeat)) {
 2542: 		    endTimer("Saving");
 2543: 		}
 2544: 	    } else
 2545: #endif
 2546: #ifdef LIBXML_C14N_ENABLED
 2547:             if (canonical) {
 2548: 	        xmlChar *result = NULL;
 2549: 		int size;
 2550: 
 2551: 		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_0, NULL, 1, &result);
 2552: 		if (size >= 0) {
 2553: 		    write(1, result, size);
 2554: 		    xmlFree(result);
 2555: 		} else {
 2556: 		    fprintf(stderr, "Failed to canonicalize\n");
 2557: 		    progresult = XMLLINT_ERR_OUT;
 2558: 		}
 2559: 	    } else if (canonical) {
 2560: 	        xmlChar *result = NULL;
 2561: 		int size;
 2562: 
 2563: 		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_1, NULL, 1, &result);
 2564: 		if (size >= 0) {
 2565: 		    write(1, result, size);
 2566: 		    xmlFree(result);
 2567: 		} else {
 2568: 		    fprintf(stderr, "Failed to canonicalize\n");
 2569: 		    progresult = XMLLINT_ERR_OUT;
 2570: 		}
 2571: 	    } else
 2572:             if (exc_canonical) {
 2573: 	        xmlChar *result = NULL;
 2574: 		int size;
 2575: 
 2576: 		size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_EXCLUSIVE_1_0, NULL, 1, &result);
 2577: 		if (size >= 0) {
 2578: 		    write(1, result, size);
 2579: 		    xmlFree(result);
 2580: 		} else {
 2581: 		    fprintf(stderr, "Failed to canonicalize\n");
 2582: 		    progresult = XMLLINT_ERR_OUT;
 2583: 		}
 2584: 	    } else
 2585: #endif
 2586: #ifdef HAVE_SYS_MMAN_H
 2587: 	    if (memory) {
 2588: 		xmlChar *result;
 2589: 		int len;
 2590: 
 2591: 		if (encoding != NULL) {
 2592: 		    if (format == 1) {
 2593: 		        xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1);
 2594: 		    } else {
 2595: 			xmlDocDumpMemoryEnc(doc, &result, &len, encoding);
 2596: 		    }
 2597: 		} else {
 2598: 		    if (format == 1)
 2599: 			xmlDocDumpFormatMemory(doc, &result, &len, 1);
 2600: 		    else
 2601: 			xmlDocDumpMemory(doc, &result, &len);
 2602: 		}
 2603: 		if (result == NULL) {
 2604: 		    fprintf(stderr, "Failed to save\n");
 2605: 		    progresult = XMLLINT_ERR_OUT;
 2606: 		} else {
 2607: 		    write(1, result, len);
 2608: 		    xmlFree(result);
 2609: 		}
 2610: 
 2611: 	    } else
 2612: #endif /* HAVE_SYS_MMAN_H */
 2613: 	    if (compress) {
 2614: 		xmlSaveFile(output ? output : "-", doc);
 2615: 	    } else if (oldout) {
 2616: 	        if (encoding != NULL) {
 2617: 		    if (format == 1) {
 2618: 			ret = xmlSaveFormatFileEnc(output ? output : "-", doc,
 2619: 						   encoding, 1);
 2620: 		    }
 2621: 		    else {
 2622: 			ret = xmlSaveFileEnc(output ? output : "-", doc,
 2623: 			                     encoding);
 2624: 		    }
 2625: 		    if (ret < 0) {
 2626: 			fprintf(stderr, "failed save to %s\n",
 2627: 				output ? output : "-");
 2628: 			progresult = XMLLINT_ERR_OUT;
 2629: 		    }
 2630: 		} else if (format == 1) {
 2631: 		    ret = xmlSaveFormatFile(output ? output : "-", doc, 1);
 2632: 		    if (ret < 0) {
 2633: 			fprintf(stderr, "failed save to %s\n",
 2634: 				output ? output : "-");
 2635: 			progresult = XMLLINT_ERR_OUT;
 2636: 		    }
 2637: 		} else {
 2638: 		    FILE *out;
 2639: 		    if (output == NULL)
 2640: 			out = stdout;
 2641: 		    else {
 2642: 			out = fopen(output,"wb");
 2643: 		    }
 2644: 		    if (out != NULL) {
 2645: 			if (xmlDocDump(out, doc) < 0)
 2646: 			    progresult = XMLLINT_ERR_OUT;
 2647: 
 2648: 			if (output != NULL)
 2649: 			    fclose(out);
 2650: 		    } else {
 2651: 			fprintf(stderr, "failed to open %s\n", output);
 2652: 			progresult = XMLLINT_ERR_OUT;
 2653: 		    }
 2654: 		}
 2655: 	    } else {
 2656: 	        xmlSaveCtxtPtr ctxt;
 2657: 		int saveOpts = 0;
 2658: 
 2659:                 if (format == 1)
 2660: 		    saveOpts |= XML_SAVE_FORMAT;
 2661:                 else if (format == 2)
 2662:                     saveOpts |= XML_SAVE_WSNONSIG;
 2663: 
 2664: #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
 2665:                 if (xmlout)
 2666:                     saveOpts |= XML_SAVE_AS_XML;
 2667: #endif
 2668: 
 2669: 		if (output == NULL)
 2670: 		    ctxt = xmlSaveToFd(1, encoding, saveOpts);
 2671: 		else
 2672: 		    ctxt = xmlSaveToFilename(output, encoding, saveOpts);
 2673: 
 2674: 		if (ctxt != NULL) {
 2675: 		    if (xmlSaveDoc(ctxt, doc) < 0) {
 2676: 			fprintf(stderr, "failed save to %s\n",
 2677: 				output ? output : "-");
 2678: 			progresult = XMLLINT_ERR_OUT;
 2679: 		    }
 2680: 		    xmlSaveClose(ctxt);
 2681: 		} else {
 2682: 		    progresult = XMLLINT_ERR_OUT;
 2683: 		}
 2684: 	    }
 2685: 	    if ((timing) && (!repeat)) {
 2686: 		endTimer("Saving");
 2687: 	    }
 2688: #ifdef LIBXML_DEBUG_ENABLED
 2689: 	} else {
 2690: 	    FILE *out;
 2691: 	    if (output == NULL)
 2692: 	        out = stdout;
 2693: 	    else {
 2694: 		out = fopen(output,"wb");
 2695: 	    }
 2696: 	    if (out != NULL) {
 2697: 		xmlDebugDumpDocument(out, doc);
 2698: 
 2699: 		if (output != NULL)
 2700: 		    fclose(out);
 2701: 	    } else {
 2702: 		fprintf(stderr, "failed to open %s\n", output);
 2703: 		progresult = XMLLINT_ERR_OUT;
 2704: 	    }
 2705: 	}
 2706: #endif
 2707:     }
 2708: #endif /* LIBXML_OUTPUT_ENABLED */
 2709: 
 2710: #ifdef LIBXML_VALID_ENABLED
 2711:     /*
 2712:      * A posteriori validation test
 2713:      */
 2714:     if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) {
 2715: 	xmlDtdPtr dtd;
 2716: 
 2717: 	if ((timing) && (!repeat)) {
 2718: 	    startTimer();
 2719: 	}
 2720: 	if (dtdvalid != NULL)
 2721: 	    dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid);
 2722: 	else
 2723: 	    dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL);
 2724: 	if ((timing) && (!repeat)) {
 2725: 	    endTimer("Parsing DTD");
 2726: 	}
 2727: 	if (dtd == NULL) {
 2728: 	    if (dtdvalid != NULL)
 2729: 		xmlGenericError(xmlGenericErrorContext,
 2730: 			"Could not parse DTD %s\n", dtdvalid);
 2731: 	    else
 2732: 		xmlGenericError(xmlGenericErrorContext,
 2733: 			"Could not parse DTD %s\n", dtdvalidfpi);
 2734: 	    progresult = XMLLINT_ERR_DTD;
 2735: 	} else {
 2736: 	    xmlValidCtxtPtr cvp;
 2737: 
 2738: 	    if ((cvp = xmlNewValidCtxt()) == NULL) {
 2739: 		xmlGenericError(xmlGenericErrorContext,
 2740: 			"Couldn't allocate validation context\n");
 2741: 		exit(-1);
 2742: 	    }
 2743: 	    cvp->userData = (void *) stderr;
 2744: 	    cvp->error    = (xmlValidityErrorFunc) fprintf;
 2745: 	    cvp->warning  = (xmlValidityWarningFunc) fprintf;
 2746: 
 2747: 	    if ((timing) && (!repeat)) {
 2748: 		startTimer();
 2749: 	    }
 2750: 	    if (!xmlValidateDtd(cvp, doc, dtd)) {
 2751: 		if (dtdvalid != NULL)
 2752: 		    xmlGenericError(xmlGenericErrorContext,
 2753: 			    "Document %s does not validate against %s\n",
 2754: 			    filename, dtdvalid);
 2755: 		else
 2756: 		    xmlGenericError(xmlGenericErrorContext,
 2757: 			    "Document %s does not validate against %s\n",
 2758: 			    filename, dtdvalidfpi);
 2759: 		progresult = XMLLINT_ERR_VALID;
 2760: 	    }
 2761: 	    if ((timing) && (!repeat)) {
 2762: 		endTimer("Validating against DTD");
 2763: 	    }
 2764: 	    xmlFreeValidCtxt(cvp);
 2765: 	    xmlFreeDtd(dtd);
 2766: 	}
 2767:     } else if (postvalid) {
 2768: 	xmlValidCtxtPtr cvp;
 2769: 
 2770: 	if ((cvp = xmlNewValidCtxt()) == NULL) {
 2771: 	    xmlGenericError(xmlGenericErrorContext,
 2772: 		    "Couldn't allocate validation context\n");
 2773: 	    exit(-1);
 2774: 	}
 2775: 
 2776: 	if ((timing) && (!repeat)) {
 2777: 	    startTimer();
 2778: 	}
 2779: 	cvp->userData = (void *) stderr;
 2780: 	cvp->error    = (xmlValidityErrorFunc) fprintf;
 2781: 	cvp->warning  = (xmlValidityWarningFunc) fprintf;
 2782: 	if (!xmlValidateDocument(cvp, doc)) {
 2783: 	    xmlGenericError(xmlGenericErrorContext,
 2784: 		    "Document %s does not validate\n", filename);
 2785: 	    progresult = XMLLINT_ERR_VALID;
 2786: 	}
 2787: 	if ((timing) && (!repeat)) {
 2788: 	    endTimer("Validating");
 2789: 	}
 2790: 	xmlFreeValidCtxt(cvp);
 2791:     }
 2792: #endif /* LIBXML_VALID_ENABLED */
 2793: #ifdef LIBXML_SCHEMATRON_ENABLED
 2794:     if (wxschematron != NULL) {
 2795: 	xmlSchematronValidCtxtPtr ctxt;
 2796: 	int ret;
 2797: 	int flag;
 2798: 
 2799: 	if ((timing) && (!repeat)) {
 2800: 	    startTimer();
 2801: 	}
 2802: 
 2803: 	if (debug)
 2804: 	    flag = XML_SCHEMATRON_OUT_XML;
 2805: 	else
 2806: 	    flag = XML_SCHEMATRON_OUT_TEXT;
 2807: 	if (noout)
 2808: 	    flag |= XML_SCHEMATRON_OUT_QUIET;
 2809: 	ctxt = xmlSchematronNewValidCtxt(wxschematron, flag);
 2810: #if 0
 2811: 	xmlSchematronSetValidErrors(ctxt,
 2812: 		(xmlSchematronValidityErrorFunc) fprintf,
 2813: 		(xmlSchematronValidityWarningFunc) fprintf,
 2814: 		stderr);
 2815: #endif
 2816: 	ret = xmlSchematronValidateDoc(ctxt, doc);
 2817: 	if (ret == 0) {
 2818: 	    fprintf(stderr, "%s validates\n", filename);
 2819: 	} else if (ret > 0) {
 2820: 	    fprintf(stderr, "%s fails to validate\n", filename);
 2821: 	    progresult = XMLLINT_ERR_VALID;
 2822: 	} else {
 2823: 	    fprintf(stderr, "%s validation generated an internal error\n",
 2824: 		   filename);
 2825: 	    progresult = XMLLINT_ERR_VALID;
 2826: 	}
 2827: 	xmlSchematronFreeValidCtxt(ctxt);
 2828: 	if ((timing) && (!repeat)) {
 2829: 	    endTimer("Validating");
 2830: 	}
 2831:     }
 2832: #endif
 2833: #ifdef LIBXML_SCHEMAS_ENABLED
 2834:     if (relaxngschemas != NULL) {
 2835: 	xmlRelaxNGValidCtxtPtr ctxt;
 2836: 	int ret;
 2837: 
 2838: 	if ((timing) && (!repeat)) {
 2839: 	    startTimer();
 2840: 	}
 2841: 
 2842: 	ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
 2843: 	xmlRelaxNGSetValidErrors(ctxt,
 2844: 		(xmlRelaxNGValidityErrorFunc) fprintf,
 2845: 		(xmlRelaxNGValidityWarningFunc) fprintf,
 2846: 		stderr);
 2847: 	ret = xmlRelaxNGValidateDoc(ctxt, doc);
 2848: 	if (ret == 0) {
 2849: 	    fprintf(stderr, "%s validates\n", filename);
 2850: 	} else if (ret > 0) {
 2851: 	    fprintf(stderr, "%s fails to validate\n", filename);
 2852: 	    progresult = XMLLINT_ERR_VALID;
 2853: 	} else {
 2854: 	    fprintf(stderr, "%s validation generated an internal error\n",
 2855: 		   filename);
 2856: 	    progresult = XMLLINT_ERR_VALID;
 2857: 	}
 2858: 	xmlRelaxNGFreeValidCtxt(ctxt);
 2859: 	if ((timing) && (!repeat)) {
 2860: 	    endTimer("Validating");
 2861: 	}
 2862:     } else if (wxschemas != NULL) {
 2863: 	xmlSchemaValidCtxtPtr ctxt;
 2864: 	int ret;
 2865: 
 2866: 	if ((timing) && (!repeat)) {
 2867: 	    startTimer();
 2868: 	}
 2869: 
 2870: 	ctxt = xmlSchemaNewValidCtxt(wxschemas);
 2871: 	xmlSchemaSetValidErrors(ctxt,
 2872: 		(xmlSchemaValidityErrorFunc) fprintf,
 2873: 		(xmlSchemaValidityWarningFunc) fprintf,
 2874: 		stderr);
 2875: 	ret = xmlSchemaValidateDoc(ctxt, doc);
 2876: 	if (ret == 0) {
 2877: 	    fprintf(stderr, "%s validates\n", filename);
 2878: 	} else if (ret > 0) {
 2879: 	    fprintf(stderr, "%s fails to validate\n", filename);
 2880: 	    progresult = XMLLINT_ERR_VALID;
 2881: 	} else {
 2882: 	    fprintf(stderr, "%s validation generated an internal error\n",
 2883: 		   filename);
 2884: 	    progresult = XMLLINT_ERR_VALID;
 2885: 	}
 2886: 	xmlSchemaFreeValidCtxt(ctxt);
 2887: 	if ((timing) && (!repeat)) {
 2888: 	    endTimer("Validating");
 2889: 	}
 2890:     }
 2891: #endif
 2892: 
 2893: #ifdef LIBXML_DEBUG_ENABLED
 2894: #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
 2895:     if ((debugent) && (!html))
 2896: 	xmlDebugDumpEntities(stderr, doc);
 2897: #endif
 2898: #endif
 2899: 
 2900:     /*
 2901:      * free it.
 2902:      */
 2903:     if ((timing) && (!repeat)) {
 2904: 	startTimer();
 2905:     }
 2906:     xmlFreeDoc(doc);
 2907:     if ((timing) && (!repeat)) {
 2908: 	endTimer("Freeing");
 2909:     }
 2910: }
 2911: 
 2912: /************************************************************************
 2913:  *									*
 2914:  *			Usage and Main					*
 2915:  *									*
 2916:  ************************************************************************/
 2917: 
 2918: static void showVersion(const char *name) {
 2919:     fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion);
 2920:     fprintf(stderr, "   compiled with: ");
 2921:     if (xmlHasFeature(XML_WITH_THREAD)) fprintf(stderr, "Threads ");
 2922:     if (xmlHasFeature(XML_WITH_TREE)) fprintf(stderr, "Tree ");
 2923:     if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(stderr, "Output ");
 2924:     if (xmlHasFeature(XML_WITH_PUSH)) fprintf(stderr, "Push ");
 2925:     if (xmlHasFeature(XML_WITH_READER)) fprintf(stderr, "Reader ");
 2926:     if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(stderr, "Patterns ");
 2927:     if (xmlHasFeature(XML_WITH_WRITER)) fprintf(stderr, "Writer ");
 2928:     if (xmlHasFeature(XML_WITH_SAX1)) fprintf(stderr, "SAXv1 ");
 2929:     if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP ");
 2930:     if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP ");
 2931:     if (xmlHasFeature(XML_WITH_VALID)) fprintf(stderr, "DTDValid ");
 2932:     if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML ");
 2933:     if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy ");
 2934:     if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N ");
 2935:     if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog ");
 2936:     if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath ");
 2937:     if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer ");
 2938:     if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude ");
 2939:     if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv ");
 2940:     if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X ");
 2941:     if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode ");
 2942:     if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps ");
 2943:     if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata ");
 2944:     if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr ");
 2945:     if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas ");
 2946:     if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron ");
 2947:     if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules ");
 2948:     if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug ");
 2949:     if (xmlHasFeature(XML_WITH_DEBUG_MEM)) fprintf(stderr, "MemDebug ");
 2950:     if (xmlHasFeature(XML_WITH_DEBUG_RUN)) fprintf(stderr, "RunDebug ");
 2951:     if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(stderr, "Zlib ");
 2952:     fprintf(stderr, "\n");
 2953: }
 2954: 
 2955: static void usage(const char *name) {
 2956:     printf("Usage : %s [options] XMLfiles ...\n", name);
 2957: #ifdef LIBXML_OUTPUT_ENABLED
 2958:     printf("\tParse the XML files and output the result of the parsing\n");
 2959: #else
 2960:     printf("\tParse the XML files\n");
 2961: #endif /* LIBXML_OUTPUT_ENABLED */
 2962:     printf("\t--version : display the version of the XML library used\n");
 2963: #ifdef LIBXML_DEBUG_ENABLED
 2964:     printf("\t--debug : dump a debug tree of the in-memory document\n");
 2965:     printf("\t--shell : run a navigating shell\n");
 2966:     printf("\t--debugent : debug the entities defined in the document\n");
 2967: #else
 2968: #ifdef LIBXML_READER_ENABLED
 2969:     printf("\t--debug : dump the nodes content when using --stream\n");
 2970: #endif /* LIBXML_READER_ENABLED */
 2971: #endif
 2972: #ifdef LIBXML_TREE_ENABLED
 2973:     printf("\t--copy : used to test the internal copy implementation\n");
 2974: #endif /* LIBXML_TREE_ENABLED */
 2975:     printf("\t--recover : output what was parsable on broken XML documents\n");
 2976:     printf("\t--huge : remove any internal arbitrary parser limits\n");
 2977:     printf("\t--noent : substitute entity references by their value\n");
 2978:     printf("\t--noout : don't output the result tree\n");
 2979:     printf("\t--path 'paths': provide a set of paths for resources\n");
 2980:     printf("\t--load-trace : print trace of all external entites loaded\n");
 2981:     printf("\t--nonet : refuse to fetch DTDs or entities over network\n");
 2982:     printf("\t--nocompact : do not generate compact text nodes\n");
 2983:     printf("\t--htmlout : output results as HTML\n");
 2984:     printf("\t--nowrap : do not put HTML doc wrapper\n");
 2985: #ifdef LIBXML_VALID_ENABLED
 2986:     printf("\t--valid : validate the document in addition to std well-formed check\n");
 2987:     printf("\t--postvalid : do a posteriori validation, i.e after parsing\n");
 2988:     printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n");
 2989:     printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n");
 2990: #endif /* LIBXML_VALID_ENABLED */
 2991:     printf("\t--timing : print some timings\n");
 2992:     printf("\t--output file or -o file: save to a given file\n");
 2993:     printf("\t--repeat : repeat 100 times, for timing or profiling\n");
 2994:     printf("\t--insert : ad-hoc test for valid insertions\n");
 2995: #ifdef LIBXML_OUTPUT_ENABLED
 2996: #ifdef HAVE_ZLIB_H
 2997:     printf("\t--compress : turn on gzip compression of output\n");
 2998: #endif
 2999: #endif /* LIBXML_OUTPUT_ENABLED */
 3000: #ifdef LIBXML_HTML_ENABLED
 3001:     printf("\t--html : use the HTML parser\n");
 3002:     printf("\t--xmlout : force to use the XML serializer when using --html\n");
 3003:     printf("\t--nodefdtd : do not default HTML doctype\n");
 3004: #endif
 3005: #ifdef LIBXML_PUSH_ENABLED
 3006:     printf("\t--push : use the push mode of the parser\n");
 3007: #endif /* LIBXML_PUSH_ENABLED */
 3008: #ifdef HAVE_SYS_MMAN_H
 3009:     printf("\t--memory : parse from memory\n");
 3010: #endif
 3011:     printf("\t--maxmem nbbytes : limits memory allocation to nbbytes bytes\n");
 3012:     printf("\t--nowarning : do not emit warnings from parser/validator\n");
 3013:     printf("\t--noblanks : drop (ignorable?) blanks spaces\n");
 3014:     printf("\t--nocdata : replace cdata section with text nodes\n");
 3015: #ifdef LIBXML_OUTPUT_ENABLED
 3016:     printf("\t--format : reformat/reindent the input\n");
 3017:     printf("\t--encode encoding : output in the given encoding\n");
 3018:     printf("\t--dropdtd : remove the DOCTYPE of the input docs\n");
 3019:     printf("\t--pretty STYLE : pretty-print in a particular style\n");
 3020:     printf("\t                 0 Do not pretty print\n");
 3021:     printf("\t                 1 Format the XML content, as --format\n");
 3022:     printf("\t                 2 Add whitespace inside tags, preserving content\n");
 3023: #endif /* LIBXML_OUTPUT_ENABLED */
 3024:     printf("\t--c14n : save in W3C canonical format v1.0 (with comments)\n");
 3025:     printf("\t--c14n11 : save in W3C canonical format v1.1 (with comments)\n");
 3026:     printf("\t--exc-c14n : save in W3C exclusive canonical format (with comments)\n");
 3027: #ifdef LIBXML_C14N_ENABLED
 3028: #endif /* LIBXML_C14N_ENABLED */
 3029:     printf("\t--nsclean : remove redundant namespace declarations\n");
 3030:     printf("\t--testIO : test user I/O support\n");
 3031: #ifdef LIBXML_CATALOG_ENABLED
 3032:     printf("\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n");
 3033:     printf("\t             otherwise XML Catalogs starting from \n");
 3034:     printf("\t         %s are activated by default\n", XML_XML_DEFAULT_CATALOG);
 3035:     printf("\t--nocatalogs: deactivate all catalogs\n");
 3036: #endif
 3037:     printf("\t--auto : generate a small doc on the fly\n");
 3038: #ifdef LIBXML_XINCLUDE_ENABLED
 3039:     printf("\t--xinclude : do XInclude processing\n");
 3040:     printf("\t--noxincludenode : same but do not generate XInclude nodes\n");
 3041:     printf("\t--nofixup-base-uris : do not fixup xml:base uris\n");
 3042: #endif
 3043:     printf("\t--loaddtd : fetch external DTD\n");
 3044:     printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n");
 3045: #ifdef LIBXML_READER_ENABLED
 3046:     printf("\t--stream : use the streaming interface to process very large files\n");
 3047:     printf("\t--walker : create a reader and walk though the resulting doc\n");
 3048: #endif /* LIBXML_READER_ENABLED */
 3049: #ifdef LIBXML_PATTERN_ENABLED
 3050:     printf("\t--pattern pattern_value : test the pattern support\n");
 3051: #endif
 3052:     printf("\t--chkregister : verify the node registration code\n");
 3053: #ifdef LIBXML_SCHEMAS_ENABLED
 3054:     printf("\t--relaxng schema : do RelaxNG validation against the schema\n");
 3055:     printf("\t--schema schema : do validation against the WXS schema\n");
 3056: #endif
 3057: #ifdef LIBXML_SCHEMATRON_ENABLED
 3058:     printf("\t--schematron schema : do validation against a schematron\n");
 3059: #endif
 3060: #ifdef LIBXML_SAX1_ENABLED
 3061:     printf("\t--sax1: use the old SAX1 interfaces for processing\n");
 3062: #endif
 3063:     printf("\t--sax: do not build a tree but work just at the SAX level\n");
 3064:     printf("\t--oldxml10: use XML-1.0 parsing rules before the 5th edition\n");
 3065: #ifdef LIBXML_XPATH_ENABLED
 3066:     printf("\t--xpath expr: evaluate the XPath expression, inply --noout\n");
 3067: #endif
 3068: 
 3069:     printf("\nLibxml project home page: http://xmlsoft.org/\n");
 3070:     printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n");
 3071: }
 3072: 
 3073: static void registerNode(xmlNodePtr node)
 3074: {
 3075:     node->_private = malloc(sizeof(long));
 3076:     *(long*)node->_private = (long) 0x81726354;
 3077:     nbregister++;
 3078: }
 3079: 
 3080: static void deregisterNode(xmlNodePtr node)
 3081: {
 3082:     assert(node->_private != NULL);
 3083:     assert(*(long*)node->_private == (long) 0x81726354);
 3084:     free(node->_private);
 3085:     nbregister--;
 3086: }
 3087: 
 3088: int
 3089: main(int argc, char **argv) {
 3090:     int i, acount;
 3091:     int files = 0;
 3092:     int version = 0;
 3093:     const char* indent;
 3094: 
 3095:     if (argc <= 1) {
 3096: 	usage(argv[0]);
 3097: 	return(1);
 3098:     }
 3099:     LIBXML_TEST_VERSION
 3100:     for (i = 1; i < argc ; i++) {
 3101: 	if (!strcmp(argv[i], "-"))
 3102: 	    break;
 3103: 
 3104: 	if (argv[i][0] != '-')
 3105: 	    continue;
 3106: 	if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
 3107: 	    debug++;
 3108: 	else
 3109: #ifdef LIBXML_DEBUG_ENABLED
 3110: 	if ((!strcmp(argv[i], "-shell")) ||
 3111: 	         (!strcmp(argv[i], "--shell"))) {
 3112: 	    shell++;
 3113:             noout = 1;
 3114:         } else
 3115: #endif
 3116: #ifdef LIBXML_TREE_ENABLED
 3117: 	if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
 3118: 	    copy++;
 3119: 	else
 3120: #endif /* LIBXML_TREE_ENABLED */
 3121: 	if ((!strcmp(argv[i], "-recover")) ||
 3122: 	         (!strcmp(argv[i], "--recover"))) {
 3123: 	    recovery++;
 3124: 	    options |= XML_PARSE_RECOVER;
 3125: 	} else if ((!strcmp(argv[i], "-huge")) ||
 3126: 	         (!strcmp(argv[i], "--huge"))) {
 3127: 	    options |= XML_PARSE_HUGE;
 3128: 	} else if ((!strcmp(argv[i], "-noent")) ||
 3129: 	         (!strcmp(argv[i], "--noent"))) {
 3130: 	    noent++;
 3131: 	    options |= XML_PARSE_NOENT;
 3132: 	} else if ((!strcmp(argv[i], "-nsclean")) ||
 3133: 	         (!strcmp(argv[i], "--nsclean"))) {
 3134: 	    options |= XML_PARSE_NSCLEAN;
 3135: 	} else if ((!strcmp(argv[i], "-nocdata")) ||
 3136: 	         (!strcmp(argv[i], "--nocdata"))) {
 3137: 	    options |= XML_PARSE_NOCDATA;
 3138: 	} else if ((!strcmp(argv[i], "-nodict")) ||
 3139: 	         (!strcmp(argv[i], "--nodict"))) {
 3140: 	    options |= XML_PARSE_NODICT;
 3141: 	} else if ((!strcmp(argv[i], "-version")) ||
 3142: 	         (!strcmp(argv[i], "--version"))) {
 3143: 	    showVersion(argv[0]);
 3144: 	    version = 1;
 3145: 	} else if ((!strcmp(argv[i], "-noout")) ||
 3146: 	         (!strcmp(argv[i], "--noout")))
 3147: 	    noout++;
 3148: #ifdef LIBXML_OUTPUT_ENABLED
 3149: 	else if ((!strcmp(argv[i], "-o")) ||
 3150: 	         (!strcmp(argv[i], "-output")) ||
 3151: 	         (!strcmp(argv[i], "--output"))) {
 3152: 	    i++;
 3153: 	    output = argv[i];
 3154: 	}
 3155: #endif /* LIBXML_OUTPUT_ENABLED */
 3156: 	else if ((!strcmp(argv[i], "-htmlout")) ||
 3157: 	         (!strcmp(argv[i], "--htmlout")))
 3158: 	    htmlout++;
 3159: 	else if ((!strcmp(argv[i], "-nowrap")) ||
 3160: 	         (!strcmp(argv[i], "--nowrap")))
 3161: 	    nowrap++;
 3162: #ifdef LIBXML_HTML_ENABLED
 3163: 	else if ((!strcmp(argv[i], "-html")) ||
 3164: 	         (!strcmp(argv[i], "--html"))) {
 3165: 	    html++;
 3166:         }
 3167: 	else if ((!strcmp(argv[i], "-xmlout")) ||
 3168: 	         (!strcmp(argv[i], "--xmlout"))) {
 3169: 	    xmlout++;
 3170: 	} else if ((!strcmp(argv[i], "-nodefdtd")) ||
 3171: 	         (!strcmp(argv[i], "--nodefdtd"))) {
 3172:             nodefdtd++;
 3173: 	    options |= HTML_PARSE_NODEFDTD;
 3174:         }
 3175: #endif /* LIBXML_HTML_ENABLED */
 3176: 	else if ((!strcmp(argv[i], "-loaddtd")) ||
 3177: 	         (!strcmp(argv[i], "--loaddtd"))) {
 3178: 	    loaddtd++;
 3179: 	    options |= XML_PARSE_DTDLOAD;
 3180: 	} else if ((!strcmp(argv[i], "-dtdattr")) ||
 3181: 	         (!strcmp(argv[i], "--dtdattr"))) {
 3182: 	    loaddtd++;
 3183: 	    dtdattrs++;
 3184: 	    options |= XML_PARSE_DTDATTR;
 3185: 	}
 3186: #ifdef LIBXML_VALID_ENABLED
 3187: 	else if ((!strcmp(argv[i], "-valid")) ||
 3188: 	         (!strcmp(argv[i], "--valid"))) {
 3189: 	    valid++;
 3190: 	    options |= XML_PARSE_DTDVALID;
 3191: 	} else if ((!strcmp(argv[i], "-postvalid")) ||
 3192: 	         (!strcmp(argv[i], "--postvalid"))) {
 3193: 	    postvalid++;
 3194: 	    loaddtd++;
 3195: 	    options |= XML_PARSE_DTDLOAD;
 3196: 	} else if ((!strcmp(argv[i], "-dtdvalid")) ||
 3197: 	         (!strcmp(argv[i], "--dtdvalid"))) {
 3198: 	    i++;
 3199: 	    dtdvalid = argv[i];
 3200: 	    loaddtd++;
 3201: 	    options |= XML_PARSE_DTDLOAD;
 3202: 	} else if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
 3203: 	         (!strcmp(argv[i], "--dtdvalidfpi"))) {
 3204: 	    i++;
 3205: 	    dtdvalidfpi = argv[i];
 3206: 	    loaddtd++;
 3207: 	    options |= XML_PARSE_DTDLOAD;
 3208:         }
 3209: #endif /* LIBXML_VALID_ENABLED */
 3210: 	else if ((!strcmp(argv[i], "-dropdtd")) ||
 3211: 	         (!strcmp(argv[i], "--dropdtd")))
 3212: 	    dropdtd++;
 3213: 	else if ((!strcmp(argv[i], "-insert")) ||
 3214: 	         (!strcmp(argv[i], "--insert")))
 3215: 	    insert++;
 3216: 	else if ((!strcmp(argv[i], "-timing")) ||
 3217: 	         (!strcmp(argv[i], "--timing")))
 3218: 	    timing++;
 3219: 	else if ((!strcmp(argv[i], "-auto")) ||
 3220: 	         (!strcmp(argv[i], "--auto")))
 3221: 	    generate++;
 3222: 	else if ((!strcmp(argv[i], "-repeat")) ||
 3223: 	         (!strcmp(argv[i], "--repeat"))) {
 3224: 	    if (repeat)
 3225: 	        repeat *= 10;
 3226: 	    else
 3227: 	        repeat = 100;
 3228: 	}
 3229: #ifdef LIBXML_PUSH_ENABLED
 3230: 	else if ((!strcmp(argv[i], "-push")) ||
 3231: 	         (!strcmp(argv[i], "--push")))
 3232: 	    push++;
 3233: #endif /* LIBXML_PUSH_ENABLED */
 3234: #ifdef HAVE_SYS_MMAN_H
 3235: 	else if ((!strcmp(argv[i], "-memory")) ||
 3236: 	         (!strcmp(argv[i], "--memory")))
 3237: 	    memory++;
 3238: #endif
 3239: 	else if ((!strcmp(argv[i], "-testIO")) ||
 3240: 	         (!strcmp(argv[i], "--testIO")))
 3241: 	    testIO++;
 3242: #ifdef LIBXML_XINCLUDE_ENABLED
 3243: 	else if ((!strcmp(argv[i], "-xinclude")) ||
 3244: 	         (!strcmp(argv[i], "--xinclude"))) {
 3245: 	    xinclude++;
 3246: 	    options |= XML_PARSE_XINCLUDE;
 3247: 	}
 3248: 	else if ((!strcmp(argv[i], "-noxincludenode")) ||
 3249: 	         (!strcmp(argv[i], "--noxincludenode"))) {
 3250: 	    xinclude++;
 3251: 	    options |= XML_PARSE_XINCLUDE;
 3252: 	    options |= XML_PARSE_NOXINCNODE;
 3253: 	}
 3254: 	else if ((!strcmp(argv[i], "-nofixup-base-uris")) ||
 3255: 	         (!strcmp(argv[i], "--nofixup-base-uris"))) {
 3256: 	    xinclude++;
 3257: 	    options |= XML_PARSE_XINCLUDE;
 3258: 	    options |= XML_PARSE_NOBASEFIX;
 3259: 	}
 3260: #endif
 3261: #ifdef LIBXML_OUTPUT_ENABLED
 3262: #ifdef HAVE_ZLIB_H
 3263: 	else if ((!strcmp(argv[i], "-compress")) ||
 3264: 	         (!strcmp(argv[i], "--compress"))) {
 3265: 	    compress++;
 3266: 	    xmlSetCompressMode(9);
 3267:         }
 3268: #endif
 3269: #endif /* LIBXML_OUTPUT_ENABLED */
 3270: 	else if ((!strcmp(argv[i], "-nowarning")) ||
 3271: 	         (!strcmp(argv[i], "--nowarning"))) {
 3272: 	    xmlGetWarningsDefaultValue = 0;
 3273: 	    xmlPedanticParserDefault(0);
 3274: 	    options |= XML_PARSE_NOWARNING;
 3275:         }
 3276: 	else if ((!strcmp(argv[i], "-pedantic")) ||
 3277: 	         (!strcmp(argv[i], "--pedantic"))) {
 3278: 	    xmlGetWarningsDefaultValue = 1;
 3279: 	    xmlPedanticParserDefault(1);
 3280: 	    options |= XML_PARSE_PEDANTIC;
 3281:         }
 3282: #ifdef LIBXML_DEBUG_ENABLED
 3283: 	else if ((!strcmp(argv[i], "-debugent")) ||
 3284: 		 (!strcmp(argv[i], "--debugent"))) {
 3285: 	    debugent++;
 3286: 	    xmlParserDebugEntities = 1;
 3287: 	}
 3288: #endif
 3289: #ifdef LIBXML_C14N_ENABLED
 3290: 	else if ((!strcmp(argv[i], "-c14n")) ||
 3291: 		 (!strcmp(argv[i], "--c14n"))) {
 3292: 	    canonical++;
 3293: 	    options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
 3294: 	}
 3295: 	else if ((!strcmp(argv[i], "-c14n11")) ||
 3296: 		 (!strcmp(argv[i], "--c14n11"))) {
 3297: 	    canonical_11++;
 3298: 	    options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
 3299: 	}
 3300: 	else if ((!strcmp(argv[i], "-exc-c14n")) ||
 3301: 		 (!strcmp(argv[i], "--exc-c14n"))) {
 3302: 	    exc_canonical++;
 3303: 	    options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
 3304: 	}
 3305: #endif
 3306: #ifdef LIBXML_CATALOG_ENABLED
 3307: 	else if ((!strcmp(argv[i], "-catalogs")) ||
 3308: 		 (!strcmp(argv[i], "--catalogs"))) {
 3309: 	    catalogs++;
 3310: 	} else if ((!strcmp(argv[i], "-nocatalogs")) ||
 3311: 		 (!strcmp(argv[i], "--nocatalogs"))) {
 3312: 	    nocatalogs++;
 3313: 	}
 3314: #endif
 3315: 	else if ((!strcmp(argv[i], "-encode")) ||
 3316: 	         (!strcmp(argv[i], "--encode"))) {
 3317: 	    i++;
 3318: 	    encoding = argv[i];
 3319: 	    /*
 3320: 	     * OK it's for testing purposes
 3321: 	     */
 3322: 	    xmlAddEncodingAlias("UTF-8", "DVEnc");
 3323:         }
 3324: 	else if ((!strcmp(argv[i], "-noblanks")) ||
 3325: 	         (!strcmp(argv[i], "--noblanks"))) {
 3326: 	     noblanks++;
 3327: 	     xmlKeepBlanksDefault(0);
 3328:         }
 3329: 	else if ((!strcmp(argv[i], "-maxmem")) ||
 3330: 	         (!strcmp(argv[i], "--maxmem"))) {
 3331: 	     i++;
 3332: 	     if (sscanf(argv[i], "%d", &maxmem) == 1) {
 3333: 	         xmlMemSetup(myFreeFunc, myMallocFunc, myReallocFunc,
 3334: 		             myStrdupFunc);
 3335: 	     } else {
 3336: 	         maxmem = 0;
 3337: 	     }
 3338:         }
 3339: 	else if ((!strcmp(argv[i], "-format")) ||
 3340: 	         (!strcmp(argv[i], "--format"))) {
 3341: 	     noblanks++;
 3342: #ifdef LIBXML_OUTPUT_ENABLED
 3343: 	     format = 1;
 3344: #endif /* LIBXML_OUTPUT_ENABLED */
 3345: 	     xmlKeepBlanksDefault(0);
 3346: 	}
 3347: 	else if ((!strcmp(argv[i], "-pretty")) ||
 3348: 	         (!strcmp(argv[i], "--pretty"))) {
 3349: 	     i++;
 3350: #ifdef LIBXML_OUTPUT_ENABLED
 3351: 	     format = atoi(argv[i]);
 3352: #endif /* LIBXML_OUTPUT_ENABLED */
 3353: 	     if (format == 1) {
 3354: 	         noblanks++;
 3355: 	         xmlKeepBlanksDefault(0);
 3356: 	     }
 3357: 	}
 3358: #ifdef LIBXML_READER_ENABLED
 3359: 	else if ((!strcmp(argv[i], "-stream")) ||
 3360: 	         (!strcmp(argv[i], "--stream"))) {
 3361: 	     stream++;
 3362: 	}
 3363: 	else if ((!strcmp(argv[i], "-walker")) ||
 3364: 	         (!strcmp(argv[i], "--walker"))) {
 3365: 	     walker++;
 3366:              noout++;
 3367: 	}
 3368: #endif /* LIBXML_READER_ENABLED */
 3369: #ifdef LIBXML_SAX1_ENABLED
 3370: 	else if ((!strcmp(argv[i], "-sax1")) ||
 3371: 	         (!strcmp(argv[i], "--sax1"))) {
 3372: 	    sax1++;
 3373: 	    options |= XML_PARSE_SAX1;
 3374: 	}
 3375: #endif /* LIBXML_SAX1_ENABLED */
 3376: 	else if ((!strcmp(argv[i], "-sax")) ||
 3377: 	         (!strcmp(argv[i], "--sax"))) {
 3378: 	    sax++;
 3379: 	}
 3380: 	else if ((!strcmp(argv[i], "-chkregister")) ||
 3381: 	         (!strcmp(argv[i], "--chkregister"))) {
 3382: 	    chkregister++;
 3383: #ifdef LIBXML_SCHEMAS_ENABLED
 3384: 	} else if ((!strcmp(argv[i], "-relaxng")) ||
 3385: 	         (!strcmp(argv[i], "--relaxng"))) {
 3386: 	    i++;
 3387: 	    relaxng = argv[i];
 3388: 	    noent++;
 3389: 	    options |= XML_PARSE_NOENT;
 3390: 	} else if ((!strcmp(argv[i], "-schema")) ||
 3391: 	         (!strcmp(argv[i], "--schema"))) {
 3392: 	    i++;
 3393: 	    schema = argv[i];
 3394: 	    noent++;
 3395: #endif
 3396: #ifdef LIBXML_SCHEMATRON_ENABLED
 3397: 	} else if ((!strcmp(argv[i], "-schematron")) ||
 3398: 	         (!strcmp(argv[i], "--schematron"))) {
 3399: 	    i++;
 3400: 	    schematron = argv[i];
 3401: 	    noent++;
 3402: #endif
 3403:         } else if ((!strcmp(argv[i], "-nonet")) ||
 3404:                    (!strcmp(argv[i], "--nonet"))) {
 3405: 	    options |= XML_PARSE_NONET;
 3406: 	    xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
 3407:         } else if ((!strcmp(argv[i], "-nocompact")) ||
 3408:                    (!strcmp(argv[i], "--nocompact"))) {
 3409: 	    options &= ~XML_PARSE_COMPACT;
 3410: 	} else if ((!strcmp(argv[i], "-load-trace")) ||
 3411: 	           (!strcmp(argv[i], "--load-trace"))) {
 3412: 	    load_trace++;
 3413:         } else if ((!strcmp(argv[i], "-path")) ||
 3414:                    (!strcmp(argv[i], "--path"))) {
 3415: 	    i++;
 3416: 	    parsePath(BAD_CAST argv[i]);
 3417: #ifdef LIBXML_PATTERN_ENABLED
 3418:         } else if ((!strcmp(argv[i], "-pattern")) ||
 3419:                    (!strcmp(argv[i], "--pattern"))) {
 3420: 	    i++;
 3421: 	    pattern = argv[i];
 3422: #endif
 3423: #ifdef LIBXML_XPATH_ENABLED
 3424:         } else if ((!strcmp(argv[i], "-xpath")) ||
 3425:                    (!strcmp(argv[i], "--xpath"))) {
 3426: 	    i++;
 3427: 	    noout++;
 3428: 	    xpathquery = argv[i];
 3429: #endif
 3430: 	} else if ((!strcmp(argv[i], "-oldxml10")) ||
 3431: 	           (!strcmp(argv[i], "--oldxml10"))) {
 3432: 	    oldxml10++;
 3433: 	    options |= XML_PARSE_OLD10;
 3434: 	} else {
 3435: 	    fprintf(stderr, "Unknown option %s\n", argv[i]);
 3436: 	    usage(argv[0]);
 3437: 	    return(1);
 3438: 	}
 3439:     }
 3440: 
 3441: #ifdef LIBXML_CATALOG_ENABLED
 3442:     if (nocatalogs == 0) {
 3443: 	if (catalogs) {
 3444: 	    const char *catal;
 3445: 
 3446: 	    catal = getenv("SGML_CATALOG_FILES");
 3447: 	    if (catal != NULL) {
 3448: 		xmlLoadCatalogs(catal);
 3449: 	    } else {
 3450: 		fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n");
 3451: 	    }
 3452: 	}
 3453:     }
 3454: #endif
 3455: 
 3456: #ifdef LIBXML_SAX1_ENABLED
 3457:     if (sax1)
 3458:         xmlSAXDefaultVersion(1);
 3459:     else
 3460:         xmlSAXDefaultVersion(2);
 3461: #endif /* LIBXML_SAX1_ENABLED */
 3462: 
 3463:     if (chkregister) {
 3464: 	xmlRegisterNodeDefault(registerNode);
 3465: 	xmlDeregisterNodeDefault(deregisterNode);
 3466:     }
 3467: 
 3468:     indent = getenv("XMLLINT_INDENT");
 3469:     if(indent != NULL) {
 3470: 	xmlTreeIndentString = indent;
 3471:     }
 3472: 
 3473: 
 3474:     defaultEntityLoader = xmlGetExternalEntityLoader();
 3475:     xmlSetExternalEntityLoader(xmllintExternalEntityLoader);
 3476: 
 3477:     xmlLineNumbersDefault(1);
 3478:     if (loaddtd != 0)
 3479: 	xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
 3480:     if (dtdattrs)
 3481: 	xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
 3482:     if (noent != 0) xmlSubstituteEntitiesDefault(1);
 3483: #ifdef LIBXML_VALID_ENABLED
 3484:     if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
 3485: #endif /* LIBXML_VALID_ENABLED */
 3486:     if ((htmlout) && (!nowrap)) {
 3487: 	xmlGenericError(xmlGenericErrorContext,
 3488:          "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n");
 3489: 	xmlGenericError(xmlGenericErrorContext,
 3490: 		"\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n");
 3491: 	xmlGenericError(xmlGenericErrorContext,
 3492: 	 "<html><head><title>%s output</title></head>\n",
 3493: 		argv[0]);
 3494: 	xmlGenericError(xmlGenericErrorContext,
 3495: 	 "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n",
 3496: 		argv[0]);
 3497:     }
 3498: 
 3499: #ifdef LIBXML_SCHEMATRON_ENABLED
 3500:     if ((schematron != NULL) && (sax == 0)
 3501: #ifdef LIBXML_READER_ENABLED
 3502:         && (stream == 0)
 3503: #endif /* LIBXML_READER_ENABLED */
 3504: 	) {
 3505: 	xmlSchematronParserCtxtPtr ctxt;
 3506: 
 3507:         /* forces loading the DTDs */
 3508:         xmlLoadExtDtdDefaultValue |= 1;
 3509: 	options |= XML_PARSE_DTDLOAD;
 3510: 	if (timing) {
 3511: 	    startTimer();
 3512: 	}
 3513: 	ctxt = xmlSchematronNewParserCtxt(schematron);
 3514: #if 0
 3515: 	xmlSchematronSetParserErrors(ctxt,
 3516: 		(xmlSchematronValidityErrorFunc) fprintf,
 3517: 		(xmlSchematronValidityWarningFunc) fprintf,
 3518: 		stderr);
 3519: #endif
 3520: 	wxschematron = xmlSchematronParse(ctxt);
 3521: 	if (wxschematron == NULL) {
 3522: 	    xmlGenericError(xmlGenericErrorContext,
 3523: 		    "Schematron schema %s failed to compile\n", schematron);
 3524:             progresult = XMLLINT_ERR_SCHEMACOMP;
 3525: 	    schematron = NULL;
 3526: 	}
 3527: 	xmlSchematronFreeParserCtxt(ctxt);
 3528: 	if (timing) {
 3529: 	    endTimer("Compiling the schemas");
 3530: 	}
 3531:     }
 3532: #endif
 3533: #ifdef LIBXML_SCHEMAS_ENABLED
 3534:     if ((relaxng != NULL) && (sax == 0)
 3535: #ifdef LIBXML_READER_ENABLED
 3536:         && (stream == 0)
 3537: #endif /* LIBXML_READER_ENABLED */
 3538: 	) {
 3539: 	xmlRelaxNGParserCtxtPtr ctxt;
 3540: 
 3541:         /* forces loading the DTDs */
 3542:         xmlLoadExtDtdDefaultValue |= 1;
 3543: 	options |= XML_PARSE_DTDLOAD;
 3544: 	if (timing) {
 3545: 	    startTimer();
 3546: 	}
 3547: 	ctxt = xmlRelaxNGNewParserCtxt(relaxng);
 3548: 	xmlRelaxNGSetParserErrors(ctxt,
 3549: 		(xmlRelaxNGValidityErrorFunc) fprintf,
 3550: 		(xmlRelaxNGValidityWarningFunc) fprintf,
 3551: 		stderr);
 3552: 	relaxngschemas = xmlRelaxNGParse(ctxt);
 3553: 	if (relaxngschemas == NULL) {
 3554: 	    xmlGenericError(xmlGenericErrorContext,
 3555: 		    "Relax-NG schema %s failed to compile\n", relaxng);
 3556:             progresult = XMLLINT_ERR_SCHEMACOMP;
 3557: 	    relaxng = NULL;
 3558: 	}
 3559: 	xmlRelaxNGFreeParserCtxt(ctxt);
 3560: 	if (timing) {
 3561: 	    endTimer("Compiling the schemas");
 3562: 	}
 3563:     } else if ((schema != NULL)
 3564: #ifdef LIBXML_READER_ENABLED
 3565: 		&& (stream == 0)
 3566: #endif
 3567: 	) {
 3568: 	xmlSchemaParserCtxtPtr ctxt;
 3569: 
 3570: 	if (timing) {
 3571: 	    startTimer();
 3572: 	}
 3573: 	ctxt = xmlSchemaNewParserCtxt(schema);
 3574: 	xmlSchemaSetParserErrors(ctxt,
 3575: 		(xmlSchemaValidityErrorFunc) fprintf,
 3576: 		(xmlSchemaValidityWarningFunc) fprintf,
 3577: 		stderr);
 3578: 	wxschemas = xmlSchemaParse(ctxt);
 3579: 	if (wxschemas == NULL) {
 3580: 	    xmlGenericError(xmlGenericErrorContext,
 3581: 		    "WXS schema %s failed to compile\n", schema);
 3582:             progresult = XMLLINT_ERR_SCHEMACOMP;
 3583: 	    schema = NULL;
 3584: 	}
 3585: 	xmlSchemaFreeParserCtxt(ctxt);
 3586: 	if (timing) {
 3587: 	    endTimer("Compiling the schemas");
 3588: 	}
 3589:     }
 3590: #endif /* LIBXML_SCHEMAS_ENABLED */
 3591: #ifdef LIBXML_PATTERN_ENABLED
 3592:     if ((pattern != NULL)
 3593: #ifdef LIBXML_READER_ENABLED
 3594:         && (walker == 0)
 3595: #endif
 3596: 	) {
 3597:         patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
 3598: 	if (patternc == NULL) {
 3599: 	    xmlGenericError(xmlGenericErrorContext,
 3600: 		    "Pattern %s failed to compile\n", pattern);
 3601:             progresult = XMLLINT_ERR_SCHEMAPAT;
 3602: 	    pattern = NULL;
 3603: 	}
 3604:     }
 3605: #endif /* LIBXML_PATTERN_ENABLED */
 3606:     for (i = 1; i < argc ; i++) {
 3607: 	if ((!strcmp(argv[i], "-encode")) ||
 3608: 	         (!strcmp(argv[i], "--encode"))) {
 3609: 	    i++;
 3610: 	    continue;
 3611:         } else if ((!strcmp(argv[i], "-o")) ||
 3612:                    (!strcmp(argv[i], "-output")) ||
 3613:                    (!strcmp(argv[i], "--output"))) {
 3614:             i++;
 3615: 	    continue;
 3616:         }
 3617: #ifdef LIBXML_VALID_ENABLED
 3618: 	if ((!strcmp(argv[i], "-dtdvalid")) ||
 3619: 	         (!strcmp(argv[i], "--dtdvalid"))) {
 3620: 	    i++;
 3621: 	    continue;
 3622:         }
 3623: 	if ((!strcmp(argv[i], "-path")) ||
 3624:                    (!strcmp(argv[i], "--path"))) {
 3625:             i++;
 3626: 	    continue;
 3627:         }
 3628: 	if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
 3629: 	         (!strcmp(argv[i], "--dtdvalidfpi"))) {
 3630: 	    i++;
 3631: 	    continue;
 3632:         }
 3633: #endif /* LIBXML_VALID_ENABLED */
 3634: 	if ((!strcmp(argv[i], "-relaxng")) ||
 3635: 	         (!strcmp(argv[i], "--relaxng"))) {
 3636: 	    i++;
 3637: 	    continue;
 3638:         }
 3639: 	if ((!strcmp(argv[i], "-maxmem")) ||
 3640: 	         (!strcmp(argv[i], "--maxmem"))) {
 3641: 	    i++;
 3642: 	    continue;
 3643:         }
 3644: 	if ((!strcmp(argv[i], "-pretty")) ||
 3645: 	         (!strcmp(argv[i], "--pretty"))) {
 3646: 	    i++;
 3647: 	    continue;
 3648:         }
 3649: 	if ((!strcmp(argv[i], "-schema")) ||
 3650: 	         (!strcmp(argv[i], "--schema"))) {
 3651: 	    i++;
 3652: 	    continue;
 3653:         }
 3654: 	if ((!strcmp(argv[i], "-schematron")) ||
 3655: 	         (!strcmp(argv[i], "--schematron"))) {
 3656: 	    i++;
 3657: 	    continue;
 3658:         }
 3659: #ifdef LIBXML_PATTERN_ENABLED
 3660:         if ((!strcmp(argv[i], "-pattern")) ||
 3661: 	    (!strcmp(argv[i], "--pattern"))) {
 3662: 	    i++;
 3663: 	    continue;
 3664: 	}
 3665: #endif
 3666: #ifdef LIBXML_XPATH_ENABLED
 3667:         if ((!strcmp(argv[i], "-xpath")) ||
 3668: 	    (!strcmp(argv[i], "--xpath"))) {
 3669: 	    i++;
 3670: 	    continue;
 3671: 	}
 3672: #endif
 3673: 	if ((timing) && (repeat))
 3674: 	    startTimer();
 3675: 	/* Remember file names.  "-" means stdin.  <sven@zen.org> */
 3676: 	if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0)) {
 3677: 	    if (repeat) {
 3678: 		xmlParserCtxtPtr ctxt = NULL;
 3679: 
 3680: 		for (acount = 0;acount < repeat;acount++) {
 3681: #ifdef LIBXML_READER_ENABLED
 3682: 		    if (stream != 0) {
 3683: 			streamFile(argv[i]);
 3684: 		    } else {
 3685: #endif /* LIBXML_READER_ENABLED */
 3686:                         if (sax) {
 3687: 			    testSAX(argv[i]);
 3688: 			} else {
 3689: 			    if (ctxt == NULL)
 3690: 				ctxt = xmlNewParserCtxt();
 3691: 			    parseAndPrintFile(argv[i], ctxt);
 3692: 			}
 3693: #ifdef LIBXML_READER_ENABLED
 3694: 		    }
 3695: #endif /* LIBXML_READER_ENABLED */
 3696: 		}
 3697: 		if (ctxt != NULL)
 3698: 		    xmlFreeParserCtxt(ctxt);
 3699: 	    } else {
 3700: 		nbregister = 0;
 3701: 
 3702: #ifdef LIBXML_READER_ENABLED
 3703: 		if (stream != 0)
 3704: 		    streamFile(argv[i]);
 3705: 		else
 3706: #endif /* LIBXML_READER_ENABLED */
 3707:                 if (sax) {
 3708: 		    testSAX(argv[i]);
 3709: 		} else {
 3710: 		    parseAndPrintFile(argv[i], NULL);
 3711: 		}
 3712: 
 3713:                 if ((chkregister) && (nbregister != 0)) {
 3714: 		    fprintf(stderr, "Registration count off: %d\n", nbregister);
 3715: 		    progresult = XMLLINT_ERR_RDREGIS;
 3716: 		}
 3717: 	    }
 3718: 	    files ++;
 3719: 	    if ((timing) && (repeat)) {
 3720: 		endTimer("%d iterations", repeat);
 3721: 	    }
 3722: 	}
 3723:     }
 3724:     if (generate)
 3725: 	parseAndPrintFile(NULL, NULL);
 3726:     if ((htmlout) && (!nowrap)) {
 3727: 	xmlGenericError(xmlGenericErrorContext, "</body></html>\n");
 3728:     }
 3729:     if ((files == 0) && (!generate) && (version == 0)) {
 3730: 	usage(argv[0]);
 3731:     }
 3732: #ifdef LIBXML_SCHEMATRON_ENABLED
 3733:     if (wxschematron != NULL)
 3734: 	xmlSchematronFree(wxschematron);
 3735: #endif
 3736: #ifdef LIBXML_SCHEMAS_ENABLED
 3737:     if (relaxngschemas != NULL)
 3738: 	xmlRelaxNGFree(relaxngschemas);
 3739:     if (wxschemas != NULL)
 3740: 	xmlSchemaFree(wxschemas);
 3741:     xmlRelaxNGCleanupTypes();
 3742: #endif
 3743: #ifdef LIBXML_PATTERN_ENABLED
 3744:     if (patternc != NULL)
 3745:         xmlFreePattern(patternc);
 3746: #endif
 3747:     xmlCleanupParser();
 3748:     xmlMemoryDump();
 3749: 
 3750:     return(progresult);
 3751: }
 3752: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>