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