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