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