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

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

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