xref: /aosp_15_r20/external/libxml2/testlimits.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker  * testlimits.c: C program to run libxml2 regression tests checking various
3*7c568831SAndroid Build Coastguard Worker  *       limits in document size. Will consume a lot of RAM and CPU cycles
4*7c568831SAndroid Build Coastguard Worker  *
5*7c568831SAndroid Build Coastguard Worker  * To compile on Unixes:
6*7c568831SAndroid Build Coastguard Worker  * cc -o testlimits `xml2-config --cflags` testlimits.c `xml2-config --libs` -lpthread
7*7c568831SAndroid Build Coastguard Worker  *
8*7c568831SAndroid Build Coastguard Worker  * See Copyright for the status of this software.
9*7c568831SAndroid Build Coastguard Worker  *
10*7c568831SAndroid Build Coastguard Worker  * [email protected]
11*7c568831SAndroid Build Coastguard Worker  */
12*7c568831SAndroid Build Coastguard Worker 
13*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
14*7c568831SAndroid Build Coastguard Worker #include <stdio.h>
15*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
16*7c568831SAndroid Build Coastguard Worker #include <string.h>
17*7c568831SAndroid Build Coastguard Worker #include <sys/stat.h>
18*7c568831SAndroid Build Coastguard Worker #include <time.h>
19*7c568831SAndroid Build Coastguard Worker 
20*7c568831SAndroid Build Coastguard Worker #include <libxml/catalog.h>
21*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
22*7c568831SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
23*7c568831SAndroid Build Coastguard Worker #include <libxml/tree.h>
24*7c568831SAndroid Build Coastguard Worker #include <libxml/uri.h>
25*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
26*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlreader.h>
27*7c568831SAndroid Build Coastguard Worker #endif
28*7c568831SAndroid Build Coastguard Worker 
29*7c568831SAndroid Build Coastguard Worker static int verbose = 0;
30*7c568831SAndroid Build Coastguard Worker static int tests_quiet = 0;
31*7c568831SAndroid Build Coastguard Worker 
32*7c568831SAndroid Build Coastguard Worker /************************************************************************
33*7c568831SAndroid Build Coastguard Worker  *									*
34*7c568831SAndroid Build Coastguard Worker  *		time handling                                           *
35*7c568831SAndroid Build Coastguard Worker  *									*
36*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
37*7c568831SAndroid Build Coastguard Worker 
38*7c568831SAndroid Build Coastguard Worker /* maximum time for one parsing before declaring a timeout */
39*7c568831SAndroid Build Coastguard Worker #define MAX_TIME 2 /* seconds */
40*7c568831SAndroid Build Coastguard Worker 
41*7c568831SAndroid Build Coastguard Worker static clock_t t0;
42*7c568831SAndroid Build Coastguard Worker int timeout = 0;
43*7c568831SAndroid Build Coastguard Worker 
reset_timout(void)44*7c568831SAndroid Build Coastguard Worker static void reset_timout(void) {
45*7c568831SAndroid Build Coastguard Worker     timeout = 0;
46*7c568831SAndroid Build Coastguard Worker     t0 = clock();
47*7c568831SAndroid Build Coastguard Worker }
48*7c568831SAndroid Build Coastguard Worker 
check_time(void)49*7c568831SAndroid Build Coastguard Worker static int check_time(void) {
50*7c568831SAndroid Build Coastguard Worker     clock_t tnow = clock();
51*7c568831SAndroid Build Coastguard Worker     if (((tnow - t0) / CLOCKS_PER_SEC) > MAX_TIME) {
52*7c568831SAndroid Build Coastguard Worker         timeout = 1;
53*7c568831SAndroid Build Coastguard Worker         return(0);
54*7c568831SAndroid Build Coastguard Worker     }
55*7c568831SAndroid Build Coastguard Worker     return(1);
56*7c568831SAndroid Build Coastguard Worker }
57*7c568831SAndroid Build Coastguard Worker 
58*7c568831SAndroid Build Coastguard Worker /************************************************************************
59*7c568831SAndroid Build Coastguard Worker  *									*
60*7c568831SAndroid Build Coastguard Worker  *		Huge document generator					*
61*7c568831SAndroid Build Coastguard Worker  *									*
62*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
63*7c568831SAndroid Build Coastguard Worker 
64*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlIO.h>
65*7c568831SAndroid Build Coastguard Worker 
66*7c568831SAndroid Build Coastguard Worker /*
67*7c568831SAndroid Build Coastguard Worker  * Huge documents are built using fixed start and end chunks
68*7c568831SAndroid Build Coastguard Worker  * and filling between the two an unconventional amount of char data
69*7c568831SAndroid Build Coastguard Worker  */
70*7c568831SAndroid Build Coastguard Worker typedef struct hugeTest hugeTest;
71*7c568831SAndroid Build Coastguard Worker typedef hugeTest *hugeTestPtr;
72*7c568831SAndroid Build Coastguard Worker struct hugeTest {
73*7c568831SAndroid Build Coastguard Worker     const char *description;
74*7c568831SAndroid Build Coastguard Worker     const char *name;
75*7c568831SAndroid Build Coastguard Worker     const char *start;
76*7c568831SAndroid Build Coastguard Worker     const char *end;
77*7c568831SAndroid Build Coastguard Worker };
78*7c568831SAndroid Build Coastguard Worker 
79*7c568831SAndroid Build Coastguard Worker static struct hugeTest hugeTests[] = {
80*7c568831SAndroid Build Coastguard Worker     { "Huge text node", "huge:textNode", "<foo>", "</foo>" },
81*7c568831SAndroid Build Coastguard Worker     { "Huge attribute node", "huge:attrNode", "<foo bar='", "'/>" },
82*7c568831SAndroid Build Coastguard Worker     { "Huge comment node", "huge:commentNode", "<foo><!--", "--></foo>" },
83*7c568831SAndroid Build Coastguard Worker     { "Huge PI node", "huge:piNode", "<foo><?bar ", "?></foo>" },
84*7c568831SAndroid Build Coastguard Worker };
85*7c568831SAndroid Build Coastguard Worker 
86*7c568831SAndroid Build Coastguard Worker static const char *current;
87*7c568831SAndroid Build Coastguard Worker static int rlen;
88*7c568831SAndroid Build Coastguard Worker static unsigned int currentTest = 0;
89*7c568831SAndroid Build Coastguard Worker static int instate = 0;
90*7c568831SAndroid Build Coastguard Worker 
91*7c568831SAndroid Build Coastguard Worker /**
92*7c568831SAndroid Build Coastguard Worker  * hugeMatch:
93*7c568831SAndroid Build Coastguard Worker  * @URI: an URI to test
94*7c568831SAndroid Build Coastguard Worker  *
95*7c568831SAndroid Build Coastguard Worker  * Check for an huge: query
96*7c568831SAndroid Build Coastguard Worker  *
97*7c568831SAndroid Build Coastguard Worker  * Returns 1 if yes and 0 if another Input module should be used
98*7c568831SAndroid Build Coastguard Worker  */
99*7c568831SAndroid Build Coastguard Worker static int
hugeMatch(const char * URI)100*7c568831SAndroid Build Coastguard Worker hugeMatch(const char * URI) {
101*7c568831SAndroid Build Coastguard Worker     if ((URI != NULL) && (!strncmp(URI, "huge:", 5)))
102*7c568831SAndroid Build Coastguard Worker         return(1);
103*7c568831SAndroid Build Coastguard Worker     return(0);
104*7c568831SAndroid Build Coastguard Worker }
105*7c568831SAndroid Build Coastguard Worker 
106*7c568831SAndroid Build Coastguard Worker /**
107*7c568831SAndroid Build Coastguard Worker  * hugeOpen:
108*7c568831SAndroid Build Coastguard Worker  * @URI: an URI to test
109*7c568831SAndroid Build Coastguard Worker  *
110*7c568831SAndroid Build Coastguard Worker  * Return a pointer to the huge: query handler, in this example simply
111*7c568831SAndroid Build Coastguard Worker  * the current pointer...
112*7c568831SAndroid Build Coastguard Worker  *
113*7c568831SAndroid Build Coastguard Worker  * Returns an Input context or NULL in case or error
114*7c568831SAndroid Build Coastguard Worker  */
115*7c568831SAndroid Build Coastguard Worker static void *
hugeOpen(const char * URI)116*7c568831SAndroid Build Coastguard Worker hugeOpen(const char * URI) {
117*7c568831SAndroid Build Coastguard Worker     if ((URI == NULL) || (strncmp(URI, "huge:", 5)))
118*7c568831SAndroid Build Coastguard Worker         return(NULL);
119*7c568831SAndroid Build Coastguard Worker 
120*7c568831SAndroid Build Coastguard Worker     for (currentTest = 0;currentTest < sizeof(hugeTests)/sizeof(hugeTests[0]);
121*7c568831SAndroid Build Coastguard Worker          currentTest++)
122*7c568831SAndroid Build Coastguard Worker          if (!strcmp(hugeTests[currentTest].name, URI))
123*7c568831SAndroid Build Coastguard Worker              goto found;
124*7c568831SAndroid Build Coastguard Worker 
125*7c568831SAndroid Build Coastguard Worker     return(NULL);
126*7c568831SAndroid Build Coastguard Worker 
127*7c568831SAndroid Build Coastguard Worker found:
128*7c568831SAndroid Build Coastguard Worker     rlen = strlen(hugeTests[currentTest].start);
129*7c568831SAndroid Build Coastguard Worker     current = hugeTests[currentTest].start;
130*7c568831SAndroid Build Coastguard Worker     instate = 0;
131*7c568831SAndroid Build Coastguard Worker     return((void *) current);
132*7c568831SAndroid Build Coastguard Worker }
133*7c568831SAndroid Build Coastguard Worker 
134*7c568831SAndroid Build Coastguard Worker /**
135*7c568831SAndroid Build Coastguard Worker  * hugeClose:
136*7c568831SAndroid Build Coastguard Worker  * @context: the read context
137*7c568831SAndroid Build Coastguard Worker  *
138*7c568831SAndroid Build Coastguard Worker  * Close the huge: query handler
139*7c568831SAndroid Build Coastguard Worker  *
140*7c568831SAndroid Build Coastguard Worker  * Returns 0 or -1 in case of error
141*7c568831SAndroid Build Coastguard Worker  */
142*7c568831SAndroid Build Coastguard Worker static int
hugeClose(void * context)143*7c568831SAndroid Build Coastguard Worker hugeClose(void * context) {
144*7c568831SAndroid Build Coastguard Worker     if (context == NULL) return(-1);
145*7c568831SAndroid Build Coastguard Worker     fprintf(stderr, "\n");
146*7c568831SAndroid Build Coastguard Worker     return(0);
147*7c568831SAndroid Build Coastguard Worker }
148*7c568831SAndroid Build Coastguard Worker 
149*7c568831SAndroid Build Coastguard Worker #define CHUNK 4096
150*7c568831SAndroid Build Coastguard Worker 
151*7c568831SAndroid Build Coastguard Worker char filling[CHUNK + 1];
152*7c568831SAndroid Build Coastguard Worker 
fillFilling(void)153*7c568831SAndroid Build Coastguard Worker static void fillFilling(void) {
154*7c568831SAndroid Build Coastguard Worker     int i;
155*7c568831SAndroid Build Coastguard Worker 
156*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < CHUNK;i++) {
157*7c568831SAndroid Build Coastguard Worker         filling[i] = 'a';
158*7c568831SAndroid Build Coastguard Worker     }
159*7c568831SAndroid Build Coastguard Worker     filling[CHUNK] = 0;
160*7c568831SAndroid Build Coastguard Worker }
161*7c568831SAndroid Build Coastguard Worker 
162*7c568831SAndroid Build Coastguard Worker size_t maxlen = 64 * 1024 * 1024;
163*7c568831SAndroid Build Coastguard Worker size_t curlen = 0;
164*7c568831SAndroid Build Coastguard Worker size_t dotlen;
165*7c568831SAndroid Build Coastguard Worker 
166*7c568831SAndroid Build Coastguard Worker /**
167*7c568831SAndroid Build Coastguard Worker  * hugeRead:
168*7c568831SAndroid Build Coastguard Worker  * @context: the read context
169*7c568831SAndroid Build Coastguard Worker  * @buffer: where to store data
170*7c568831SAndroid Build Coastguard Worker  * @len: number of bytes to read
171*7c568831SAndroid Build Coastguard Worker  *
172*7c568831SAndroid Build Coastguard Worker  * Implement an huge: query read.
173*7c568831SAndroid Build Coastguard Worker  *
174*7c568831SAndroid Build Coastguard Worker  * Returns the number of bytes read or -1 in case of error
175*7c568831SAndroid Build Coastguard Worker  */
176*7c568831SAndroid Build Coastguard Worker static int
hugeRead(void * context,char * buffer,int len)177*7c568831SAndroid Build Coastguard Worker hugeRead(void *context, char *buffer, int len)
178*7c568831SAndroid Build Coastguard Worker {
179*7c568831SAndroid Build Coastguard Worker     if ((context == NULL) || (buffer == NULL) || (len < 0))
180*7c568831SAndroid Build Coastguard Worker         return (-1);
181*7c568831SAndroid Build Coastguard Worker 
182*7c568831SAndroid Build Coastguard Worker     if (instate == 0) {
183*7c568831SAndroid Build Coastguard Worker         if (len >= rlen) {
184*7c568831SAndroid Build Coastguard Worker             len = rlen;
185*7c568831SAndroid Build Coastguard Worker             rlen = 0;
186*7c568831SAndroid Build Coastguard Worker             memcpy(buffer, current, len);
187*7c568831SAndroid Build Coastguard Worker             instate = 1;
188*7c568831SAndroid Build Coastguard Worker             curlen = 0;
189*7c568831SAndroid Build Coastguard Worker             dotlen = maxlen / 10;
190*7c568831SAndroid Build Coastguard Worker         } else {
191*7c568831SAndroid Build Coastguard Worker             memcpy(buffer, current, len);
192*7c568831SAndroid Build Coastguard Worker             rlen -= len;
193*7c568831SAndroid Build Coastguard Worker             current += len;
194*7c568831SAndroid Build Coastguard Worker         }
195*7c568831SAndroid Build Coastguard Worker     } else if (instate == 2) {
196*7c568831SAndroid Build Coastguard Worker         if (len >= rlen) {
197*7c568831SAndroid Build Coastguard Worker             len = rlen;
198*7c568831SAndroid Build Coastguard Worker             rlen = 0;
199*7c568831SAndroid Build Coastguard Worker             memcpy(buffer, current, len);
200*7c568831SAndroid Build Coastguard Worker             instate = 3;
201*7c568831SAndroid Build Coastguard Worker             curlen = 0;
202*7c568831SAndroid Build Coastguard Worker         } else {
203*7c568831SAndroid Build Coastguard Worker             memcpy(buffer, current, len);
204*7c568831SAndroid Build Coastguard Worker             rlen -= len;
205*7c568831SAndroid Build Coastguard Worker             current += len;
206*7c568831SAndroid Build Coastguard Worker         }
207*7c568831SAndroid Build Coastguard Worker     } else if (instate == 1) {
208*7c568831SAndroid Build Coastguard Worker         if (len > CHUNK) len = CHUNK;
209*7c568831SAndroid Build Coastguard Worker         memcpy(buffer, &filling[0], len);
210*7c568831SAndroid Build Coastguard Worker         curlen += len;
211*7c568831SAndroid Build Coastguard Worker         if (curlen >= maxlen) {
212*7c568831SAndroid Build Coastguard Worker             rlen = strlen(hugeTests[currentTest].end);
213*7c568831SAndroid Build Coastguard Worker             current = hugeTests[currentTest].end;
214*7c568831SAndroid Build Coastguard Worker             instate = 2;
215*7c568831SAndroid Build Coastguard Worker 	} else {
216*7c568831SAndroid Build Coastguard Worker             if (curlen > dotlen) {
217*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, ".");
218*7c568831SAndroid Build Coastguard Worker                 dotlen += maxlen / 10;
219*7c568831SAndroid Build Coastguard Worker             }
220*7c568831SAndroid Build Coastguard Worker         }
221*7c568831SAndroid Build Coastguard Worker     } else
222*7c568831SAndroid Build Coastguard Worker       len = 0;
223*7c568831SAndroid Build Coastguard Worker     return (len);
224*7c568831SAndroid Build Coastguard Worker }
225*7c568831SAndroid Build Coastguard Worker 
226*7c568831SAndroid Build Coastguard Worker /************************************************************************
227*7c568831SAndroid Build Coastguard Worker  *									*
228*7c568831SAndroid Build Coastguard Worker  *		Crazy document generator				*
229*7c568831SAndroid Build Coastguard Worker  *									*
230*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
231*7c568831SAndroid Build Coastguard Worker 
232*7c568831SAndroid Build Coastguard Worker unsigned int crazy_indx = 0;
233*7c568831SAndroid Build Coastguard Worker 
234*7c568831SAndroid Build Coastguard Worker const char *crazy = "<?xml version='1.0' encoding='UTF-8'?>\
235*7c568831SAndroid Build Coastguard Worker <?tst ?>\
236*7c568831SAndroid Build Coastguard Worker <!-- tst -->\
237*7c568831SAndroid Build Coastguard Worker <!DOCTYPE foo [\
238*7c568831SAndroid Build Coastguard Worker <?tst ?>\
239*7c568831SAndroid Build Coastguard Worker <!-- tst -->\
240*7c568831SAndroid Build Coastguard Worker <!ELEMENT foo (#PCDATA)>\
241*7c568831SAndroid Build Coastguard Worker <!ELEMENT p (#PCDATA|emph)* >\
242*7c568831SAndroid Build Coastguard Worker ]>\
243*7c568831SAndroid Build Coastguard Worker <?tst ?>\
244*7c568831SAndroid Build Coastguard Worker <!-- tst -->\
245*7c568831SAndroid Build Coastguard Worker <foo bar='foo'>\
246*7c568831SAndroid Build Coastguard Worker <?tst ?>\
247*7c568831SAndroid Build Coastguard Worker <!-- tst -->\
248*7c568831SAndroid Build Coastguard Worker foo\
249*7c568831SAndroid Build Coastguard Worker <![CDATA[ ]]>\
250*7c568831SAndroid Build Coastguard Worker </foo>\
251*7c568831SAndroid Build Coastguard Worker <?tst ?>\
252*7c568831SAndroid Build Coastguard Worker <!-- tst -->";
253*7c568831SAndroid Build Coastguard Worker 
254*7c568831SAndroid Build Coastguard Worker /**
255*7c568831SAndroid Build Coastguard Worker  * crazyMatch:
256*7c568831SAndroid Build Coastguard Worker  * @URI: an URI to test
257*7c568831SAndroid Build Coastguard Worker  *
258*7c568831SAndroid Build Coastguard Worker  * Check for a crazy: query
259*7c568831SAndroid Build Coastguard Worker  *
260*7c568831SAndroid Build Coastguard Worker  * Returns 1 if yes and 0 if another Input module should be used
261*7c568831SAndroid Build Coastguard Worker  */
262*7c568831SAndroid Build Coastguard Worker static int
crazyMatch(const char * URI)263*7c568831SAndroid Build Coastguard Worker crazyMatch(const char * URI) {
264*7c568831SAndroid Build Coastguard Worker     if ((URI != NULL) && (!strncmp(URI, "crazy:", 6)))
265*7c568831SAndroid Build Coastguard Worker         return(1);
266*7c568831SAndroid Build Coastguard Worker     return(0);
267*7c568831SAndroid Build Coastguard Worker }
268*7c568831SAndroid Build Coastguard Worker 
269*7c568831SAndroid Build Coastguard Worker /**
270*7c568831SAndroid Build Coastguard Worker  * crazyOpen:
271*7c568831SAndroid Build Coastguard Worker  * @URI: an URI to test
272*7c568831SAndroid Build Coastguard Worker  *
273*7c568831SAndroid Build Coastguard Worker  * Return a pointer to the crazy: query handler, in this example simply
274*7c568831SAndroid Build Coastguard Worker  * the current pointer...
275*7c568831SAndroid Build Coastguard Worker  *
276*7c568831SAndroid Build Coastguard Worker  * Returns an Input context or NULL in case or error
277*7c568831SAndroid Build Coastguard Worker  */
278*7c568831SAndroid Build Coastguard Worker static void *
crazyOpen(const char * URI)279*7c568831SAndroid Build Coastguard Worker crazyOpen(const char * URI) {
280*7c568831SAndroid Build Coastguard Worker     if ((URI == NULL) || (strncmp(URI, "crazy:", 6)))
281*7c568831SAndroid Build Coastguard Worker         return(NULL);
282*7c568831SAndroid Build Coastguard Worker 
283*7c568831SAndroid Build Coastguard Worker     if (crazy_indx > strlen(crazy))
284*7c568831SAndroid Build Coastguard Worker         return(NULL);
285*7c568831SAndroid Build Coastguard Worker     reset_timout();
286*7c568831SAndroid Build Coastguard Worker     rlen = crazy_indx;
287*7c568831SAndroid Build Coastguard Worker     current = &crazy[0];
288*7c568831SAndroid Build Coastguard Worker     instate = 0;
289*7c568831SAndroid Build Coastguard Worker     return((void *) current);
290*7c568831SAndroid Build Coastguard Worker }
291*7c568831SAndroid Build Coastguard Worker 
292*7c568831SAndroid Build Coastguard Worker /**
293*7c568831SAndroid Build Coastguard Worker  * crazyClose:
294*7c568831SAndroid Build Coastguard Worker  * @context: the read context
295*7c568831SAndroid Build Coastguard Worker  *
296*7c568831SAndroid Build Coastguard Worker  * Close the crazy: query handler
297*7c568831SAndroid Build Coastguard Worker  *
298*7c568831SAndroid Build Coastguard Worker  * Returns 0 or -1 in case of error
299*7c568831SAndroid Build Coastguard Worker  */
300*7c568831SAndroid Build Coastguard Worker static int
crazyClose(void * context)301*7c568831SAndroid Build Coastguard Worker crazyClose(void * context) {
302*7c568831SAndroid Build Coastguard Worker     if (context == NULL) return(-1);
303*7c568831SAndroid Build Coastguard Worker     return(0);
304*7c568831SAndroid Build Coastguard Worker }
305*7c568831SAndroid Build Coastguard Worker 
306*7c568831SAndroid Build Coastguard Worker 
307*7c568831SAndroid Build Coastguard Worker /**
308*7c568831SAndroid Build Coastguard Worker  * crazyRead:
309*7c568831SAndroid Build Coastguard Worker  * @context: the read context
310*7c568831SAndroid Build Coastguard Worker  * @buffer: where to store data
311*7c568831SAndroid Build Coastguard Worker  * @len: number of bytes to read
312*7c568831SAndroid Build Coastguard Worker  *
313*7c568831SAndroid Build Coastguard Worker  * Implement an crazy: query read.
314*7c568831SAndroid Build Coastguard Worker  *
315*7c568831SAndroid Build Coastguard Worker  * Returns the number of bytes read or -1 in case of error
316*7c568831SAndroid Build Coastguard Worker  */
317*7c568831SAndroid Build Coastguard Worker static int
crazyRead(void * context,char * buffer,int len)318*7c568831SAndroid Build Coastguard Worker crazyRead(void *context, char *buffer, int len)
319*7c568831SAndroid Build Coastguard Worker {
320*7c568831SAndroid Build Coastguard Worker     if ((context == NULL) || (buffer == NULL) || (len < 0))
321*7c568831SAndroid Build Coastguard Worker         return (-1);
322*7c568831SAndroid Build Coastguard Worker 
323*7c568831SAndroid Build Coastguard Worker     if ((check_time() <= 0) && (instate == 1)) {
324*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "\ntimeout in crazy(%d)\n", crazy_indx);
325*7c568831SAndroid Build Coastguard Worker         rlen = strlen(crazy) - crazy_indx;
326*7c568831SAndroid Build Coastguard Worker         current = &crazy[crazy_indx];
327*7c568831SAndroid Build Coastguard Worker         instate = 2;
328*7c568831SAndroid Build Coastguard Worker     }
329*7c568831SAndroid Build Coastguard Worker     if (instate == 0) {
330*7c568831SAndroid Build Coastguard Worker         if (len >= rlen) {
331*7c568831SAndroid Build Coastguard Worker             len = rlen;
332*7c568831SAndroid Build Coastguard Worker             rlen = 0;
333*7c568831SAndroid Build Coastguard Worker             memcpy(buffer, current, len);
334*7c568831SAndroid Build Coastguard Worker             instate = 1;
335*7c568831SAndroid Build Coastguard Worker             curlen = 0;
336*7c568831SAndroid Build Coastguard Worker         } else {
337*7c568831SAndroid Build Coastguard Worker             memcpy(buffer, current, len);
338*7c568831SAndroid Build Coastguard Worker             rlen -= len;
339*7c568831SAndroid Build Coastguard Worker             current += len;
340*7c568831SAndroid Build Coastguard Worker         }
341*7c568831SAndroid Build Coastguard Worker     } else if (instate == 2) {
342*7c568831SAndroid Build Coastguard Worker         if (len >= rlen) {
343*7c568831SAndroid Build Coastguard Worker             len = rlen;
344*7c568831SAndroid Build Coastguard Worker             rlen = 0;
345*7c568831SAndroid Build Coastguard Worker             memcpy(buffer, current, len);
346*7c568831SAndroid Build Coastguard Worker             instate = 3;
347*7c568831SAndroid Build Coastguard Worker             curlen = 0;
348*7c568831SAndroid Build Coastguard Worker         } else {
349*7c568831SAndroid Build Coastguard Worker             memcpy(buffer, current, len);
350*7c568831SAndroid Build Coastguard Worker             rlen -= len;
351*7c568831SAndroid Build Coastguard Worker             current += len;
352*7c568831SAndroid Build Coastguard Worker         }
353*7c568831SAndroid Build Coastguard Worker     } else if (instate == 1) {
354*7c568831SAndroid Build Coastguard Worker         if (len > CHUNK) len = CHUNK;
355*7c568831SAndroid Build Coastguard Worker         memcpy(buffer, &filling[0], len);
356*7c568831SAndroid Build Coastguard Worker         curlen += len;
357*7c568831SAndroid Build Coastguard Worker         if (curlen >= maxlen) {
358*7c568831SAndroid Build Coastguard Worker             rlen = strlen(crazy) - crazy_indx;
359*7c568831SAndroid Build Coastguard Worker             current = &crazy[crazy_indx];
360*7c568831SAndroid Build Coastguard Worker             instate = 2;
361*7c568831SAndroid Build Coastguard Worker         }
362*7c568831SAndroid Build Coastguard Worker     } else
363*7c568831SAndroid Build Coastguard Worker       len = 0;
364*7c568831SAndroid Build Coastguard Worker     return (len);
365*7c568831SAndroid Build Coastguard Worker }
366*7c568831SAndroid Build Coastguard Worker /************************************************************************
367*7c568831SAndroid Build Coastguard Worker  *									*
368*7c568831SAndroid Build Coastguard Worker  *		Libxml2 specific routines				*
369*7c568831SAndroid Build Coastguard Worker  *									*
370*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
371*7c568831SAndroid Build Coastguard Worker 
372*7c568831SAndroid Build Coastguard Worker static int nb_tests = 0;
373*7c568831SAndroid Build Coastguard Worker static int nb_errors = 0;
374*7c568831SAndroid Build Coastguard Worker static int nb_leaks = 0;
375*7c568831SAndroid Build Coastguard Worker 
376*7c568831SAndroid Build Coastguard Worker static void
initializeLibxml2(void)377*7c568831SAndroid Build Coastguard Worker initializeLibxml2(void) {
378*7c568831SAndroid Build Coastguard Worker     xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);
379*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
380*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
381*7c568831SAndroid Build Coastguard Worker     xmlInitializeCatalog();
382*7c568831SAndroid Build Coastguard Worker     xmlCatalogSetDefaults(XML_CATA_ALLOW_NONE);
383*7c568831SAndroid Build Coastguard Worker #endif
384*7c568831SAndroid Build Coastguard Worker     /*
385*7c568831SAndroid Build Coastguard Worker      * register the new I/O handlers
386*7c568831SAndroid Build Coastguard Worker      */
387*7c568831SAndroid Build Coastguard Worker     if (xmlRegisterInputCallbacks(hugeMatch, hugeOpen,
388*7c568831SAndroid Build Coastguard Worker                                   hugeRead, hugeClose) < 0) {
389*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "failed to register Huge handlers\n");
390*7c568831SAndroid Build Coastguard Worker 	exit(1);
391*7c568831SAndroid Build Coastguard Worker     }
392*7c568831SAndroid Build Coastguard Worker     if (xmlRegisterInputCallbacks(crazyMatch, crazyOpen,
393*7c568831SAndroid Build Coastguard Worker                                   crazyRead, crazyClose) < 0) {
394*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "failed to register Crazy handlers\n");
395*7c568831SAndroid Build Coastguard Worker 	exit(1);
396*7c568831SAndroid Build Coastguard Worker     }
397*7c568831SAndroid Build Coastguard Worker }
398*7c568831SAndroid Build Coastguard Worker 
399*7c568831SAndroid Build Coastguard Worker /************************************************************************
400*7c568831SAndroid Build Coastguard Worker  *									*
401*7c568831SAndroid Build Coastguard Worker  *		SAX empty callbacks                                     *
402*7c568831SAndroid Build Coastguard Worker  *									*
403*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
404*7c568831SAndroid Build Coastguard Worker 
405*7c568831SAndroid Build Coastguard Worker unsigned long callbacks = 0;
406*7c568831SAndroid Build Coastguard Worker 
407*7c568831SAndroid Build Coastguard Worker /**
408*7c568831SAndroid Build Coastguard Worker  * isStandaloneCallback:
409*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
410*7c568831SAndroid Build Coastguard Worker  *
411*7c568831SAndroid Build Coastguard Worker  * Is this document tagged standalone ?
412*7c568831SAndroid Build Coastguard Worker  *
413*7c568831SAndroid Build Coastguard Worker  * Returns 1 if true
414*7c568831SAndroid Build Coastguard Worker  */
415*7c568831SAndroid Build Coastguard Worker static int
isStandaloneCallback(void * ctx ATTRIBUTE_UNUSED)416*7c568831SAndroid Build Coastguard Worker isStandaloneCallback(void *ctx ATTRIBUTE_UNUSED)
417*7c568831SAndroid Build Coastguard Worker {
418*7c568831SAndroid Build Coastguard Worker     callbacks++;
419*7c568831SAndroid Build Coastguard Worker     return (0);
420*7c568831SAndroid Build Coastguard Worker }
421*7c568831SAndroid Build Coastguard Worker 
422*7c568831SAndroid Build Coastguard Worker /**
423*7c568831SAndroid Build Coastguard Worker  * hasInternalSubsetCallback:
424*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
425*7c568831SAndroid Build Coastguard Worker  *
426*7c568831SAndroid Build Coastguard Worker  * Does this document has an internal subset
427*7c568831SAndroid Build Coastguard Worker  *
428*7c568831SAndroid Build Coastguard Worker  * Returns 1 if true
429*7c568831SAndroid Build Coastguard Worker  */
430*7c568831SAndroid Build Coastguard Worker static int
hasInternalSubsetCallback(void * ctx ATTRIBUTE_UNUSED)431*7c568831SAndroid Build Coastguard Worker hasInternalSubsetCallback(void *ctx ATTRIBUTE_UNUSED)
432*7c568831SAndroid Build Coastguard Worker {
433*7c568831SAndroid Build Coastguard Worker     callbacks++;
434*7c568831SAndroid Build Coastguard Worker     return (0);
435*7c568831SAndroid Build Coastguard Worker }
436*7c568831SAndroid Build Coastguard Worker 
437*7c568831SAndroid Build Coastguard Worker /**
438*7c568831SAndroid Build Coastguard Worker  * hasExternalSubsetCallback:
439*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
440*7c568831SAndroid Build Coastguard Worker  *
441*7c568831SAndroid Build Coastguard Worker  * Does this document has an external subset
442*7c568831SAndroid Build Coastguard Worker  *
443*7c568831SAndroid Build Coastguard Worker  * Returns 1 if true
444*7c568831SAndroid Build Coastguard Worker  */
445*7c568831SAndroid Build Coastguard Worker static int
hasExternalSubsetCallback(void * ctx ATTRIBUTE_UNUSED)446*7c568831SAndroid Build Coastguard Worker hasExternalSubsetCallback(void *ctx ATTRIBUTE_UNUSED)
447*7c568831SAndroid Build Coastguard Worker {
448*7c568831SAndroid Build Coastguard Worker     callbacks++;
449*7c568831SAndroid Build Coastguard Worker     return (0);
450*7c568831SAndroid Build Coastguard Worker }
451*7c568831SAndroid Build Coastguard Worker 
452*7c568831SAndroid Build Coastguard Worker /**
453*7c568831SAndroid Build Coastguard Worker  * internalSubsetCallback:
454*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
455*7c568831SAndroid Build Coastguard Worker  *
456*7c568831SAndroid Build Coastguard Worker  * Does this document has an internal subset
457*7c568831SAndroid Build Coastguard Worker  */
458*7c568831SAndroid Build Coastguard Worker static void
internalSubsetCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED,const xmlChar * ExternalID ATTRIBUTE_UNUSED,const xmlChar * SystemID ATTRIBUTE_UNUSED)459*7c568831SAndroid Build Coastguard Worker internalSubsetCallback(void *ctx ATTRIBUTE_UNUSED,
460*7c568831SAndroid Build Coastguard Worker                        const xmlChar * name ATTRIBUTE_UNUSED,
461*7c568831SAndroid Build Coastguard Worker                        const xmlChar * ExternalID ATTRIBUTE_UNUSED,
462*7c568831SAndroid Build Coastguard Worker                        const xmlChar * SystemID ATTRIBUTE_UNUSED)
463*7c568831SAndroid Build Coastguard Worker {
464*7c568831SAndroid Build Coastguard Worker     callbacks++;
465*7c568831SAndroid Build Coastguard Worker }
466*7c568831SAndroid Build Coastguard Worker 
467*7c568831SAndroid Build Coastguard Worker /**
468*7c568831SAndroid Build Coastguard Worker  * externalSubsetCallback:
469*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
470*7c568831SAndroid Build Coastguard Worker  *
471*7c568831SAndroid Build Coastguard Worker  * Does this document has an external subset
472*7c568831SAndroid Build Coastguard Worker  */
473*7c568831SAndroid Build Coastguard Worker static void
externalSubsetCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED,const xmlChar * ExternalID ATTRIBUTE_UNUSED,const xmlChar * SystemID ATTRIBUTE_UNUSED)474*7c568831SAndroid Build Coastguard Worker externalSubsetCallback(void *ctx ATTRIBUTE_UNUSED,
475*7c568831SAndroid Build Coastguard Worker                        const xmlChar * name ATTRIBUTE_UNUSED,
476*7c568831SAndroid Build Coastguard Worker                        const xmlChar * ExternalID ATTRIBUTE_UNUSED,
477*7c568831SAndroid Build Coastguard Worker                        const xmlChar * SystemID ATTRIBUTE_UNUSED)
478*7c568831SAndroid Build Coastguard Worker {
479*7c568831SAndroid Build Coastguard Worker     callbacks++;
480*7c568831SAndroid Build Coastguard Worker }
481*7c568831SAndroid Build Coastguard Worker 
482*7c568831SAndroid Build Coastguard Worker /**
483*7c568831SAndroid Build Coastguard Worker  * resolveEntityCallback:
484*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
485*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
486*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
487*7c568831SAndroid Build Coastguard Worker  *
488*7c568831SAndroid Build Coastguard Worker  * Special entity resolver, better left to the parser, it has
489*7c568831SAndroid Build Coastguard Worker  * more context than the application layer.
490*7c568831SAndroid Build Coastguard Worker  * The default behaviour is to NOT resolve the entities, in that case
491*7c568831SAndroid Build Coastguard Worker  * the ENTITY_REF nodes are built in the structure (and the parameter
492*7c568831SAndroid Build Coastguard Worker  * values).
493*7c568831SAndroid Build Coastguard Worker  *
494*7c568831SAndroid Build Coastguard Worker  * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
495*7c568831SAndroid Build Coastguard Worker  */
496*7c568831SAndroid Build Coastguard Worker static xmlParserInputPtr
resolveEntityCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * publicId ATTRIBUTE_UNUSED,const xmlChar * systemId ATTRIBUTE_UNUSED)497*7c568831SAndroid Build Coastguard Worker resolveEntityCallback(void *ctx ATTRIBUTE_UNUSED,
498*7c568831SAndroid Build Coastguard Worker                       const xmlChar * publicId ATTRIBUTE_UNUSED,
499*7c568831SAndroid Build Coastguard Worker                       const xmlChar * systemId ATTRIBUTE_UNUSED)
500*7c568831SAndroid Build Coastguard Worker {
501*7c568831SAndroid Build Coastguard Worker     callbacks++;
502*7c568831SAndroid Build Coastguard Worker     return (NULL);
503*7c568831SAndroid Build Coastguard Worker }
504*7c568831SAndroid Build Coastguard Worker 
505*7c568831SAndroid Build Coastguard Worker /**
506*7c568831SAndroid Build Coastguard Worker  * getEntityCallback:
507*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
508*7c568831SAndroid Build Coastguard Worker  * @name: The entity name
509*7c568831SAndroid Build Coastguard Worker  *
510*7c568831SAndroid Build Coastguard Worker  * Get an entity by name
511*7c568831SAndroid Build Coastguard Worker  *
512*7c568831SAndroid Build Coastguard Worker  * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
513*7c568831SAndroid Build Coastguard Worker  */
514*7c568831SAndroid Build Coastguard Worker static xmlEntityPtr
getEntityCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED)515*7c568831SAndroid Build Coastguard Worker getEntityCallback(void *ctx ATTRIBUTE_UNUSED,
516*7c568831SAndroid Build Coastguard Worker                   const xmlChar * name ATTRIBUTE_UNUSED)
517*7c568831SAndroid Build Coastguard Worker {
518*7c568831SAndroid Build Coastguard Worker     callbacks++;
519*7c568831SAndroid Build Coastguard Worker     return (NULL);
520*7c568831SAndroid Build Coastguard Worker }
521*7c568831SAndroid Build Coastguard Worker 
522*7c568831SAndroid Build Coastguard Worker /**
523*7c568831SAndroid Build Coastguard Worker  * getParameterEntityCallback:
524*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
525*7c568831SAndroid Build Coastguard Worker  * @name: The entity name
526*7c568831SAndroid Build Coastguard Worker  *
527*7c568831SAndroid Build Coastguard Worker  * Get a parameter entity by name
528*7c568831SAndroid Build Coastguard Worker  *
529*7c568831SAndroid Build Coastguard Worker  * Returns the xmlParserInputPtr
530*7c568831SAndroid Build Coastguard Worker  */
531*7c568831SAndroid Build Coastguard Worker static xmlEntityPtr
getParameterEntityCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED)532*7c568831SAndroid Build Coastguard Worker getParameterEntityCallback(void *ctx ATTRIBUTE_UNUSED,
533*7c568831SAndroid Build Coastguard Worker                            const xmlChar * name ATTRIBUTE_UNUSED)
534*7c568831SAndroid Build Coastguard Worker {
535*7c568831SAndroid Build Coastguard Worker     callbacks++;
536*7c568831SAndroid Build Coastguard Worker     return (NULL);
537*7c568831SAndroid Build Coastguard Worker }
538*7c568831SAndroid Build Coastguard Worker 
539*7c568831SAndroid Build Coastguard Worker 
540*7c568831SAndroid Build Coastguard Worker /**
541*7c568831SAndroid Build Coastguard Worker  * entityDeclCallback:
542*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
543*7c568831SAndroid Build Coastguard Worker  * @name:  the entity name
544*7c568831SAndroid Build Coastguard Worker  * @type:  the entity type
545*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
546*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
547*7c568831SAndroid Build Coastguard Worker  * @content: the entity value (without processing).
548*7c568831SAndroid Build Coastguard Worker  *
549*7c568831SAndroid Build Coastguard Worker  * An entity definition has been parsed
550*7c568831SAndroid Build Coastguard Worker  */
551*7c568831SAndroid Build Coastguard Worker static void
entityDeclCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED,int type ATTRIBUTE_UNUSED,const xmlChar * publicId ATTRIBUTE_UNUSED,const xmlChar * systemId ATTRIBUTE_UNUSED,xmlChar * content ATTRIBUTE_UNUSED)552*7c568831SAndroid Build Coastguard Worker entityDeclCallback(void *ctx ATTRIBUTE_UNUSED,
553*7c568831SAndroid Build Coastguard Worker                    const xmlChar * name ATTRIBUTE_UNUSED,
554*7c568831SAndroid Build Coastguard Worker                    int type ATTRIBUTE_UNUSED,
555*7c568831SAndroid Build Coastguard Worker                    const xmlChar * publicId ATTRIBUTE_UNUSED,
556*7c568831SAndroid Build Coastguard Worker                    const xmlChar * systemId ATTRIBUTE_UNUSED,
557*7c568831SAndroid Build Coastguard Worker                    xmlChar * content ATTRIBUTE_UNUSED)
558*7c568831SAndroid Build Coastguard Worker {
559*7c568831SAndroid Build Coastguard Worker     callbacks++;
560*7c568831SAndroid Build Coastguard Worker }
561*7c568831SAndroid Build Coastguard Worker 
562*7c568831SAndroid Build Coastguard Worker /**
563*7c568831SAndroid Build Coastguard Worker  * attributeDeclCallback:
564*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
565*7c568831SAndroid Build Coastguard Worker  * @name:  the attribute name
566*7c568831SAndroid Build Coastguard Worker  * @type:  the attribute type
567*7c568831SAndroid Build Coastguard Worker  *
568*7c568831SAndroid Build Coastguard Worker  * An attribute definition has been parsed
569*7c568831SAndroid Build Coastguard Worker  */
570*7c568831SAndroid Build Coastguard Worker static void
attributeDeclCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * elem ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED,int type ATTRIBUTE_UNUSED,int def ATTRIBUTE_UNUSED,const xmlChar * defaultValue ATTRIBUTE_UNUSED,xmlEnumerationPtr tree ATTRIBUTE_UNUSED)571*7c568831SAndroid Build Coastguard Worker attributeDeclCallback(void *ctx ATTRIBUTE_UNUSED,
572*7c568831SAndroid Build Coastguard Worker                       const xmlChar * elem ATTRIBUTE_UNUSED,
573*7c568831SAndroid Build Coastguard Worker                       const xmlChar * name ATTRIBUTE_UNUSED,
574*7c568831SAndroid Build Coastguard Worker                       int type ATTRIBUTE_UNUSED, int def ATTRIBUTE_UNUSED,
575*7c568831SAndroid Build Coastguard Worker                       const xmlChar * defaultValue ATTRIBUTE_UNUSED,
576*7c568831SAndroid Build Coastguard Worker                       xmlEnumerationPtr tree ATTRIBUTE_UNUSED)
577*7c568831SAndroid Build Coastguard Worker {
578*7c568831SAndroid Build Coastguard Worker     callbacks++;
579*7c568831SAndroid Build Coastguard Worker }
580*7c568831SAndroid Build Coastguard Worker 
581*7c568831SAndroid Build Coastguard Worker /**
582*7c568831SAndroid Build Coastguard Worker  * elementDeclCallback:
583*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
584*7c568831SAndroid Build Coastguard Worker  * @name:  the element name
585*7c568831SAndroid Build Coastguard Worker  * @type:  the element type
586*7c568831SAndroid Build Coastguard Worker  * @content: the element value (without processing).
587*7c568831SAndroid Build Coastguard Worker  *
588*7c568831SAndroid Build Coastguard Worker  * An element definition has been parsed
589*7c568831SAndroid Build Coastguard Worker  */
590*7c568831SAndroid Build Coastguard Worker static void
elementDeclCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED,int type ATTRIBUTE_UNUSED,xmlElementContentPtr content ATTRIBUTE_UNUSED)591*7c568831SAndroid Build Coastguard Worker elementDeclCallback(void *ctx ATTRIBUTE_UNUSED,
592*7c568831SAndroid Build Coastguard Worker                     const xmlChar * name ATTRIBUTE_UNUSED,
593*7c568831SAndroid Build Coastguard Worker                     int type ATTRIBUTE_UNUSED,
594*7c568831SAndroid Build Coastguard Worker                     xmlElementContentPtr content ATTRIBUTE_UNUSED)
595*7c568831SAndroid Build Coastguard Worker {
596*7c568831SAndroid Build Coastguard Worker     callbacks++;
597*7c568831SAndroid Build Coastguard Worker }
598*7c568831SAndroid Build Coastguard Worker 
599*7c568831SAndroid Build Coastguard Worker /**
600*7c568831SAndroid Build Coastguard Worker  * notationDeclCallback:
601*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
602*7c568831SAndroid Build Coastguard Worker  * @name: The name of the notation
603*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
604*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
605*7c568831SAndroid Build Coastguard Worker  *
606*7c568831SAndroid Build Coastguard Worker  * What to do when a notation declaration has been parsed.
607*7c568831SAndroid Build Coastguard Worker  */
608*7c568831SAndroid Build Coastguard Worker static void
notationDeclCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED,const xmlChar * publicId ATTRIBUTE_UNUSED,const xmlChar * systemId ATTRIBUTE_UNUSED)609*7c568831SAndroid Build Coastguard Worker notationDeclCallback(void *ctx ATTRIBUTE_UNUSED,
610*7c568831SAndroid Build Coastguard Worker                      const xmlChar * name ATTRIBUTE_UNUSED,
611*7c568831SAndroid Build Coastguard Worker                      const xmlChar * publicId ATTRIBUTE_UNUSED,
612*7c568831SAndroid Build Coastguard Worker                      const xmlChar * systemId ATTRIBUTE_UNUSED)
613*7c568831SAndroid Build Coastguard Worker {
614*7c568831SAndroid Build Coastguard Worker     callbacks++;
615*7c568831SAndroid Build Coastguard Worker }
616*7c568831SAndroid Build Coastguard Worker 
617*7c568831SAndroid Build Coastguard Worker /**
618*7c568831SAndroid Build Coastguard Worker  * unparsedEntityDeclCallback:
619*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
620*7c568831SAndroid Build Coastguard Worker  * @name: The name of the entity
621*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
622*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
623*7c568831SAndroid Build Coastguard Worker  * @notationName: the name of the notation
624*7c568831SAndroid Build Coastguard Worker  *
625*7c568831SAndroid Build Coastguard Worker  * What to do when an unparsed entity declaration is parsed
626*7c568831SAndroid Build Coastguard Worker  */
627*7c568831SAndroid Build Coastguard Worker static void
unparsedEntityDeclCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED,const xmlChar * publicId ATTRIBUTE_UNUSED,const xmlChar * systemId ATTRIBUTE_UNUSED,const xmlChar * notationName ATTRIBUTE_UNUSED)628*7c568831SAndroid Build Coastguard Worker unparsedEntityDeclCallback(void *ctx ATTRIBUTE_UNUSED,
629*7c568831SAndroid Build Coastguard Worker                            const xmlChar * name ATTRIBUTE_UNUSED,
630*7c568831SAndroid Build Coastguard Worker                            const xmlChar * publicId ATTRIBUTE_UNUSED,
631*7c568831SAndroid Build Coastguard Worker                            const xmlChar * systemId ATTRIBUTE_UNUSED,
632*7c568831SAndroid Build Coastguard Worker                            const xmlChar * notationName ATTRIBUTE_UNUSED)
633*7c568831SAndroid Build Coastguard Worker {
634*7c568831SAndroid Build Coastguard Worker     callbacks++;
635*7c568831SAndroid Build Coastguard Worker }
636*7c568831SAndroid Build Coastguard Worker 
637*7c568831SAndroid Build Coastguard Worker /**
638*7c568831SAndroid Build Coastguard Worker  * setDocumentLocatorCallback:
639*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
640*7c568831SAndroid Build Coastguard Worker  * @loc: A SAX Locator
641*7c568831SAndroid Build Coastguard Worker  *
642*7c568831SAndroid Build Coastguard Worker  * Receive the document locator at startup, actually xmlDefaultSAXLocator
643*7c568831SAndroid Build Coastguard Worker  * Everything is available on the context, so this is useless in our case.
644*7c568831SAndroid Build Coastguard Worker  */
645*7c568831SAndroid Build Coastguard Worker static void
setDocumentLocatorCallback(void * ctx ATTRIBUTE_UNUSED,xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)646*7c568831SAndroid Build Coastguard Worker setDocumentLocatorCallback(void *ctx ATTRIBUTE_UNUSED,
647*7c568831SAndroid Build Coastguard Worker                            xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
648*7c568831SAndroid Build Coastguard Worker {
649*7c568831SAndroid Build Coastguard Worker     callbacks++;
650*7c568831SAndroid Build Coastguard Worker }
651*7c568831SAndroid Build Coastguard Worker 
652*7c568831SAndroid Build Coastguard Worker /**
653*7c568831SAndroid Build Coastguard Worker  * startDocumentCallback:
654*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
655*7c568831SAndroid Build Coastguard Worker  *
656*7c568831SAndroid Build Coastguard Worker  * called when the document start being processed.
657*7c568831SAndroid Build Coastguard Worker  */
658*7c568831SAndroid Build Coastguard Worker static void
startDocumentCallback(void * ctx ATTRIBUTE_UNUSED)659*7c568831SAndroid Build Coastguard Worker startDocumentCallback(void *ctx ATTRIBUTE_UNUSED)
660*7c568831SAndroid Build Coastguard Worker {
661*7c568831SAndroid Build Coastguard Worker     callbacks++;
662*7c568831SAndroid Build Coastguard Worker }
663*7c568831SAndroid Build Coastguard Worker 
664*7c568831SAndroid Build Coastguard Worker /**
665*7c568831SAndroid Build Coastguard Worker  * endDocumentCallback:
666*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
667*7c568831SAndroid Build Coastguard Worker  *
668*7c568831SAndroid Build Coastguard Worker  * called when the document end has been detected.
669*7c568831SAndroid Build Coastguard Worker  */
670*7c568831SAndroid Build Coastguard Worker static void
endDocumentCallback(void * ctx ATTRIBUTE_UNUSED)671*7c568831SAndroid Build Coastguard Worker endDocumentCallback(void *ctx ATTRIBUTE_UNUSED)
672*7c568831SAndroid Build Coastguard Worker {
673*7c568831SAndroid Build Coastguard Worker     callbacks++;
674*7c568831SAndroid Build Coastguard Worker }
675*7c568831SAndroid Build Coastguard Worker 
676*7c568831SAndroid Build Coastguard Worker #if 0
677*7c568831SAndroid Build Coastguard Worker /**
678*7c568831SAndroid Build Coastguard Worker  * startElementCallback:
679*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
680*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
681*7c568831SAndroid Build Coastguard Worker  *
682*7c568831SAndroid Build Coastguard Worker  * called when an opening tag has been processed.
683*7c568831SAndroid Build Coastguard Worker  */
684*7c568831SAndroid Build Coastguard Worker static void
685*7c568831SAndroid Build Coastguard Worker startElementCallback(void *ctx ATTRIBUTE_UNUSED,
686*7c568831SAndroid Build Coastguard Worker                      const xmlChar * name ATTRIBUTE_UNUSED,
687*7c568831SAndroid Build Coastguard Worker                      const xmlChar ** atts ATTRIBUTE_UNUSED)
688*7c568831SAndroid Build Coastguard Worker {
689*7c568831SAndroid Build Coastguard Worker     callbacks++;
690*7c568831SAndroid Build Coastguard Worker     return;
691*7c568831SAndroid Build Coastguard Worker }
692*7c568831SAndroid Build Coastguard Worker 
693*7c568831SAndroid Build Coastguard Worker /**
694*7c568831SAndroid Build Coastguard Worker  * endElementCallback:
695*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
696*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
697*7c568831SAndroid Build Coastguard Worker  *
698*7c568831SAndroid Build Coastguard Worker  * called when the end of an element has been detected.
699*7c568831SAndroid Build Coastguard Worker  */
700*7c568831SAndroid Build Coastguard Worker static void
701*7c568831SAndroid Build Coastguard Worker endElementCallback(void *ctx ATTRIBUTE_UNUSED,
702*7c568831SAndroid Build Coastguard Worker                    const xmlChar * name ATTRIBUTE_UNUSED)
703*7c568831SAndroid Build Coastguard Worker {
704*7c568831SAndroid Build Coastguard Worker     callbacks++;
705*7c568831SAndroid Build Coastguard Worker     return;
706*7c568831SAndroid Build Coastguard Worker }
707*7c568831SAndroid Build Coastguard Worker #endif
708*7c568831SAndroid Build Coastguard Worker 
709*7c568831SAndroid Build Coastguard Worker /**
710*7c568831SAndroid Build Coastguard Worker  * charactersCallback:
711*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
712*7c568831SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
713*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
714*7c568831SAndroid Build Coastguard Worker  *
715*7c568831SAndroid Build Coastguard Worker  * receiving some chars from the parser.
716*7c568831SAndroid Build Coastguard Worker  * Question: how much at a time ???
717*7c568831SAndroid Build Coastguard Worker  */
718*7c568831SAndroid Build Coastguard Worker static void
charactersCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * ch ATTRIBUTE_UNUSED,int len ATTRIBUTE_UNUSED)719*7c568831SAndroid Build Coastguard Worker charactersCallback(void *ctx ATTRIBUTE_UNUSED,
720*7c568831SAndroid Build Coastguard Worker                    const xmlChar * ch ATTRIBUTE_UNUSED,
721*7c568831SAndroid Build Coastguard Worker                    int len ATTRIBUTE_UNUSED)
722*7c568831SAndroid Build Coastguard Worker {
723*7c568831SAndroid Build Coastguard Worker     callbacks++;
724*7c568831SAndroid Build Coastguard Worker }
725*7c568831SAndroid Build Coastguard Worker 
726*7c568831SAndroid Build Coastguard Worker /**
727*7c568831SAndroid Build Coastguard Worker  * referenceCallback:
728*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
729*7c568831SAndroid Build Coastguard Worker  * @name:  The entity name
730*7c568831SAndroid Build Coastguard Worker  *
731*7c568831SAndroid Build Coastguard Worker  * called when an entity reference is detected.
732*7c568831SAndroid Build Coastguard Worker  */
733*7c568831SAndroid Build Coastguard Worker static void
referenceCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name ATTRIBUTE_UNUSED)734*7c568831SAndroid Build Coastguard Worker referenceCallback(void *ctx ATTRIBUTE_UNUSED,
735*7c568831SAndroid Build Coastguard Worker                   const xmlChar * name ATTRIBUTE_UNUSED)
736*7c568831SAndroid Build Coastguard Worker {
737*7c568831SAndroid Build Coastguard Worker     callbacks++;
738*7c568831SAndroid Build Coastguard Worker }
739*7c568831SAndroid Build Coastguard Worker 
740*7c568831SAndroid Build Coastguard Worker /**
741*7c568831SAndroid Build Coastguard Worker  * ignorableWhitespaceCallback:
742*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
743*7c568831SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
744*7c568831SAndroid Build Coastguard Worker  * @start: the first char in the string
745*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
746*7c568831SAndroid Build Coastguard Worker  *
747*7c568831SAndroid Build Coastguard Worker  * receiving some ignorable whitespaces from the parser.
748*7c568831SAndroid Build Coastguard Worker  * Question: how much at a time ???
749*7c568831SAndroid Build Coastguard Worker  */
750*7c568831SAndroid Build Coastguard Worker static void
ignorableWhitespaceCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * ch ATTRIBUTE_UNUSED,int len ATTRIBUTE_UNUSED)751*7c568831SAndroid Build Coastguard Worker ignorableWhitespaceCallback(void *ctx ATTRIBUTE_UNUSED,
752*7c568831SAndroid Build Coastguard Worker                             const xmlChar * ch ATTRIBUTE_UNUSED,
753*7c568831SAndroid Build Coastguard Worker                             int len ATTRIBUTE_UNUSED)
754*7c568831SAndroid Build Coastguard Worker {
755*7c568831SAndroid Build Coastguard Worker     callbacks++;
756*7c568831SAndroid Build Coastguard Worker }
757*7c568831SAndroid Build Coastguard Worker 
758*7c568831SAndroid Build Coastguard Worker /**
759*7c568831SAndroid Build Coastguard Worker  * processingInstructionCallback:
760*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
761*7c568831SAndroid Build Coastguard Worker  * @target:  the target name
762*7c568831SAndroid Build Coastguard Worker  * @data: the PI data's
763*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
764*7c568831SAndroid Build Coastguard Worker  *
765*7c568831SAndroid Build Coastguard Worker  * A processing instruction has been parsed.
766*7c568831SAndroid Build Coastguard Worker  */
767*7c568831SAndroid Build Coastguard Worker static void
processingInstructionCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * target ATTRIBUTE_UNUSED,const xmlChar * data ATTRIBUTE_UNUSED)768*7c568831SAndroid Build Coastguard Worker processingInstructionCallback(void *ctx ATTRIBUTE_UNUSED,
769*7c568831SAndroid Build Coastguard Worker                               const xmlChar * target ATTRIBUTE_UNUSED,
770*7c568831SAndroid Build Coastguard Worker                               const xmlChar * data ATTRIBUTE_UNUSED)
771*7c568831SAndroid Build Coastguard Worker {
772*7c568831SAndroid Build Coastguard Worker     callbacks++;
773*7c568831SAndroid Build Coastguard Worker }
774*7c568831SAndroid Build Coastguard Worker 
775*7c568831SAndroid Build Coastguard Worker /**
776*7c568831SAndroid Build Coastguard Worker  * cdataBlockCallback:
777*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
778*7c568831SAndroid Build Coastguard Worker  * @value:  The pcdata content
779*7c568831SAndroid Build Coastguard Worker  * @len:  the block length
780*7c568831SAndroid Build Coastguard Worker  *
781*7c568831SAndroid Build Coastguard Worker  * called when a pcdata block has been parsed
782*7c568831SAndroid Build Coastguard Worker  */
783*7c568831SAndroid Build Coastguard Worker static void
cdataBlockCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * value ATTRIBUTE_UNUSED,int len ATTRIBUTE_UNUSED)784*7c568831SAndroid Build Coastguard Worker cdataBlockCallback(void *ctx ATTRIBUTE_UNUSED,
785*7c568831SAndroid Build Coastguard Worker                    const xmlChar * value ATTRIBUTE_UNUSED,
786*7c568831SAndroid Build Coastguard Worker                    int len ATTRIBUTE_UNUSED)
787*7c568831SAndroid Build Coastguard Worker {
788*7c568831SAndroid Build Coastguard Worker     callbacks++;
789*7c568831SAndroid Build Coastguard Worker }
790*7c568831SAndroid Build Coastguard Worker 
791*7c568831SAndroid Build Coastguard Worker /**
792*7c568831SAndroid Build Coastguard Worker  * commentCallback:
793*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
794*7c568831SAndroid Build Coastguard Worker  * @value:  the comment content
795*7c568831SAndroid Build Coastguard Worker  *
796*7c568831SAndroid Build Coastguard Worker  * A comment has been parsed.
797*7c568831SAndroid Build Coastguard Worker  */
798*7c568831SAndroid Build Coastguard Worker static void
commentCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * value ATTRIBUTE_UNUSED)799*7c568831SAndroid Build Coastguard Worker commentCallback(void *ctx ATTRIBUTE_UNUSED,
800*7c568831SAndroid Build Coastguard Worker                 const xmlChar * value ATTRIBUTE_UNUSED)
801*7c568831SAndroid Build Coastguard Worker {
802*7c568831SAndroid Build Coastguard Worker     callbacks++;
803*7c568831SAndroid Build Coastguard Worker }
804*7c568831SAndroid Build Coastguard Worker 
805*7c568831SAndroid Build Coastguard Worker /**
806*7c568831SAndroid Build Coastguard Worker  * warningCallback:
807*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
808*7c568831SAndroid Build Coastguard Worker  * @msg:  the message to display/transmit
809*7c568831SAndroid Build Coastguard Worker  * @...:  extra parameters for the message display
810*7c568831SAndroid Build Coastguard Worker  *
811*7c568831SAndroid Build Coastguard Worker  * Display and format a warning messages, gives file, line, position and
812*7c568831SAndroid Build Coastguard Worker  * extra parameters.
813*7c568831SAndroid Build Coastguard Worker  */
814*7c568831SAndroid Build Coastguard Worker static void
warningCallback(void * ctx ATTRIBUTE_UNUSED,const char * msg ATTRIBUTE_UNUSED,...)815*7c568831SAndroid Build Coastguard Worker warningCallback(void *ctx ATTRIBUTE_UNUSED,
816*7c568831SAndroid Build Coastguard Worker                 const char *msg ATTRIBUTE_UNUSED, ...)
817*7c568831SAndroid Build Coastguard Worker {
818*7c568831SAndroid Build Coastguard Worker     callbacks++;
819*7c568831SAndroid Build Coastguard Worker }
820*7c568831SAndroid Build Coastguard Worker 
821*7c568831SAndroid Build Coastguard Worker /**
822*7c568831SAndroid Build Coastguard Worker  * errorCallback:
823*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
824*7c568831SAndroid Build Coastguard Worker  * @msg:  the message to display/transmit
825*7c568831SAndroid Build Coastguard Worker  * @...:  extra parameters for the message display
826*7c568831SAndroid Build Coastguard Worker  *
827*7c568831SAndroid Build Coastguard Worker  * Display and format a error messages, gives file, line, position and
828*7c568831SAndroid Build Coastguard Worker  * extra parameters.
829*7c568831SAndroid Build Coastguard Worker  */
830*7c568831SAndroid Build Coastguard Worker static void
errorCallback(void * ctx ATTRIBUTE_UNUSED,const char * msg ATTRIBUTE_UNUSED,...)831*7c568831SAndroid Build Coastguard Worker errorCallback(void *ctx ATTRIBUTE_UNUSED, const char *msg ATTRIBUTE_UNUSED,
832*7c568831SAndroid Build Coastguard Worker               ...)
833*7c568831SAndroid Build Coastguard Worker {
834*7c568831SAndroid Build Coastguard Worker     callbacks++;
835*7c568831SAndroid Build Coastguard Worker }
836*7c568831SAndroid Build Coastguard Worker 
837*7c568831SAndroid Build Coastguard Worker /**
838*7c568831SAndroid Build Coastguard Worker  * fatalErrorCallback:
839*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
840*7c568831SAndroid Build Coastguard Worker  * @msg:  the message to display/transmit
841*7c568831SAndroid Build Coastguard Worker  * @...:  extra parameters for the message display
842*7c568831SAndroid Build Coastguard Worker  *
843*7c568831SAndroid Build Coastguard Worker  * Display and format a fatalError messages, gives file, line, position and
844*7c568831SAndroid Build Coastguard Worker  * extra parameters.
845*7c568831SAndroid Build Coastguard Worker  */
846*7c568831SAndroid Build Coastguard Worker static void
fatalErrorCallback(void * ctx ATTRIBUTE_UNUSED,const char * msg ATTRIBUTE_UNUSED,...)847*7c568831SAndroid Build Coastguard Worker fatalErrorCallback(void *ctx ATTRIBUTE_UNUSED,
848*7c568831SAndroid Build Coastguard Worker                    const char *msg ATTRIBUTE_UNUSED, ...)
849*7c568831SAndroid Build Coastguard Worker {
850*7c568831SAndroid Build Coastguard Worker }
851*7c568831SAndroid Build Coastguard Worker 
852*7c568831SAndroid Build Coastguard Worker 
853*7c568831SAndroid Build Coastguard Worker /*
854*7c568831SAndroid Build Coastguard Worker  * SAX2 specific callbacks
855*7c568831SAndroid Build Coastguard Worker  */
856*7c568831SAndroid Build Coastguard Worker 
857*7c568831SAndroid Build Coastguard Worker /**
858*7c568831SAndroid Build Coastguard Worker  * startElementNsCallback:
859*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
860*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
861*7c568831SAndroid Build Coastguard Worker  *
862*7c568831SAndroid Build Coastguard Worker  * called when an opening tag has been processed.
863*7c568831SAndroid Build Coastguard Worker  */
864*7c568831SAndroid Build Coastguard Worker static void
startElementNsCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * localname ATTRIBUTE_UNUSED,const xmlChar * prefix ATTRIBUTE_UNUSED,const xmlChar * URI ATTRIBUTE_UNUSED,int nb_namespaces ATTRIBUTE_UNUSED,const xmlChar ** namespaces ATTRIBUTE_UNUSED,int nb_attributes ATTRIBUTE_UNUSED,int nb_defaulted ATTRIBUTE_UNUSED,const xmlChar ** attributes ATTRIBUTE_UNUSED)865*7c568831SAndroid Build Coastguard Worker startElementNsCallback(void *ctx ATTRIBUTE_UNUSED,
866*7c568831SAndroid Build Coastguard Worker                        const xmlChar * localname ATTRIBUTE_UNUSED,
867*7c568831SAndroid Build Coastguard Worker                        const xmlChar * prefix ATTRIBUTE_UNUSED,
868*7c568831SAndroid Build Coastguard Worker                        const xmlChar * URI ATTRIBUTE_UNUSED,
869*7c568831SAndroid Build Coastguard Worker                        int nb_namespaces ATTRIBUTE_UNUSED,
870*7c568831SAndroid Build Coastguard Worker                        const xmlChar ** namespaces ATTRIBUTE_UNUSED,
871*7c568831SAndroid Build Coastguard Worker                        int nb_attributes ATTRIBUTE_UNUSED,
872*7c568831SAndroid Build Coastguard Worker                        int nb_defaulted ATTRIBUTE_UNUSED,
873*7c568831SAndroid Build Coastguard Worker                        const xmlChar ** attributes ATTRIBUTE_UNUSED)
874*7c568831SAndroid Build Coastguard Worker {
875*7c568831SAndroid Build Coastguard Worker     callbacks++;
876*7c568831SAndroid Build Coastguard Worker }
877*7c568831SAndroid Build Coastguard Worker 
878*7c568831SAndroid Build Coastguard Worker /**
879*7c568831SAndroid Build Coastguard Worker  * endElementCallback:
880*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
881*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
882*7c568831SAndroid Build Coastguard Worker  *
883*7c568831SAndroid Build Coastguard Worker  * called when the end of an element has been detected.
884*7c568831SAndroid Build Coastguard Worker  */
885*7c568831SAndroid Build Coastguard Worker static void
endElementNsCallback(void * ctx ATTRIBUTE_UNUSED,const xmlChar * localname ATTRIBUTE_UNUSED,const xmlChar * prefix ATTRIBUTE_UNUSED,const xmlChar * URI ATTRIBUTE_UNUSED)886*7c568831SAndroid Build Coastguard Worker endElementNsCallback(void *ctx ATTRIBUTE_UNUSED,
887*7c568831SAndroid Build Coastguard Worker                      const xmlChar * localname ATTRIBUTE_UNUSED,
888*7c568831SAndroid Build Coastguard Worker                      const xmlChar * prefix ATTRIBUTE_UNUSED,
889*7c568831SAndroid Build Coastguard Worker                      const xmlChar * URI ATTRIBUTE_UNUSED)
890*7c568831SAndroid Build Coastguard Worker {
891*7c568831SAndroid Build Coastguard Worker     callbacks++;
892*7c568831SAndroid Build Coastguard Worker }
893*7c568831SAndroid Build Coastguard Worker 
894*7c568831SAndroid Build Coastguard Worker static xmlSAXHandler callbackSAX2HandlerStruct = {
895*7c568831SAndroid Build Coastguard Worker     internalSubsetCallback,
896*7c568831SAndroid Build Coastguard Worker     isStandaloneCallback,
897*7c568831SAndroid Build Coastguard Worker     hasInternalSubsetCallback,
898*7c568831SAndroid Build Coastguard Worker     hasExternalSubsetCallback,
899*7c568831SAndroid Build Coastguard Worker     resolveEntityCallback,
900*7c568831SAndroid Build Coastguard Worker     getEntityCallback,
901*7c568831SAndroid Build Coastguard Worker     entityDeclCallback,
902*7c568831SAndroid Build Coastguard Worker     notationDeclCallback,
903*7c568831SAndroid Build Coastguard Worker     attributeDeclCallback,
904*7c568831SAndroid Build Coastguard Worker     elementDeclCallback,
905*7c568831SAndroid Build Coastguard Worker     unparsedEntityDeclCallback,
906*7c568831SAndroid Build Coastguard Worker     setDocumentLocatorCallback,
907*7c568831SAndroid Build Coastguard Worker     startDocumentCallback,
908*7c568831SAndroid Build Coastguard Worker     endDocumentCallback,
909*7c568831SAndroid Build Coastguard Worker     NULL,
910*7c568831SAndroid Build Coastguard Worker     NULL,
911*7c568831SAndroid Build Coastguard Worker     referenceCallback,
912*7c568831SAndroid Build Coastguard Worker     charactersCallback,
913*7c568831SAndroid Build Coastguard Worker     ignorableWhitespaceCallback,
914*7c568831SAndroid Build Coastguard Worker     processingInstructionCallback,
915*7c568831SAndroid Build Coastguard Worker     commentCallback,
916*7c568831SAndroid Build Coastguard Worker     warningCallback,
917*7c568831SAndroid Build Coastguard Worker     errorCallback,
918*7c568831SAndroid Build Coastguard Worker     fatalErrorCallback,
919*7c568831SAndroid Build Coastguard Worker     getParameterEntityCallback,
920*7c568831SAndroid Build Coastguard Worker     cdataBlockCallback,
921*7c568831SAndroid Build Coastguard Worker     externalSubsetCallback,
922*7c568831SAndroid Build Coastguard Worker     XML_SAX2_MAGIC,
923*7c568831SAndroid Build Coastguard Worker     NULL,
924*7c568831SAndroid Build Coastguard Worker     startElementNsCallback,
925*7c568831SAndroid Build Coastguard Worker     endElementNsCallback,
926*7c568831SAndroid Build Coastguard Worker     NULL
927*7c568831SAndroid Build Coastguard Worker };
928*7c568831SAndroid Build Coastguard Worker 
929*7c568831SAndroid Build Coastguard Worker static xmlSAXHandlerPtr callbackSAX2Handler = &callbackSAX2HandlerStruct;
930*7c568831SAndroid Build Coastguard Worker 
931*7c568831SAndroid Build Coastguard Worker /************************************************************************
932*7c568831SAndroid Build Coastguard Worker  *									*
933*7c568831SAndroid Build Coastguard Worker  *		The tests front-ends                                     *
934*7c568831SAndroid Build Coastguard Worker  *									*
935*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
936*7c568831SAndroid Build Coastguard Worker 
937*7c568831SAndroid Build Coastguard Worker /**
938*7c568831SAndroid Build Coastguard Worker  * readerTest:
939*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
940*7c568831SAndroid Build Coastguard Worker  * @max_size: size of the limit to test
941*7c568831SAndroid Build Coastguard Worker  * @options: parsing options
942*7c568831SAndroid Build Coastguard Worker  * @fail: should a failure be reported
943*7c568831SAndroid Build Coastguard Worker  *
944*7c568831SAndroid Build Coastguard Worker  * Parse a memory generated file using SAX
945*7c568831SAndroid Build Coastguard Worker  *
946*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
947*7c568831SAndroid Build Coastguard Worker  */
948*7c568831SAndroid Build Coastguard Worker static int
saxTest(const char * filename,size_t limit,int options,int fail)949*7c568831SAndroid Build Coastguard Worker saxTest(const char *filename, size_t limit, int options, int fail) {
950*7c568831SAndroid Build Coastguard Worker     int res = 0;
951*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
952*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
953*7c568831SAndroid Build Coastguard Worker 
954*7c568831SAndroid Build Coastguard Worker     nb_tests++;
955*7c568831SAndroid Build Coastguard Worker 
956*7c568831SAndroid Build Coastguard Worker     maxlen = limit;
957*7c568831SAndroid Build Coastguard Worker     ctxt = xmlNewSAXParserCtxt(callbackSAX2Handler, NULL);
958*7c568831SAndroid Build Coastguard Worker     if (ctxt == NULL) {
959*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to create parser context\n");
960*7c568831SAndroid Build Coastguard Worker 	return(1);
961*7c568831SAndroid Build Coastguard Worker     }
962*7c568831SAndroid Build Coastguard Worker     doc = xmlCtxtReadFile(ctxt, filename, NULL, options | XML_PARSE_NOERROR);
963*7c568831SAndroid Build Coastguard Worker 
964*7c568831SAndroid Build Coastguard Worker     if (doc != NULL) {
965*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "SAX parsing generated a document !\n");
966*7c568831SAndroid Build Coastguard Worker         xmlFreeDoc(doc);
967*7c568831SAndroid Build Coastguard Worker         res = 0;
968*7c568831SAndroid Build Coastguard Worker     } else if (ctxt->wellFormed == 0) {
969*7c568831SAndroid Build Coastguard Worker         if (fail)
970*7c568831SAndroid Build Coastguard Worker             res = 0;
971*7c568831SAndroid Build Coastguard Worker         else {
972*7c568831SAndroid Build Coastguard Worker             fprintf(stderr, "Failed to parse '%s' %lu\n", filename,
973*7c568831SAndroid Build Coastguard Worker                     (unsigned long) limit);
974*7c568831SAndroid Build Coastguard Worker             res = 1;
975*7c568831SAndroid Build Coastguard Worker         }
976*7c568831SAndroid Build Coastguard Worker     } else {
977*7c568831SAndroid Build Coastguard Worker         if (fail) {
978*7c568831SAndroid Build Coastguard Worker             fprintf(stderr, "Failed to get failure for '%s' %lu\n",
979*7c568831SAndroid Build Coastguard Worker                     filename, (unsigned long) limit);
980*7c568831SAndroid Build Coastguard Worker             res = 1;
981*7c568831SAndroid Build Coastguard Worker         } else
982*7c568831SAndroid Build Coastguard Worker             res = 0;
983*7c568831SAndroid Build Coastguard Worker     }
984*7c568831SAndroid Build Coastguard Worker     xmlFreeParserCtxt(ctxt);
985*7c568831SAndroid Build Coastguard Worker 
986*7c568831SAndroid Build Coastguard Worker     return(res);
987*7c568831SAndroid Build Coastguard Worker }
988*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
989*7c568831SAndroid Build Coastguard Worker /**
990*7c568831SAndroid Build Coastguard Worker  * readerTest:
991*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
992*7c568831SAndroid Build Coastguard Worker  * @max_size: size of the limit to test
993*7c568831SAndroid Build Coastguard Worker  * @options: parsing options
994*7c568831SAndroid Build Coastguard Worker  * @fail: should a failure be reported
995*7c568831SAndroid Build Coastguard Worker  *
996*7c568831SAndroid Build Coastguard Worker  * Parse a memory generated file using the xmlReader
997*7c568831SAndroid Build Coastguard Worker  *
998*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
999*7c568831SAndroid Build Coastguard Worker  */
1000*7c568831SAndroid Build Coastguard Worker static int
readerTest(const char * filename,size_t limit,int options,int fail)1001*7c568831SAndroid Build Coastguard Worker readerTest(const char *filename, size_t limit, int options, int fail) {
1002*7c568831SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
1003*7c568831SAndroid Build Coastguard Worker     int res = 0;
1004*7c568831SAndroid Build Coastguard Worker     int ret;
1005*7c568831SAndroid Build Coastguard Worker 
1006*7c568831SAndroid Build Coastguard Worker     nb_tests++;
1007*7c568831SAndroid Build Coastguard Worker 
1008*7c568831SAndroid Build Coastguard Worker     maxlen = limit;
1009*7c568831SAndroid Build Coastguard Worker     reader = xmlReaderForFile(filename , NULL, options | XML_PARSE_NOERROR);
1010*7c568831SAndroid Build Coastguard Worker     if (reader == NULL) {
1011*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to open '%s' test\n", filename);
1012*7c568831SAndroid Build Coastguard Worker 	return(1);
1013*7c568831SAndroid Build Coastguard Worker     }
1014*7c568831SAndroid Build Coastguard Worker     ret = xmlTextReaderRead(reader);
1015*7c568831SAndroid Build Coastguard Worker     while (ret == 1) {
1016*7c568831SAndroid Build Coastguard Worker         ret = xmlTextReaderRead(reader);
1017*7c568831SAndroid Build Coastguard Worker     }
1018*7c568831SAndroid Build Coastguard Worker     if (ret != 0) {
1019*7c568831SAndroid Build Coastguard Worker         if (fail)
1020*7c568831SAndroid Build Coastguard Worker             res = 0;
1021*7c568831SAndroid Build Coastguard Worker         else {
1022*7c568831SAndroid Build Coastguard Worker             if (strncmp(filename, "crazy:", 6) == 0)
1023*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "Failed to parse '%s' %u\n",
1024*7c568831SAndroid Build Coastguard Worker                         filename, crazy_indx);
1025*7c568831SAndroid Build Coastguard Worker             else
1026*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "Failed to parse '%s' %lu\n",
1027*7c568831SAndroid Build Coastguard Worker                         filename, (unsigned long) limit);
1028*7c568831SAndroid Build Coastguard Worker             res = 1;
1029*7c568831SAndroid Build Coastguard Worker         }
1030*7c568831SAndroid Build Coastguard Worker     } else {
1031*7c568831SAndroid Build Coastguard Worker         if (fail) {
1032*7c568831SAndroid Build Coastguard Worker             if (strncmp(filename, "crazy:", 6) == 0)
1033*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "Failed to get failure for '%s' %u\n",
1034*7c568831SAndroid Build Coastguard Worker                         filename, crazy_indx);
1035*7c568831SAndroid Build Coastguard Worker             else
1036*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "Failed to get failure for '%s' %lu\n",
1037*7c568831SAndroid Build Coastguard Worker                         filename, (unsigned long) limit);
1038*7c568831SAndroid Build Coastguard Worker             res = 1;
1039*7c568831SAndroid Build Coastguard Worker         } else
1040*7c568831SAndroid Build Coastguard Worker             res = 0;
1041*7c568831SAndroid Build Coastguard Worker     }
1042*7c568831SAndroid Build Coastguard Worker     if (timeout)
1043*7c568831SAndroid Build Coastguard Worker         res = 1;
1044*7c568831SAndroid Build Coastguard Worker     xmlFreeTextReader(reader);
1045*7c568831SAndroid Build Coastguard Worker 
1046*7c568831SAndroid Build Coastguard Worker     return(res);
1047*7c568831SAndroid Build Coastguard Worker }
1048*7c568831SAndroid Build Coastguard Worker #endif
1049*7c568831SAndroid Build Coastguard Worker 
1050*7c568831SAndroid Build Coastguard Worker /************************************************************************
1051*7c568831SAndroid Build Coastguard Worker  *									*
1052*7c568831SAndroid Build Coastguard Worker  *			Tests descriptions				*
1053*7c568831SAndroid Build Coastguard Worker  *									*
1054*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
1055*7c568831SAndroid Build Coastguard Worker 
1056*7c568831SAndroid Build Coastguard Worker typedef int (*functest) (const char *filename, size_t limit, int options,
1057*7c568831SAndroid Build Coastguard Worker                          int fail);
1058*7c568831SAndroid Build Coastguard Worker 
1059*7c568831SAndroid Build Coastguard Worker typedef struct limitDesc limitDesc;
1060*7c568831SAndroid Build Coastguard Worker typedef limitDesc *limitDescPtr;
1061*7c568831SAndroid Build Coastguard Worker struct limitDesc {
1062*7c568831SAndroid Build Coastguard Worker     const char *name; /* the huge generator name */
1063*7c568831SAndroid Build Coastguard Worker     size_t limit;     /* the limit to test */
1064*7c568831SAndroid Build Coastguard Worker     int options;      /* extra parser options */
1065*7c568831SAndroid Build Coastguard Worker     int fail;         /* whether the test should fail */
1066*7c568831SAndroid Build Coastguard Worker };
1067*7c568831SAndroid Build Coastguard Worker 
1068*7c568831SAndroid Build Coastguard Worker static limitDesc limitDescriptions[] = {
1069*7c568831SAndroid Build Coastguard Worker     /* max length of a text node in content */
1070*7c568831SAndroid Build Coastguard Worker     {"huge:textNode", XML_MAX_TEXT_LENGTH - CHUNK, 0, 0},
1071*7c568831SAndroid Build Coastguard Worker     {"huge:textNode", XML_MAX_TEXT_LENGTH + CHUNK, 0, 1},
1072*7c568831SAndroid Build Coastguard Worker     {"huge:textNode", XML_MAX_TEXT_LENGTH + CHUNK, XML_PARSE_HUGE, 0},
1073*7c568831SAndroid Build Coastguard Worker     /* max length of a text node in content */
1074*7c568831SAndroid Build Coastguard Worker     {"huge:attrNode", XML_MAX_TEXT_LENGTH - CHUNK, 0, 0},
1075*7c568831SAndroid Build Coastguard Worker     {"huge:attrNode", XML_MAX_TEXT_LENGTH + CHUNK, 0, 1},
1076*7c568831SAndroid Build Coastguard Worker     {"huge:attrNode", XML_MAX_TEXT_LENGTH + CHUNK, XML_PARSE_HUGE, 0},
1077*7c568831SAndroid Build Coastguard Worker     /* max length of a comment node */
1078*7c568831SAndroid Build Coastguard Worker     {"huge:commentNode", XML_MAX_TEXT_LENGTH - CHUNK, 0, 0},
1079*7c568831SAndroid Build Coastguard Worker     {"huge:commentNode", XML_MAX_TEXT_LENGTH + CHUNK, 0, 1},
1080*7c568831SAndroid Build Coastguard Worker     {"huge:commentNode", XML_MAX_TEXT_LENGTH + CHUNK, XML_PARSE_HUGE, 0},
1081*7c568831SAndroid Build Coastguard Worker     /* max length of a PI node */
1082*7c568831SAndroid Build Coastguard Worker     {"huge:piNode", XML_MAX_TEXT_LENGTH - CHUNK, 0, 0},
1083*7c568831SAndroid Build Coastguard Worker     {"huge:piNode", XML_MAX_TEXT_LENGTH + CHUNK, 0, 1},
1084*7c568831SAndroid Build Coastguard Worker     {"huge:piNode", XML_MAX_TEXT_LENGTH + CHUNK, XML_PARSE_HUGE, 0},
1085*7c568831SAndroid Build Coastguard Worker };
1086*7c568831SAndroid Build Coastguard Worker 
1087*7c568831SAndroid Build Coastguard Worker typedef struct testDesc testDesc;
1088*7c568831SAndroid Build Coastguard Worker typedef testDesc *testDescPtr;
1089*7c568831SAndroid Build Coastguard Worker struct testDesc {
1090*7c568831SAndroid Build Coastguard Worker     const char *desc; /* description of the test */
1091*7c568831SAndroid Build Coastguard Worker     functest    func; /* function implementing the test */
1092*7c568831SAndroid Build Coastguard Worker };
1093*7c568831SAndroid Build Coastguard Worker 
1094*7c568831SAndroid Build Coastguard Worker static
1095*7c568831SAndroid Build Coastguard Worker testDesc testDescriptions[] = {
1096*7c568831SAndroid Build Coastguard Worker     { "Parsing of huge files with the sax parser", saxTest},
1097*7c568831SAndroid Build Coastguard Worker /*    { "Parsing of huge files with the tree parser", treeTest}, */
1098*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
1099*7c568831SAndroid Build Coastguard Worker     { "Parsing of huge files with the reader", readerTest},
1100*7c568831SAndroid Build Coastguard Worker #endif
1101*7c568831SAndroid Build Coastguard Worker     {NULL, NULL}
1102*7c568831SAndroid Build Coastguard Worker };
1103*7c568831SAndroid Build Coastguard Worker 
1104*7c568831SAndroid Build Coastguard Worker typedef struct testException testException;
1105*7c568831SAndroid Build Coastguard Worker typedef testException *testExceptionPtr;
1106*7c568831SAndroid Build Coastguard Worker struct testException {
1107*7c568831SAndroid Build Coastguard Worker     unsigned int test;  /* the parser test number */
1108*7c568831SAndroid Build Coastguard Worker     unsigned int limit; /* the limit test number */
1109*7c568831SAndroid Build Coastguard Worker     int fail;           /* new fail value or -1*/
1110*7c568831SAndroid Build Coastguard Worker     size_t size;        /* new limit value or 0 */
1111*7c568831SAndroid Build Coastguard Worker };
1112*7c568831SAndroid Build Coastguard Worker 
1113*7c568831SAndroid Build Coastguard Worker static
1114*7c568831SAndroid Build Coastguard Worker testException testExceptions[] = {
1115*7c568831SAndroid Build Coastguard Worker     /* the SAX parser doesn't hit a limit of XML_MAX_TEXT_LENGTH text nodes */
1116*7c568831SAndroid Build Coastguard Worker     { 0, 1, 0, 0},
1117*7c568831SAndroid Build Coastguard Worker };
1118*7c568831SAndroid Build Coastguard Worker 
1119*7c568831SAndroid Build Coastguard Worker static int
launchTests(testDescPtr tst,unsigned int test)1120*7c568831SAndroid Build Coastguard Worker launchTests(testDescPtr tst, unsigned int test) {
1121*7c568831SAndroid Build Coastguard Worker     int res = 0, err = 0;
1122*7c568831SAndroid Build Coastguard Worker     unsigned int i, j;
1123*7c568831SAndroid Build Coastguard Worker     size_t limit;
1124*7c568831SAndroid Build Coastguard Worker     int fail;
1125*7c568831SAndroid Build Coastguard Worker 
1126*7c568831SAndroid Build Coastguard Worker     if (tst == NULL) return(-1);
1127*7c568831SAndroid Build Coastguard Worker 
1128*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < sizeof(limitDescriptions)/sizeof(limitDescriptions[0]);i++) {
1129*7c568831SAndroid Build Coastguard Worker         limit = limitDescriptions[i].limit;
1130*7c568831SAndroid Build Coastguard Worker         fail = limitDescriptions[i].fail;
1131*7c568831SAndroid Build Coastguard Worker         /*
1132*7c568831SAndroid Build Coastguard Worker          * Handle exceptions if any
1133*7c568831SAndroid Build Coastguard Worker          */
1134*7c568831SAndroid Build Coastguard Worker         for (j = 0;j < sizeof(testExceptions)/sizeof(testExceptions[0]);j++) {
1135*7c568831SAndroid Build Coastguard Worker             if ((testExceptions[j].test == test) &&
1136*7c568831SAndroid Build Coastguard Worker                 (testExceptions[j].limit == i)) {
1137*7c568831SAndroid Build Coastguard Worker                 if (testExceptions[j].fail != -1)
1138*7c568831SAndroid Build Coastguard Worker                     fail = testExceptions[j].fail;
1139*7c568831SAndroid Build Coastguard Worker                 if (testExceptions[j].size != 0)
1140*7c568831SAndroid Build Coastguard Worker                     limit = testExceptions[j].size;
1141*7c568831SAndroid Build Coastguard Worker                 break;
1142*7c568831SAndroid Build Coastguard Worker             }
1143*7c568831SAndroid Build Coastguard Worker         }
1144*7c568831SAndroid Build Coastguard Worker         res = tst->func(limitDescriptions[i].name, limit,
1145*7c568831SAndroid Build Coastguard Worker                         limitDescriptions[i].options, fail);
1146*7c568831SAndroid Build Coastguard Worker         if (res != 0) {
1147*7c568831SAndroid Build Coastguard Worker             nb_errors++;
1148*7c568831SAndroid Build Coastguard Worker             err++;
1149*7c568831SAndroid Build Coastguard Worker         }
1150*7c568831SAndroid Build Coastguard Worker     }
1151*7c568831SAndroid Build Coastguard Worker     return(err);
1152*7c568831SAndroid Build Coastguard Worker }
1153*7c568831SAndroid Build Coastguard Worker 
1154*7c568831SAndroid Build Coastguard Worker 
1155*7c568831SAndroid Build Coastguard Worker static int
runtest(unsigned int i)1156*7c568831SAndroid Build Coastguard Worker runtest(unsigned int i) {
1157*7c568831SAndroid Build Coastguard Worker     int ret = 0, res;
1158*7c568831SAndroid Build Coastguard Worker     int old_errors, old_tests, old_leaks;
1159*7c568831SAndroid Build Coastguard Worker 
1160*7c568831SAndroid Build Coastguard Worker     old_errors = nb_errors;
1161*7c568831SAndroid Build Coastguard Worker     old_tests = nb_tests;
1162*7c568831SAndroid Build Coastguard Worker     old_leaks = nb_leaks;
1163*7c568831SAndroid Build Coastguard Worker     if ((tests_quiet == 0) && (testDescriptions[i].desc != NULL))
1164*7c568831SAndroid Build Coastguard Worker 	printf("## %s\n", testDescriptions[i].desc);
1165*7c568831SAndroid Build Coastguard Worker     res = launchTests(&testDescriptions[i], i);
1166*7c568831SAndroid Build Coastguard Worker     if (res != 0)
1167*7c568831SAndroid Build Coastguard Worker 	ret++;
1168*7c568831SAndroid Build Coastguard Worker     if (verbose) {
1169*7c568831SAndroid Build Coastguard Worker 	if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
1170*7c568831SAndroid Build Coastguard Worker 	    printf("Ran %d tests, no errors\n", nb_tests - old_tests);
1171*7c568831SAndroid Build Coastguard Worker 	else
1172*7c568831SAndroid Build Coastguard Worker 	    printf("Ran %d tests, %d errors, %d leaks\n",
1173*7c568831SAndroid Build Coastguard Worker 		   nb_tests - old_tests,
1174*7c568831SAndroid Build Coastguard Worker 		   nb_errors - old_errors,
1175*7c568831SAndroid Build Coastguard Worker 		   nb_leaks - old_leaks);
1176*7c568831SAndroid Build Coastguard Worker     }
1177*7c568831SAndroid Build Coastguard Worker     return(ret);
1178*7c568831SAndroid Build Coastguard Worker }
1179*7c568831SAndroid Build Coastguard Worker 
1180*7c568831SAndroid Build Coastguard Worker static int
launchCrazySAX(unsigned int test,int fail)1181*7c568831SAndroid Build Coastguard Worker launchCrazySAX(unsigned int test, int fail) {
1182*7c568831SAndroid Build Coastguard Worker     int res = 0, err = 0;
1183*7c568831SAndroid Build Coastguard Worker 
1184*7c568831SAndroid Build Coastguard Worker     crazy_indx = test;
1185*7c568831SAndroid Build Coastguard Worker 
1186*7c568831SAndroid Build Coastguard Worker     res = saxTest("crazy::test", XML_MAX_LOOKUP_LIMIT - CHUNK, 0, fail);
1187*7c568831SAndroid Build Coastguard Worker     if (res != 0) {
1188*7c568831SAndroid Build Coastguard Worker         nb_errors++;
1189*7c568831SAndroid Build Coastguard Worker         err++;
1190*7c568831SAndroid Build Coastguard Worker     }
1191*7c568831SAndroid Build Coastguard Worker     if (tests_quiet == 0)
1192*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "%c", crazy[test]);
1193*7c568831SAndroid Build Coastguard Worker 
1194*7c568831SAndroid Build Coastguard Worker     return(err);
1195*7c568831SAndroid Build Coastguard Worker }
1196*7c568831SAndroid Build Coastguard Worker 
1197*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
1198*7c568831SAndroid Build Coastguard Worker static int
launchCrazy(unsigned int test,int fail)1199*7c568831SAndroid Build Coastguard Worker launchCrazy(unsigned int test, int fail) {
1200*7c568831SAndroid Build Coastguard Worker     int res = 0, err = 0;
1201*7c568831SAndroid Build Coastguard Worker 
1202*7c568831SAndroid Build Coastguard Worker     crazy_indx = test;
1203*7c568831SAndroid Build Coastguard Worker 
1204*7c568831SAndroid Build Coastguard Worker     res = readerTest("crazy::test", XML_MAX_LOOKUP_LIMIT - CHUNK, 0, fail);
1205*7c568831SAndroid Build Coastguard Worker     if (res != 0) {
1206*7c568831SAndroid Build Coastguard Worker         nb_errors++;
1207*7c568831SAndroid Build Coastguard Worker         err++;
1208*7c568831SAndroid Build Coastguard Worker     }
1209*7c568831SAndroid Build Coastguard Worker     if (tests_quiet == 0)
1210*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "%c", crazy[test]);
1211*7c568831SAndroid Build Coastguard Worker 
1212*7c568831SAndroid Build Coastguard Worker     return(err);
1213*7c568831SAndroid Build Coastguard Worker }
1214*7c568831SAndroid Build Coastguard Worker #endif
1215*7c568831SAndroid Build Coastguard Worker 
get_crazy_fail(int test)1216*7c568831SAndroid Build Coastguard Worker static int get_crazy_fail(int test) {
1217*7c568831SAndroid Build Coastguard Worker     /*
1218*7c568831SAndroid Build Coastguard Worker      * adding 1000000 of character 'a' leads to parser failure mostly
1219*7c568831SAndroid Build Coastguard Worker      * everywhere except in those special spots. Need to be updated
1220*7c568831SAndroid Build Coastguard Worker      * each time crazy is updated
1221*7c568831SAndroid Build Coastguard Worker      */
1222*7c568831SAndroid Build Coastguard Worker     int fail = 1;
1223*7c568831SAndroid Build Coastguard Worker     if ((test == 44) || /* PI in Misc */
1224*7c568831SAndroid Build Coastguard Worker         ((test >= 50) && (test <= 55)) || /* Comment in Misc */
1225*7c568831SAndroid Build Coastguard Worker         (test == 79) || /* PI in DTD */
1226*7c568831SAndroid Build Coastguard Worker         ((test >= 85) && (test <= 90)) || /* Comment in DTD */
1227*7c568831SAndroid Build Coastguard Worker         (test == 154) || /* PI in Misc */
1228*7c568831SAndroid Build Coastguard Worker         ((test >= 160) && (test <= 165)) || /* Comment in Misc */
1229*7c568831SAndroid Build Coastguard Worker         ((test >= 178) && (test <= 181)) || /* attribute value */
1230*7c568831SAndroid Build Coastguard Worker         (test == 183) || /* Text */
1231*7c568831SAndroid Build Coastguard Worker         (test == 189) || /* PI in Content */
1232*7c568831SAndroid Build Coastguard Worker         (test == 191) || /* Text */
1233*7c568831SAndroid Build Coastguard Worker         ((test >= 195) && (test <= 200)) || /* Comment in Content */
1234*7c568831SAndroid Build Coastguard Worker         ((test >= 203) && (test <= 206)) || /* Text */
1235*7c568831SAndroid Build Coastguard Worker         (test == 215) || (test == 216) || /* in CDATA */
1236*7c568831SAndroid Build Coastguard Worker         (test == 219) || /* Text */
1237*7c568831SAndroid Build Coastguard Worker         (test == 231) || /* PI in Misc */
1238*7c568831SAndroid Build Coastguard Worker         ((test >= 237) && (test <= 242))) /* Comment in Misc */
1239*7c568831SAndroid Build Coastguard Worker         fail = 0;
1240*7c568831SAndroid Build Coastguard Worker     return(fail);
1241*7c568831SAndroid Build Coastguard Worker }
1242*7c568831SAndroid Build Coastguard Worker 
1243*7c568831SAndroid Build Coastguard Worker static int
runcrazy(void)1244*7c568831SAndroid Build Coastguard Worker runcrazy(void) {
1245*7c568831SAndroid Build Coastguard Worker     int ret = 0, res = 0;
1246*7c568831SAndroid Build Coastguard Worker     int old_errors, old_tests, old_leaks;
1247*7c568831SAndroid Build Coastguard Worker     unsigned int i;
1248*7c568831SAndroid Build Coastguard Worker 
1249*7c568831SAndroid Build Coastguard Worker     old_errors = nb_errors;
1250*7c568831SAndroid Build Coastguard Worker     old_tests = nb_tests;
1251*7c568831SAndroid Build Coastguard Worker     old_leaks = nb_leaks;
1252*7c568831SAndroid Build Coastguard Worker 
1253*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
1254*7c568831SAndroid Build Coastguard Worker     if (tests_quiet == 0) {
1255*7c568831SAndroid Build Coastguard Worker 	printf("## Crazy tests on reader\n");
1256*7c568831SAndroid Build Coastguard Worker     }
1257*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < strlen(crazy);i++) {
1258*7c568831SAndroid Build Coastguard Worker         res += launchCrazy(i, get_crazy_fail(i));
1259*7c568831SAndroid Build Coastguard Worker         if (res != 0)
1260*7c568831SAndroid Build Coastguard Worker             ret++;
1261*7c568831SAndroid Build Coastguard Worker     }
1262*7c568831SAndroid Build Coastguard Worker #endif
1263*7c568831SAndroid Build Coastguard Worker 
1264*7c568831SAndroid Build Coastguard Worker     if (tests_quiet == 0) {
1265*7c568831SAndroid Build Coastguard Worker 	printf("\n## Crazy tests on SAX\n");
1266*7c568831SAndroid Build Coastguard Worker     }
1267*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < strlen(crazy);i++) {
1268*7c568831SAndroid Build Coastguard Worker         res += launchCrazySAX(i, get_crazy_fail(i));
1269*7c568831SAndroid Build Coastguard Worker         if (res != 0)
1270*7c568831SAndroid Build Coastguard Worker             ret++;
1271*7c568831SAndroid Build Coastguard Worker     }
1272*7c568831SAndroid Build Coastguard Worker     if (tests_quiet == 0)
1273*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "\n");
1274*7c568831SAndroid Build Coastguard Worker     if (verbose) {
1275*7c568831SAndroid Build Coastguard Worker 	if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
1276*7c568831SAndroid Build Coastguard Worker 	    printf("Ran %d tests, no errors\n", nb_tests - old_tests);
1277*7c568831SAndroid Build Coastguard Worker 	else
1278*7c568831SAndroid Build Coastguard Worker 	    printf("Ran %d tests, %d errors, %d leaks\n",
1279*7c568831SAndroid Build Coastguard Worker 		   nb_tests - old_tests,
1280*7c568831SAndroid Build Coastguard Worker 		   nb_errors - old_errors,
1281*7c568831SAndroid Build Coastguard Worker 		   nb_leaks - old_leaks);
1282*7c568831SAndroid Build Coastguard Worker     }
1283*7c568831SAndroid Build Coastguard Worker     return(ret);
1284*7c568831SAndroid Build Coastguard Worker }
1285*7c568831SAndroid Build Coastguard Worker 
1286*7c568831SAndroid Build Coastguard Worker 
1287*7c568831SAndroid Build Coastguard Worker int
main(int argc ATTRIBUTE_UNUSED,char ** argv ATTRIBUTE_UNUSED)1288*7c568831SAndroid Build Coastguard Worker main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
1289*7c568831SAndroid Build Coastguard Worker     int i, a, ret = 0;
1290*7c568831SAndroid Build Coastguard Worker     int subset = 0;
1291*7c568831SAndroid Build Coastguard Worker 
1292*7c568831SAndroid Build Coastguard Worker     fillFilling();
1293*7c568831SAndroid Build Coastguard Worker     initializeLibxml2();
1294*7c568831SAndroid Build Coastguard Worker 
1295*7c568831SAndroid Build Coastguard Worker     for (a = 1; a < argc;a++) {
1296*7c568831SAndroid Build Coastguard Worker         if (!strcmp(argv[a], "-v"))
1297*7c568831SAndroid Build Coastguard Worker 	    verbose = 1;
1298*7c568831SAndroid Build Coastguard Worker         else if (!strcmp(argv[a], "-quiet"))
1299*7c568831SAndroid Build Coastguard Worker 	    tests_quiet = 1;
1300*7c568831SAndroid Build Coastguard Worker         else if (!strcmp(argv[a], "-crazy"))
1301*7c568831SAndroid Build Coastguard Worker 	    subset = 1;
1302*7c568831SAndroid Build Coastguard Worker     }
1303*7c568831SAndroid Build Coastguard Worker     if (subset == 0) {
1304*7c568831SAndroid Build Coastguard Worker 	for (i = 0; testDescriptions[i].func != NULL; i++) {
1305*7c568831SAndroid Build Coastguard Worker 	    ret += runtest(i);
1306*7c568831SAndroid Build Coastguard Worker 	}
1307*7c568831SAndroid Build Coastguard Worker     }
1308*7c568831SAndroid Build Coastguard Worker     ret += runcrazy();
1309*7c568831SAndroid Build Coastguard Worker     if ((nb_errors == 0) && (nb_leaks == 0)) {
1310*7c568831SAndroid Build Coastguard Worker         ret = 0;
1311*7c568831SAndroid Build Coastguard Worker 	printf("Total %d tests, no errors\n",
1312*7c568831SAndroid Build Coastguard Worker 	       nb_tests);
1313*7c568831SAndroid Build Coastguard Worker     } else {
1314*7c568831SAndroid Build Coastguard Worker         ret = 1;
1315*7c568831SAndroid Build Coastguard Worker 	printf("Total %d tests, %d errors, %d leaks\n",
1316*7c568831SAndroid Build Coastguard Worker 	       nb_tests, nb_errors, nb_leaks);
1317*7c568831SAndroid Build Coastguard Worker     }
1318*7c568831SAndroid Build Coastguard Worker     xmlCleanupParser();
1319*7c568831SAndroid Build Coastguard Worker 
1320*7c568831SAndroid Build Coastguard Worker     return(ret);
1321*7c568831SAndroid Build Coastguard Worker }
1322