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