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