Annotation of embedaddon/libxml2/xmllint.c, revision 1.1

1.1     ! misho       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>