2 * xmllint.c : a small tester program for XML input.
4 * See Copyright for the status of this software.
15 #if defined (_WIN32) && !defined(__CYGWIN__)
16 #if defined (_MSC_VER) || defined(__BORLANDC__)
18 #pragma comment(lib, "ws2_32.lib")
19 #define gettimeofday(p1,p2)
23 #ifdef HAVE_SYS_TIME_H
32 #include <wsockcompat.h>
35 #define XML_SOCKLEN_T unsigned int
38 #ifdef HAVE_SYS_TIMEB_H
39 #include <sys/timeb.h>
42 #ifdef HAVE_SYS_TYPES_H
43 #include <sys/types.h>
45 #ifdef HAVE_SYS_STAT_H
54 #ifdef HAVE_SYS_MMAN_H
56 /* seems needed for Solaris */
58 #define MAP_FAILED ((void *) -1)
64 #ifdef HAVE_LIBREADLINE
65 #include <readline/readline.h>
66 #ifdef HAVE_LIBHISTORY
67 #include <readline/history.h>
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>
83 #ifdef LIBXML_CATALOG_ENABLED
84 #include <libxml/catalog.h>
86 #include <libxml/globals.h>
87 #include <libxml/xmlreader.h>
88 #ifdef LIBXML_SCHEMATRON_ENABLED
89 #include <libxml/schematron.h>
91 #ifdef LIBXML_SCHEMAS_ENABLED
92 #include <libxml/relaxng.h>
93 #include <libxml/xmlschemas.h>
95 #ifdef LIBXML_PATTERN_ENABLED
96 #include <libxml/pattern.h>
98 #ifdef LIBXML_C14N_ENABLED
99 #include <libxml/c14n.h>
101 #ifdef LIBXML_OUTPUT_ENABLED
102 #include <libxml/xmlsave.h>
105 #ifndef XML_XML_DEFAULT_CATALOG
106 #define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
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 */
122 #ifdef LIBXML_DEBUG_ENABLED
123 static int shell
= 0;
124 static int debugent
= 0;
126 static int debug
= 0;
127 static int maxmem
= 0;
128 #ifdef LIBXML_TREE_ENABLED
130 #endif /* LIBXML_TREE_ENABLED */
131 static int recovery
= 0;
132 static int noent
= 0;
133 static int noenc
= 0;
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
;
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
;
155 #ifdef LIBXML_SCHEMATRON_ENABLED
156 static char * schematron
= NULL
;
157 static xmlSchematronPtr wxschematron
= NULL
;
159 static int repeat
= 0;
160 static int insert
= 0;
161 #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
163 static int xmlout
= 0;
165 static int htmlout
= 0;
166 #if defined(LIBXML_HTML_ENABLED)
167 static int nodefdtd
= 0;
169 #ifdef LIBXML_PUSH_ENABLED
171 static int pushsize
= 4096;
172 #endif /* LIBXML_PUSH_ENABLED */
174 static int memory
= 0;
176 static int testIO
= 0;
177 static char *encoding
= NULL
;
178 #ifdef LIBXML_XINCLUDE_ENABLED
179 static int xinclude
= 0;
181 static int dtdattrs
= 0;
182 static int loaddtd
= 0;
183 static xmllintReturnCode progresult
= XMLLINT_RETURN_OK
;
184 static int timing
= 0;
185 static int generate
= 0;
186 static int dropdtd
= 0;
187 #ifdef LIBXML_CATALOG_ENABLED
188 static int catalogs
= 0;
189 static int nocatalogs
= 0;
191 #ifdef LIBXML_C14N_ENABLED
192 static int canonical
= 0;
193 static int canonical_11
= 0;
194 static int exc_canonical
= 0;
196 #ifdef LIBXML_READER_ENABLED
197 static int stream
= 0;
198 static int walker
= 0;
199 #endif /* LIBXML_READER_ENABLED */
200 static int chkregister
= 0;
201 static int nbregister
= 0;
202 #ifdef LIBXML_SAX1_ENABLED
204 #endif /* LIBXML_SAX1_ENABLED */
205 #ifdef LIBXML_PATTERN_ENABLED
206 static const char *pattern
= NULL
;
207 static xmlPatternPtr patternc
= NULL
;
208 static xmlStreamCtxtPtr patstream
= NULL
;
210 #ifdef LIBXML_XPATH_ENABLED
211 static const char *xpathquery
= NULL
;
213 static int options
= XML_PARSE_COMPACT
| XML_PARSE_BIG_LINES
;
215 static int oldxml10
= 0;
217 /************************************************************************
219 * Entity loading control and customization. *
221 ************************************************************************/
224 # define PATH_SEPARATOR ';'
226 # define PATH_SEPARATOR ':'
228 static xmlChar
*paths
[MAX_PATHS
+ 1];
229 static int nbpaths
= 0;
230 static int load_trace
= 0;
233 void parsePath(const xmlChar
*path
) {
239 if (nbpaths
>= MAX_PATHS
) {
240 fprintf(stderr
, "MAX_PATHS reached: too many paths\n");
244 while ((*cur
== ' ') || (*cur
== PATH_SEPARATOR
))
247 while ((*cur
!= 0) && (*cur
!= ' ') && (*cur
!= PATH_SEPARATOR
))
250 paths
[nbpaths
] = xmlStrndup(path
, cur
- path
);
251 if (paths
[nbpaths
] != NULL
)
258 static xmlExternalEntityLoader defaultEntityLoader
= NULL
;
260 static xmlParserInputPtr
261 xmllintExternalEntityLoader(const char *URL
, const char *ID
,
262 xmlParserCtxtPtr ctxt
) {
263 xmlParserInputPtr ret
;
264 warningSAXFunc warning
= NULL
;
265 errorSAXFunc err
= NULL
;
268 const char *lastsegment
= URL
;
269 const char *iter
= URL
;
271 if ((nbpaths
> 0) && (iter
!= NULL
)) {
274 lastsegment
= iter
+ 1;
279 if ((ctxt
!= NULL
) && (ctxt
->sax
!= NULL
)) {
280 warning
= ctxt
->sax
->warning
;
281 err
= ctxt
->sax
->error
;
282 ctxt
->sax
->warning
= NULL
;
283 ctxt
->sax
->error
= NULL
;
286 if (defaultEntityLoader
!= NULL
) {
287 ret
= defaultEntityLoader(URL
, ID
, ctxt
);
290 ctxt
->sax
->warning
= warning
;
292 ctxt
->sax
->error
= err
;
296 "Loaded URL=\"%s\" ID=\"%s\"\n",
297 URL
? URL
: "(null)",
303 for (i
= 0;i
< nbpaths
;i
++) {
306 newURL
= xmlStrdup((const xmlChar
*) paths
[i
]);
307 newURL
= xmlStrcat(newURL
, (const xmlChar
*) "/");
308 newURL
= xmlStrcat(newURL
, (const xmlChar
*) lastsegment
);
309 if (newURL
!= NULL
) {
310 ret
= defaultEntityLoader((const char *)newURL
, ID
, ctxt
);
313 ctxt
->sax
->warning
= warning
;
315 ctxt
->sax
->error
= err
;
319 "Loaded URL=\"%s\" ID=\"%s\"\n",
330 ctxt
->sax
->error
= err
;
331 if (warning
!= NULL
) {
332 ctxt
->sax
->warning
= warning
;
334 warning(ctxt
, "failed to load external entity \"%s\"\n", URL
);
336 warning(ctxt
, "failed to load external entity \"%s\"\n", ID
);
340 /************************************************************************
342 * Memory allocation consumption debugging *
344 ************************************************************************/
349 fprintf(stderr
, "Ran out of memory needs > %d bytes\n", maxmem
);
350 progresult
= XMLLINT_ERR_MEM
;
354 myFreeFunc(void *mem
)
359 myMallocFunc(size_t size
)
363 ret
= xmlMemMalloc(size
);
365 if (xmlMemUsed() > maxmem
) {
374 myReallocFunc(void *mem
, size_t size
)
378 ret
= xmlMemRealloc(mem
, size
);
380 if (xmlMemUsed() > maxmem
) {
389 myStrdupFunc(const char *str
)
393 ret
= xmlMemoryStrdup(str
);
395 if (xmlMemUsed() > maxmem
) {
403 /************************************************************************
405 * Internal timing routines to remove the necessity to have *
406 * unix-specific function calls. *
408 ************************************************************************/
410 #ifndef HAVE_GETTIMEOFDAY
411 #ifdef HAVE_SYS_TIMEB_H
412 #ifdef HAVE_SYS_TIME_H
416 my_gettimeofday(struct timeval
*tvp
, void *tzp
)
418 struct timeb timebuffer
;
422 tvp
->tv_sec
= timebuffer
.time
;
423 tvp
->tv_usec
= timebuffer
.millitm
* 1000L;
427 #define HAVE_GETTIMEOFDAY 1
428 #define gettimeofday my_gettimeofday
430 #endif /* HAVE_FTIME */
431 #endif /* HAVE_SYS_TIME_H */
432 #endif /* HAVE_SYS_TIMEB_H */
433 #endif /* !HAVE_GETTIMEOFDAY */
435 #if defined(HAVE_GETTIMEOFDAY)
436 static struct timeval begin
, end
;
439 * startTimer: call where you want to start timing
444 gettimeofday(&begin
, NULL
);
448 * endTimer: call where you want to stop timing and to print out a
449 * message about the timing performed; format is a printf
453 endTimer(const char *fmt
, ...)
458 gettimeofday(&end
, NULL
);
459 msec
= end
.tv_sec
- begin
.tv_sec
;
461 msec
+= (end
.tv_usec
- begin
.tv_usec
) / 1000;
463 #ifndef HAVE_STDARG_H
464 #error "endTimer required stdarg functions"
467 vfprintf(stderr
, fmt
, ap
);
470 fprintf(stderr
, " took %ld ms\n", msec
);
472 #elif defined(HAVE_TIME_H)
474 * No gettimeofday function, so we have to make do with calling clock.
475 * This is obviously less accurate, but there's little we can do about
478 #ifndef CLOCKS_PER_SEC
479 #define CLOCKS_PER_SEC 100
482 static clock_t begin
, end
;
489 endTimer(const char *fmt
, ...)
495 msec
= ((end
- begin
) * 1000) / CLOCKS_PER_SEC
;
497 #ifndef HAVE_STDARG_H
498 #error "endTimer required stdarg functions"
501 vfprintf(stderr
, fmt
, ap
);
503 fprintf(stderr
, " took %ld ms\n", msec
);
508 * We don't have a gettimeofday or time.h, so we just don't do timing
518 endTimer(char *format
, ...)
521 * We cannot do anything because we don't have a timing function
525 va_start(ap
, format
);
526 vfprintf(stderr
, format
, ap
);
528 fprintf(stderr
, " was not timed\n");
530 /* We don't have gettimeofday, time or stdarg.h, what crazy world is
536 /************************************************************************
540 ************************************************************************/
541 static char buffer
[50000];
544 xmlHTMLEncodeSend(void) {
547 result
= (char *) xmlEncodeEntitiesReentrant(NULL
, BAD_CAST buffer
);
549 xmlGenericError(xmlGenericErrorContext
, "%s", result
);
556 * xmlHTMLPrintFileInfo:
557 * @input: an xmlParserInputPtr input
559 * Displays the associated file and line informations for the current input
563 xmlHTMLPrintFileInfo(xmlParserInputPtr input
) {
565 xmlGenericError(xmlGenericErrorContext
, "<p>");
567 len
= strlen(buffer
);
569 if (input
->filename
) {
570 snprintf(&buffer
[len
], sizeof(buffer
) - len
, "%s:%d: ", input
->filename
,
573 snprintf(&buffer
[len
], sizeof(buffer
) - len
, "Entity: line %d: ", input
->line
);
580 * xmlHTMLPrintFileContext:
581 * @input: an xmlParserInputPtr input
583 * Displays current context within the input content for error tracking
587 xmlHTMLPrintFileContext(xmlParserInputPtr input
) {
588 const xmlChar
*cur
, *base
;
592 if (input
== NULL
) return;
593 xmlGenericError(xmlGenericErrorContext
, "<pre>\n");
596 while ((cur
> base
) && ((*cur
== '\n') || (*cur
== '\r'))) {
600 while ((n
++ < 80) && (cur
> base
) && (*cur
!= '\n') && (*cur
!= '\r'))
602 if ((*cur
== '\n') || (*cur
== '\r')) cur
++;
605 while ((*cur
!= 0) && (*cur
!= '\n') && (*cur
!= '\r') && (n
< 79)) {
606 len
= strlen(buffer
);
607 snprintf(&buffer
[len
], sizeof(buffer
) - len
, "%c",
608 (unsigned char) *cur
++);
611 len
= strlen(buffer
);
612 snprintf(&buffer
[len
], sizeof(buffer
) - len
, "\n");
614 while ((*cur
== '\n') || (*cur
== '\r'))
617 while ((cur
!= base
) && (n
++ < 80)) {
618 len
= strlen(buffer
);
619 snprintf(&buffer
[len
], sizeof(buffer
) - len
, " ");
622 len
= strlen(buffer
);
623 snprintf(&buffer
[len
], sizeof(buffer
) - len
, "^\n");
625 xmlGenericError(xmlGenericErrorContext
, "</pre>");
630 * @ctx: an XML parser context
631 * @msg: the message to display/transmit
632 * @...: extra parameters for the message display
634 * Display and format an error messages, gives file, line, position and
638 xmlHTMLError(void *ctx
, const char *msg
, ...)
640 xmlParserCtxtPtr ctxt
= (xmlParserCtxtPtr
) ctx
;
641 xmlParserInputPtr input
;
647 if ((input
!= NULL
) && (input
->filename
== NULL
) && (ctxt
->inputNr
> 1)) {
648 input
= ctxt
->inputTab
[ctxt
->inputNr
- 2];
651 xmlHTMLPrintFileInfo(input
);
653 xmlGenericError(xmlGenericErrorContext
, "<b>error</b>: ");
655 len
= strlen(buffer
);
656 vsnprintf(&buffer
[len
], sizeof(buffer
) - len
, msg
, args
);
659 xmlGenericError(xmlGenericErrorContext
, "</p>\n");
661 xmlHTMLPrintFileContext(input
);
667 * @ctx: an XML parser context
668 * @msg: the message to display/transmit
669 * @...: extra parameters for the message display
671 * Display and format a warning messages, gives file, line, position and
675 xmlHTMLWarning(void *ctx
, const char *msg
, ...)
677 xmlParserCtxtPtr ctxt
= (xmlParserCtxtPtr
) ctx
;
678 xmlParserInputPtr input
;
684 if ((input
!= NULL
) && (input
->filename
== NULL
) && (ctxt
->inputNr
> 1)) {
685 input
= ctxt
->inputTab
[ctxt
->inputNr
- 2];
689 xmlHTMLPrintFileInfo(input
);
691 xmlGenericError(xmlGenericErrorContext
, "<b>warning</b>: ");
693 len
= strlen(buffer
);
694 vsnprintf(&buffer
[len
], sizeof(buffer
) - len
, msg
, args
);
697 xmlGenericError(xmlGenericErrorContext
, "</p>\n");
699 xmlHTMLPrintFileContext(input
);
704 * xmlHTMLValidityError:
705 * @ctx: an XML parser context
706 * @msg: the message to display/transmit
707 * @...: extra parameters for the message display
709 * Display and format an validity error messages, gives file,
710 * line, position and extra parameters.
713 xmlHTMLValidityError(void *ctx
, const char *msg
, ...)
715 xmlParserCtxtPtr ctxt
= (xmlParserCtxtPtr
) ctx
;
716 xmlParserInputPtr input
;
722 if ((input
->filename
== NULL
) && (ctxt
->inputNr
> 1))
723 input
= ctxt
->inputTab
[ctxt
->inputNr
- 2];
725 xmlHTMLPrintFileInfo(input
);
727 xmlGenericError(xmlGenericErrorContext
, "<b>validity error</b>: ");
728 len
= strlen(buffer
);
730 vsnprintf(&buffer
[len
], sizeof(buffer
) - len
, msg
, args
);
733 xmlGenericError(xmlGenericErrorContext
, "</p>\n");
735 xmlHTMLPrintFileContext(input
);
737 progresult
= XMLLINT_ERR_VALID
;
741 * xmlHTMLValidityWarning:
742 * @ctx: an XML parser context
743 * @msg: the message to display/transmit
744 * @...: extra parameters for the message display
746 * Display and format a validity warning messages, gives file, line,
747 * position and extra parameters.
750 xmlHTMLValidityWarning(void *ctx
, const char *msg
, ...)
752 xmlParserCtxtPtr ctxt
= (xmlParserCtxtPtr
) ctx
;
753 xmlParserInputPtr input
;
759 if ((input
->filename
== NULL
) && (ctxt
->inputNr
> 1))
760 input
= ctxt
->inputTab
[ctxt
->inputNr
- 2];
762 xmlHTMLPrintFileInfo(input
);
764 xmlGenericError(xmlGenericErrorContext
, "<b>validity warning</b>: ");
766 len
= strlen(buffer
);
767 vsnprintf(&buffer
[len
], sizeof(buffer
) - len
, msg
, args
);
770 xmlGenericError(xmlGenericErrorContext
, "</p>\n");
772 xmlHTMLPrintFileContext(input
);
776 /************************************************************************
780 ************************************************************************/
781 #ifdef LIBXML_DEBUG_ENABLED
782 #ifdef LIBXML_XPATH_ENABLED
785 * @prompt: the prompt value
789 * Returns a pointer to it or NULL on EOF the caller is expected to
790 * free the returned string.
793 xmlShellReadline(char *prompt
) {
794 #ifdef HAVE_LIBREADLINE
797 /* Get a line from the user. */
798 line_read
= readline (prompt
);
800 /* If the line has any text in it, save it on the history. */
801 if (line_read
&& *line_read
)
802 add_history (line_read
);
811 fprintf(stdout
, "%s", prompt
);
812 if (!fgets(line_read
, 500, stdin
))
815 len
= strlen(line_read
);
816 ret
= (char *) malloc(len
+ 1);
818 memcpy (ret
, line_read
, len
+ 1);
823 #endif /* LIBXML_XPATH_ENABLED */
824 #endif /* LIBXML_DEBUG_ENABLED */
826 /************************************************************************
830 ************************************************************************/
832 static int myRead(FILE *f
, char * buf
, int len
) {
833 return(fread(buf
, 1, len
, f
));
835 static void myClose(FILE *f
) {
841 /************************************************************************
845 ************************************************************************/
850 static xmlSAXHandler emptySAXHandlerStruct
= {
851 NULL
, /* internalSubset */
852 NULL
, /* isStandalone */
853 NULL
, /* hasInternalSubset */
854 NULL
, /* hasExternalSubset */
855 NULL
, /* resolveEntity */
856 NULL
, /* getEntity */
857 NULL
, /* entityDecl */
858 NULL
, /* notationDecl */
859 NULL
, /* attributeDecl */
860 NULL
, /* elementDecl */
861 NULL
, /* unparsedEntityDecl */
862 NULL
, /* setDocumentLocator */
863 NULL
, /* startDocument */
864 NULL
, /* endDocument */
865 NULL
, /* startElement */
866 NULL
, /* endElement */
867 NULL
, /* reference */
868 NULL
, /* characters */
869 NULL
, /* ignorableWhitespace */
870 NULL
, /* processingInstruction */
872 NULL
, /* xmlParserWarning */
873 NULL
, /* xmlParserError */
874 NULL
, /* xmlParserError */
875 NULL
, /* getParameterEntity */
876 NULL
, /* cdataBlock; */
877 NULL
, /* externalSubset; */
880 NULL
, /* startElementNs */
881 NULL
, /* endElementNs */
882 NULL
/* xmlStructuredErrorFunc */
885 static xmlSAXHandlerPtr emptySAXHandler
= &emptySAXHandlerStruct
;
886 extern xmlSAXHandlerPtr debugSAXHandler
;
887 static int callbacks
;
891 * @ctxt: An XML parser context
893 * Is this document tagged standalone ?
898 isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED
)
903 fprintf(stdout
, "SAX.isStandalone()\n");
908 * hasInternalSubsetDebug:
909 * @ctxt: An XML parser context
911 * Does this document has an internal subset
916 hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED
)
921 fprintf(stdout
, "SAX.hasInternalSubset()\n");
926 * hasExternalSubsetDebug:
927 * @ctxt: An XML parser context
929 * Does this document has an external subset
934 hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED
)
939 fprintf(stdout
, "SAX.hasExternalSubset()\n");
944 * internalSubsetDebug:
945 * @ctxt: An XML parser context
947 * Does this document has an internal subset
950 internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
,
951 const xmlChar
*ExternalID
, const xmlChar
*SystemID
)
956 fprintf(stdout
, "SAX.internalSubset(%s,", name
);
957 if (ExternalID
== NULL
)
958 fprintf(stdout
, " ,");
960 fprintf(stdout
, " %s,", ExternalID
);
961 if (SystemID
== NULL
)
962 fprintf(stdout
, " )\n");
964 fprintf(stdout
, " %s)\n", SystemID
);
968 * externalSubsetDebug:
969 * @ctxt: An XML parser context
971 * Does this document has an external subset
974 externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
,
975 const xmlChar
*ExternalID
, const xmlChar
*SystemID
)
980 fprintf(stdout
, "SAX.externalSubset(%s,", name
);
981 if (ExternalID
== NULL
)
982 fprintf(stdout
, " ,");
984 fprintf(stdout
, " %s,", ExternalID
);
985 if (SystemID
== NULL
)
986 fprintf(stdout
, " )\n");
988 fprintf(stdout
, " %s)\n", SystemID
);
992 * resolveEntityDebug:
993 * @ctxt: An XML parser context
994 * @publicId: The public ID of the entity
995 * @systemId: The system ID of the entity
997 * Special entity resolver, better left to the parser, it has
998 * more context than the application layer.
999 * The default behaviour is to NOT resolve the entities, in that case
1000 * the ENTITY_REF nodes are built in the structure (and the parameter
1003 * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
1005 static xmlParserInputPtr
1006 resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*publicId
, const xmlChar
*systemId
)
1011 /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
1014 fprintf(stdout
, "SAX.resolveEntity(");
1015 if (publicId
!= NULL
)
1016 fprintf(stdout
, "%s", (char *)publicId
);
1018 fprintf(stdout
, " ");
1019 if (systemId
!= NULL
)
1020 fprintf(stdout
, ", %s)\n", (char *)systemId
);
1022 fprintf(stdout
, ", )\n");
1028 * @ctxt: An XML parser context
1029 * @name: The entity name
1031 * Get an entity by name
1033 * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
1036 getEntityDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
)
1041 fprintf(stdout
, "SAX.getEntity(%s)\n", name
);
1046 * getParameterEntityDebug:
1047 * @ctxt: An XML parser context
1048 * @name: The entity name
1050 * Get a parameter entity by name
1052 * Returns the xmlParserInputPtr
1055 getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
)
1060 fprintf(stdout
, "SAX.getParameterEntity(%s)\n", name
);
1067 * @ctxt: An XML parser context
1068 * @name: the entity name
1069 * @type: the entity type
1070 * @publicId: The public ID of the entity
1071 * @systemId: The system ID of the entity
1072 * @content: the entity value (without processing).
1074 * An entity definition has been parsed
1077 entityDeclDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
, int type
,
1078 const xmlChar
*publicId
, const xmlChar
*systemId
, xmlChar
*content
)
1080 const xmlChar
*nullstr
= BAD_CAST
"(null)";
1081 /* not all libraries handle printing null pointers nicely */
1082 if (publicId
== NULL
)
1084 if (systemId
== NULL
)
1086 if (content
== NULL
)
1087 content
= (xmlChar
*)nullstr
;
1091 fprintf(stdout
, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
1092 name
, type
, publicId
, systemId
, content
);
1096 * attributeDeclDebug:
1097 * @ctxt: An XML parser context
1098 * @name: the attribute name
1099 * @type: the attribute type
1101 * An attribute definition has been parsed
1104 attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
* elem
,
1105 const xmlChar
* name
, int type
, int def
,
1106 const xmlChar
* defaultValue
, xmlEnumerationPtr tree
)
1111 if (defaultValue
== NULL
)
1112 fprintf(stdout
, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
1113 elem
, name
, type
, def
);
1115 fprintf(stdout
, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
1116 elem
, name
, type
, def
, defaultValue
);
1117 xmlFreeEnumeration(tree
);
1122 * @ctxt: An XML parser context
1123 * @name: the element name
1124 * @type: the element type
1125 * @content: the element value (without processing).
1127 * An element definition has been parsed
1130 elementDeclDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
, int type
,
1131 xmlElementContentPtr content ATTRIBUTE_UNUSED
)
1136 fprintf(stdout
, "SAX.elementDecl(%s, %d, ...)\n",
1141 * notationDeclDebug:
1142 * @ctxt: An XML parser context
1143 * @name: The name of the notation
1144 * @publicId: The public ID of the entity
1145 * @systemId: The system ID of the entity
1147 * What to do when a notation declaration has been parsed.
1150 notationDeclDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
,
1151 const xmlChar
*publicId
, const xmlChar
*systemId
)
1156 fprintf(stdout
, "SAX.notationDecl(%s, %s, %s)\n",
1157 (char *) name
, (char *) publicId
, (char *) systemId
);
1161 * unparsedEntityDeclDebug:
1162 * @ctxt: An XML parser context
1163 * @name: The name of the entity
1164 * @publicId: The public ID of the entity
1165 * @systemId: The system ID of the entity
1166 * @notationName: the name of the notation
1168 * What to do when an unparsed entity declaration is parsed
1171 unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
,
1172 const xmlChar
*publicId
, const xmlChar
*systemId
,
1173 const xmlChar
*notationName
)
1175 const xmlChar
*nullstr
= BAD_CAST
"(null)";
1177 if (publicId
== NULL
)
1179 if (systemId
== NULL
)
1181 if (notationName
== NULL
)
1182 notationName
= nullstr
;
1186 fprintf(stdout
, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
1187 (char *) name
, (char *) publicId
, (char *) systemId
,
1188 (char *) notationName
);
1192 * setDocumentLocatorDebug:
1193 * @ctxt: An XML parser context
1194 * @loc: A SAX Locator
1196 * Receive the document locator at startup, actually xmlDefaultSAXLocator
1197 * Everything is available on the context, so this is useless in our case.
1200 setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED
, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED
)
1205 fprintf(stdout
, "SAX.setDocumentLocator()\n");
1209 * startDocumentDebug:
1210 * @ctxt: An XML parser context
1212 * called when the document start being processed.
1215 startDocumentDebug(void *ctx ATTRIBUTE_UNUSED
)
1220 fprintf(stdout
, "SAX.startDocument()\n");
1225 * @ctxt: An XML parser context
1227 * called when the document end has been detected.
1230 endDocumentDebug(void *ctx ATTRIBUTE_UNUSED
)
1235 fprintf(stdout
, "SAX.endDocument()\n");
1239 * startElementDebug:
1240 * @ctxt: An XML parser context
1241 * @name: The element name
1243 * called when an opening tag has been processed.
1246 startElementDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
, const xmlChar
**atts
)
1253 fprintf(stdout
, "SAX.startElement(%s", (char *) name
);
1255 for (i
= 0;(atts
[i
] != NULL
);i
++) {
1256 fprintf(stdout
, ", %s='", atts
[i
++]);
1257 if (atts
[i
] != NULL
)
1258 fprintf(stdout
, "%s'", atts
[i
]);
1261 fprintf(stdout
, ")\n");
1266 * @ctxt: An XML parser context
1267 * @name: The element name
1269 * called when the end of an element has been detected.
1272 endElementDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
)
1277 fprintf(stdout
, "SAX.endElement(%s)\n", (char *) name
);
1282 * @ctxt: An XML parser context
1283 * @ch: a xmlChar string
1284 * @len: the number of xmlChar
1286 * receiving some chars from the parser.
1287 * Question: how much at a time ???
1290 charactersDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*ch
, int len
)
1298 for (i
= 0;(i
<len
) && (i
< 30);i
++)
1302 fprintf(stdout
, "SAX.characters(%s, %d)\n", out
, len
);
1307 * @ctxt: An XML parser context
1308 * @name: The entity name
1310 * called when an entity reference is detected.
1313 referenceDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*name
)
1318 fprintf(stdout
, "SAX.reference(%s)\n", name
);
1322 * ignorableWhitespaceDebug:
1323 * @ctxt: An XML parser context
1324 * @ch: a xmlChar string
1325 * @start: the first char in the string
1326 * @len: the number of xmlChar
1328 * receiving some ignorable whitespaces from the parser.
1329 * Question: how much at a time ???
1332 ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*ch
, int len
)
1340 for (i
= 0;(i
<len
) && (i
< 30);i
++)
1343 fprintf(stdout
, "SAX.ignorableWhitespace(%s, %d)\n", out
, len
);
1347 * processingInstructionDebug:
1348 * @ctxt: An XML parser context
1349 * @target: the target name
1350 * @data: the PI data's
1351 * @len: the number of xmlChar
1353 * A processing instruction has been parsed.
1356 processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*target
,
1357 const xmlChar
*data
)
1363 fprintf(stdout
, "SAX.processingInstruction(%s, %s)\n",
1364 (char *) target
, (char *) data
);
1366 fprintf(stdout
, "SAX.processingInstruction(%s, NULL)\n",
1372 * @ctx: the user data (XML parser context)
1373 * @value: The pcdata content
1374 * @len: the block length
1376 * called when a pcdata block has been parsed
1379 cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*value
, int len
)
1384 fprintf(stdout
, "SAX.pcdata(%.20s, %d)\n",
1385 (char *) value
, len
);
1390 * @ctxt: An XML parser context
1391 * @value: the comment content
1393 * A comment has been parsed.
1396 commentDebug(void *ctx ATTRIBUTE_UNUSED
, const xmlChar
*value
)
1401 fprintf(stdout
, "SAX.comment(%s)\n", value
);
1406 * @ctxt: An XML parser context
1407 * @msg: the message to display/transmit
1408 * @...: extra parameters for the message display
1410 * Display and format a warning messages, gives file, line, position and
1413 static void XMLCDECL
1414 warningDebug(void *ctx ATTRIBUTE_UNUSED
, const char *msg
, ...)
1421 va_start(args
, msg
);
1422 fprintf(stdout
, "SAX.warning: ");
1423 vfprintf(stdout
, msg
, args
);
1429 * @ctxt: An XML parser context
1430 * @msg: the message to display/transmit
1431 * @...: extra parameters for the message display
1433 * Display and format a error messages, gives file, line, position and
1436 static void XMLCDECL
1437 errorDebug(void *ctx ATTRIBUTE_UNUSED
, const char *msg
, ...)
1444 va_start(args
, msg
);
1445 fprintf(stdout
, "SAX.error: ");
1446 vfprintf(stdout
, msg
, args
);
1452 * @ctxt: An XML parser context
1453 * @msg: the message to display/transmit
1454 * @...: extra parameters for the message display
1456 * Display and format a fatalError messages, gives file, line, position and
1459 static void XMLCDECL
1460 fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED
, const char *msg
, ...)
1467 va_start(args
, msg
);
1468 fprintf(stdout
, "SAX.fatalError: ");
1469 vfprintf(stdout
, msg
, args
);
1473 static xmlSAXHandler debugSAXHandlerStruct
= {
1474 internalSubsetDebug
,
1476 hasInternalSubsetDebug
,
1477 hasExternalSubsetDebug
,
1484 unparsedEntityDeclDebug
,
1485 setDocumentLocatorDebug
,
1492 ignorableWhitespaceDebug
,
1493 processingInstructionDebug
,
1498 getParameterEntityDebug
,
1500 externalSubsetDebug
,
1508 xmlSAXHandlerPtr debugSAXHandler
= &debugSAXHandlerStruct
;
1511 * SAX2 specific callbacks
1514 * startElementNsDebug:
1515 * @ctxt: An XML parser context
1516 * @name: The element name
1518 * called when an opening tag has been processed.
1521 startElementNsDebug(void *ctx ATTRIBUTE_UNUSED
,
1522 const xmlChar
*localname
,
1523 const xmlChar
*prefix
,
1526 const xmlChar
**namespaces
,
1529 const xmlChar
**attributes
)
1536 fprintf(stdout
, "SAX.startElementNs(%s", (char *) localname
);
1538 fprintf(stdout
, ", NULL");
1540 fprintf(stdout
, ", %s", (char *) prefix
);
1542 fprintf(stdout
, ", NULL");
1544 fprintf(stdout
, ", '%s'", (char *) URI
);
1545 fprintf(stdout
, ", %d", nb_namespaces
);
1547 if (namespaces
!= NULL
) {
1548 for (i
= 0;i
< nb_namespaces
* 2;i
++) {
1549 fprintf(stdout
, ", xmlns");
1550 if (namespaces
[i
] != NULL
)
1551 fprintf(stdout
, ":%s", namespaces
[i
]);
1553 fprintf(stdout
, "='%s'", namespaces
[i
]);
1556 fprintf(stdout
, ", %d, %d", nb_attributes
, nb_defaulted
);
1557 if (attributes
!= NULL
) {
1558 for (i
= 0;i
< nb_attributes
* 5;i
+= 5) {
1559 if (attributes
[i
+ 1] != NULL
)
1560 fprintf(stdout
, ", %s:%s='", attributes
[i
+ 1], attributes
[i
]);
1562 fprintf(stdout
, ", %s='", attributes
[i
]);
1563 fprintf(stdout
, "%.4s...', %d", attributes
[i
+ 3],
1564 (int)(attributes
[i
+ 4] - attributes
[i
+ 3]));
1567 fprintf(stdout
, ")\n");
1572 * @ctxt: An XML parser context
1573 * @name: The element name
1575 * called when the end of an element has been detected.
1578 endElementNsDebug(void *ctx ATTRIBUTE_UNUSED
,
1579 const xmlChar
*localname
,
1580 const xmlChar
*prefix
,
1586 fprintf(stdout
, "SAX.endElementNs(%s", (char *) localname
);
1588 fprintf(stdout
, ", NULL");
1590 fprintf(stdout
, ", %s", (char *) prefix
);
1592 fprintf(stdout
, ", NULL)\n");
1594 fprintf(stdout
, ", '%s')\n", (char *) URI
);
1597 static xmlSAXHandler debugSAX2HandlerStruct
= {
1598 internalSubsetDebug
,
1600 hasInternalSubsetDebug
,
1601 hasExternalSubsetDebug
,
1608 unparsedEntityDeclDebug
,
1609 setDocumentLocatorDebug
,
1616 ignorableWhitespaceDebug
,
1617 processingInstructionDebug
,
1622 getParameterEntityDebug
,
1624 externalSubsetDebug
,
1627 startElementNsDebug
,
1632 static xmlSAXHandlerPtr debugSAX2Handler
= &debugSAX2HandlerStruct
;
1635 testSAX(const char *filename
) {
1636 xmlSAXHandlerPtr handler
;
1637 const char *user_data
= "user_data"; /* mostly for debugging */
1638 xmlParserInputBufferPtr buf
= NULL
;
1639 xmlParserInputPtr inputStream
;
1640 xmlParserCtxtPtr ctxt
= NULL
;
1641 xmlSAXHandlerPtr old_sax
= NULL
;
1646 handler
= emptySAXHandler
;
1647 #ifdef LIBXML_SAX1_ENABLED
1649 handler
= debugSAXHandler
;
1652 handler
= debugSAX2Handler
;
1656 * it's not the simplest code but the most generic in term of I/O
1658 buf
= xmlParserInputBufferCreateFilename(filename
, XML_CHAR_ENCODING_NONE
);
1663 #ifdef LIBXML_SCHEMAS_ENABLED
1664 if (wxschemas
!= NULL
) {
1666 xmlSchemaValidCtxtPtr vctxt
;
1668 vctxt
= xmlSchemaNewValidCtxt(wxschemas
);
1669 xmlSchemaSetValidErrors(vctxt
,
1670 (xmlSchemaValidityErrorFunc
) fprintf
,
1671 (xmlSchemaValidityWarningFunc
) fprintf
,
1673 xmlSchemaValidateSetFilename(vctxt
, filename
);
1675 ret
= xmlSchemaValidateStream(vctxt
, buf
, 0, handler
,
1679 fprintf(stderr
, "%s validates\n", filename
);
1680 } else if (ret
> 0) {
1681 fprintf(stderr
, "%s fails to validate\n", filename
);
1682 progresult
= XMLLINT_ERR_VALID
;
1684 fprintf(stderr
, "%s validation generated an internal error\n",
1686 progresult
= XMLLINT_ERR_VALID
;
1689 xmlSchemaFreeValidCtxt(vctxt
);
1694 * Create the parser context amd hook the input
1696 ctxt
= xmlNewParserCtxt();
1698 xmlFreeParserInputBuffer(buf
);
1701 old_sax
= ctxt
->sax
;
1702 ctxt
->sax
= handler
;
1703 ctxt
->userData
= (void *) user_data
;
1704 inputStream
= xmlNewIOInputStream(ctxt
, buf
, XML_CHAR_ENCODING_NONE
);
1705 if (inputStream
== NULL
) {
1706 xmlFreeParserInputBuffer(buf
);
1709 inputPush(ctxt
, inputStream
);
1711 /* do the parsing */
1712 xmlParseDocument(ctxt
);
1714 if (ctxt
->myDoc
!= NULL
) {
1715 fprintf(stderr
, "SAX generated a doc !\n");
1716 xmlFreeDoc(ctxt
->myDoc
);
1723 ctxt
->sax
= old_sax
;
1724 xmlFreeParserCtxt(ctxt
);
1728 /************************************************************************
1730 * Stream Test processing *
1732 ************************************************************************/
1733 #ifdef LIBXML_READER_ENABLED
1734 static void processNode(xmlTextReaderPtr reader
) {
1735 const xmlChar
*name
, *value
;
1738 type
= xmlTextReaderNodeType(reader
);
1739 empty
= xmlTextReaderIsEmptyElement(reader
);
1742 name
= xmlTextReaderConstName(reader
);
1744 name
= BAD_CAST
"--";
1746 value
= xmlTextReaderConstValue(reader
);
1749 printf("%d %d %s %d %d",
1750 xmlTextReaderDepth(reader
),
1754 xmlTextReaderHasValue(reader
));
1758 printf(" %s\n", value
);
1761 #ifdef LIBXML_PATTERN_ENABLED
1763 xmlChar
*path
= NULL
;
1766 if (type
== XML_READER_TYPE_ELEMENT
) {
1767 /* do the check only on element start */
1768 match
= xmlPatternMatch(patternc
, xmlTextReaderCurrentNode(reader
));
1771 #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
1772 path
= xmlGetNodePath(xmlTextReaderCurrentNode(reader
));
1773 printf("Node %s matches pattern %s\n", path
, pattern
);
1775 printf("Node %s matches pattern %s\n",
1776 xmlTextReaderConstName(reader
), pattern
);
1780 if (patstream
!= NULL
) {
1783 if (type
== XML_READER_TYPE_ELEMENT
) {
1784 ret
= xmlStreamPush(patstream
,
1785 xmlTextReaderConstLocalName(reader
),
1786 xmlTextReaderConstNamespaceUri(reader
));
1788 fprintf(stderr
, "xmlStreamPush() failure\n");
1789 xmlFreeStreamCtxt(patstream
);
1791 } else if (ret
!= match
) {
1792 #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
1794 path
= xmlGetNodePath(
1795 xmlTextReaderCurrentNode(reader
));
1799 "xmlPatternMatch and xmlStreamPush disagree\n");
1801 fprintf(stderr
, " pattern %s node %s\n",
1804 fprintf(stderr
, " pattern %s node %s\n",
1805 pattern
, xmlTextReaderConstName(reader
));
1809 if ((type
== XML_READER_TYPE_END_ELEMENT
) ||
1810 ((type
== XML_READER_TYPE_ELEMENT
) && (empty
))) {
1811 ret
= xmlStreamPop(patstream
);
1813 fprintf(stderr
, "xmlStreamPop() failure\n");
1814 xmlFreeStreamCtxt(patstream
);
1825 static void streamFile(char *filename
) {
1826 xmlTextReaderPtr reader
;
1831 const char *base
= NULL
;
1832 xmlParserInputBufferPtr input
= NULL
;
1835 if (stat(filename
, &info
) < 0)
1837 if ((fd
= open(filename
, O_RDONLY
)) < 0)
1839 base
= mmap(NULL
, info
.st_size
, PROT_READ
, MAP_SHARED
, fd
, 0) ;
1840 if (base
== (void *) MAP_FAILED
) {
1842 fprintf(stderr
, "mmap failure for file %s\n", filename
);
1843 progresult
= XMLLINT_ERR_RDFILE
;
1847 reader
= xmlReaderForMemory(base
, info
.st_size
, filename
,
1851 reader
= xmlReaderForFile(filename
, NULL
, options
);
1852 #ifdef LIBXML_PATTERN_ENABLED
1853 if (pattern
!= NULL
) {
1854 patternc
= xmlPatterncompile((const xmlChar
*) pattern
, NULL
, 0, NULL
);
1855 if (patternc
== NULL
) {
1856 xmlGenericError(xmlGenericErrorContext
,
1857 "Pattern %s failed to compile\n", pattern
);
1858 progresult
= XMLLINT_ERR_SCHEMAPAT
;
1862 if (patternc
!= NULL
) {
1863 patstream
= xmlPatternGetStreamCtxt(patternc
);
1864 if (patstream
!= NULL
) {
1865 ret
= xmlStreamPush(patstream
, NULL
, NULL
);
1867 fprintf(stderr
, "xmlStreamPush() failure\n");
1868 xmlFreeStreamCtxt(patstream
);
1876 if (reader
!= NULL
) {
1877 #ifdef LIBXML_VALID_ENABLED
1879 xmlTextReaderSetParserProp(reader
, XML_PARSER_VALIDATE
, 1);
1881 #endif /* LIBXML_VALID_ENABLED */
1883 xmlTextReaderSetParserProp(reader
, XML_PARSER_LOADDTD
, 1);
1884 #ifdef LIBXML_SCHEMAS_ENABLED
1885 if (relaxng
!= NULL
) {
1886 if ((timing
) && (!repeat
)) {
1889 ret
= xmlTextReaderRelaxNGValidate(reader
, relaxng
);
1891 xmlGenericError(xmlGenericErrorContext
,
1892 "Relax-NG schema %s failed to compile\n", relaxng
);
1893 progresult
= XMLLINT_ERR_SCHEMACOMP
;
1896 if ((timing
) && (!repeat
)) {
1897 endTimer("Compiling the schemas");
1900 if (schema
!= NULL
) {
1901 if ((timing
) && (!repeat
)) {
1904 ret
= xmlTextReaderSchemaValidate(reader
, schema
);
1906 xmlGenericError(xmlGenericErrorContext
,
1907 "XSD schema %s failed to compile\n", schema
);
1908 progresult
= XMLLINT_ERR_SCHEMACOMP
;
1911 if ((timing
) && (!repeat
)) {
1912 endTimer("Compiling the schemas");
1918 * Process all nodes in sequence
1920 if ((timing
) && (!repeat
)) {
1923 ret
= xmlTextReaderRead(reader
);
1926 #ifdef LIBXML_PATTERN_ENABLED
1930 processNode(reader
);
1931 ret
= xmlTextReaderRead(reader
);
1933 if ((timing
) && (!repeat
)) {
1934 #ifdef LIBXML_SCHEMAS_ENABLED
1935 if (relaxng
!= NULL
)
1936 endTimer("Parsing and validating");
1939 #ifdef LIBXML_VALID_ENABLED
1941 endTimer("Parsing and validating");
1944 endTimer("Parsing");
1947 #ifdef LIBXML_VALID_ENABLED
1949 if (xmlTextReaderIsValid(reader
) != 1) {
1950 xmlGenericError(xmlGenericErrorContext
,
1951 "Document %s does not validate\n", filename
);
1952 progresult
= XMLLINT_ERR_VALID
;
1955 #endif /* LIBXML_VALID_ENABLED */
1956 #ifdef LIBXML_SCHEMAS_ENABLED
1957 if ((relaxng
!= NULL
) || (schema
!= NULL
)) {
1958 if (xmlTextReaderIsValid(reader
) != 1) {
1959 fprintf(stderr
, "%s fails to validate\n", filename
);
1960 progresult
= XMLLINT_ERR_VALID
;
1962 fprintf(stderr
, "%s validates\n", filename
);
1967 * Done, cleanup and status
1969 xmlFreeTextReader(reader
);
1971 fprintf(stderr
, "%s : failed to parse\n", filename
);
1972 progresult
= XMLLINT_ERR_UNCLASS
;
1975 fprintf(stderr
, "Unable to open %s\n", filename
);
1976 progresult
= XMLLINT_ERR_UNCLASS
;
1978 #ifdef LIBXML_PATTERN_ENABLED
1979 if (patstream
!= NULL
) {
1980 xmlFreeStreamCtxt(patstream
);
1986 xmlFreeParserInputBuffer(input
);
1987 munmap((char *) base
, info
.st_size
);
1993 static void walkDoc(xmlDocPtr doc
) {
1994 xmlTextReaderPtr reader
;
1997 #ifdef LIBXML_PATTERN_ENABLED
1999 const xmlChar
*namespaces
[22];
2003 root
= xmlDocGetRootElement(doc
);
2004 for (ns
= root
->nsDef
, i
= 0;ns
!= NULL
&& i
< 20;ns
=ns
->next
) {
2005 namespaces
[i
++] = ns
->href
;
2006 namespaces
[i
++] = ns
->prefix
;
2008 namespaces
[i
++] = NULL
;
2009 namespaces
[i
] = NULL
;
2011 if (pattern
!= NULL
) {
2012 patternc
= xmlPatterncompile((const xmlChar
*) pattern
, doc
->dict
,
2014 if (patternc
== NULL
) {
2015 xmlGenericError(xmlGenericErrorContext
,
2016 "Pattern %s failed to compile\n", pattern
);
2017 progresult
= XMLLINT_ERR_SCHEMAPAT
;
2021 if (patternc
!= NULL
) {
2022 patstream
= xmlPatternGetStreamCtxt(patternc
);
2023 if (patstream
!= NULL
) {
2024 ret
= xmlStreamPush(patstream
, NULL
, NULL
);
2026 fprintf(stderr
, "xmlStreamPush() failure\n");
2027 xmlFreeStreamCtxt(patstream
);
2032 #endif /* LIBXML_PATTERN_ENABLED */
2033 reader
= xmlReaderWalker(doc
);
2034 if (reader
!= NULL
) {
2035 if ((timing
) && (!repeat
)) {
2038 ret
= xmlTextReaderRead(reader
);
2041 #ifdef LIBXML_PATTERN_ENABLED
2045 processNode(reader
);
2046 ret
= xmlTextReaderRead(reader
);
2048 if ((timing
) && (!repeat
)) {
2049 endTimer("walking through the doc");
2051 xmlFreeTextReader(reader
);
2053 fprintf(stderr
, "failed to walk through the doc\n");
2054 progresult
= XMLLINT_ERR_UNCLASS
;
2057 fprintf(stderr
, "Failed to crate a reader from the document\n");
2058 progresult
= XMLLINT_ERR_UNCLASS
;
2060 #ifdef LIBXML_PATTERN_ENABLED
2061 if (patstream
!= NULL
) {
2062 xmlFreeStreamCtxt(patstream
);
2067 #endif /* LIBXML_READER_ENABLED */
2069 #ifdef LIBXML_XPATH_ENABLED
2070 /************************************************************************
2074 ************************************************************************/
2076 static void doXPathDump(xmlXPathObjectPtr cur
) {
2078 case XPATH_NODESET
: {
2081 #ifdef LIBXML_OUTPUT_ENABLED
2082 xmlSaveCtxtPtr ctxt
;
2084 if ((cur
->nodesetval
== NULL
) || (cur
->nodesetval
->nodeNr
<= 0)) {
2085 fprintf(stderr
, "XPath set is empty\n");
2086 progresult
= XMLLINT_ERR_XPATH
;
2089 ctxt
= xmlSaveToFd(1, NULL
, 0);
2091 fprintf(stderr
, "Out of memory for XPath\n");
2092 progresult
= XMLLINT_ERR_MEM
;
2095 for (i
= 0;i
< cur
->nodesetval
->nodeNr
;i
++) {
2096 node
= cur
->nodesetval
->nodeTab
[i
];
2097 xmlSaveTree(ctxt
, node
);
2101 printf("xpath returned %d nodes\n", cur
->nodesetval
->nodeNr
);
2106 if (cur
->boolval
) printf("true");
2107 else printf("false");
2110 switch (xmlXPathIsInf(cur
->floatval
)) {
2115 printf("-Infinity");
2118 if (xmlXPathIsNaN(cur
->floatval
)) {
2121 printf("%0g", cur
->floatval
);
2126 printf("%s", (const char *) cur
->stringval
);
2128 case XPATH_UNDEFINED
:
2129 fprintf(stderr
, "XPath Object is uninitialized\n");
2130 progresult
= XMLLINT_ERR_XPATH
;
2133 fprintf(stderr
, "XPath object of unexpected type\n");
2134 progresult
= XMLLINT_ERR_XPATH
;
2139 static void doXPathQuery(xmlDocPtr doc
, const char *query
) {
2140 xmlXPathContextPtr ctxt
;
2141 xmlXPathObjectPtr res
;
2143 ctxt
= xmlXPathNewContext(doc
);
2145 fprintf(stderr
, "Out of memory for XPath\n");
2146 progresult
= XMLLINT_ERR_MEM
;
2149 ctxt
->node
= (xmlNodePtr
) doc
;
2150 res
= xmlXPathEval(BAD_CAST query
, ctxt
);
2151 xmlXPathFreeContext(ctxt
);
2154 fprintf(stderr
, "XPath evaluation failure\n");
2155 progresult
= XMLLINT_ERR_XPATH
;
2159 xmlXPathFreeObject(res
);
2161 #endif /* LIBXML_XPATH_ENABLED */
2163 /************************************************************************
2165 * Tree Test processing *
2167 ************************************************************************/
2168 static void parseAndPrintFile(char *filename
, xmlParserCtxtPtr rectxt
) {
2169 xmlDocPtr doc
= NULL
;
2170 #ifdef LIBXML_TREE_ENABLED
2172 #endif /* LIBXML_TREE_ENABLED */
2174 if ((timing
) && (!repeat
))
2178 #ifdef LIBXML_TREE_ENABLED
2179 if (filename
== NULL
) {
2183 doc
= xmlNewDoc(BAD_CAST
"1.0");
2184 n
= xmlNewDocNode(doc
, NULL
, BAD_CAST
"info", NULL
);
2185 xmlNodeSetContent(n
, BAD_CAST
"abc");
2186 xmlDocSetRootElement(doc
, n
);
2189 #endif /* LIBXML_TREE_ENABLED */
2190 #ifdef LIBXML_HTML_ENABLED
2191 #ifdef LIBXML_PUSH_ENABLED
2192 else if ((html
) && (push
)) {
2195 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2196 f
= fopen(filename
, "rb");
2197 #elif defined(__OS400__)
2198 f
= fopen(filename
, "rb");
2200 f
= fopen(filename
, "r");
2205 htmlParserCtxtPtr ctxt
;
2207 res
= fread(chars
, 1, 4, f
);
2209 ctxt
= htmlCreatePushParserCtxt(NULL
, NULL
,
2210 chars
, res
, filename
, XML_CHAR_ENCODING_NONE
);
2211 xmlCtxtUseOptions(ctxt
, options
);
2212 while ((res
= fread(chars
, 1, pushsize
, f
)) > 0) {
2213 htmlParseChunk(ctxt
, chars
, res
, 0);
2215 htmlParseChunk(ctxt
, chars
, 0, 1);
2217 htmlFreeParserCtxt(ctxt
);
2222 #endif /* LIBXML_PUSH_ENABLED */
2224 else if ((html
) && (memory
)) {
2228 if (stat(filename
, &info
) < 0)
2230 if ((fd
= open(filename
, O_RDONLY
)) < 0)
2232 base
= mmap(NULL
, info
.st_size
, PROT_READ
, MAP_SHARED
, fd
, 0) ;
2233 if (base
== (void *) MAP_FAILED
) {
2235 fprintf(stderr
, "mmap failure for file %s\n", filename
);
2236 progresult
= XMLLINT_ERR_RDFILE
;
2240 doc
= htmlReadMemory((char *) base
, info
.st_size
, filename
,
2243 munmap((char *) base
, info
.st_size
);
2248 doc
= htmlReadFile(filename
, NULL
, options
);
2250 #endif /* LIBXML_HTML_ENABLED */
2252 #ifdef LIBXML_PUSH_ENABLED
2254 * build an XML tree from a string;
2259 /* '-' Usually means stdin -<sven@zen.org> */
2260 if ((filename
[0] == '-') && (filename
[1] == 0)) {
2263 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2264 f
= fopen(filename
, "rb");
2265 #elif defined(__OS400__)
2266 f
= fopen(filename
, "rb");
2268 f
= fopen(filename
, "r");
2273 int res
, size
= 1024;
2275 xmlParserCtxtPtr ctxt
;
2277 /* if (repeat) size = 1024; */
2278 res
= fread(chars
, 1, 4, f
);
2280 ctxt
= xmlCreatePushParserCtxt(NULL
, NULL
,
2281 chars
, res
, filename
);
2282 xmlCtxtUseOptions(ctxt
, options
);
2283 while ((res
= fread(chars
, 1, size
, f
)) > 0) {
2284 xmlParseChunk(ctxt
, chars
, res
, 0);
2286 xmlParseChunk(ctxt
, chars
, 0, 1);
2288 ret
= ctxt
->wellFormed
;
2289 xmlFreeParserCtxt(ctxt
);
2299 #endif /* LIBXML_PUSH_ENABLED */
2301 if ((filename
[0] == '-') && (filename
[1] == 0)) {
2302 doc
= xmlReadFd(0, NULL
, NULL
, options
);
2306 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2307 f
= fopen(filename
, "rb");
2308 #elif defined(__OS400__)
2309 f
= fopen(filename
, "rb");
2311 f
= fopen(filename
, "r");
2315 doc
= xmlReadIO((xmlInputReadCallback
) myRead
,
2316 (xmlInputCloseCallback
) myClose
, f
,
2317 filename
, NULL
, options
);
2319 doc
= xmlCtxtReadIO(rectxt
,
2320 (xmlInputReadCallback
) myRead
,
2321 (xmlInputCloseCallback
) myClose
, f
,
2322 filename
, NULL
, options
);
2326 } else if (htmlout
) {
2327 xmlParserCtxtPtr ctxt
;
2330 ctxt
= xmlNewParserCtxt();
2336 ctxt
->sax
->error
= xmlHTMLError
;
2337 ctxt
->sax
->warning
= xmlHTMLWarning
;
2338 ctxt
->vctxt
.error
= xmlHTMLValidityError
;
2339 ctxt
->vctxt
.warning
= xmlHTMLValidityWarning
;
2341 doc
= xmlCtxtReadFile(ctxt
, filename
, NULL
, options
);
2344 xmlFreeParserCtxt(ctxt
);
2347 } else if (memory
) {
2351 if (stat(filename
, &info
) < 0)
2353 if ((fd
= open(filename
, O_RDONLY
)) < 0)
2355 base
= mmap(NULL
, info
.st_size
, PROT_READ
, MAP_SHARED
, fd
, 0) ;
2356 if (base
== (void *) MAP_FAILED
) {
2358 fprintf(stderr
, "mmap failure for file %s\n", filename
);
2359 progresult
= XMLLINT_ERR_RDFILE
;
2364 doc
= xmlReadMemory((char *) base
, info
.st_size
,
2365 filename
, NULL
, options
);
2367 doc
= xmlCtxtReadMemory(rectxt
, (char *) base
, info
.st_size
,
2368 filename
, NULL
, options
);
2370 munmap((char *) base
, info
.st_size
);
2373 #ifdef LIBXML_VALID_ENABLED
2375 xmlParserCtxtPtr ctxt
= NULL
;
2378 ctxt
= xmlNewParserCtxt();
2384 doc
= xmlCtxtReadFile(ctxt
, filename
, NULL
, options
);
2386 if (ctxt
->valid
== 0)
2387 progresult
= XMLLINT_ERR_RDFILE
;
2389 xmlFreeParserCtxt(ctxt
);
2391 #endif /* LIBXML_VALID_ENABLED */
2394 doc
= xmlCtxtReadFile(rectxt
, filename
, NULL
, options
);
2396 #ifdef LIBXML_SAX1_ENABLED
2398 doc
= xmlParseFile(filename
);
2400 #endif /* LIBXML_SAX1_ENABLED */
2401 doc
= xmlReadFile(filename
, NULL
, options
);
2407 * If we don't have a document we might as well give up. Do we
2408 * want an error message here? <sven@zen.org> */
2410 progresult
= XMLLINT_ERR_UNCLASS
;
2414 if ((timing
) && (!repeat
)) {
2415 endTimer("Parsing");
2419 * Remove DOCTYPE nodes
2424 dtd
= xmlGetIntSubset(doc
);
2426 xmlUnlinkNode((xmlNodePtr
)dtd
);
2431 #ifdef LIBXML_XINCLUDE_ENABLED
2433 if ((timing
) && (!repeat
)) {
2436 if (xmlXIncludeProcessFlags(doc
, options
) < 0)
2437 progresult
= XMLLINT_ERR_UNCLASS
;
2438 if ((timing
) && (!repeat
)) {
2439 endTimer("Xinclude processing");
2444 #ifdef LIBXML_XPATH_ENABLED
2445 if (xpathquery
!= NULL
) {
2446 doXPathQuery(doc
, xpathquery
);
2450 #ifdef LIBXML_DEBUG_ENABLED
2451 #ifdef LIBXML_XPATH_ENABLED
2456 xmlXPathOrderDocElems(doc
);
2457 xmlShell(doc
, filename
, xmlShellReadline
, stdout
);
2462 #ifdef LIBXML_TREE_ENABLED
2464 * test intermediate copy if needed.
2471 doc
= xmlCopyDoc(doc
, 1);
2473 endTimer("Copying");
2480 endTimer("Freeing original");
2483 #endif /* LIBXML_TREE_ENABLED */
2485 #ifdef LIBXML_VALID_ENABLED
2486 if ((insert
) && (!html
)) {
2487 const xmlChar
* list
[256];
2491 if (doc
->children
!= NULL
) {
2492 node
= doc
->children
;
2493 while ((node
!= NULL
) && (node
->last
== NULL
)) node
= node
->next
;
2495 nb
= xmlValidGetValidElements(node
->last
, NULL
, list
, 256);
2497 fprintf(stderr
, "could not get valid list of elements\n");
2498 } else if (nb
== 0) {
2499 fprintf(stderr
, "No element can be inserted under root\n");
2501 fprintf(stderr
, "%d element types can be inserted under root:\n",
2503 for (i
= 0;i
< nb
;i
++) {
2504 fprintf(stderr
, "%s\n", (char *) list
[i
]);
2510 #endif /* LIBXML_VALID_ENABLED */
2511 #ifdef LIBXML_READER_ENABLED
2515 #endif /* LIBXML_READER_ENABLED */
2516 #ifdef LIBXML_OUTPUT_ENABLED
2523 #ifdef LIBXML_DEBUG_ENABLED
2526 if ((timing
) && (!repeat
)) {
2529 #ifdef LIBXML_HTML_ENABLED
2530 if ((html
) && (!xmlout
)) {
2532 htmlSaveFile(output
? output
: "-", doc
);
2534 else if (encoding
!= NULL
) {
2536 htmlSaveFileFormat(output
? output
: "-", doc
, encoding
, 1);
2539 htmlSaveFileFormat(output
? output
: "-", doc
, encoding
, 0);
2542 else if (format
== 1) {
2543 htmlSaveFileFormat(output
? output
: "-", doc
, NULL
, 1);
2550 out
= fopen(output
,"wb");
2553 if (htmlDocDump(out
, doc
) < 0)
2554 progresult
= XMLLINT_ERR_OUT
;
2559 fprintf(stderr
, "failed to open %s\n", output
);
2560 progresult
= XMLLINT_ERR_OUT
;
2563 if ((timing
) && (!repeat
)) {
2568 #ifdef LIBXML_C14N_ENABLED
2570 xmlChar
*result
= NULL
;
2573 size
= xmlC14NDocDumpMemory(doc
, NULL
, XML_C14N_1_0
, NULL
, 1, &result
);
2575 if (write(1, result
, size
) == -1) {
2576 fprintf(stderr
, "Can't write data\n");
2580 fprintf(stderr
, "Failed to canonicalize\n");
2581 progresult
= XMLLINT_ERR_OUT
;
2583 } else if (canonical_11
) {
2584 xmlChar
*result
= NULL
;
2587 size
= xmlC14NDocDumpMemory(doc
, NULL
, XML_C14N_1_1
, NULL
, 1, &result
);
2589 if (write(1, result
, size
) == -1) {
2590 fprintf(stderr
, "Can't write data\n");
2594 fprintf(stderr
, "Failed to canonicalize\n");
2595 progresult
= XMLLINT_ERR_OUT
;
2598 if (exc_canonical
) {
2599 xmlChar
*result
= NULL
;
2602 size
= xmlC14NDocDumpMemory(doc
, NULL
, XML_C14N_EXCLUSIVE_1_0
, NULL
, 1, &result
);
2604 if (write(1, result
, size
) == -1) {
2605 fprintf(stderr
, "Can't write data\n");
2609 fprintf(stderr
, "Failed to canonicalize\n");
2610 progresult
= XMLLINT_ERR_OUT
;
2619 if (encoding
!= NULL
) {
2621 xmlDocDumpFormatMemoryEnc(doc
, &result
, &len
, encoding
, 1);
2623 xmlDocDumpMemoryEnc(doc
, &result
, &len
, encoding
);
2627 xmlDocDumpFormatMemory(doc
, &result
, &len
, 1);
2629 xmlDocDumpMemory(doc
, &result
, &len
);
2631 if (result
== NULL
) {
2632 fprintf(stderr
, "Failed to save\n");
2633 progresult
= XMLLINT_ERR_OUT
;
2635 if (write(1, result
, len
) == -1) {
2636 fprintf(stderr
, "Can't write data\n");
2642 #endif /* HAVE_MMAP */
2644 xmlSaveFile(output
? output
: "-", doc
);
2645 } else if (oldout
) {
2646 if (encoding
!= NULL
) {
2648 ret
= xmlSaveFormatFileEnc(output
? output
: "-", doc
,
2652 ret
= xmlSaveFileEnc(output
? output
: "-", doc
,
2656 fprintf(stderr
, "failed save to %s\n",
2657 output
? output
: "-");
2658 progresult
= XMLLINT_ERR_OUT
;
2660 } else if (format
== 1) {
2661 ret
= xmlSaveFormatFile(output
? output
: "-", doc
, 1);
2663 fprintf(stderr
, "failed save to %s\n",
2664 output
? output
: "-");
2665 progresult
= XMLLINT_ERR_OUT
;
2672 out
= fopen(output
,"wb");
2675 if (xmlDocDump(out
, doc
) < 0)
2676 progresult
= XMLLINT_ERR_OUT
;
2681 fprintf(stderr
, "failed to open %s\n", output
);
2682 progresult
= XMLLINT_ERR_OUT
;
2686 xmlSaveCtxtPtr ctxt
;
2690 saveOpts
|= XML_SAVE_FORMAT
;
2691 else if (format
== 2)
2692 saveOpts
|= XML_SAVE_WSNONSIG
;
2694 #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
2696 saveOpts
|= XML_SAVE_AS_XML
;
2700 ctxt
= xmlSaveToFd(1, encoding
, saveOpts
);
2702 ctxt
= xmlSaveToFilename(output
, encoding
, saveOpts
);
2705 if (xmlSaveDoc(ctxt
, doc
) < 0) {
2706 fprintf(stderr
, "failed save to %s\n",
2707 output
? output
: "-");
2708 progresult
= XMLLINT_ERR_OUT
;
2712 progresult
= XMLLINT_ERR_OUT
;
2715 if ((timing
) && (!repeat
)) {
2718 #ifdef LIBXML_DEBUG_ENABLED
2724 out
= fopen(output
,"wb");
2727 xmlDebugDumpDocument(out
, doc
);
2732 fprintf(stderr
, "failed to open %s\n", output
);
2733 progresult
= XMLLINT_ERR_OUT
;
2738 #endif /* LIBXML_OUTPUT_ENABLED */
2740 #ifdef LIBXML_VALID_ENABLED
2742 * A posteriori validation test
2744 if ((dtdvalid
!= NULL
) || (dtdvalidfpi
!= NULL
)) {
2747 if ((timing
) && (!repeat
)) {
2750 if (dtdvalid
!= NULL
)
2751 dtd
= xmlParseDTD(NULL
, (const xmlChar
*)dtdvalid
);
2753 dtd
= xmlParseDTD((const xmlChar
*)dtdvalidfpi
, NULL
);
2754 if ((timing
) && (!repeat
)) {
2755 endTimer("Parsing DTD");
2758 if (dtdvalid
!= NULL
)
2759 xmlGenericError(xmlGenericErrorContext
,
2760 "Could not parse DTD %s\n", dtdvalid
);
2762 xmlGenericError(xmlGenericErrorContext
,
2763 "Could not parse DTD %s\n", dtdvalidfpi
);
2764 progresult
= XMLLINT_ERR_DTD
;
2766 xmlValidCtxtPtr cvp
;
2768 if ((cvp
= xmlNewValidCtxt()) == NULL
) {
2769 xmlGenericError(xmlGenericErrorContext
,
2770 "Couldn't allocate validation context\n");
2773 cvp
->userData
= (void *) stderr
;
2774 cvp
->error
= (xmlValidityErrorFunc
) fprintf
;
2775 cvp
->warning
= (xmlValidityWarningFunc
) fprintf
;
2777 if ((timing
) && (!repeat
)) {
2780 if (!xmlValidateDtd(cvp
, doc
, dtd
)) {
2781 if (dtdvalid
!= NULL
)
2782 xmlGenericError(xmlGenericErrorContext
,
2783 "Document %s does not validate against %s\n",
2784 filename
, dtdvalid
);
2786 xmlGenericError(xmlGenericErrorContext
,
2787 "Document %s does not validate against %s\n",
2788 filename
, dtdvalidfpi
);
2789 progresult
= XMLLINT_ERR_VALID
;
2791 if ((timing
) && (!repeat
)) {
2792 endTimer("Validating against DTD");
2794 xmlFreeValidCtxt(cvp
);
2797 } else if (postvalid
) {
2798 xmlValidCtxtPtr cvp
;
2800 if ((cvp
= xmlNewValidCtxt()) == NULL
) {
2801 xmlGenericError(xmlGenericErrorContext
,
2802 "Couldn't allocate validation context\n");
2806 if ((timing
) && (!repeat
)) {
2809 cvp
->userData
= (void *) stderr
;
2810 cvp
->error
= (xmlValidityErrorFunc
) fprintf
;
2811 cvp
->warning
= (xmlValidityWarningFunc
) fprintf
;
2812 if (!xmlValidateDocument(cvp
, doc
)) {
2813 xmlGenericError(xmlGenericErrorContext
,
2814 "Document %s does not validate\n", filename
);
2815 progresult
= XMLLINT_ERR_VALID
;
2817 if ((timing
) && (!repeat
)) {
2818 endTimer("Validating");
2820 xmlFreeValidCtxt(cvp
);
2822 #endif /* LIBXML_VALID_ENABLED */
2823 #ifdef LIBXML_SCHEMATRON_ENABLED
2824 if (wxschematron
!= NULL
) {
2825 xmlSchematronValidCtxtPtr ctxt
;
2829 if ((timing
) && (!repeat
)) {
2834 flag
= XML_SCHEMATRON_OUT_XML
;
2836 flag
= XML_SCHEMATRON_OUT_TEXT
;
2838 flag
|= XML_SCHEMATRON_OUT_QUIET
;
2839 ctxt
= xmlSchematronNewValidCtxt(wxschematron
, flag
);
2841 xmlSchematronSetValidErrors(ctxt
,
2842 (xmlSchematronValidityErrorFunc
) fprintf
,
2843 (xmlSchematronValidityWarningFunc
) fprintf
,
2846 ret
= xmlSchematronValidateDoc(ctxt
, doc
);
2848 fprintf(stderr
, "%s validates\n", filename
);
2849 } else if (ret
> 0) {
2850 fprintf(stderr
, "%s fails to validate\n", filename
);
2851 progresult
= XMLLINT_ERR_VALID
;
2853 fprintf(stderr
, "%s validation generated an internal error\n",
2855 progresult
= XMLLINT_ERR_VALID
;
2857 xmlSchematronFreeValidCtxt(ctxt
);
2858 if ((timing
) && (!repeat
)) {
2859 endTimer("Validating");
2863 #ifdef LIBXML_SCHEMAS_ENABLED
2864 if (relaxngschemas
!= NULL
) {
2865 xmlRelaxNGValidCtxtPtr ctxt
;
2868 if ((timing
) && (!repeat
)) {
2872 ctxt
= xmlRelaxNGNewValidCtxt(relaxngschemas
);
2873 xmlRelaxNGSetValidErrors(ctxt
,
2874 (xmlRelaxNGValidityErrorFunc
) fprintf
,
2875 (xmlRelaxNGValidityWarningFunc
) fprintf
,
2877 ret
= xmlRelaxNGValidateDoc(ctxt
, doc
);
2879 fprintf(stderr
, "%s validates\n", filename
);
2880 } else if (ret
> 0) {
2881 fprintf(stderr
, "%s fails to validate\n", filename
);
2882 progresult
= XMLLINT_ERR_VALID
;
2884 fprintf(stderr
, "%s validation generated an internal error\n",
2886 progresult
= XMLLINT_ERR_VALID
;
2888 xmlRelaxNGFreeValidCtxt(ctxt
);
2889 if ((timing
) && (!repeat
)) {
2890 endTimer("Validating");
2892 } else if (wxschemas
!= NULL
) {
2893 xmlSchemaValidCtxtPtr ctxt
;
2896 if ((timing
) && (!repeat
)) {
2900 ctxt
= xmlSchemaNewValidCtxt(wxschemas
);
2901 xmlSchemaSetValidErrors(ctxt
,
2902 (xmlSchemaValidityErrorFunc
) fprintf
,
2903 (xmlSchemaValidityWarningFunc
) fprintf
,
2905 ret
= xmlSchemaValidateDoc(ctxt
, doc
);
2907 fprintf(stderr
, "%s validates\n", filename
);
2908 } else if (ret
> 0) {
2909 fprintf(stderr
, "%s fails to validate\n", filename
);
2910 progresult
= XMLLINT_ERR_VALID
;
2912 fprintf(stderr
, "%s validation generated an internal error\n",
2914 progresult
= XMLLINT_ERR_VALID
;
2916 xmlSchemaFreeValidCtxt(ctxt
);
2917 if ((timing
) && (!repeat
)) {
2918 endTimer("Validating");
2923 #ifdef LIBXML_DEBUG_ENABLED
2924 #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
2925 if ((debugent
) && (!html
))
2926 xmlDebugDumpEntities(stderr
, doc
);
2933 if ((timing
) && (!repeat
)) {
2937 if ((timing
) && (!repeat
)) {
2938 endTimer("Freeing");
2942 /************************************************************************
2946 ************************************************************************/
2948 static void showVersion(const char *name
) {
2949 fprintf(stderr
, "%s: using libxml version %s\n", name
, xmlParserVersion
);
2950 fprintf(stderr
, " compiled with: ");
2951 if (xmlHasFeature(XML_WITH_THREAD
)) fprintf(stderr
, "Threads ");
2952 if (xmlHasFeature(XML_WITH_TREE
)) fprintf(stderr
, "Tree ");
2953 if (xmlHasFeature(XML_WITH_OUTPUT
)) fprintf(stderr
, "Output ");
2954 if (xmlHasFeature(XML_WITH_PUSH
)) fprintf(stderr
, "Push ");
2955 if (xmlHasFeature(XML_WITH_READER
)) fprintf(stderr
, "Reader ");
2956 if (xmlHasFeature(XML_WITH_PATTERN
)) fprintf(stderr
, "Patterns ");
2957 if (xmlHasFeature(XML_WITH_WRITER
)) fprintf(stderr
, "Writer ");
2958 if (xmlHasFeature(XML_WITH_SAX1
)) fprintf(stderr
, "SAXv1 ");
2959 if (xmlHasFeature(XML_WITH_FTP
)) fprintf(stderr
, "FTP ");
2960 if (xmlHasFeature(XML_WITH_HTTP
)) fprintf(stderr
, "HTTP ");
2961 if (xmlHasFeature(XML_WITH_VALID
)) fprintf(stderr
, "DTDValid ");
2962 if (xmlHasFeature(XML_WITH_HTML
)) fprintf(stderr
, "HTML ");
2963 if (xmlHasFeature(XML_WITH_LEGACY
)) fprintf(stderr
, "Legacy ");
2964 if (xmlHasFeature(XML_WITH_C14N
)) fprintf(stderr
, "C14N ");
2965 if (xmlHasFeature(XML_WITH_CATALOG
)) fprintf(stderr
, "Catalog ");
2966 if (xmlHasFeature(XML_WITH_XPATH
)) fprintf(stderr
, "XPath ");
2967 if (xmlHasFeature(XML_WITH_XPTR
)) fprintf(stderr
, "XPointer ");
2968 if (xmlHasFeature(XML_WITH_XINCLUDE
)) fprintf(stderr
, "XInclude ");
2969 if (xmlHasFeature(XML_WITH_ICONV
)) fprintf(stderr
, "Iconv ");
2970 if (xmlHasFeature(XML_WITH_ISO8859X
)) fprintf(stderr
, "ISO8859X ");
2971 if (xmlHasFeature(XML_WITH_UNICODE
)) fprintf(stderr
, "Unicode ");
2972 if (xmlHasFeature(XML_WITH_REGEXP
)) fprintf(stderr
, "Regexps ");
2973 if (xmlHasFeature(XML_WITH_AUTOMATA
)) fprintf(stderr
, "Automata ");
2974 if (xmlHasFeature(XML_WITH_EXPR
)) fprintf(stderr
, "Expr ");
2975 if (xmlHasFeature(XML_WITH_SCHEMAS
)) fprintf(stderr
, "Schemas ");
2976 if (xmlHasFeature(XML_WITH_SCHEMATRON
)) fprintf(stderr
, "Schematron ");
2977 if (xmlHasFeature(XML_WITH_MODULES
)) fprintf(stderr
, "Modules ");
2978 if (xmlHasFeature(XML_WITH_DEBUG
)) fprintf(stderr
, "Debug ");
2979 if (xmlHasFeature(XML_WITH_DEBUG_MEM
)) fprintf(stderr
, "MemDebug ");
2980 if (xmlHasFeature(XML_WITH_DEBUG_RUN
)) fprintf(stderr
, "RunDebug ");
2981 if (xmlHasFeature(XML_WITH_ZLIB
)) fprintf(stderr
, "Zlib ");
2982 if (xmlHasFeature(XML_WITH_LZMA
)) fprintf(stderr
, "Lzma ");
2983 fprintf(stderr
, "\n");
2986 static void usage(const char *name
) {
2987 printf("Usage : %s [options] XMLfiles ...\n", name
);
2988 #ifdef LIBXML_OUTPUT_ENABLED
2989 printf("\tParse the XML files and output the result of the parsing\n");
2991 printf("\tParse the XML files\n");
2992 #endif /* LIBXML_OUTPUT_ENABLED */
2993 printf("\t--version : display the version of the XML library used\n");
2994 #ifdef LIBXML_DEBUG_ENABLED
2995 printf("\t--debug : dump a debug tree of the in-memory document\n");
2996 printf("\t--shell : run a navigating shell\n");
2997 printf("\t--debugent : debug the entities defined in the document\n");
2999 #ifdef LIBXML_READER_ENABLED
3000 printf("\t--debug : dump the nodes content when using --stream\n");
3001 #endif /* LIBXML_READER_ENABLED */
3003 #ifdef LIBXML_TREE_ENABLED
3004 printf("\t--copy : used to test the internal copy implementation\n");
3005 #endif /* LIBXML_TREE_ENABLED */
3006 printf("\t--recover : output what was parsable on broken XML documents\n");
3007 printf("\t--huge : remove any internal arbitrary parser limits\n");
3008 printf("\t--noent : substitute entity references by their value\n");
3009 printf("\t--noenc : ignore any encoding specified inside the document\n");
3010 printf("\t--noout : don't output the result tree\n");
3011 printf("\t--path 'paths': provide a set of paths for resources\n");
3012 printf("\t--load-trace : print trace of all external entities loaded\n");
3013 printf("\t--nonet : refuse to fetch DTDs or entities over network\n");
3014 printf("\t--nocompact : do not generate compact text nodes\n");
3015 printf("\t--htmlout : output results as HTML\n");
3016 printf("\t--nowrap : do not put HTML doc wrapper\n");
3017 #ifdef LIBXML_VALID_ENABLED
3018 printf("\t--valid : validate the document in addition to std well-formed check\n");
3019 printf("\t--postvalid : do a posteriori validation, i.e after parsing\n");
3020 printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n");
3021 printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n");
3022 #endif /* LIBXML_VALID_ENABLED */
3023 printf("\t--timing : print some timings\n");
3024 printf("\t--output file or -o file: save to a given file\n");
3025 printf("\t--repeat : repeat 100 times, for timing or profiling\n");
3026 printf("\t--insert : ad-hoc test for valid insertions\n");
3027 #ifdef LIBXML_OUTPUT_ENABLED
3029 printf("\t--compress : turn on gzip compression of output\n");
3031 #endif /* LIBXML_OUTPUT_ENABLED */
3032 #ifdef LIBXML_HTML_ENABLED
3033 printf("\t--html : use the HTML parser\n");
3034 printf("\t--xmlout : force to use the XML serializer when using --html\n");
3035 printf("\t--nodefdtd : do not default HTML doctype\n");
3037 #ifdef LIBXML_PUSH_ENABLED
3038 printf("\t--push : use the push mode of the parser\n");
3039 printf("\t--pushsmall : use the push mode of the parser using tiny increments\n");
3040 #endif /* LIBXML_PUSH_ENABLED */
3042 printf("\t--memory : parse from memory\n");
3044 printf("\t--maxmem nbbytes : limits memory allocation to nbbytes bytes\n");
3045 printf("\t--nowarning : do not emit warnings from parser/validator\n");
3046 printf("\t--noblanks : drop (ignorable?) blanks spaces\n");
3047 printf("\t--nocdata : replace cdata section with text nodes\n");
3048 #ifdef LIBXML_OUTPUT_ENABLED
3049 printf("\t--format : reformat/reindent the input\n");
3050 printf("\t--encode encoding : output in the given encoding\n");
3051 printf("\t--dropdtd : remove the DOCTYPE of the input docs\n");
3052 printf("\t--pretty STYLE : pretty-print in a particular style\n");
3053 printf("\t 0 Do not pretty print\n");
3054 printf("\t 1 Format the XML content, as --format\n");
3055 printf("\t 2 Add whitespace inside tags, preserving content\n");
3056 #endif /* LIBXML_OUTPUT_ENABLED */
3057 printf("\t--c14n : save in W3C canonical format v1.0 (with comments)\n");
3058 printf("\t--c14n11 : save in W3C canonical format v1.1 (with comments)\n");
3059 printf("\t--exc-c14n : save in W3C exclusive canonical format (with comments)\n");
3060 #ifdef LIBXML_C14N_ENABLED
3061 #endif /* LIBXML_C14N_ENABLED */
3062 printf("\t--nsclean : remove redundant namespace declarations\n");
3063 printf("\t--testIO : test user I/O support\n");
3064 #ifdef LIBXML_CATALOG_ENABLED
3065 printf("\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n");
3066 printf("\t otherwise XML Catalogs starting from \n");
3067 printf("\t %s are activated by default\n", XML_XML_DEFAULT_CATALOG
);
3068 printf("\t--nocatalogs: deactivate all catalogs\n");
3070 printf("\t--auto : generate a small doc on the fly\n");
3071 #ifdef LIBXML_XINCLUDE_ENABLED
3072 printf("\t--xinclude : do XInclude processing\n");
3073 printf("\t--noxincludenode : same but do not generate XInclude nodes\n");
3074 printf("\t--nofixup-base-uris : do not fixup xml:base uris\n");
3076 printf("\t--loaddtd : fetch external DTD\n");
3077 printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n");
3078 #ifdef LIBXML_READER_ENABLED
3079 printf("\t--stream : use the streaming interface to process very large files\n");
3080 printf("\t--walker : create a reader and walk though the resulting doc\n");
3081 #endif /* LIBXML_READER_ENABLED */
3082 #ifdef LIBXML_PATTERN_ENABLED
3083 printf("\t--pattern pattern_value : test the pattern support\n");
3085 printf("\t--chkregister : verify the node registration code\n");
3086 #ifdef LIBXML_SCHEMAS_ENABLED
3087 printf("\t--relaxng schema : do RelaxNG validation against the schema\n");
3088 printf("\t--schema schema : do validation against the WXS schema\n");
3090 #ifdef LIBXML_SCHEMATRON_ENABLED
3091 printf("\t--schematron schema : do validation against a schematron\n");
3093 #ifdef LIBXML_SAX1_ENABLED
3094 printf("\t--sax1: use the old SAX1 interfaces for processing\n");
3096 printf("\t--sax: do not build a tree but work just at the SAX level\n");
3097 printf("\t--oldxml10: use XML-1.0 parsing rules before the 5th edition\n");
3098 #ifdef LIBXML_XPATH_ENABLED
3099 printf("\t--xpath expr: evaluate the XPath expression, imply --noout\n");
3102 printf("\nLibxml project home page: http://xmlsoft.org/\n");
3103 printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n");
3106 static void registerNode(xmlNodePtr node
)
3108 node
->_private
= malloc(sizeof(long));
3109 if (node
->_private
== NULL
) {
3110 fprintf(stderr
, "Out of memory in xmllint:registerNode()\n");
3111 exit(XMLLINT_ERR_MEM
);
3113 *(long*)node
->_private
= (long) 0x81726354;
3117 static void deregisterNode(xmlNodePtr node
)
3119 assert(node
->_private
!= NULL
);
3120 assert(*(long*)node
->_private
== (long) 0x81726354);
3121 free(node
->_private
);
3126 main(int argc
, char **argv
) {
3137 for (i
= 1; i
< argc
; i
++) {
3138 if (!strcmp(argv
[i
], "-"))
3141 if (argv
[i
][0] != '-')
3143 if ((!strcmp(argv
[i
], "-debug")) || (!strcmp(argv
[i
], "--debug")))
3146 #ifdef LIBXML_DEBUG_ENABLED
3147 if ((!strcmp(argv
[i
], "-shell")) ||
3148 (!strcmp(argv
[i
], "--shell"))) {
3153 #ifdef LIBXML_TREE_ENABLED
3154 if ((!strcmp(argv
[i
], "-copy")) || (!strcmp(argv
[i
], "--copy")))
3157 #endif /* LIBXML_TREE_ENABLED */
3158 if ((!strcmp(argv
[i
], "-recover")) ||
3159 (!strcmp(argv
[i
], "--recover"))) {
3161 options
|= XML_PARSE_RECOVER
;
3162 } else if ((!strcmp(argv
[i
], "-huge")) ||
3163 (!strcmp(argv
[i
], "--huge"))) {
3164 options
|= XML_PARSE_HUGE
;
3165 } else if ((!strcmp(argv
[i
], "-noent")) ||
3166 (!strcmp(argv
[i
], "--noent"))) {
3168 options
|= XML_PARSE_NOENT
;
3169 } else if ((!strcmp(argv
[i
], "-noenc")) ||
3170 (!strcmp(argv
[i
], "--noenc"))) {
3172 options
|= XML_PARSE_IGNORE_ENC
;
3173 } else if ((!strcmp(argv
[i
], "-nsclean")) ||
3174 (!strcmp(argv
[i
], "--nsclean"))) {
3175 options
|= XML_PARSE_NSCLEAN
;
3176 } else if ((!strcmp(argv
[i
], "-nocdata")) ||
3177 (!strcmp(argv
[i
], "--nocdata"))) {
3178 options
|= XML_PARSE_NOCDATA
;
3179 } else if ((!strcmp(argv
[i
], "-nodict")) ||
3180 (!strcmp(argv
[i
], "--nodict"))) {
3181 options
|= XML_PARSE_NODICT
;
3182 } else if ((!strcmp(argv
[i
], "-version")) ||
3183 (!strcmp(argv
[i
], "--version"))) {
3184 showVersion(argv
[0]);
3186 } else if ((!strcmp(argv
[i
], "-noout")) ||
3187 (!strcmp(argv
[i
], "--noout")))
3189 #ifdef LIBXML_OUTPUT_ENABLED
3190 else if ((!strcmp(argv
[i
], "-o")) ||
3191 (!strcmp(argv
[i
], "-output")) ||
3192 (!strcmp(argv
[i
], "--output"))) {
3196 #endif /* LIBXML_OUTPUT_ENABLED */
3197 else if ((!strcmp(argv
[i
], "-htmlout")) ||
3198 (!strcmp(argv
[i
], "--htmlout")))
3200 else if ((!strcmp(argv
[i
], "-nowrap")) ||
3201 (!strcmp(argv
[i
], "--nowrap")))
3203 #ifdef LIBXML_HTML_ENABLED
3204 else if ((!strcmp(argv
[i
], "-html")) ||
3205 (!strcmp(argv
[i
], "--html"))) {
3208 else if ((!strcmp(argv
[i
], "-xmlout")) ||
3209 (!strcmp(argv
[i
], "--xmlout"))) {
3211 } else if ((!strcmp(argv
[i
], "-nodefdtd")) ||
3212 (!strcmp(argv
[i
], "--nodefdtd"))) {
3214 options
|= HTML_PARSE_NODEFDTD
;
3216 #endif /* LIBXML_HTML_ENABLED */
3217 else if ((!strcmp(argv
[i
], "-loaddtd")) ||
3218 (!strcmp(argv
[i
], "--loaddtd"))) {
3220 options
|= XML_PARSE_DTDLOAD
;
3221 } else if ((!strcmp(argv
[i
], "-dtdattr")) ||
3222 (!strcmp(argv
[i
], "--dtdattr"))) {
3225 options
|= XML_PARSE_DTDATTR
;
3227 #ifdef LIBXML_VALID_ENABLED
3228 else if ((!strcmp(argv
[i
], "-valid")) ||
3229 (!strcmp(argv
[i
], "--valid"))) {
3231 options
|= XML_PARSE_DTDVALID
;
3232 } else if ((!strcmp(argv
[i
], "-postvalid")) ||
3233 (!strcmp(argv
[i
], "--postvalid"))) {
3236 options
|= XML_PARSE_DTDLOAD
;
3237 } else if ((!strcmp(argv
[i
], "-dtdvalid")) ||
3238 (!strcmp(argv
[i
], "--dtdvalid"))) {
3242 options
|= XML_PARSE_DTDLOAD
;
3243 } else if ((!strcmp(argv
[i
], "-dtdvalidfpi")) ||
3244 (!strcmp(argv
[i
], "--dtdvalidfpi"))) {
3246 dtdvalidfpi
= argv
[i
];
3248 options
|= XML_PARSE_DTDLOAD
;
3250 #endif /* LIBXML_VALID_ENABLED */
3251 else if ((!strcmp(argv
[i
], "-dropdtd")) ||
3252 (!strcmp(argv
[i
], "--dropdtd")))
3254 else if ((!strcmp(argv
[i
], "-insert")) ||
3255 (!strcmp(argv
[i
], "--insert")))
3257 else if ((!strcmp(argv
[i
], "-timing")) ||
3258 (!strcmp(argv
[i
], "--timing")))
3260 else if ((!strcmp(argv
[i
], "-auto")) ||
3261 (!strcmp(argv
[i
], "--auto")))
3263 else if ((!strcmp(argv
[i
], "-repeat")) ||
3264 (!strcmp(argv
[i
], "--repeat"))) {
3270 #ifdef LIBXML_PUSH_ENABLED
3271 else if ((!strcmp(argv
[i
], "-push")) ||
3272 (!strcmp(argv
[i
], "--push")))
3274 else if ((!strcmp(argv
[i
], "-pushsmall")) ||
3275 (!strcmp(argv
[i
], "--pushsmall"))) {
3279 #endif /* LIBXML_PUSH_ENABLED */
3281 else if ((!strcmp(argv
[i
], "-memory")) ||
3282 (!strcmp(argv
[i
], "--memory")))
3285 else if ((!strcmp(argv
[i
], "-testIO")) ||
3286 (!strcmp(argv
[i
], "--testIO")))
3288 #ifdef LIBXML_XINCLUDE_ENABLED
3289 else if ((!strcmp(argv
[i
], "-xinclude")) ||
3290 (!strcmp(argv
[i
], "--xinclude"))) {
3292 options
|= XML_PARSE_XINCLUDE
;
3294 else if ((!strcmp(argv
[i
], "-noxincludenode")) ||
3295 (!strcmp(argv
[i
], "--noxincludenode"))) {
3297 options
|= XML_PARSE_XINCLUDE
;
3298 options
|= XML_PARSE_NOXINCNODE
;
3300 else if ((!strcmp(argv
[i
], "-nofixup-base-uris")) ||
3301 (!strcmp(argv
[i
], "--nofixup-base-uris"))) {
3303 options
|= XML_PARSE_XINCLUDE
;
3304 options
|= XML_PARSE_NOBASEFIX
;
3307 #ifdef LIBXML_OUTPUT_ENABLED
3309 else if ((!strcmp(argv
[i
], "-compress")) ||
3310 (!strcmp(argv
[i
], "--compress"))) {
3312 xmlSetCompressMode(9);
3315 #endif /* LIBXML_OUTPUT_ENABLED */
3316 else if ((!strcmp(argv
[i
], "-nowarning")) ||
3317 (!strcmp(argv
[i
], "--nowarning"))) {
3318 xmlGetWarningsDefaultValue
= 0;
3319 xmlPedanticParserDefault(0);
3320 options
|= XML_PARSE_NOWARNING
;
3322 else if ((!strcmp(argv
[i
], "-pedantic")) ||
3323 (!strcmp(argv
[i
], "--pedantic"))) {
3324 xmlGetWarningsDefaultValue
= 1;
3325 xmlPedanticParserDefault(1);
3326 options
|= XML_PARSE_PEDANTIC
;
3328 #ifdef LIBXML_DEBUG_ENABLED
3329 else if ((!strcmp(argv
[i
], "-debugent")) ||
3330 (!strcmp(argv
[i
], "--debugent"))) {
3332 xmlParserDebugEntities
= 1;
3335 #ifdef LIBXML_C14N_ENABLED
3336 else if ((!strcmp(argv
[i
], "-c14n")) ||
3337 (!strcmp(argv
[i
], "--c14n"))) {
3339 options
|= XML_PARSE_NOENT
| XML_PARSE_DTDATTR
| XML_PARSE_DTDLOAD
;
3341 else if ((!strcmp(argv
[i
], "-c14n11")) ||
3342 (!strcmp(argv
[i
], "--c14n11"))) {
3344 options
|= XML_PARSE_NOENT
| XML_PARSE_DTDATTR
| XML_PARSE_DTDLOAD
;
3346 else if ((!strcmp(argv
[i
], "-exc-c14n")) ||
3347 (!strcmp(argv
[i
], "--exc-c14n"))) {
3349 options
|= XML_PARSE_NOENT
| XML_PARSE_DTDATTR
| XML_PARSE_DTDLOAD
;
3352 #ifdef LIBXML_CATALOG_ENABLED
3353 else if ((!strcmp(argv
[i
], "-catalogs")) ||
3354 (!strcmp(argv
[i
], "--catalogs"))) {
3356 } else if ((!strcmp(argv
[i
], "-nocatalogs")) ||
3357 (!strcmp(argv
[i
], "--nocatalogs"))) {
3361 else if ((!strcmp(argv
[i
], "-encode")) ||
3362 (!strcmp(argv
[i
], "--encode"))) {
3366 * OK it's for testing purposes
3368 xmlAddEncodingAlias("UTF-8", "DVEnc");
3370 else if ((!strcmp(argv
[i
], "-noblanks")) ||
3371 (!strcmp(argv
[i
], "--noblanks"))) {
3373 xmlKeepBlanksDefault(0);
3374 options
|= XML_PARSE_NOBLANKS
;
3376 else if ((!strcmp(argv
[i
], "-maxmem")) ||
3377 (!strcmp(argv
[i
], "--maxmem"))) {
3379 if (sscanf(argv
[i
], "%d", &maxmem
) == 1) {
3380 xmlMemSetup(myFreeFunc
, myMallocFunc
, myReallocFunc
,
3386 else if ((!strcmp(argv
[i
], "-format")) ||
3387 (!strcmp(argv
[i
], "--format"))) {
3389 #ifdef LIBXML_OUTPUT_ENABLED
3391 #endif /* LIBXML_OUTPUT_ENABLED */
3392 xmlKeepBlanksDefault(0);
3394 else if ((!strcmp(argv
[i
], "-pretty")) ||
3395 (!strcmp(argv
[i
], "--pretty"))) {
3397 #ifdef LIBXML_OUTPUT_ENABLED
3398 if (argv
[i
] != NULL
) {
3399 format
= atoi(argv
[i
]);
3402 xmlKeepBlanksDefault(0);
3405 #endif /* LIBXML_OUTPUT_ENABLED */
3407 #ifdef LIBXML_READER_ENABLED
3408 else if ((!strcmp(argv
[i
], "-stream")) ||
3409 (!strcmp(argv
[i
], "--stream"))) {
3412 else if ((!strcmp(argv
[i
], "-walker")) ||
3413 (!strcmp(argv
[i
], "--walker"))) {
3417 #endif /* LIBXML_READER_ENABLED */
3418 #ifdef LIBXML_SAX1_ENABLED
3419 else if ((!strcmp(argv
[i
], "-sax1")) ||
3420 (!strcmp(argv
[i
], "--sax1"))) {
3422 options
|= XML_PARSE_SAX1
;
3424 #endif /* LIBXML_SAX1_ENABLED */
3425 else if ((!strcmp(argv
[i
], "-sax")) ||
3426 (!strcmp(argv
[i
], "--sax"))) {
3429 else if ((!strcmp(argv
[i
], "-chkregister")) ||
3430 (!strcmp(argv
[i
], "--chkregister"))) {
3432 #ifdef LIBXML_SCHEMAS_ENABLED
3433 } else if ((!strcmp(argv
[i
], "-relaxng")) ||
3434 (!strcmp(argv
[i
], "--relaxng"))) {
3438 options
|= XML_PARSE_NOENT
;
3439 } else if ((!strcmp(argv
[i
], "-schema")) ||
3440 (!strcmp(argv
[i
], "--schema"))) {
3445 #ifdef LIBXML_SCHEMATRON_ENABLED
3446 } else if ((!strcmp(argv
[i
], "-schematron")) ||
3447 (!strcmp(argv
[i
], "--schematron"))) {
3449 schematron
= argv
[i
];
3452 } else if ((!strcmp(argv
[i
], "-nonet")) ||
3453 (!strcmp(argv
[i
], "--nonet"))) {
3454 options
|= XML_PARSE_NONET
;
3455 xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader
);
3456 } else if ((!strcmp(argv
[i
], "-nocompact")) ||
3457 (!strcmp(argv
[i
], "--nocompact"))) {
3458 options
&= ~XML_PARSE_COMPACT
;
3459 } else if ((!strcmp(argv
[i
], "-load-trace")) ||
3460 (!strcmp(argv
[i
], "--load-trace"))) {
3462 } else if ((!strcmp(argv
[i
], "-path")) ||
3463 (!strcmp(argv
[i
], "--path"))) {
3465 parsePath(BAD_CAST argv
[i
]);
3466 #ifdef LIBXML_PATTERN_ENABLED
3467 } else if ((!strcmp(argv
[i
], "-pattern")) ||
3468 (!strcmp(argv
[i
], "--pattern"))) {
3472 #ifdef LIBXML_XPATH_ENABLED
3473 } else if ((!strcmp(argv
[i
], "-xpath")) ||
3474 (!strcmp(argv
[i
], "--xpath"))) {
3477 xpathquery
= argv
[i
];
3479 } else if ((!strcmp(argv
[i
], "-oldxml10")) ||
3480 (!strcmp(argv
[i
], "--oldxml10"))) {
3482 options
|= XML_PARSE_OLD10
;
3484 fprintf(stderr
, "Unknown option %s\n", argv
[i
]);
3490 #ifdef LIBXML_CATALOG_ENABLED
3491 if (nocatalogs
== 0) {
3495 catal
= getenv("SGML_CATALOG_FILES");
3496 if (catal
!= NULL
) {
3497 xmlLoadCatalogs(catal
);
3499 fprintf(stderr
, "Variable $SGML_CATALOG_FILES not set\n");
3505 #ifdef LIBXML_SAX1_ENABLED
3507 xmlSAXDefaultVersion(1);
3509 xmlSAXDefaultVersion(2);
3510 #endif /* LIBXML_SAX1_ENABLED */
3513 xmlRegisterNodeDefault(registerNode
);
3514 xmlDeregisterNodeDefault(deregisterNode
);
3517 indent
= getenv("XMLLINT_INDENT");
3518 if(indent
!= NULL
) {
3519 xmlTreeIndentString
= indent
;
3523 defaultEntityLoader
= xmlGetExternalEntityLoader();
3524 xmlSetExternalEntityLoader(xmllintExternalEntityLoader
);
3526 xmlLineNumbersDefault(1);
3528 xmlLoadExtDtdDefaultValue
|= XML_DETECT_IDS
;
3530 xmlLoadExtDtdDefaultValue
|= XML_COMPLETE_ATTRS
;
3531 if (noent
!= 0) xmlSubstituteEntitiesDefault(1);
3532 #ifdef LIBXML_VALID_ENABLED
3533 if (valid
!= 0) xmlDoValidityCheckingDefaultValue
= 1;
3534 #endif /* LIBXML_VALID_ENABLED */
3535 if ((htmlout
) && (!nowrap
)) {
3536 xmlGenericError(xmlGenericErrorContext
,
3537 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n");
3538 xmlGenericError(xmlGenericErrorContext
,
3539 "\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n");
3540 xmlGenericError(xmlGenericErrorContext
,
3541 "<html><head><title>%s output</title></head>\n",
3543 xmlGenericError(xmlGenericErrorContext
,
3544 "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n",
3548 #ifdef LIBXML_SCHEMATRON_ENABLED
3549 if ((schematron
!= NULL
) && (sax
== 0)
3550 #ifdef LIBXML_READER_ENABLED
3552 #endif /* LIBXML_READER_ENABLED */
3554 xmlSchematronParserCtxtPtr ctxt
;
3556 /* forces loading the DTDs */
3557 xmlLoadExtDtdDefaultValue
|= 1;
3558 options
|= XML_PARSE_DTDLOAD
;
3562 ctxt
= xmlSchematronNewParserCtxt(schematron
);
3564 xmlSchematronSetParserErrors(ctxt
,
3565 (xmlSchematronValidityErrorFunc
) fprintf
,
3566 (xmlSchematronValidityWarningFunc
) fprintf
,
3569 wxschematron
= xmlSchematronParse(ctxt
);
3570 if (wxschematron
== NULL
) {
3571 xmlGenericError(xmlGenericErrorContext
,
3572 "Schematron schema %s failed to compile\n", schematron
);
3573 progresult
= XMLLINT_ERR_SCHEMACOMP
;
3576 xmlSchematronFreeParserCtxt(ctxt
);
3578 endTimer("Compiling the schemas");
3582 #ifdef LIBXML_SCHEMAS_ENABLED
3583 if ((relaxng
!= NULL
) && (sax
== 0)
3584 #ifdef LIBXML_READER_ENABLED
3586 #endif /* LIBXML_READER_ENABLED */
3588 xmlRelaxNGParserCtxtPtr ctxt
;
3590 /* forces loading the DTDs */
3591 xmlLoadExtDtdDefaultValue
|= 1;
3592 options
|= XML_PARSE_DTDLOAD
;
3596 ctxt
= xmlRelaxNGNewParserCtxt(relaxng
);
3597 xmlRelaxNGSetParserErrors(ctxt
,
3598 (xmlRelaxNGValidityErrorFunc
) fprintf
,
3599 (xmlRelaxNGValidityWarningFunc
) fprintf
,
3601 relaxngschemas
= xmlRelaxNGParse(ctxt
);
3602 if (relaxngschemas
== NULL
) {
3603 xmlGenericError(xmlGenericErrorContext
,
3604 "Relax-NG schema %s failed to compile\n", relaxng
);
3605 progresult
= XMLLINT_ERR_SCHEMACOMP
;
3608 xmlRelaxNGFreeParserCtxt(ctxt
);
3610 endTimer("Compiling the schemas");
3612 } else if ((schema
!= NULL
)
3613 #ifdef LIBXML_READER_ENABLED
3617 xmlSchemaParserCtxtPtr ctxt
;
3622 ctxt
= xmlSchemaNewParserCtxt(schema
);
3623 xmlSchemaSetParserErrors(ctxt
,
3624 (xmlSchemaValidityErrorFunc
) fprintf
,
3625 (xmlSchemaValidityWarningFunc
) fprintf
,
3627 wxschemas
= xmlSchemaParse(ctxt
);
3628 if (wxschemas
== NULL
) {
3629 xmlGenericError(xmlGenericErrorContext
,
3630 "WXS schema %s failed to compile\n", schema
);
3631 progresult
= XMLLINT_ERR_SCHEMACOMP
;
3634 xmlSchemaFreeParserCtxt(ctxt
);
3636 endTimer("Compiling the schemas");
3639 #endif /* LIBXML_SCHEMAS_ENABLED */
3640 #ifdef LIBXML_PATTERN_ENABLED
3641 if ((pattern
!= NULL
)
3642 #ifdef LIBXML_READER_ENABLED
3646 patternc
= xmlPatterncompile((const xmlChar
*) pattern
, NULL
, 0, NULL
);
3647 if (patternc
== NULL
) {
3648 xmlGenericError(xmlGenericErrorContext
,
3649 "Pattern %s failed to compile\n", pattern
);
3650 progresult
= XMLLINT_ERR_SCHEMAPAT
;
3654 #endif /* LIBXML_PATTERN_ENABLED */
3655 for (i
= 1; i
< argc
; i
++) {
3656 if ((!strcmp(argv
[i
], "-encode")) ||
3657 (!strcmp(argv
[i
], "--encode"))) {
3660 } else if ((!strcmp(argv
[i
], "-o")) ||
3661 (!strcmp(argv
[i
], "-output")) ||
3662 (!strcmp(argv
[i
], "--output"))) {
3666 #ifdef LIBXML_VALID_ENABLED
3667 if ((!strcmp(argv
[i
], "-dtdvalid")) ||
3668 (!strcmp(argv
[i
], "--dtdvalid"))) {
3672 if ((!strcmp(argv
[i
], "-path")) ||
3673 (!strcmp(argv
[i
], "--path"))) {
3677 if ((!strcmp(argv
[i
], "-dtdvalidfpi")) ||
3678 (!strcmp(argv
[i
], "--dtdvalidfpi"))) {
3682 #endif /* LIBXML_VALID_ENABLED */
3683 if ((!strcmp(argv
[i
], "-relaxng")) ||
3684 (!strcmp(argv
[i
], "--relaxng"))) {
3688 if ((!strcmp(argv
[i
], "-maxmem")) ||
3689 (!strcmp(argv
[i
], "--maxmem"))) {
3693 if ((!strcmp(argv
[i
], "-pretty")) ||
3694 (!strcmp(argv
[i
], "--pretty"))) {
3698 if ((!strcmp(argv
[i
], "-schema")) ||
3699 (!strcmp(argv
[i
], "--schema"))) {
3703 if ((!strcmp(argv
[i
], "-schematron")) ||
3704 (!strcmp(argv
[i
], "--schematron"))) {
3708 #ifdef LIBXML_PATTERN_ENABLED
3709 if ((!strcmp(argv
[i
], "-pattern")) ||
3710 (!strcmp(argv
[i
], "--pattern"))) {
3715 #ifdef LIBXML_XPATH_ENABLED
3716 if ((!strcmp(argv
[i
], "-xpath")) ||
3717 (!strcmp(argv
[i
], "--xpath"))) {
3722 if ((timing
) && (repeat
))
3724 /* Remember file names. "-" means stdin. <sven@zen.org> */
3725 if ((argv
[i
][0] != '-') || (strcmp(argv
[i
], "-") == 0)) {
3727 xmlParserCtxtPtr ctxt
= NULL
;
3729 for (acount
= 0;acount
< repeat
;acount
++) {
3730 #ifdef LIBXML_READER_ENABLED
3732 streamFile(argv
[i
]);
3734 #endif /* LIBXML_READER_ENABLED */
3739 ctxt
= xmlNewParserCtxt();
3740 parseAndPrintFile(argv
[i
], ctxt
);
3742 #ifdef LIBXML_READER_ENABLED
3744 #endif /* LIBXML_READER_ENABLED */
3747 xmlFreeParserCtxt(ctxt
);
3751 #ifdef LIBXML_READER_ENABLED
3753 streamFile(argv
[i
]);
3755 #endif /* LIBXML_READER_ENABLED */
3759 parseAndPrintFile(argv
[i
], NULL
);
3762 if ((chkregister
) && (nbregister
!= 0)) {
3763 fprintf(stderr
, "Registration count off: %d\n", nbregister
);
3764 progresult
= XMLLINT_ERR_RDREGIS
;
3768 if ((timing
) && (repeat
)) {
3769 endTimer("%d iterations", repeat
);
3774 parseAndPrintFile(NULL
, NULL
);
3775 if ((htmlout
) && (!nowrap
)) {
3776 xmlGenericError(xmlGenericErrorContext
, "</body></html>\n");
3778 if ((files
== 0) && (!generate
) && (version
== 0)) {
3781 #ifdef LIBXML_SCHEMATRON_ENABLED
3782 if (wxschematron
!= NULL
)
3783 xmlSchematronFree(wxschematron
);
3785 #ifdef LIBXML_SCHEMAS_ENABLED
3786 if (relaxngschemas
!= NULL
)
3787 xmlRelaxNGFree(relaxngschemas
);
3788 if (wxschemas
!= NULL
)
3789 xmlSchemaFree(wxschemas
);
3790 xmlRelaxNGCleanupTypes();
3792 #ifdef LIBXML_PATTERN_ENABLED
3793 if (patternc
!= NULL
)
3794 xmlFreePattern(patternc
);