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