xref: /aosp_15_r20/external/libxml2/runtest.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker  * runtest.c: C program to run libxml2 regression tests without
3*7c568831SAndroid Build Coastguard Worker  *            requiring make or Python, and reducing platform dependencies
4*7c568831SAndroid Build Coastguard Worker  *            to a strict minimum.
5*7c568831SAndroid Build Coastguard Worker  *
6*7c568831SAndroid Build Coastguard Worker  * To compile on Unixes:
7*7c568831SAndroid Build Coastguard Worker  * cc -o runtest `xml2-config --cflags` runtest.c `xml2-config --libs` -lpthread
8*7c568831SAndroid Build Coastguard Worker  *
9*7c568831SAndroid Build Coastguard Worker  * See Copyright for the status of this software.
10*7c568831SAndroid Build Coastguard Worker  *
11*7c568831SAndroid Build Coastguard Worker  * [email protected]
12*7c568831SAndroid Build Coastguard Worker  */
13*7c568831SAndroid Build Coastguard Worker 
14*7c568831SAndroid Build Coastguard Worker #define XML_DEPRECATED
15*7c568831SAndroid Build Coastguard Worker #define XML_DEPRECATED_MEMBER
16*7c568831SAndroid Build Coastguard Worker 
17*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
18*7c568831SAndroid Build Coastguard Worker #include <stdio.h>
19*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
20*7c568831SAndroid Build Coastguard Worker #include <string.h>
21*7c568831SAndroid Build Coastguard Worker 
22*7c568831SAndroid Build Coastguard Worker #include <fcntl.h>
23*7c568831SAndroid Build Coastguard Worker #include <sys/stat.h>
24*7c568831SAndroid Build Coastguard Worker 
25*7c568831SAndroid Build Coastguard Worker #ifdef _WIN32
26*7c568831SAndroid Build Coastguard Worker   #include <io.h>
27*7c568831SAndroid Build Coastguard Worker #else
28*7c568831SAndroid Build Coastguard Worker   #include <unistd.h>
29*7c568831SAndroid Build Coastguard Worker #endif
30*7c568831SAndroid Build Coastguard Worker 
31*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
32*7c568831SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
33*7c568831SAndroid Build Coastguard Worker #include <libxml/tree.h>
34*7c568831SAndroid Build Coastguard Worker #include <libxml/uri.h>
35*7c568831SAndroid Build Coastguard Worker #include <libxml/encoding.h>
36*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlsave.h>
37*7c568831SAndroid Build Coastguard Worker 
38*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
39*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
40*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlreader.h>
41*7c568831SAndroid Build Coastguard Worker #endif
42*7c568831SAndroid Build Coastguard Worker 
43*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
44*7c568831SAndroid Build Coastguard Worker #include <libxml/xinclude.h>
45*7c568831SAndroid Build Coastguard Worker #endif
46*7c568831SAndroid Build Coastguard Worker 
47*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XPATH_ENABLED
48*7c568831SAndroid Build Coastguard Worker #include <libxml/xpath.h>
49*7c568831SAndroid Build Coastguard Worker #include <libxml/xpathInternals.h>
50*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XPTR_ENABLED
51*7c568831SAndroid Build Coastguard Worker #include <libxml/xpointer.h>
52*7c568831SAndroid Build Coastguard Worker #endif
53*7c568831SAndroid Build Coastguard Worker #endif
54*7c568831SAndroid Build Coastguard Worker 
55*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
56*7c568831SAndroid Build Coastguard Worker #include <libxml/relaxng.h>
57*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlschemas.h>
58*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlschemastypes.h>
59*7c568831SAndroid Build Coastguard Worker #endif
60*7c568831SAndroid Build Coastguard Worker 
61*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMATRON_ENABLED
62*7c568831SAndroid Build Coastguard Worker #include <libxml/schematron.h>
63*7c568831SAndroid Build Coastguard Worker #endif
64*7c568831SAndroid Build Coastguard Worker 
65*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
66*7c568831SAndroid Build Coastguard Worker #include <libxml/pattern.h>
67*7c568831SAndroid Build Coastguard Worker #endif
68*7c568831SAndroid Build Coastguard Worker 
69*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_C14N_ENABLED
70*7c568831SAndroid Build Coastguard Worker #include <libxml/c14n.h>
71*7c568831SAndroid Build Coastguard Worker #endif
72*7c568831SAndroid Build Coastguard Worker 
73*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
74*7c568831SAndroid Build Coastguard Worker #include <libxml/HTMLparser.h>
75*7c568831SAndroid Build Coastguard Worker #include <libxml/HTMLtree.h>
76*7c568831SAndroid Build Coastguard Worker #endif
77*7c568831SAndroid Build Coastguard Worker 
78*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
79*7c568831SAndroid Build Coastguard Worker #include <libxml/threads.h>
80*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
81*7c568831SAndroid Build Coastguard Worker #endif
82*7c568831SAndroid Build Coastguard Worker 
83*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
84*7c568831SAndroid Build Coastguard Worker #include <libxml/catalog.h>
85*7c568831SAndroid Build Coastguard Worker #endif
86*7c568831SAndroid Build Coastguard Worker 
87*7c568831SAndroid Build Coastguard Worker /*
88*7c568831SAndroid Build Coastguard Worker  * pseudo flag for the unification of HTML and XML tests
89*7c568831SAndroid Build Coastguard Worker  */
90*7c568831SAndroid Build Coastguard Worker #define XML_PARSE_HTML 1 << 30
91*7c568831SAndroid Build Coastguard Worker 
92*7c568831SAndroid Build Coastguard Worker /*
93*7c568831SAndroid Build Coastguard Worker  * O_BINARY is just for Windows compatibility - if it isn't defined
94*7c568831SAndroid Build Coastguard Worker  * on this system, avoid any compilation error
95*7c568831SAndroid Build Coastguard Worker  */
96*7c568831SAndroid Build Coastguard Worker #ifdef	O_BINARY
97*7c568831SAndroid Build Coastguard Worker #define RD_FLAGS	O_RDONLY | O_BINARY
98*7c568831SAndroid Build Coastguard Worker #define WR_FLAGS	O_WRONLY | O_CREAT | O_TRUNC | O_BINARY
99*7c568831SAndroid Build Coastguard Worker #else
100*7c568831SAndroid Build Coastguard Worker #define RD_FLAGS	O_RDONLY
101*7c568831SAndroid Build Coastguard Worker #define WR_FLAGS	O_WRONLY | O_CREAT | O_TRUNC
102*7c568831SAndroid Build Coastguard Worker #endif
103*7c568831SAndroid Build Coastguard Worker 
104*7c568831SAndroid Build Coastguard Worker typedef int (*functest) (const char *filename, const char *result,
105*7c568831SAndroid Build Coastguard Worker                          const char *error, int options);
106*7c568831SAndroid Build Coastguard Worker 
107*7c568831SAndroid Build Coastguard Worker typedef struct testDesc testDesc;
108*7c568831SAndroid Build Coastguard Worker typedef testDesc *testDescPtr;
109*7c568831SAndroid Build Coastguard Worker struct testDesc {
110*7c568831SAndroid Build Coastguard Worker     const char *desc; /* description of the test */
111*7c568831SAndroid Build Coastguard Worker     functest    func; /* function implementing the test */
112*7c568831SAndroid Build Coastguard Worker     const char *in;   /* glob to path for input files */
113*7c568831SAndroid Build Coastguard Worker     const char *out;  /* output directory */
114*7c568831SAndroid Build Coastguard Worker     const char *suffix;/* suffix for output files */
115*7c568831SAndroid Build Coastguard Worker     const char *err;  /* suffix for error output files */
116*7c568831SAndroid Build Coastguard Worker     int     options;  /* parser options for the test */
117*7c568831SAndroid Build Coastguard Worker };
118*7c568831SAndroid Build Coastguard Worker 
119*7c568831SAndroid Build Coastguard Worker static int update_results = 0;
120*7c568831SAndroid Build Coastguard Worker static char* temp_directory = NULL;
121*7c568831SAndroid Build Coastguard Worker static int checkTestFile(const char *filename);
122*7c568831SAndroid Build Coastguard Worker 
123*7c568831SAndroid Build Coastguard Worker #if defined(_WIN32)
124*7c568831SAndroid Build Coastguard Worker 
125*7c568831SAndroid Build Coastguard Worker #include <windows.h>
126*7c568831SAndroid Build Coastguard Worker 
127*7c568831SAndroid Build Coastguard Worker typedef struct
128*7c568831SAndroid Build Coastguard Worker {
129*7c568831SAndroid Build Coastguard Worker       size_t gl_pathc;    /* Count of paths matched so far  */
130*7c568831SAndroid Build Coastguard Worker       char **gl_pathv;    /* List of matched pathnames.  */
131*7c568831SAndroid Build Coastguard Worker       size_t gl_offs;     /* Slots to reserve in 'gl_pathv'.  */
132*7c568831SAndroid Build Coastguard Worker } glob_t;
133*7c568831SAndroid Build Coastguard Worker 
134*7c568831SAndroid Build Coastguard Worker #define GLOB_DOOFFS 0
glob(const char * pattern,ATTRIBUTE_UNUSED int flags,ATTRIBUTE_UNUSED int errfunc (const char * epath,int eerrno),glob_t * pglob)135*7c568831SAndroid Build Coastguard Worker static int glob(const char *pattern, ATTRIBUTE_UNUSED int flags,
136*7c568831SAndroid Build Coastguard Worker                 ATTRIBUTE_UNUSED int errfunc(const char *epath, int eerrno),
137*7c568831SAndroid Build Coastguard Worker                 glob_t *pglob) {
138*7c568831SAndroid Build Coastguard Worker     glob_t *ret;
139*7c568831SAndroid Build Coastguard Worker     WIN32_FIND_DATA FindFileData;
140*7c568831SAndroid Build Coastguard Worker     HANDLE hFind;
141*7c568831SAndroid Build Coastguard Worker     unsigned int nb_paths = 0;
142*7c568831SAndroid Build Coastguard Worker     char directory[500];
143*7c568831SAndroid Build Coastguard Worker     int len;
144*7c568831SAndroid Build Coastguard Worker 
145*7c568831SAndroid Build Coastguard Worker     if ((pattern == NULL) || (pglob == NULL)) return(-1);
146*7c568831SAndroid Build Coastguard Worker 
147*7c568831SAndroid Build Coastguard Worker     strncpy(directory, pattern, 499);
148*7c568831SAndroid Build Coastguard Worker     for (len = strlen(directory);len >= 0;len--) {
149*7c568831SAndroid Build Coastguard Worker         if (directory[len] == '/') {
150*7c568831SAndroid Build Coastguard Worker 	    len++;
151*7c568831SAndroid Build Coastguard Worker 	    directory[len] = 0;
152*7c568831SAndroid Build Coastguard Worker 	    break;
153*7c568831SAndroid Build Coastguard Worker 	}
154*7c568831SAndroid Build Coastguard Worker     }
155*7c568831SAndroid Build Coastguard Worker     if (len <= 0)
156*7c568831SAndroid Build Coastguard Worker         len = 0;
157*7c568831SAndroid Build Coastguard Worker 
158*7c568831SAndroid Build Coastguard Worker 
159*7c568831SAndroid Build Coastguard Worker     ret = pglob;
160*7c568831SAndroid Build Coastguard Worker     memset(ret, 0, sizeof(glob_t));
161*7c568831SAndroid Build Coastguard Worker 
162*7c568831SAndroid Build Coastguard Worker     hFind = FindFirstFileA(pattern, &FindFileData);
163*7c568831SAndroid Build Coastguard Worker     if (hFind == INVALID_HANDLE_VALUE)
164*7c568831SAndroid Build Coastguard Worker         return(0);
165*7c568831SAndroid Build Coastguard Worker     nb_paths = 20;
166*7c568831SAndroid Build Coastguard Worker     ret->gl_pathv = (char **) malloc(nb_paths * sizeof(char *));
167*7c568831SAndroid Build Coastguard Worker     if (ret->gl_pathv == NULL) {
168*7c568831SAndroid Build Coastguard Worker 	FindClose(hFind);
169*7c568831SAndroid Build Coastguard Worker         return(-1);
170*7c568831SAndroid Build Coastguard Worker     }
171*7c568831SAndroid Build Coastguard Worker     strncpy(directory + len, FindFileData.cFileName, 499 - len);
172*7c568831SAndroid Build Coastguard Worker     ret->gl_pathv[ret->gl_pathc] = strdup(directory);
173*7c568831SAndroid Build Coastguard Worker     if (ret->gl_pathv[ret->gl_pathc] == NULL)
174*7c568831SAndroid Build Coastguard Worker         goto done;
175*7c568831SAndroid Build Coastguard Worker     ret->gl_pathc++;
176*7c568831SAndroid Build Coastguard Worker     while(FindNextFileA(hFind, &FindFileData)) {
177*7c568831SAndroid Build Coastguard Worker         if (FindFileData.cFileName[0] == '.')
178*7c568831SAndroid Build Coastguard Worker 	    continue;
179*7c568831SAndroid Build Coastguard Worker         if (ret->gl_pathc + 2 > nb_paths) {
180*7c568831SAndroid Build Coastguard Worker             char **tmp = realloc(ret->gl_pathv, nb_paths * 2 * sizeof(char *));
181*7c568831SAndroid Build Coastguard Worker             if (tmp == NULL)
182*7c568831SAndroid Build Coastguard Worker                 break;
183*7c568831SAndroid Build Coastguard Worker             ret->gl_pathv = tmp;
184*7c568831SAndroid Build Coastguard Worker             nb_paths *= 2;
185*7c568831SAndroid Build Coastguard Worker 	}
186*7c568831SAndroid Build Coastguard Worker 	strncpy(directory + len, FindFileData.cFileName, 499 - len);
187*7c568831SAndroid Build Coastguard Worker 	ret->gl_pathv[ret->gl_pathc] = strdup(directory);
188*7c568831SAndroid Build Coastguard Worker         if (ret->gl_pathv[ret->gl_pathc] == NULL)
189*7c568831SAndroid Build Coastguard Worker             break;
190*7c568831SAndroid Build Coastguard Worker         ret->gl_pathc++;
191*7c568831SAndroid Build Coastguard Worker     }
192*7c568831SAndroid Build Coastguard Worker     ret->gl_pathv[ret->gl_pathc] = NULL;
193*7c568831SAndroid Build Coastguard Worker 
194*7c568831SAndroid Build Coastguard Worker done:
195*7c568831SAndroid Build Coastguard Worker     FindClose(hFind);
196*7c568831SAndroid Build Coastguard Worker     return(0);
197*7c568831SAndroid Build Coastguard Worker }
198*7c568831SAndroid Build Coastguard Worker 
199*7c568831SAndroid Build Coastguard Worker 
200*7c568831SAndroid Build Coastguard Worker 
globfree(glob_t * pglob)201*7c568831SAndroid Build Coastguard Worker static void globfree(glob_t *pglob) {
202*7c568831SAndroid Build Coastguard Worker     unsigned int i;
203*7c568831SAndroid Build Coastguard Worker     if (pglob == NULL)
204*7c568831SAndroid Build Coastguard Worker         return;
205*7c568831SAndroid Build Coastguard Worker 
206*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < pglob->gl_pathc;i++) {
207*7c568831SAndroid Build Coastguard Worker          if (pglob->gl_pathv[i] != NULL)
208*7c568831SAndroid Build Coastguard Worker              free(pglob->gl_pathv[i]);
209*7c568831SAndroid Build Coastguard Worker     }
210*7c568831SAndroid Build Coastguard Worker }
211*7c568831SAndroid Build Coastguard Worker 
212*7c568831SAndroid Build Coastguard Worker #elif HAVE_DECL_GLOB
213*7c568831SAndroid Build Coastguard Worker 
214*7c568831SAndroid Build Coastguard Worker #include <glob.h>
215*7c568831SAndroid Build Coastguard Worker 
216*7c568831SAndroid Build Coastguard Worker #else /* _WIN32, HAVE_DECL_GLOB */
217*7c568831SAndroid Build Coastguard Worker 
218*7c568831SAndroid Build Coastguard Worker #define GLOB_DOOFFS 0
219*7c568831SAndroid Build Coastguard Worker 
220*7c568831SAndroid Build Coastguard Worker typedef struct {
221*7c568831SAndroid Build Coastguard Worker       size_t gl_pathc;    /* Count of paths matched so far  */
222*7c568831SAndroid Build Coastguard Worker       char **gl_pathv;    /* List of matched pathnames.  */
223*7c568831SAndroid Build Coastguard Worker       size_t gl_offs;     /* Slots to reserve in 'gl_pathv'.  */
224*7c568831SAndroid Build Coastguard Worker } glob_t;
225*7c568831SAndroid Build Coastguard Worker 
226*7c568831SAndroid Build Coastguard Worker static int
glob(const char * pattern ATTRIBUTE_UNUSED,int flags ATTRIBUTE_UNUSED,int errfunc (const char * epath,int eerrno)ATTRIBUTE_UNUSED,glob_t * pglob)227*7c568831SAndroid Build Coastguard Worker glob(const char *pattern ATTRIBUTE_UNUSED, int flags ATTRIBUTE_UNUSED,
228*7c568831SAndroid Build Coastguard Worker      int errfunc(const char *epath, int eerrno) ATTRIBUTE_UNUSED,
229*7c568831SAndroid Build Coastguard Worker      glob_t *pglob) {
230*7c568831SAndroid Build Coastguard Worker     pglob->gl_pathc = 0;
231*7c568831SAndroid Build Coastguard Worker     pglob->gl_pathv = NULL;
232*7c568831SAndroid Build Coastguard Worker 
233*7c568831SAndroid Build Coastguard Worker     return(0);
234*7c568831SAndroid Build Coastguard Worker }
235*7c568831SAndroid Build Coastguard Worker 
236*7c568831SAndroid Build Coastguard Worker static void
globfree(glob_t * pglob ATTRIBUTE_UNUSED)237*7c568831SAndroid Build Coastguard Worker globfree(glob_t *pglob ATTRIBUTE_UNUSED) {
238*7c568831SAndroid Build Coastguard Worker }
239*7c568831SAndroid Build Coastguard Worker 
240*7c568831SAndroid Build Coastguard Worker #endif /* _WIN32, HAVE_DECL_GLOB */
241*7c568831SAndroid Build Coastguard Worker 
242*7c568831SAndroid Build Coastguard Worker /************************************************************************
243*7c568831SAndroid Build Coastguard Worker  *									*
244*7c568831SAndroid Build Coastguard Worker  *		Libxml2 specific routines				*
245*7c568831SAndroid Build Coastguard Worker  *									*
246*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
247*7c568831SAndroid Build Coastguard Worker 
248*7c568831SAndroid Build Coastguard Worker static int nb_tests = 0;
249*7c568831SAndroid Build Coastguard Worker static int nb_errors = 0;
250*7c568831SAndroid Build Coastguard Worker static int nb_leaks = 0;
251*7c568831SAndroid Build Coastguard Worker 
252*7c568831SAndroid Build Coastguard Worker static int
fatalError(void)253*7c568831SAndroid Build Coastguard Worker fatalError(void) {
254*7c568831SAndroid Build Coastguard Worker     fprintf(stderr, "Exitting tests on fatal error\n");
255*7c568831SAndroid Build Coastguard Worker     exit(1);
256*7c568831SAndroid Build Coastguard Worker }
257*7c568831SAndroid Build Coastguard Worker 
258*7c568831SAndroid Build Coastguard Worker /*
259*7c568831SAndroid Build Coastguard Worker  * Trapping the error messages at the generic level to grab the equivalent of
260*7c568831SAndroid Build Coastguard Worker  * stderr messages on CLI tools.
261*7c568831SAndroid Build Coastguard Worker  */
262*7c568831SAndroid Build Coastguard Worker static char testErrors[32769];
263*7c568831SAndroid Build Coastguard Worker static int testErrorsSize = 0;
264*7c568831SAndroid Build Coastguard Worker 
265*7c568831SAndroid Build Coastguard Worker static void
testErrorHandler(void * ctx ATTRIBUTE_UNUSED,const char * msg,...)266*7c568831SAndroid Build Coastguard Worker testErrorHandler(void *ctx  ATTRIBUTE_UNUSED, const char *msg, ...) {
267*7c568831SAndroid Build Coastguard Worker     va_list args;
268*7c568831SAndroid Build Coastguard Worker     int res;
269*7c568831SAndroid Build Coastguard Worker 
270*7c568831SAndroid Build Coastguard Worker     if (testErrorsSize >= 32768)
271*7c568831SAndroid Build Coastguard Worker         return;
272*7c568831SAndroid Build Coastguard Worker     va_start(args, msg);
273*7c568831SAndroid Build Coastguard Worker     res = vsnprintf(&testErrors[testErrorsSize],
274*7c568831SAndroid Build Coastguard Worker                     32768 - testErrorsSize,
275*7c568831SAndroid Build Coastguard Worker 		    msg, args);
276*7c568831SAndroid Build Coastguard Worker     va_end(args);
277*7c568831SAndroid Build Coastguard Worker     if (testErrorsSize + res >= 32768) {
278*7c568831SAndroid Build Coastguard Worker         /* buffer is full */
279*7c568831SAndroid Build Coastguard Worker 	testErrorsSize = 32768;
280*7c568831SAndroid Build Coastguard Worker 	testErrors[testErrorsSize] = 0;
281*7c568831SAndroid Build Coastguard Worker     } else {
282*7c568831SAndroid Build Coastguard Worker         testErrorsSize += res;
283*7c568831SAndroid Build Coastguard Worker     }
284*7c568831SAndroid Build Coastguard Worker     testErrors[testErrorsSize] = 0;
285*7c568831SAndroid Build Coastguard Worker }
286*7c568831SAndroid Build Coastguard Worker 
287*7c568831SAndroid Build Coastguard Worker static void
testStructuredErrorHandler(void * ctx ATTRIBUTE_UNUSED,const xmlError * err)288*7c568831SAndroid Build Coastguard Worker testStructuredErrorHandler(void *ctx ATTRIBUTE_UNUSED, const xmlError *err) {
289*7c568831SAndroid Build Coastguard Worker     xmlFormatError(err, testErrorHandler, NULL);
290*7c568831SAndroid Build Coastguard Worker }
291*7c568831SAndroid Build Coastguard Worker 
292*7c568831SAndroid Build Coastguard Worker static void
initializeLibxml2(void)293*7c568831SAndroid Build Coastguard Worker initializeLibxml2(void) {
294*7c568831SAndroid Build Coastguard Worker     /*
295*7c568831SAndroid Build Coastguard Worker      * This verifies that xmlInitParser doesn't allocate memory with
296*7c568831SAndroid Build Coastguard Worker      * xmlMalloc
297*7c568831SAndroid Build Coastguard Worker      */
298*7c568831SAndroid Build Coastguard Worker     xmlFree = NULL;
299*7c568831SAndroid Build Coastguard Worker     xmlMalloc = NULL;
300*7c568831SAndroid Build Coastguard Worker     xmlRealloc = NULL;
301*7c568831SAndroid Build Coastguard Worker     xmlMemStrdup = NULL;
302*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
303*7c568831SAndroid Build Coastguard Worker     xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);
304*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
305*7c568831SAndroid Build Coastguard Worker     /*
306*7c568831SAndroid Build Coastguard Worker      * Disable system catalog which could cause lazy memory allocations
307*7c568831SAndroid Build Coastguard Worker      * resulting in false positive memory leaks.
308*7c568831SAndroid Build Coastguard Worker      */
309*7c568831SAndroid Build Coastguard Worker #ifdef _WIN32
310*7c568831SAndroid Build Coastguard Worker     putenv("XML_CATALOG_FILES=");
311*7c568831SAndroid Build Coastguard Worker #else
312*7c568831SAndroid Build Coastguard Worker     setenv("XML_CATALOG_FILES", "", 1);
313*7c568831SAndroid Build Coastguard Worker #endif
314*7c568831SAndroid Build Coastguard Worker     xmlInitializeCatalog();
315*7c568831SAndroid Build Coastguard Worker #endif
316*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
317*7c568831SAndroid Build Coastguard Worker     xmlSchemaInitTypes();
318*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGInitTypes();
319*7c568831SAndroid Build Coastguard Worker #endif
320*7c568831SAndroid Build Coastguard Worker }
321*7c568831SAndroid Build Coastguard Worker 
322*7c568831SAndroid Build Coastguard Worker 
323*7c568831SAndroid Build Coastguard Worker /************************************************************************
324*7c568831SAndroid Build Coastguard Worker  *									*
325*7c568831SAndroid Build Coastguard Worker  *		File name and path utilities				*
326*7c568831SAndroid Build Coastguard Worker  *									*
327*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
328*7c568831SAndroid Build Coastguard Worker 
baseFilename(const char * filename)329*7c568831SAndroid Build Coastguard Worker static const char *baseFilename(const char *filename) {
330*7c568831SAndroid Build Coastguard Worker     const char *cur;
331*7c568831SAndroid Build Coastguard Worker     if (filename == NULL)
332*7c568831SAndroid Build Coastguard Worker         return(NULL);
333*7c568831SAndroid Build Coastguard Worker     cur = &filename[strlen(filename)];
334*7c568831SAndroid Build Coastguard Worker     while ((cur > filename) && (*cur != '/'))
335*7c568831SAndroid Build Coastguard Worker         cur--;
336*7c568831SAndroid Build Coastguard Worker     if (*cur == '/')
337*7c568831SAndroid Build Coastguard Worker         return(cur + 1);
338*7c568831SAndroid Build Coastguard Worker     return(cur);
339*7c568831SAndroid Build Coastguard Worker }
340*7c568831SAndroid Build Coastguard Worker 
resultFilename(const char * filename,const char * out,const char * suffix)341*7c568831SAndroid Build Coastguard Worker static char *resultFilename(const char *filename, const char *out,
342*7c568831SAndroid Build Coastguard Worker                             const char *suffix) {
343*7c568831SAndroid Build Coastguard Worker     const char *base;
344*7c568831SAndroid Build Coastguard Worker     char res[500];
345*7c568831SAndroid Build Coastguard Worker     char suffixbuff[500];
346*7c568831SAndroid Build Coastguard Worker 
347*7c568831SAndroid Build Coastguard Worker /*************
348*7c568831SAndroid Build Coastguard Worker     if ((filename[0] == 't') && (filename[1] == 'e') &&
349*7c568831SAndroid Build Coastguard Worker         (filename[2] == 's') && (filename[3] == 't') &&
350*7c568831SAndroid Build Coastguard Worker 	(filename[4] == '/'))
351*7c568831SAndroid Build Coastguard Worker 	filename = &filename[5];
352*7c568831SAndroid Build Coastguard Worker  *************/
353*7c568831SAndroid Build Coastguard Worker 
354*7c568831SAndroid Build Coastguard Worker     base = baseFilename(filename);
355*7c568831SAndroid Build Coastguard Worker     if (suffix == NULL)
356*7c568831SAndroid Build Coastguard Worker         suffix = ".tmp";
357*7c568831SAndroid Build Coastguard Worker     if (out == NULL)
358*7c568831SAndroid Build Coastguard Worker         out = "";
359*7c568831SAndroid Build Coastguard Worker 
360*7c568831SAndroid Build Coastguard Worker     strncpy(suffixbuff,suffix,499);
361*7c568831SAndroid Build Coastguard Worker 
362*7c568831SAndroid Build Coastguard Worker     if (snprintf(res, 499, "%s%s%s", out, base, suffixbuff) >= 499)
363*7c568831SAndroid Build Coastguard Worker         res[499] = 0;
364*7c568831SAndroid Build Coastguard Worker     return(strdup(res));
365*7c568831SAndroid Build Coastguard Worker }
366*7c568831SAndroid Build Coastguard Worker 
checkTestFile(const char * filename)367*7c568831SAndroid Build Coastguard Worker static int checkTestFile(const char *filename) {
368*7c568831SAndroid Build Coastguard Worker     struct stat buf;
369*7c568831SAndroid Build Coastguard Worker 
370*7c568831SAndroid Build Coastguard Worker     if (stat(filename, &buf) == -1)
371*7c568831SAndroid Build Coastguard Worker         return(0);
372*7c568831SAndroid Build Coastguard Worker 
373*7c568831SAndroid Build Coastguard Worker #if defined(_WIN32)
374*7c568831SAndroid Build Coastguard Worker     if (!(buf.st_mode & _S_IFREG))
375*7c568831SAndroid Build Coastguard Worker         return(0);
376*7c568831SAndroid Build Coastguard Worker #else
377*7c568831SAndroid Build Coastguard Worker     if (!S_ISREG(buf.st_mode))
378*7c568831SAndroid Build Coastguard Worker         return(0);
379*7c568831SAndroid Build Coastguard Worker #endif
380*7c568831SAndroid Build Coastguard Worker 
381*7c568831SAndroid Build Coastguard Worker     return(1);
382*7c568831SAndroid Build Coastguard Worker }
383*7c568831SAndroid Build Coastguard Worker 
compareFiles(const char * r1,const char * r2)384*7c568831SAndroid Build Coastguard Worker static int compareFiles(const char *r1 /* temp */, const char *r2 /* result */) {
385*7c568831SAndroid Build Coastguard Worker     int res1, res2, total;
386*7c568831SAndroid Build Coastguard Worker     int fd1, fd2;
387*7c568831SAndroid Build Coastguard Worker     char bytes1[4096];
388*7c568831SAndroid Build Coastguard Worker     char bytes2[4096];
389*7c568831SAndroid Build Coastguard Worker 
390*7c568831SAndroid Build Coastguard Worker     if (update_results) {
391*7c568831SAndroid Build Coastguard Worker         fd1 = open(r1, RD_FLAGS);
392*7c568831SAndroid Build Coastguard Worker         if (fd1 < 0)
393*7c568831SAndroid Build Coastguard Worker             return(-1);
394*7c568831SAndroid Build Coastguard Worker         fd2 = open(r2, WR_FLAGS, 0644);
395*7c568831SAndroid Build Coastguard Worker         if (fd2 < 0) {
396*7c568831SAndroid Build Coastguard Worker             close(fd1);
397*7c568831SAndroid Build Coastguard Worker             return(-1);
398*7c568831SAndroid Build Coastguard Worker         }
399*7c568831SAndroid Build Coastguard Worker         total = 0;
400*7c568831SAndroid Build Coastguard Worker         do {
401*7c568831SAndroid Build Coastguard Worker             res1 = read(fd1, bytes1, 4096);
402*7c568831SAndroid Build Coastguard Worker             if (res1 <= 0)
403*7c568831SAndroid Build Coastguard Worker                 break;
404*7c568831SAndroid Build Coastguard Worker             total += res1;
405*7c568831SAndroid Build Coastguard Worker             res2 = write(fd2, bytes1, res1);
406*7c568831SAndroid Build Coastguard Worker             if (res2 <= 0 || res2 != res1)
407*7c568831SAndroid Build Coastguard Worker                 break;
408*7c568831SAndroid Build Coastguard Worker         } while (1);
409*7c568831SAndroid Build Coastguard Worker         close(fd2);
410*7c568831SAndroid Build Coastguard Worker         close(fd1);
411*7c568831SAndroid Build Coastguard Worker         if (total == 0)
412*7c568831SAndroid Build Coastguard Worker             unlink(r2);
413*7c568831SAndroid Build Coastguard Worker         return(res1 != 0);
414*7c568831SAndroid Build Coastguard Worker     }
415*7c568831SAndroid Build Coastguard Worker 
416*7c568831SAndroid Build Coastguard Worker     fd1 = open(r1, RD_FLAGS);
417*7c568831SAndroid Build Coastguard Worker     if (fd1 < 0)
418*7c568831SAndroid Build Coastguard Worker         return(-1);
419*7c568831SAndroid Build Coastguard Worker     fd2 = open(r2, RD_FLAGS);
420*7c568831SAndroid Build Coastguard Worker     while (1) {
421*7c568831SAndroid Build Coastguard Worker         res1 = read(fd1, bytes1, 4096);
422*7c568831SAndroid Build Coastguard Worker         res2 = fd2 >= 0 ? read(fd2, bytes2, 4096) : 0;
423*7c568831SAndroid Build Coastguard Worker 	if ((res1 != res2) || (res1 < 0)) {
424*7c568831SAndroid Build Coastguard Worker 	    close(fd1);
425*7c568831SAndroid Build Coastguard Worker             if (fd2 >= 0)
426*7c568831SAndroid Build Coastguard Worker                 close(fd2);
427*7c568831SAndroid Build Coastguard Worker 	    return(1);
428*7c568831SAndroid Build Coastguard Worker 	}
429*7c568831SAndroid Build Coastguard Worker 	if (res1 == 0)
430*7c568831SAndroid Build Coastguard Worker 	    break;
431*7c568831SAndroid Build Coastguard Worker 	if (memcmp(bytes1, bytes2, res1) != 0) {
432*7c568831SAndroid Build Coastguard Worker 	    close(fd1);
433*7c568831SAndroid Build Coastguard Worker             if (fd2 >= 0)
434*7c568831SAndroid Build Coastguard Worker                 close(fd2);
435*7c568831SAndroid Build Coastguard Worker 	    return(1);
436*7c568831SAndroid Build Coastguard Worker 	}
437*7c568831SAndroid Build Coastguard Worker     }
438*7c568831SAndroid Build Coastguard Worker     close(fd1);
439*7c568831SAndroid Build Coastguard Worker     if (fd2 >= 0)
440*7c568831SAndroid Build Coastguard Worker         close(fd2);
441*7c568831SAndroid Build Coastguard Worker     return(0);
442*7c568831SAndroid Build Coastguard Worker }
443*7c568831SAndroid Build Coastguard Worker 
compareFileMem(const char * filename,const char * mem,int size)444*7c568831SAndroid Build Coastguard Worker static int compareFileMem(const char *filename, const char *mem, int size) {
445*7c568831SAndroid Build Coastguard Worker     int res;
446*7c568831SAndroid Build Coastguard Worker     int fd;
447*7c568831SAndroid Build Coastguard Worker     char bytes[4096];
448*7c568831SAndroid Build Coastguard Worker     int idx = 0;
449*7c568831SAndroid Build Coastguard Worker     struct stat info;
450*7c568831SAndroid Build Coastguard Worker 
451*7c568831SAndroid Build Coastguard Worker     if (update_results) {
452*7c568831SAndroid Build Coastguard Worker         if (size == 0) {
453*7c568831SAndroid Build Coastguard Worker             unlink(filename);
454*7c568831SAndroid Build Coastguard Worker             return(0);
455*7c568831SAndroid Build Coastguard Worker         }
456*7c568831SAndroid Build Coastguard Worker         fd = open(filename, WR_FLAGS, 0644);
457*7c568831SAndroid Build Coastguard Worker         if (fd < 0) {
458*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "failed to open %s for writing", filename);
459*7c568831SAndroid Build Coastguard Worker             return(-1);
460*7c568831SAndroid Build Coastguard Worker 	}
461*7c568831SAndroid Build Coastguard Worker         res = write(fd, mem, size);
462*7c568831SAndroid Build Coastguard Worker         close(fd);
463*7c568831SAndroid Build Coastguard Worker         return(res != size);
464*7c568831SAndroid Build Coastguard Worker     }
465*7c568831SAndroid Build Coastguard Worker 
466*7c568831SAndroid Build Coastguard Worker     if (stat(filename, &info) < 0) {
467*7c568831SAndroid Build Coastguard Worker         if (size == 0)
468*7c568831SAndroid Build Coastguard Worker             return(0);
469*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "failed to stat %s\n", filename);
470*7c568831SAndroid Build Coastguard Worker 	return(-1);
471*7c568831SAndroid Build Coastguard Worker     }
472*7c568831SAndroid Build Coastguard Worker     if (info.st_size != size) {
473*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "file %s is %ld bytes, result is %d bytes\n",
474*7c568831SAndroid Build Coastguard Worker 	        filename, (long) info.st_size, size);
475*7c568831SAndroid Build Coastguard Worker         return(-1);
476*7c568831SAndroid Build Coastguard Worker     }
477*7c568831SAndroid Build Coastguard Worker     fd = open(filename, RD_FLAGS);
478*7c568831SAndroid Build Coastguard Worker     if (fd < 0) {
479*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "failed to open %s for reading", filename);
480*7c568831SAndroid Build Coastguard Worker         return(-1);
481*7c568831SAndroid Build Coastguard Worker     }
482*7c568831SAndroid Build Coastguard Worker     while (idx < size) {
483*7c568831SAndroid Build Coastguard Worker         res = read(fd, bytes, 4096);
484*7c568831SAndroid Build Coastguard Worker 	if (res <= 0)
485*7c568831SAndroid Build Coastguard Worker 	    break;
486*7c568831SAndroid Build Coastguard Worker 	if (res + idx > size)
487*7c568831SAndroid Build Coastguard Worker 	    break;
488*7c568831SAndroid Build Coastguard Worker 	if (memcmp(bytes, &mem[idx], res) != 0) {
489*7c568831SAndroid Build Coastguard Worker 	    int ix;
490*7c568831SAndroid Build Coastguard Worker 	    for (ix=0; ix<res; ix++)
491*7c568831SAndroid Build Coastguard Worker 		if (bytes[ix] != mem[idx+ix])
492*7c568831SAndroid Build Coastguard Worker 			break;
493*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr,"Compare error at position %d\n", idx+ix);
494*7c568831SAndroid Build Coastguard Worker 	    close(fd);
495*7c568831SAndroid Build Coastguard Worker 	    return(1);
496*7c568831SAndroid Build Coastguard Worker 	}
497*7c568831SAndroid Build Coastguard Worker 	idx += res;
498*7c568831SAndroid Build Coastguard Worker     }
499*7c568831SAndroid Build Coastguard Worker     close(fd);
500*7c568831SAndroid Build Coastguard Worker     if (idx != size) {
501*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr,"Compare error index %d, size %d\n", idx, size);
502*7c568831SAndroid Build Coastguard Worker     }
503*7c568831SAndroid Build Coastguard Worker     return(idx != size);
504*7c568831SAndroid Build Coastguard Worker }
505*7c568831SAndroid Build Coastguard Worker 
loadMem(const char * filename,const char ** mem,int * size)506*7c568831SAndroid Build Coastguard Worker static int loadMem(const char *filename, const char **mem, int *size) {
507*7c568831SAndroid Build Coastguard Worker     int fd, res;
508*7c568831SAndroid Build Coastguard Worker     struct stat info;
509*7c568831SAndroid Build Coastguard Worker     char *base;
510*7c568831SAndroid Build Coastguard Worker     int siz = 0;
511*7c568831SAndroid Build Coastguard Worker     if (stat(filename, &info) < 0)
512*7c568831SAndroid Build Coastguard Worker 	return(-1);
513*7c568831SAndroid Build Coastguard Worker     base = malloc(info.st_size + 1);
514*7c568831SAndroid Build Coastguard Worker     if (base == NULL)
515*7c568831SAndroid Build Coastguard Worker 	return(-1);
516*7c568831SAndroid Build Coastguard Worker     fd = open(filename, RD_FLAGS);
517*7c568831SAndroid Build Coastguard Worker     if (fd  < 0) {
518*7c568831SAndroid Build Coastguard Worker         free(base);
519*7c568831SAndroid Build Coastguard Worker 	return(-1);
520*7c568831SAndroid Build Coastguard Worker     }
521*7c568831SAndroid Build Coastguard Worker     while ((res = read(fd, &base[siz], info.st_size - siz)) > 0) {
522*7c568831SAndroid Build Coastguard Worker         siz += res;
523*7c568831SAndroid Build Coastguard Worker     }
524*7c568831SAndroid Build Coastguard Worker     close(fd);
525*7c568831SAndroid Build Coastguard Worker #if !defined(_WIN32)
526*7c568831SAndroid Build Coastguard Worker     if (siz != info.st_size) {
527*7c568831SAndroid Build Coastguard Worker         free(base);
528*7c568831SAndroid Build Coastguard Worker 	return(-1);
529*7c568831SAndroid Build Coastguard Worker     }
530*7c568831SAndroid Build Coastguard Worker #endif
531*7c568831SAndroid Build Coastguard Worker     base[siz] = 0;
532*7c568831SAndroid Build Coastguard Worker     *mem = base;
533*7c568831SAndroid Build Coastguard Worker     *size = siz;
534*7c568831SAndroid Build Coastguard Worker     return(0);
535*7c568831SAndroid Build Coastguard Worker }
536*7c568831SAndroid Build Coastguard Worker 
unloadMem(const char * mem)537*7c568831SAndroid Build Coastguard Worker static int unloadMem(const char *mem) {
538*7c568831SAndroid Build Coastguard Worker     free((char *)mem);
539*7c568831SAndroid Build Coastguard Worker     return(0);
540*7c568831SAndroid Build Coastguard Worker }
541*7c568831SAndroid Build Coastguard Worker 
542*7c568831SAndroid Build Coastguard Worker /************************************************************************
543*7c568831SAndroid Build Coastguard Worker  *									*
544*7c568831SAndroid Build Coastguard Worker  *		Tests implementations					*
545*7c568831SAndroid Build Coastguard Worker  *									*
546*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
547*7c568831SAndroid Build Coastguard Worker 
548*7c568831SAndroid Build Coastguard Worker /************************************************************************
549*7c568831SAndroid Build Coastguard Worker  *									*
550*7c568831SAndroid Build Coastguard Worker  *		Parse to SAX based tests				*
551*7c568831SAndroid Build Coastguard Worker  *									*
552*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
553*7c568831SAndroid Build Coastguard Worker 
554*7c568831SAndroid Build Coastguard Worker static FILE *SAXdebug = NULL;
555*7c568831SAndroid Build Coastguard Worker 
556*7c568831SAndroid Build Coastguard Worker /*
557*7c568831SAndroid Build Coastguard Worker  * empty SAX block
558*7c568831SAndroid Build Coastguard Worker  */
559*7c568831SAndroid Build Coastguard Worker static xmlSAXHandler emptySAXHandlerStruct = {
560*7c568831SAndroid Build Coastguard Worker     NULL, /* internalSubset */
561*7c568831SAndroid Build Coastguard Worker     NULL, /* isStandalone */
562*7c568831SAndroid Build Coastguard Worker     NULL, /* hasInternalSubset */
563*7c568831SAndroid Build Coastguard Worker     NULL, /* hasExternalSubset */
564*7c568831SAndroid Build Coastguard Worker     NULL, /* resolveEntity */
565*7c568831SAndroid Build Coastguard Worker     NULL, /* getEntity */
566*7c568831SAndroid Build Coastguard Worker     NULL, /* entityDecl */
567*7c568831SAndroid Build Coastguard Worker     NULL, /* notationDecl */
568*7c568831SAndroid Build Coastguard Worker     NULL, /* attributeDecl */
569*7c568831SAndroid Build Coastguard Worker     NULL, /* elementDecl */
570*7c568831SAndroid Build Coastguard Worker     NULL, /* unparsedEntityDecl */
571*7c568831SAndroid Build Coastguard Worker     NULL, /* setDocumentLocator */
572*7c568831SAndroid Build Coastguard Worker     NULL, /* startDocument */
573*7c568831SAndroid Build Coastguard Worker     NULL, /* endDocument */
574*7c568831SAndroid Build Coastguard Worker     NULL, /* startElement */
575*7c568831SAndroid Build Coastguard Worker     NULL, /* endElement */
576*7c568831SAndroid Build Coastguard Worker     NULL, /* reference */
577*7c568831SAndroid Build Coastguard Worker     NULL, /* characters */
578*7c568831SAndroid Build Coastguard Worker     NULL, /* ignorableWhitespace */
579*7c568831SAndroid Build Coastguard Worker     NULL, /* processingInstruction */
580*7c568831SAndroid Build Coastguard Worker     NULL, /* comment */
581*7c568831SAndroid Build Coastguard Worker     NULL, /* xmlParserWarning */
582*7c568831SAndroid Build Coastguard Worker     NULL, /* xmlParserError */
583*7c568831SAndroid Build Coastguard Worker     NULL, /* xmlParserError */
584*7c568831SAndroid Build Coastguard Worker     NULL, /* getParameterEntity */
585*7c568831SAndroid Build Coastguard Worker     NULL, /* cdataBlock; */
586*7c568831SAndroid Build Coastguard Worker     NULL, /* externalSubset; */
587*7c568831SAndroid Build Coastguard Worker     1,
588*7c568831SAndroid Build Coastguard Worker     NULL,
589*7c568831SAndroid Build Coastguard Worker     NULL, /* startElementNs */
590*7c568831SAndroid Build Coastguard Worker     NULL, /* endElementNs */
591*7c568831SAndroid Build Coastguard Worker     NULL  /* xmlStructuredErrorFunc */
592*7c568831SAndroid Build Coastguard Worker };
593*7c568831SAndroid Build Coastguard Worker 
594*7c568831SAndroid Build Coastguard Worker typedef struct {
595*7c568831SAndroid Build Coastguard Worker     const char *filename;
596*7c568831SAndroid Build Coastguard Worker     xmlHashTablePtr generalEntities;
597*7c568831SAndroid Build Coastguard Worker     xmlHashTablePtr parameterEntities;
598*7c568831SAndroid Build Coastguard Worker } debugContext;
599*7c568831SAndroid Build Coastguard Worker 
600*7c568831SAndroid Build Coastguard Worker static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
601*7c568831SAndroid Build Coastguard Worker static int callbacks = 0;
602*7c568831SAndroid Build Coastguard Worker static int quiet = 0;
603*7c568831SAndroid Build Coastguard Worker 
604*7c568831SAndroid Build Coastguard Worker /**
605*7c568831SAndroid Build Coastguard Worker  * isStandaloneDebug:
606*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
607*7c568831SAndroid Build Coastguard Worker  *
608*7c568831SAndroid Build Coastguard Worker  * Is this document tagged standalone ?
609*7c568831SAndroid Build Coastguard Worker  *
610*7c568831SAndroid Build Coastguard Worker  * Returns 1 if true
611*7c568831SAndroid Build Coastguard Worker  */
612*7c568831SAndroid Build Coastguard Worker static int
isStandaloneDebug(void * ctx ATTRIBUTE_UNUSED)613*7c568831SAndroid Build Coastguard Worker isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
614*7c568831SAndroid Build Coastguard Worker {
615*7c568831SAndroid Build Coastguard Worker     callbacks++;
616*7c568831SAndroid Build Coastguard Worker     if (quiet)
617*7c568831SAndroid Build Coastguard Worker 	return(0);
618*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.isStandalone()\n");
619*7c568831SAndroid Build Coastguard Worker     return(0);
620*7c568831SAndroid Build Coastguard Worker }
621*7c568831SAndroid Build Coastguard Worker 
622*7c568831SAndroid Build Coastguard Worker /**
623*7c568831SAndroid Build Coastguard Worker  * hasInternalSubsetDebug:
624*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
625*7c568831SAndroid Build Coastguard Worker  *
626*7c568831SAndroid Build Coastguard Worker  * Does this document has an internal subset
627*7c568831SAndroid Build Coastguard Worker  *
628*7c568831SAndroid Build Coastguard Worker  * Returns 1 if true
629*7c568831SAndroid Build Coastguard Worker  */
630*7c568831SAndroid Build Coastguard Worker static int
hasInternalSubsetDebug(void * ctx ATTRIBUTE_UNUSED)631*7c568831SAndroid Build Coastguard Worker hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
632*7c568831SAndroid Build Coastguard Worker {
633*7c568831SAndroid Build Coastguard Worker     callbacks++;
634*7c568831SAndroid Build Coastguard Worker     if (quiet)
635*7c568831SAndroid Build Coastguard Worker 	return(0);
636*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.hasInternalSubset()\n");
637*7c568831SAndroid Build Coastguard Worker     return(0);
638*7c568831SAndroid Build Coastguard Worker }
639*7c568831SAndroid Build Coastguard Worker 
640*7c568831SAndroid Build Coastguard Worker /**
641*7c568831SAndroid Build Coastguard Worker  * hasExternalSubsetDebug:
642*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
643*7c568831SAndroid Build Coastguard Worker  *
644*7c568831SAndroid Build Coastguard Worker  * Does this document has an external subset
645*7c568831SAndroid Build Coastguard Worker  *
646*7c568831SAndroid Build Coastguard Worker  * Returns 1 if true
647*7c568831SAndroid Build Coastguard Worker  */
648*7c568831SAndroid Build Coastguard Worker static int
hasExternalSubsetDebug(void * ctx ATTRIBUTE_UNUSED)649*7c568831SAndroid Build Coastguard Worker hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
650*7c568831SAndroid Build Coastguard Worker {
651*7c568831SAndroid Build Coastguard Worker     callbacks++;
652*7c568831SAndroid Build Coastguard Worker     if (quiet)
653*7c568831SAndroid Build Coastguard Worker 	return(0);
654*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.hasExternalSubset()\n");
655*7c568831SAndroid Build Coastguard Worker     return(0);
656*7c568831SAndroid Build Coastguard Worker }
657*7c568831SAndroid Build Coastguard Worker 
658*7c568831SAndroid Build Coastguard Worker /**
659*7c568831SAndroid Build Coastguard Worker  * internalSubsetDebug:
660*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
661*7c568831SAndroid Build Coastguard Worker  *
662*7c568831SAndroid Build Coastguard Worker  * Does this document has an internal subset
663*7c568831SAndroid Build Coastguard Worker  */
664*7c568831SAndroid Build Coastguard Worker static void
internalSubsetDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name,const xmlChar * ExternalID,const xmlChar * SystemID)665*7c568831SAndroid Build Coastguard Worker internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
666*7c568831SAndroid Build Coastguard Worker 	       const xmlChar *ExternalID, const xmlChar *SystemID)
667*7c568831SAndroid Build Coastguard Worker {
668*7c568831SAndroid Build Coastguard Worker     callbacks++;
669*7c568831SAndroid Build Coastguard Worker     if (quiet)
670*7c568831SAndroid Build Coastguard Worker 	return;
671*7c568831SAndroid Build Coastguard Worker     if (name == NULL)
672*7c568831SAndroid Build Coastguard Worker         name = BAD_CAST "(null)";
673*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.internalSubset(%s,", name);
674*7c568831SAndroid Build Coastguard Worker     if (ExternalID == NULL)
675*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, " ,");
676*7c568831SAndroid Build Coastguard Worker     else
677*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, " %s,", ExternalID);
678*7c568831SAndroid Build Coastguard Worker     if (SystemID == NULL)
679*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, " )\n");
680*7c568831SAndroid Build Coastguard Worker     else
681*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, " %s)\n", SystemID);
682*7c568831SAndroid Build Coastguard Worker }
683*7c568831SAndroid Build Coastguard Worker 
684*7c568831SAndroid Build Coastguard Worker /**
685*7c568831SAndroid Build Coastguard Worker  * externalSubsetDebug:
686*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
687*7c568831SAndroid Build Coastguard Worker  *
688*7c568831SAndroid Build Coastguard Worker  * Does this document has an external subset
689*7c568831SAndroid Build Coastguard Worker  */
690*7c568831SAndroid Build Coastguard Worker static void
externalSubsetDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name,const xmlChar * ExternalID,const xmlChar * SystemID)691*7c568831SAndroid Build Coastguard Worker externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
692*7c568831SAndroid Build Coastguard Worker 	       const xmlChar *ExternalID, const xmlChar *SystemID)
693*7c568831SAndroid Build Coastguard Worker {
694*7c568831SAndroid Build Coastguard Worker     callbacks++;
695*7c568831SAndroid Build Coastguard Worker     if (quiet)
696*7c568831SAndroid Build Coastguard Worker 	return;
697*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.externalSubset(%s,", name);
698*7c568831SAndroid Build Coastguard Worker     if (ExternalID == NULL)
699*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, " ,");
700*7c568831SAndroid Build Coastguard Worker     else
701*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, " %s,", ExternalID);
702*7c568831SAndroid Build Coastguard Worker     if (SystemID == NULL)
703*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, " )\n");
704*7c568831SAndroid Build Coastguard Worker     else
705*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, " %s)\n", SystemID);
706*7c568831SAndroid Build Coastguard Worker }
707*7c568831SAndroid Build Coastguard Worker 
708*7c568831SAndroid Build Coastguard Worker /**
709*7c568831SAndroid Build Coastguard Worker  * resolveEntityDebug:
710*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
711*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
712*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
713*7c568831SAndroid Build Coastguard Worker  *
714*7c568831SAndroid Build Coastguard Worker  * Special entity resolver, better left to the parser, it has
715*7c568831SAndroid Build Coastguard Worker  * more context than the application layer.
716*7c568831SAndroid Build Coastguard Worker  * The default behaviour is to NOT resolve the entities, in that case
717*7c568831SAndroid Build Coastguard Worker  * the ENTITY_REF nodes are built in the structure (and the parameter
718*7c568831SAndroid Build Coastguard Worker  * values).
719*7c568831SAndroid Build Coastguard Worker  *
720*7c568831SAndroid Build Coastguard Worker  * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
721*7c568831SAndroid Build Coastguard Worker  */
722*7c568831SAndroid Build Coastguard Worker static xmlParserInputPtr
resolveEntityDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * publicId,const xmlChar * systemId)723*7c568831SAndroid Build Coastguard Worker resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
724*7c568831SAndroid Build Coastguard Worker {
725*7c568831SAndroid Build Coastguard Worker     callbacks++;
726*7c568831SAndroid Build Coastguard Worker     if (quiet)
727*7c568831SAndroid Build Coastguard Worker 	return(NULL);
728*7c568831SAndroid Build Coastguard Worker     /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
729*7c568831SAndroid Build Coastguard Worker 
730*7c568831SAndroid Build Coastguard Worker 
731*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.resolveEntity(");
732*7c568831SAndroid Build Coastguard Worker     if (publicId != NULL)
733*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, "%s", (char *)publicId);
734*7c568831SAndroid Build Coastguard Worker     else
735*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, " ");
736*7c568831SAndroid Build Coastguard Worker     if (systemId != NULL)
737*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", %s)\n", (char *)systemId);
738*7c568831SAndroid Build Coastguard Worker     else
739*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", )\n");
740*7c568831SAndroid Build Coastguard Worker /*********
741*7c568831SAndroid Build Coastguard Worker     if (systemId != NULL) {
742*7c568831SAndroid Build Coastguard Worker         return(xmlNewInputFromFile(ctxt, (char *) systemId));
743*7c568831SAndroid Build Coastguard Worker     }
744*7c568831SAndroid Build Coastguard Worker  *********/
745*7c568831SAndroid Build Coastguard Worker     return(NULL);
746*7c568831SAndroid Build Coastguard Worker }
747*7c568831SAndroid Build Coastguard Worker 
748*7c568831SAndroid Build Coastguard Worker /**
749*7c568831SAndroid Build Coastguard Worker  * getEntityDebug:
750*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
751*7c568831SAndroid Build Coastguard Worker  * @name: The entity name
752*7c568831SAndroid Build Coastguard Worker  *
753*7c568831SAndroid Build Coastguard Worker  * Get an entity by name
754*7c568831SAndroid Build Coastguard Worker  *
755*7c568831SAndroid Build Coastguard Worker  * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
756*7c568831SAndroid Build Coastguard Worker  */
757*7c568831SAndroid Build Coastguard Worker static xmlEntityPtr
getEntityDebug(void * ctx,const xmlChar * name)758*7c568831SAndroid Build Coastguard Worker getEntityDebug(void *ctx, const xmlChar *name)
759*7c568831SAndroid Build Coastguard Worker {
760*7c568831SAndroid Build Coastguard Worker     debugContext *ctxt = ctx;
761*7c568831SAndroid Build Coastguard Worker 
762*7c568831SAndroid Build Coastguard Worker     callbacks++;
763*7c568831SAndroid Build Coastguard Worker     if (quiet)
764*7c568831SAndroid Build Coastguard Worker 	return(NULL);
765*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.getEntity(%s)\n", name);
766*7c568831SAndroid Build Coastguard Worker 
767*7c568831SAndroid Build Coastguard Worker     return(xmlHashLookup(ctxt->generalEntities, name));
768*7c568831SAndroid Build Coastguard Worker }
769*7c568831SAndroid Build Coastguard Worker 
770*7c568831SAndroid Build Coastguard Worker /**
771*7c568831SAndroid Build Coastguard Worker  * getParameterEntityDebug:
772*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
773*7c568831SAndroid Build Coastguard Worker  * @name: The entity name
774*7c568831SAndroid Build Coastguard Worker  *
775*7c568831SAndroid Build Coastguard Worker  * Get a parameter entity by name
776*7c568831SAndroid Build Coastguard Worker  *
777*7c568831SAndroid Build Coastguard Worker  * Returns the xmlParserInputPtr
778*7c568831SAndroid Build Coastguard Worker  */
779*7c568831SAndroid Build Coastguard Worker static xmlEntityPtr
getParameterEntityDebug(void * ctx,const xmlChar * name)780*7c568831SAndroid Build Coastguard Worker getParameterEntityDebug(void *ctx, const xmlChar *name)
781*7c568831SAndroid Build Coastguard Worker {
782*7c568831SAndroid Build Coastguard Worker     debugContext *ctxt = ctx;
783*7c568831SAndroid Build Coastguard Worker 
784*7c568831SAndroid Build Coastguard Worker     callbacks++;
785*7c568831SAndroid Build Coastguard Worker     if (quiet)
786*7c568831SAndroid Build Coastguard Worker 	return(NULL);
787*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.getParameterEntity(%s)\n", name);
788*7c568831SAndroid Build Coastguard Worker 
789*7c568831SAndroid Build Coastguard Worker     return(xmlHashLookup(ctxt->parameterEntities, name));
790*7c568831SAndroid Build Coastguard Worker }
791*7c568831SAndroid Build Coastguard Worker 
792*7c568831SAndroid Build Coastguard Worker 
793*7c568831SAndroid Build Coastguard Worker /**
794*7c568831SAndroid Build Coastguard Worker  * entityDeclDebug:
795*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
796*7c568831SAndroid Build Coastguard Worker  * @name:  the entity name
797*7c568831SAndroid Build Coastguard Worker  * @type:  the entity type
798*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
799*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
800*7c568831SAndroid Build Coastguard Worker  * @content: the entity value (without processing).
801*7c568831SAndroid Build Coastguard Worker  *
802*7c568831SAndroid Build Coastguard Worker  * An entity definition has been parsed
803*7c568831SAndroid Build Coastguard Worker  */
804*7c568831SAndroid Build Coastguard Worker static void
entityDeclDebug(void * ctx,const xmlChar * name,int type,const xmlChar * publicId,const xmlChar * systemId,xmlChar * content)805*7c568831SAndroid Build Coastguard Worker entityDeclDebug(void *ctx, const xmlChar *name, int type,
806*7c568831SAndroid Build Coastguard Worker           const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
807*7c568831SAndroid Build Coastguard Worker {
808*7c568831SAndroid Build Coastguard Worker     debugContext *ctxt = ctx;
809*7c568831SAndroid Build Coastguard Worker     xmlEntityPtr ent;
810*7c568831SAndroid Build Coastguard Worker     const xmlChar *nullstr = BAD_CAST "(null)";
811*7c568831SAndroid Build Coastguard Worker 
812*7c568831SAndroid Build Coastguard Worker     ent = xmlNewEntity(NULL, name, type, publicId, systemId, content);
813*7c568831SAndroid Build Coastguard Worker     if (systemId != NULL)
814*7c568831SAndroid Build Coastguard Worker         ent->URI = xmlBuildURI(systemId, (const xmlChar *) ctxt->filename);
815*7c568831SAndroid Build Coastguard Worker 
816*7c568831SAndroid Build Coastguard Worker     if ((type == XML_INTERNAL_PARAMETER_ENTITY) ||
817*7c568831SAndroid Build Coastguard Worker         (type == XML_EXTERNAL_PARAMETER_ENTITY))
818*7c568831SAndroid Build Coastguard Worker         xmlHashAddEntry(ctxt->parameterEntities, name, ent);
819*7c568831SAndroid Build Coastguard Worker     else
820*7c568831SAndroid Build Coastguard Worker         xmlHashAddEntry(ctxt->generalEntities, name, ent);
821*7c568831SAndroid Build Coastguard Worker 
822*7c568831SAndroid Build Coastguard Worker     /* not all libraries handle printing null pointers nicely */
823*7c568831SAndroid Build Coastguard Worker     if (publicId == NULL)
824*7c568831SAndroid Build Coastguard Worker         publicId = nullstr;
825*7c568831SAndroid Build Coastguard Worker     if (systemId == NULL)
826*7c568831SAndroid Build Coastguard Worker         systemId = nullstr;
827*7c568831SAndroid Build Coastguard Worker     if (content == NULL)
828*7c568831SAndroid Build Coastguard Worker         content = (xmlChar *)nullstr;
829*7c568831SAndroid Build Coastguard Worker     callbacks++;
830*7c568831SAndroid Build Coastguard Worker     if (quiet)
831*7c568831SAndroid Build Coastguard Worker 	return;
832*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
833*7c568831SAndroid Build Coastguard Worker             name, type, publicId, systemId, content);
834*7c568831SAndroid Build Coastguard Worker }
835*7c568831SAndroid Build Coastguard Worker 
836*7c568831SAndroid Build Coastguard Worker /**
837*7c568831SAndroid Build Coastguard Worker  * attributeDeclDebug:
838*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
839*7c568831SAndroid Build Coastguard Worker  * @name:  the attribute name
840*7c568831SAndroid Build Coastguard Worker  * @type:  the attribute type
841*7c568831SAndroid Build Coastguard Worker  *
842*7c568831SAndroid Build Coastguard Worker  * An attribute definition has been parsed
843*7c568831SAndroid Build Coastguard Worker  */
844*7c568831SAndroid Build Coastguard Worker static void
attributeDeclDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * elem,const xmlChar * name,int type,int def,const xmlChar * defaultValue,xmlEnumerationPtr tree)845*7c568831SAndroid Build Coastguard Worker attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
846*7c568831SAndroid Build Coastguard Worker                    const xmlChar * name, int type, int def,
847*7c568831SAndroid Build Coastguard Worker                    const xmlChar * defaultValue, xmlEnumerationPtr tree)
848*7c568831SAndroid Build Coastguard Worker {
849*7c568831SAndroid Build Coastguard Worker     callbacks++;
850*7c568831SAndroid Build Coastguard Worker     if (quiet)
851*7c568831SAndroid Build Coastguard Worker         return;
852*7c568831SAndroid Build Coastguard Worker     if (defaultValue == NULL)
853*7c568831SAndroid Build Coastguard Worker         fprintf(SAXdebug, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
854*7c568831SAndroid Build Coastguard Worker                 elem, name, type, def);
855*7c568831SAndroid Build Coastguard Worker     else
856*7c568831SAndroid Build Coastguard Worker         fprintf(SAXdebug, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
857*7c568831SAndroid Build Coastguard Worker                 elem, name, type, def, defaultValue);
858*7c568831SAndroid Build Coastguard Worker     xmlFreeEnumeration(tree);
859*7c568831SAndroid Build Coastguard Worker }
860*7c568831SAndroid Build Coastguard Worker 
861*7c568831SAndroid Build Coastguard Worker /**
862*7c568831SAndroid Build Coastguard Worker  * elementDeclDebug:
863*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
864*7c568831SAndroid Build Coastguard Worker  * @name:  the element name
865*7c568831SAndroid Build Coastguard Worker  * @type:  the element type
866*7c568831SAndroid Build Coastguard Worker  * @content: the element value (without processing).
867*7c568831SAndroid Build Coastguard Worker  *
868*7c568831SAndroid Build Coastguard Worker  * An element definition has been parsed
869*7c568831SAndroid Build Coastguard Worker  */
870*7c568831SAndroid Build Coastguard Worker static void
elementDeclDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name,int type,xmlElementContentPtr content ATTRIBUTE_UNUSED)871*7c568831SAndroid Build Coastguard Worker elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
872*7c568831SAndroid Build Coastguard Worker 	    xmlElementContentPtr content ATTRIBUTE_UNUSED)
873*7c568831SAndroid Build Coastguard Worker {
874*7c568831SAndroid Build Coastguard Worker     callbacks++;
875*7c568831SAndroid Build Coastguard Worker     if (quiet)
876*7c568831SAndroid Build Coastguard Worker 	return;
877*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.elementDecl(%s, %d, ...)\n",
878*7c568831SAndroid Build Coastguard Worker             name, type);
879*7c568831SAndroid Build Coastguard Worker }
880*7c568831SAndroid Build Coastguard Worker 
881*7c568831SAndroid Build Coastguard Worker /**
882*7c568831SAndroid Build Coastguard Worker  * notationDeclDebug:
883*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
884*7c568831SAndroid Build Coastguard Worker  * @name: The name of the notation
885*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
886*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
887*7c568831SAndroid Build Coastguard Worker  *
888*7c568831SAndroid Build Coastguard Worker  * What to do when a notation declaration has been parsed.
889*7c568831SAndroid Build Coastguard Worker  */
890*7c568831SAndroid Build Coastguard Worker static void
notationDeclDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name,const xmlChar * publicId,const xmlChar * systemId)891*7c568831SAndroid Build Coastguard Worker notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
892*7c568831SAndroid Build Coastguard Worker 	     const xmlChar *publicId, const xmlChar *systemId)
893*7c568831SAndroid Build Coastguard Worker {
894*7c568831SAndroid Build Coastguard Worker     callbacks++;
895*7c568831SAndroid Build Coastguard Worker     if (quiet)
896*7c568831SAndroid Build Coastguard Worker 	return;
897*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.notationDecl(%s, %s, %s)\n",
898*7c568831SAndroid Build Coastguard Worker             (char *) name, (char *) publicId, (char *) systemId);
899*7c568831SAndroid Build Coastguard Worker }
900*7c568831SAndroid Build Coastguard Worker 
901*7c568831SAndroid Build Coastguard Worker /**
902*7c568831SAndroid Build Coastguard Worker  * unparsedEntityDeclDebug:
903*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
904*7c568831SAndroid Build Coastguard Worker  * @name: The name of the entity
905*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
906*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
907*7c568831SAndroid Build Coastguard Worker  * @notationName: the name of the notation
908*7c568831SAndroid Build Coastguard Worker  *
909*7c568831SAndroid Build Coastguard Worker  * What to do when an unparsed entity declaration is parsed
910*7c568831SAndroid Build Coastguard Worker  */
911*7c568831SAndroid Build Coastguard Worker static void
unparsedEntityDeclDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name,const xmlChar * publicId,const xmlChar * systemId,const xmlChar * notationName)912*7c568831SAndroid Build Coastguard Worker unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
913*7c568831SAndroid Build Coastguard Worker 		   const xmlChar *publicId, const xmlChar *systemId,
914*7c568831SAndroid Build Coastguard Worker 		   const xmlChar *notationName)
915*7c568831SAndroid Build Coastguard Worker {
916*7c568831SAndroid Build Coastguard Worker const xmlChar *nullstr = BAD_CAST "(null)";
917*7c568831SAndroid Build Coastguard Worker 
918*7c568831SAndroid Build Coastguard Worker     if (publicId == NULL)
919*7c568831SAndroid Build Coastguard Worker         publicId = nullstr;
920*7c568831SAndroid Build Coastguard Worker     if (systemId == NULL)
921*7c568831SAndroid Build Coastguard Worker         systemId = nullstr;
922*7c568831SAndroid Build Coastguard Worker     if (notationName == NULL)
923*7c568831SAndroid Build Coastguard Worker         notationName = nullstr;
924*7c568831SAndroid Build Coastguard Worker     callbacks++;
925*7c568831SAndroid Build Coastguard Worker     if (quiet)
926*7c568831SAndroid Build Coastguard Worker 	return;
927*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
928*7c568831SAndroid Build Coastguard Worker             (char *) name, (char *) publicId, (char *) systemId,
929*7c568831SAndroid Build Coastguard Worker 	    (char *) notationName);
930*7c568831SAndroid Build Coastguard Worker }
931*7c568831SAndroid Build Coastguard Worker 
932*7c568831SAndroid Build Coastguard Worker /**
933*7c568831SAndroid Build Coastguard Worker  * setDocumentLocatorDebug:
934*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
935*7c568831SAndroid Build Coastguard Worker  * @loc: A SAX Locator
936*7c568831SAndroid Build Coastguard Worker  *
937*7c568831SAndroid Build Coastguard Worker  * Receive the document locator at startup, actually xmlDefaultSAXLocator
938*7c568831SAndroid Build Coastguard Worker  * Everything is available on the context, so this is useless in our case.
939*7c568831SAndroid Build Coastguard Worker  */
940*7c568831SAndroid Build Coastguard Worker static void
setDocumentLocatorDebug(void * ctx ATTRIBUTE_UNUSED,xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)941*7c568831SAndroid Build Coastguard Worker setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
942*7c568831SAndroid Build Coastguard Worker {
943*7c568831SAndroid Build Coastguard Worker     callbacks++;
944*7c568831SAndroid Build Coastguard Worker     if (quiet)
945*7c568831SAndroid Build Coastguard Worker 	return;
946*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.setDocumentLocator()\n");
947*7c568831SAndroid Build Coastguard Worker }
948*7c568831SAndroid Build Coastguard Worker 
949*7c568831SAndroid Build Coastguard Worker /**
950*7c568831SAndroid Build Coastguard Worker  * startDocumentDebug:
951*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
952*7c568831SAndroid Build Coastguard Worker  *
953*7c568831SAndroid Build Coastguard Worker  * called when the document start being processed.
954*7c568831SAndroid Build Coastguard Worker  */
955*7c568831SAndroid Build Coastguard Worker static void
startDocumentDebug(void * ctx ATTRIBUTE_UNUSED)956*7c568831SAndroid Build Coastguard Worker startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
957*7c568831SAndroid Build Coastguard Worker {
958*7c568831SAndroid Build Coastguard Worker     callbacks++;
959*7c568831SAndroid Build Coastguard Worker     if (quiet)
960*7c568831SAndroid Build Coastguard Worker 	return;
961*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.startDocument()\n");
962*7c568831SAndroid Build Coastguard Worker }
963*7c568831SAndroid Build Coastguard Worker 
964*7c568831SAndroid Build Coastguard Worker /**
965*7c568831SAndroid Build Coastguard Worker  * endDocumentDebug:
966*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
967*7c568831SAndroid Build Coastguard Worker  *
968*7c568831SAndroid Build Coastguard Worker  * called when the document end has been detected.
969*7c568831SAndroid Build Coastguard Worker  */
970*7c568831SAndroid Build Coastguard Worker static void
endDocumentDebug(void * ctx ATTRIBUTE_UNUSED)971*7c568831SAndroid Build Coastguard Worker endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
972*7c568831SAndroid Build Coastguard Worker {
973*7c568831SAndroid Build Coastguard Worker     callbacks++;
974*7c568831SAndroid Build Coastguard Worker     if (quiet)
975*7c568831SAndroid Build Coastguard Worker 	return;
976*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.endDocument()\n");
977*7c568831SAndroid Build Coastguard Worker }
978*7c568831SAndroid Build Coastguard Worker 
979*7c568831SAndroid Build Coastguard Worker /**
980*7c568831SAndroid Build Coastguard Worker  * startElementDebug:
981*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
982*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
983*7c568831SAndroid Build Coastguard Worker  *
984*7c568831SAndroid Build Coastguard Worker  * called when an opening tag has been processed.
985*7c568831SAndroid Build Coastguard Worker  */
986*7c568831SAndroid Build Coastguard Worker static void
startElementDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name,const xmlChar ** atts)987*7c568831SAndroid Build Coastguard Worker startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
988*7c568831SAndroid Build Coastguard Worker {
989*7c568831SAndroid Build Coastguard Worker     int i;
990*7c568831SAndroid Build Coastguard Worker 
991*7c568831SAndroid Build Coastguard Worker     callbacks++;
992*7c568831SAndroid Build Coastguard Worker     if (quiet)
993*7c568831SAndroid Build Coastguard Worker 	return;
994*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.startElement(%s", (char *) name);
995*7c568831SAndroid Build Coastguard Worker     if (atts != NULL) {
996*7c568831SAndroid Build Coastguard Worker         for (i = 0;(atts[i] != NULL);i++) {
997*7c568831SAndroid Build Coastguard Worker 	    fprintf(SAXdebug, ", %s='", atts[i++]);
998*7c568831SAndroid Build Coastguard Worker 	    if (atts[i] != NULL)
999*7c568831SAndroid Build Coastguard Worker 	        fprintf(SAXdebug, "%s'", atts[i]);
1000*7c568831SAndroid Build Coastguard Worker 	}
1001*7c568831SAndroid Build Coastguard Worker     }
1002*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, ")\n");
1003*7c568831SAndroid Build Coastguard Worker }
1004*7c568831SAndroid Build Coastguard Worker 
1005*7c568831SAndroid Build Coastguard Worker /**
1006*7c568831SAndroid Build Coastguard Worker  * endElementDebug:
1007*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1008*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
1009*7c568831SAndroid Build Coastguard Worker  *
1010*7c568831SAndroid Build Coastguard Worker  * called when the end of an element has been detected.
1011*7c568831SAndroid Build Coastguard Worker  */
1012*7c568831SAndroid Build Coastguard Worker static void
endElementDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name)1013*7c568831SAndroid Build Coastguard Worker endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
1014*7c568831SAndroid Build Coastguard Worker {
1015*7c568831SAndroid Build Coastguard Worker     callbacks++;
1016*7c568831SAndroid Build Coastguard Worker     if (quiet)
1017*7c568831SAndroid Build Coastguard Worker 	return;
1018*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.endElement(%s)\n", (char *) name);
1019*7c568831SAndroid Build Coastguard Worker }
1020*7c568831SAndroid Build Coastguard Worker 
1021*7c568831SAndroid Build Coastguard Worker /**
1022*7c568831SAndroid Build Coastguard Worker  * charactersDebug:
1023*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1024*7c568831SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
1025*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
1026*7c568831SAndroid Build Coastguard Worker  *
1027*7c568831SAndroid Build Coastguard Worker  * receiving some chars from the parser.
1028*7c568831SAndroid Build Coastguard Worker  * Question: how much at a time ???
1029*7c568831SAndroid Build Coastguard Worker  */
1030*7c568831SAndroid Build Coastguard Worker static void
charactersDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * ch,int len)1031*7c568831SAndroid Build Coastguard Worker charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
1032*7c568831SAndroid Build Coastguard Worker {
1033*7c568831SAndroid Build Coastguard Worker     char output[40];
1034*7c568831SAndroid Build Coastguard Worker     int i;
1035*7c568831SAndroid Build Coastguard Worker 
1036*7c568831SAndroid Build Coastguard Worker     callbacks++;
1037*7c568831SAndroid Build Coastguard Worker     if (quiet)
1038*7c568831SAndroid Build Coastguard Worker 	return;
1039*7c568831SAndroid Build Coastguard Worker     for (i = 0;(i<len) && (i < 30);i++)
1040*7c568831SAndroid Build Coastguard Worker 	output[i] = (char) ch[i];
1041*7c568831SAndroid Build Coastguard Worker     output[i] = 0;
1042*7c568831SAndroid Build Coastguard Worker 
1043*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.characters(%s, %d)\n", output, len);
1044*7c568831SAndroid Build Coastguard Worker }
1045*7c568831SAndroid Build Coastguard Worker 
1046*7c568831SAndroid Build Coastguard Worker /**
1047*7c568831SAndroid Build Coastguard Worker  * referenceDebug:
1048*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1049*7c568831SAndroid Build Coastguard Worker  * @name:  The entity name
1050*7c568831SAndroid Build Coastguard Worker  *
1051*7c568831SAndroid Build Coastguard Worker  * called when an entity reference is detected.
1052*7c568831SAndroid Build Coastguard Worker  */
1053*7c568831SAndroid Build Coastguard Worker static void
referenceDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name)1054*7c568831SAndroid Build Coastguard Worker referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
1055*7c568831SAndroid Build Coastguard Worker {
1056*7c568831SAndroid Build Coastguard Worker     callbacks++;
1057*7c568831SAndroid Build Coastguard Worker     if (quiet)
1058*7c568831SAndroid Build Coastguard Worker 	return;
1059*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.reference(%s)\n", name);
1060*7c568831SAndroid Build Coastguard Worker }
1061*7c568831SAndroid Build Coastguard Worker 
1062*7c568831SAndroid Build Coastguard Worker /**
1063*7c568831SAndroid Build Coastguard Worker  * ignorableWhitespaceDebug:
1064*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1065*7c568831SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
1066*7c568831SAndroid Build Coastguard Worker  * @start: the first char in the string
1067*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
1068*7c568831SAndroid Build Coastguard Worker  *
1069*7c568831SAndroid Build Coastguard Worker  * receiving some ignorable whitespaces from the parser.
1070*7c568831SAndroid Build Coastguard Worker  * Question: how much at a time ???
1071*7c568831SAndroid Build Coastguard Worker  */
1072*7c568831SAndroid Build Coastguard Worker static void
ignorableWhitespaceDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * ch,int len)1073*7c568831SAndroid Build Coastguard Worker ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
1074*7c568831SAndroid Build Coastguard Worker {
1075*7c568831SAndroid Build Coastguard Worker     char output[40];
1076*7c568831SAndroid Build Coastguard Worker     int i;
1077*7c568831SAndroid Build Coastguard Worker 
1078*7c568831SAndroid Build Coastguard Worker     callbacks++;
1079*7c568831SAndroid Build Coastguard Worker     if (quiet)
1080*7c568831SAndroid Build Coastguard Worker 	return;
1081*7c568831SAndroid Build Coastguard Worker     for (i = 0;(i<len) && (i < 30);i++)
1082*7c568831SAndroid Build Coastguard Worker 	output[i] = (char) ch[i];
1083*7c568831SAndroid Build Coastguard Worker     output[i] = 0;
1084*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.ignorableWhitespace(%s, %d)\n", output, len);
1085*7c568831SAndroid Build Coastguard Worker }
1086*7c568831SAndroid Build Coastguard Worker 
1087*7c568831SAndroid Build Coastguard Worker /**
1088*7c568831SAndroid Build Coastguard Worker  * processingInstructionDebug:
1089*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1090*7c568831SAndroid Build Coastguard Worker  * @target:  the target name
1091*7c568831SAndroid Build Coastguard Worker  * @data: the PI data's
1092*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
1093*7c568831SAndroid Build Coastguard Worker  *
1094*7c568831SAndroid Build Coastguard Worker  * A processing instruction has been parsed.
1095*7c568831SAndroid Build Coastguard Worker  */
1096*7c568831SAndroid Build Coastguard Worker static void
processingInstructionDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * target,const xmlChar * data)1097*7c568831SAndroid Build Coastguard Worker processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
1098*7c568831SAndroid Build Coastguard Worker                       const xmlChar *data)
1099*7c568831SAndroid Build Coastguard Worker {
1100*7c568831SAndroid Build Coastguard Worker     callbacks++;
1101*7c568831SAndroid Build Coastguard Worker     if (quiet)
1102*7c568831SAndroid Build Coastguard Worker 	return;
1103*7c568831SAndroid Build Coastguard Worker     if (data != NULL)
1104*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, "SAX.processingInstruction(%s, %s)\n",
1105*7c568831SAndroid Build Coastguard Worker 		(char *) target, (char *) data);
1106*7c568831SAndroid Build Coastguard Worker     else
1107*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, "SAX.processingInstruction(%s, NULL)\n",
1108*7c568831SAndroid Build Coastguard Worker 		(char *) target);
1109*7c568831SAndroid Build Coastguard Worker }
1110*7c568831SAndroid Build Coastguard Worker 
1111*7c568831SAndroid Build Coastguard Worker /**
1112*7c568831SAndroid Build Coastguard Worker  * cdataBlockDebug:
1113*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
1114*7c568831SAndroid Build Coastguard Worker  * @value:  The pcdata content
1115*7c568831SAndroid Build Coastguard Worker  * @len:  the block length
1116*7c568831SAndroid Build Coastguard Worker  *
1117*7c568831SAndroid Build Coastguard Worker  * called when a pcdata block has been parsed
1118*7c568831SAndroid Build Coastguard Worker  */
1119*7c568831SAndroid Build Coastguard Worker static void
cdataBlockDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * value,int len)1120*7c568831SAndroid Build Coastguard Worker cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len)
1121*7c568831SAndroid Build Coastguard Worker {
1122*7c568831SAndroid Build Coastguard Worker     callbacks++;
1123*7c568831SAndroid Build Coastguard Worker     if (quiet)
1124*7c568831SAndroid Build Coastguard Worker 	return;
1125*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.pcdata(%.20s, %d)\n",
1126*7c568831SAndroid Build Coastguard Worker 	    (char *) value, len);
1127*7c568831SAndroid Build Coastguard Worker }
1128*7c568831SAndroid Build Coastguard Worker 
1129*7c568831SAndroid Build Coastguard Worker /**
1130*7c568831SAndroid Build Coastguard Worker  * commentDebug:
1131*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1132*7c568831SAndroid Build Coastguard Worker  * @value:  the comment content
1133*7c568831SAndroid Build Coastguard Worker  *
1134*7c568831SAndroid Build Coastguard Worker  * A comment has been parsed.
1135*7c568831SAndroid Build Coastguard Worker  */
1136*7c568831SAndroid Build Coastguard Worker static void
commentDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * value)1137*7c568831SAndroid Build Coastguard Worker commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
1138*7c568831SAndroid Build Coastguard Worker {
1139*7c568831SAndroid Build Coastguard Worker     callbacks++;
1140*7c568831SAndroid Build Coastguard Worker     if (quiet)
1141*7c568831SAndroid Build Coastguard Worker 	return;
1142*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.comment(%s)\n", value);
1143*7c568831SAndroid Build Coastguard Worker }
1144*7c568831SAndroid Build Coastguard Worker 
1145*7c568831SAndroid Build Coastguard Worker /**
1146*7c568831SAndroid Build Coastguard Worker  * warningDebug:
1147*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1148*7c568831SAndroid Build Coastguard Worker  * @msg:  the message to display/transmit
1149*7c568831SAndroid Build Coastguard Worker  * @...:  extra parameters for the message display
1150*7c568831SAndroid Build Coastguard Worker  *
1151*7c568831SAndroid Build Coastguard Worker  * Display and format a warning messages, gives file, line, position and
1152*7c568831SAndroid Build Coastguard Worker  * extra parameters.
1153*7c568831SAndroid Build Coastguard Worker  */
1154*7c568831SAndroid Build Coastguard Worker static void
warningDebug(void * ctx ATTRIBUTE_UNUSED,const char * msg,...)1155*7c568831SAndroid Build Coastguard Worker warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
1156*7c568831SAndroid Build Coastguard Worker {
1157*7c568831SAndroid Build Coastguard Worker     va_list args;
1158*7c568831SAndroid Build Coastguard Worker 
1159*7c568831SAndroid Build Coastguard Worker     callbacks++;
1160*7c568831SAndroid Build Coastguard Worker     if (quiet)
1161*7c568831SAndroid Build Coastguard Worker 	return;
1162*7c568831SAndroid Build Coastguard Worker     va_start(args, msg);
1163*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.warning: ");
1164*7c568831SAndroid Build Coastguard Worker     vfprintf(SAXdebug, msg, args);
1165*7c568831SAndroid Build Coastguard Worker     va_end(args);
1166*7c568831SAndroid Build Coastguard Worker }
1167*7c568831SAndroid Build Coastguard Worker 
1168*7c568831SAndroid Build Coastguard Worker /**
1169*7c568831SAndroid Build Coastguard Worker  * errorDebug:
1170*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1171*7c568831SAndroid Build Coastguard Worker  * @msg:  the message to display/transmit
1172*7c568831SAndroid Build Coastguard Worker  * @...:  extra parameters for the message display
1173*7c568831SAndroid Build Coastguard Worker  *
1174*7c568831SAndroid Build Coastguard Worker  * Display and format a error messages, gives file, line, position and
1175*7c568831SAndroid Build Coastguard Worker  * extra parameters.
1176*7c568831SAndroid Build Coastguard Worker  */
1177*7c568831SAndroid Build Coastguard Worker static void
errorDebug(void * ctx ATTRIBUTE_UNUSED,const char * msg,...)1178*7c568831SAndroid Build Coastguard Worker errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
1179*7c568831SAndroid Build Coastguard Worker {
1180*7c568831SAndroid Build Coastguard Worker     va_list args;
1181*7c568831SAndroid Build Coastguard Worker 
1182*7c568831SAndroid Build Coastguard Worker     callbacks++;
1183*7c568831SAndroid Build Coastguard Worker     if (quiet)
1184*7c568831SAndroid Build Coastguard Worker 	return;
1185*7c568831SAndroid Build Coastguard Worker     va_start(args, msg);
1186*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.error: ");
1187*7c568831SAndroid Build Coastguard Worker     vfprintf(SAXdebug, msg, args);
1188*7c568831SAndroid Build Coastguard Worker     va_end(args);
1189*7c568831SAndroid Build Coastguard Worker }
1190*7c568831SAndroid Build Coastguard Worker 
1191*7c568831SAndroid Build Coastguard Worker /**
1192*7c568831SAndroid Build Coastguard Worker  * fatalErrorDebug:
1193*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1194*7c568831SAndroid Build Coastguard Worker  * @msg:  the message to display/transmit
1195*7c568831SAndroid Build Coastguard Worker  * @...:  extra parameters for the message display
1196*7c568831SAndroid Build Coastguard Worker  *
1197*7c568831SAndroid Build Coastguard Worker  * Display and format a fatalError messages, gives file, line, position and
1198*7c568831SAndroid Build Coastguard Worker  * extra parameters.
1199*7c568831SAndroid Build Coastguard Worker  */
1200*7c568831SAndroid Build Coastguard Worker static void
fatalErrorDebug(void * ctx ATTRIBUTE_UNUSED,const char * msg,...)1201*7c568831SAndroid Build Coastguard Worker fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
1202*7c568831SAndroid Build Coastguard Worker {
1203*7c568831SAndroid Build Coastguard Worker     va_list args;
1204*7c568831SAndroid Build Coastguard Worker 
1205*7c568831SAndroid Build Coastguard Worker     callbacks++;
1206*7c568831SAndroid Build Coastguard Worker     if (quiet)
1207*7c568831SAndroid Build Coastguard Worker 	return;
1208*7c568831SAndroid Build Coastguard Worker     va_start(args, msg);
1209*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.fatalError: ");
1210*7c568831SAndroid Build Coastguard Worker     vfprintf(SAXdebug, msg, args);
1211*7c568831SAndroid Build Coastguard Worker     va_end(args);
1212*7c568831SAndroid Build Coastguard Worker }
1213*7c568831SAndroid Build Coastguard Worker 
1214*7c568831SAndroid Build Coastguard Worker static xmlSAXHandler debugSAXHandlerStruct = {
1215*7c568831SAndroid Build Coastguard Worker     internalSubsetDebug,
1216*7c568831SAndroid Build Coastguard Worker     isStandaloneDebug,
1217*7c568831SAndroid Build Coastguard Worker     hasInternalSubsetDebug,
1218*7c568831SAndroid Build Coastguard Worker     hasExternalSubsetDebug,
1219*7c568831SAndroid Build Coastguard Worker     resolveEntityDebug,
1220*7c568831SAndroid Build Coastguard Worker     getEntityDebug,
1221*7c568831SAndroid Build Coastguard Worker     entityDeclDebug,
1222*7c568831SAndroid Build Coastguard Worker     notationDeclDebug,
1223*7c568831SAndroid Build Coastguard Worker     attributeDeclDebug,
1224*7c568831SAndroid Build Coastguard Worker     elementDeclDebug,
1225*7c568831SAndroid Build Coastguard Worker     unparsedEntityDeclDebug,
1226*7c568831SAndroid Build Coastguard Worker     setDocumentLocatorDebug,
1227*7c568831SAndroid Build Coastguard Worker     startDocumentDebug,
1228*7c568831SAndroid Build Coastguard Worker     endDocumentDebug,
1229*7c568831SAndroid Build Coastguard Worker     startElementDebug,
1230*7c568831SAndroid Build Coastguard Worker     endElementDebug,
1231*7c568831SAndroid Build Coastguard Worker     referenceDebug,
1232*7c568831SAndroid Build Coastguard Worker     charactersDebug,
1233*7c568831SAndroid Build Coastguard Worker     ignorableWhitespaceDebug,
1234*7c568831SAndroid Build Coastguard Worker     processingInstructionDebug,
1235*7c568831SAndroid Build Coastguard Worker     commentDebug,
1236*7c568831SAndroid Build Coastguard Worker     warningDebug,
1237*7c568831SAndroid Build Coastguard Worker     errorDebug,
1238*7c568831SAndroid Build Coastguard Worker     fatalErrorDebug,
1239*7c568831SAndroid Build Coastguard Worker     getParameterEntityDebug,
1240*7c568831SAndroid Build Coastguard Worker     cdataBlockDebug,
1241*7c568831SAndroid Build Coastguard Worker     externalSubsetDebug,
1242*7c568831SAndroid Build Coastguard Worker     1,
1243*7c568831SAndroid Build Coastguard Worker     NULL,
1244*7c568831SAndroid Build Coastguard Worker     NULL,
1245*7c568831SAndroid Build Coastguard Worker     NULL,
1246*7c568831SAndroid Build Coastguard Worker     NULL
1247*7c568831SAndroid Build Coastguard Worker };
1248*7c568831SAndroid Build Coastguard Worker 
1249*7c568831SAndroid Build Coastguard Worker static xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
1250*7c568831SAndroid Build Coastguard Worker 
1251*7c568831SAndroid Build Coastguard Worker /*
1252*7c568831SAndroid Build Coastguard Worker  * SAX2 specific callbacks
1253*7c568831SAndroid Build Coastguard Worker  */
1254*7c568831SAndroid Build Coastguard Worker /**
1255*7c568831SAndroid Build Coastguard Worker  * startElementNsDebug:
1256*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1257*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
1258*7c568831SAndroid Build Coastguard Worker  *
1259*7c568831SAndroid Build Coastguard Worker  * called when an opening tag has been processed.
1260*7c568831SAndroid Build Coastguard Worker  */
1261*7c568831SAndroid Build Coastguard Worker static void
startElementNsDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * localname,const xmlChar * prefix,const xmlChar * URI,int nb_namespaces,const xmlChar ** namespaces,int nb_attributes,int nb_defaulted,const xmlChar ** attributes)1262*7c568831SAndroid Build Coastguard Worker startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
1263*7c568831SAndroid Build Coastguard Worker                     const xmlChar *localname,
1264*7c568831SAndroid Build Coastguard Worker                     const xmlChar *prefix,
1265*7c568831SAndroid Build Coastguard Worker                     const xmlChar *URI,
1266*7c568831SAndroid Build Coastguard Worker 		    int nb_namespaces,
1267*7c568831SAndroid Build Coastguard Worker 		    const xmlChar **namespaces,
1268*7c568831SAndroid Build Coastguard Worker 		    int nb_attributes,
1269*7c568831SAndroid Build Coastguard Worker 		    int nb_defaulted,
1270*7c568831SAndroid Build Coastguard Worker 		    const xmlChar **attributes)
1271*7c568831SAndroid Build Coastguard Worker {
1272*7c568831SAndroid Build Coastguard Worker     int i;
1273*7c568831SAndroid Build Coastguard Worker 
1274*7c568831SAndroid Build Coastguard Worker     callbacks++;
1275*7c568831SAndroid Build Coastguard Worker     if (quiet)
1276*7c568831SAndroid Build Coastguard Worker 	return;
1277*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.startElementNs(%s", (char *) localname);
1278*7c568831SAndroid Build Coastguard Worker     if (prefix == NULL)
1279*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", NULL");
1280*7c568831SAndroid Build Coastguard Worker     else
1281*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", %s", (char *) prefix);
1282*7c568831SAndroid Build Coastguard Worker     if (URI == NULL)
1283*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", NULL");
1284*7c568831SAndroid Build Coastguard Worker     else
1285*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", '%s'", (char *) URI);
1286*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, ", %d", nb_namespaces);
1287*7c568831SAndroid Build Coastguard Worker 
1288*7c568831SAndroid Build Coastguard Worker     if (namespaces != NULL) {
1289*7c568831SAndroid Build Coastguard Worker         for (i = 0;i < nb_namespaces * 2;i++) {
1290*7c568831SAndroid Build Coastguard Worker 	    fprintf(SAXdebug, ", xmlns");
1291*7c568831SAndroid Build Coastguard Worker 	    if (namespaces[i] != NULL)
1292*7c568831SAndroid Build Coastguard Worker 	        fprintf(SAXdebug, ":%s", namespaces[i]);
1293*7c568831SAndroid Build Coastguard Worker 	    i++;
1294*7c568831SAndroid Build Coastguard Worker 	    fprintf(SAXdebug, "='%s'", namespaces[i]);
1295*7c568831SAndroid Build Coastguard Worker 	}
1296*7c568831SAndroid Build Coastguard Worker     }
1297*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, ", %d, %d", nb_attributes, nb_defaulted);
1298*7c568831SAndroid Build Coastguard Worker     if (attributes != NULL) {
1299*7c568831SAndroid Build Coastguard Worker         for (i = 0;i < nb_attributes * 5;i += 5) {
1300*7c568831SAndroid Build Coastguard Worker 	    if (attributes[i + 1] != NULL)
1301*7c568831SAndroid Build Coastguard Worker 		fprintf(SAXdebug, ", %s:%s='", attributes[i + 1], attributes[i]);
1302*7c568831SAndroid Build Coastguard Worker 	    else
1303*7c568831SAndroid Build Coastguard Worker 		fprintf(SAXdebug, ", %s='", attributes[i]);
1304*7c568831SAndroid Build Coastguard Worker 	    fprintf(SAXdebug, "%.4s...', %d", attributes[i + 3],
1305*7c568831SAndroid Build Coastguard Worker 		    (int)(attributes[i + 4] - attributes[i + 3]));
1306*7c568831SAndroid Build Coastguard Worker 	}
1307*7c568831SAndroid Build Coastguard Worker     }
1308*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, ")\n");
1309*7c568831SAndroid Build Coastguard Worker }
1310*7c568831SAndroid Build Coastguard Worker 
1311*7c568831SAndroid Build Coastguard Worker /**
1312*7c568831SAndroid Build Coastguard Worker  * endElementDebug:
1313*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1314*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
1315*7c568831SAndroid Build Coastguard Worker  *
1316*7c568831SAndroid Build Coastguard Worker  * called when the end of an element has been detected.
1317*7c568831SAndroid Build Coastguard Worker  */
1318*7c568831SAndroid Build Coastguard Worker static void
endElementNsDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * localname,const xmlChar * prefix,const xmlChar * URI)1319*7c568831SAndroid Build Coastguard Worker endElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
1320*7c568831SAndroid Build Coastguard Worker                   const xmlChar *localname,
1321*7c568831SAndroid Build Coastguard Worker                   const xmlChar *prefix,
1322*7c568831SAndroid Build Coastguard Worker                   const xmlChar *URI)
1323*7c568831SAndroid Build Coastguard Worker {
1324*7c568831SAndroid Build Coastguard Worker     callbacks++;
1325*7c568831SAndroid Build Coastguard Worker     if (quiet)
1326*7c568831SAndroid Build Coastguard Worker 	return;
1327*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.endElementNs(%s", (char *) localname);
1328*7c568831SAndroid Build Coastguard Worker     if (prefix == NULL)
1329*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", NULL");
1330*7c568831SAndroid Build Coastguard Worker     else
1331*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", %s", (char *) prefix);
1332*7c568831SAndroid Build Coastguard Worker     if (URI == NULL)
1333*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", NULL)\n");
1334*7c568831SAndroid Build Coastguard Worker     else
1335*7c568831SAndroid Build Coastguard Worker 	fprintf(SAXdebug, ", '%s')\n", (char *) URI);
1336*7c568831SAndroid Build Coastguard Worker }
1337*7c568831SAndroid Build Coastguard Worker 
1338*7c568831SAndroid Build Coastguard Worker static xmlSAXHandler debugSAX2HandlerStruct = {
1339*7c568831SAndroid Build Coastguard Worker     internalSubsetDebug,
1340*7c568831SAndroid Build Coastguard Worker     isStandaloneDebug,
1341*7c568831SAndroid Build Coastguard Worker     hasInternalSubsetDebug,
1342*7c568831SAndroid Build Coastguard Worker     hasExternalSubsetDebug,
1343*7c568831SAndroid Build Coastguard Worker     resolveEntityDebug,
1344*7c568831SAndroid Build Coastguard Worker     getEntityDebug,
1345*7c568831SAndroid Build Coastguard Worker     entityDeclDebug,
1346*7c568831SAndroid Build Coastguard Worker     notationDeclDebug,
1347*7c568831SAndroid Build Coastguard Worker     attributeDeclDebug,
1348*7c568831SAndroid Build Coastguard Worker     elementDeclDebug,
1349*7c568831SAndroid Build Coastguard Worker     unparsedEntityDeclDebug,
1350*7c568831SAndroid Build Coastguard Worker     setDocumentLocatorDebug,
1351*7c568831SAndroid Build Coastguard Worker     startDocumentDebug,
1352*7c568831SAndroid Build Coastguard Worker     endDocumentDebug,
1353*7c568831SAndroid Build Coastguard Worker     NULL,
1354*7c568831SAndroid Build Coastguard Worker     NULL,
1355*7c568831SAndroid Build Coastguard Worker     referenceDebug,
1356*7c568831SAndroid Build Coastguard Worker     charactersDebug,
1357*7c568831SAndroid Build Coastguard Worker     ignorableWhitespaceDebug,
1358*7c568831SAndroid Build Coastguard Worker     processingInstructionDebug,
1359*7c568831SAndroid Build Coastguard Worker     commentDebug,
1360*7c568831SAndroid Build Coastguard Worker     warningDebug,
1361*7c568831SAndroid Build Coastguard Worker     errorDebug,
1362*7c568831SAndroid Build Coastguard Worker     fatalErrorDebug,
1363*7c568831SAndroid Build Coastguard Worker     getParameterEntityDebug,
1364*7c568831SAndroid Build Coastguard Worker     cdataBlockDebug,
1365*7c568831SAndroid Build Coastguard Worker     externalSubsetDebug,
1366*7c568831SAndroid Build Coastguard Worker     XML_SAX2_MAGIC,
1367*7c568831SAndroid Build Coastguard Worker     NULL,
1368*7c568831SAndroid Build Coastguard Worker     startElementNsDebug,
1369*7c568831SAndroid Build Coastguard Worker     endElementNsDebug,
1370*7c568831SAndroid Build Coastguard Worker     NULL
1371*7c568831SAndroid Build Coastguard Worker };
1372*7c568831SAndroid Build Coastguard Worker 
1373*7c568831SAndroid Build Coastguard Worker static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct;
1374*7c568831SAndroid Build Coastguard Worker 
1375*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1376*7c568831SAndroid Build Coastguard Worker /**
1377*7c568831SAndroid Build Coastguard Worker  * htmlstartElementDebug:
1378*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1379*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
1380*7c568831SAndroid Build Coastguard Worker  *
1381*7c568831SAndroid Build Coastguard Worker  * called when an opening tag has been processed.
1382*7c568831SAndroid Build Coastguard Worker  */
1383*7c568831SAndroid Build Coastguard Worker static void
htmlstartElementDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * name,const xmlChar ** atts)1384*7c568831SAndroid Build Coastguard Worker htmlstartElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
1385*7c568831SAndroid Build Coastguard Worker {
1386*7c568831SAndroid Build Coastguard Worker     int i;
1387*7c568831SAndroid Build Coastguard Worker 
1388*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.startElement(%s", (char *) name);
1389*7c568831SAndroid Build Coastguard Worker     if (atts != NULL) {
1390*7c568831SAndroid Build Coastguard Worker         for (i = 0;(atts[i] != NULL);i++) {
1391*7c568831SAndroid Build Coastguard Worker 	    fprintf(SAXdebug, ", %s", atts[i++]);
1392*7c568831SAndroid Build Coastguard Worker 	    if (atts[i] != NULL) {
1393*7c568831SAndroid Build Coastguard Worker 		unsigned char output[40];
1394*7c568831SAndroid Build Coastguard Worker 		const unsigned char *att = atts[i];
1395*7c568831SAndroid Build Coastguard Worker 		int outlen, attlen;
1396*7c568831SAndroid Build Coastguard Worker 	        fprintf(SAXdebug, "='");
1397*7c568831SAndroid Build Coastguard Worker 		while ((attlen = strlen((char*)att)) > 0) {
1398*7c568831SAndroid Build Coastguard Worker 		    outlen = sizeof output - 1;
1399*7c568831SAndroid Build Coastguard Worker 		    htmlEncodeEntities(output, &outlen, att, &attlen, '\'');
1400*7c568831SAndroid Build Coastguard Worker 		    output[outlen] = 0;
1401*7c568831SAndroid Build Coastguard Worker 		    fprintf(SAXdebug, "%s", (char *) output);
1402*7c568831SAndroid Build Coastguard Worker 		    att += attlen;
1403*7c568831SAndroid Build Coastguard Worker 		}
1404*7c568831SAndroid Build Coastguard Worker 		fprintf(SAXdebug, "'");
1405*7c568831SAndroid Build Coastguard Worker 	    }
1406*7c568831SAndroid Build Coastguard Worker 	}
1407*7c568831SAndroid Build Coastguard Worker     }
1408*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, ")\n");
1409*7c568831SAndroid Build Coastguard Worker }
1410*7c568831SAndroid Build Coastguard Worker 
1411*7c568831SAndroid Build Coastguard Worker /**
1412*7c568831SAndroid Build Coastguard Worker  * htmlcharactersDebug:
1413*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1414*7c568831SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
1415*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
1416*7c568831SAndroid Build Coastguard Worker  *
1417*7c568831SAndroid Build Coastguard Worker  * receiving some chars from the parser.
1418*7c568831SAndroid Build Coastguard Worker  * Question: how much at a time ???
1419*7c568831SAndroid Build Coastguard Worker  */
1420*7c568831SAndroid Build Coastguard Worker static void
htmlcharactersDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * ch,int len)1421*7c568831SAndroid Build Coastguard Worker htmlcharactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
1422*7c568831SAndroid Build Coastguard Worker {
1423*7c568831SAndroid Build Coastguard Worker     unsigned char output[40];
1424*7c568831SAndroid Build Coastguard Worker     int inlen = len, outlen = 30;
1425*7c568831SAndroid Build Coastguard Worker 
1426*7c568831SAndroid Build Coastguard Worker     htmlEncodeEntities(output, &outlen, ch, &inlen, 0);
1427*7c568831SAndroid Build Coastguard Worker     output[outlen] = 0;
1428*7c568831SAndroid Build Coastguard Worker 
1429*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.characters(%s, %d)\n", output, len);
1430*7c568831SAndroid Build Coastguard Worker }
1431*7c568831SAndroid Build Coastguard Worker 
1432*7c568831SAndroid Build Coastguard Worker /**
1433*7c568831SAndroid Build Coastguard Worker  * htmlcdataDebug:
1434*7c568831SAndroid Build Coastguard Worker  * @ctxt:  An XML parser context
1435*7c568831SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
1436*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
1437*7c568831SAndroid Build Coastguard Worker  *
1438*7c568831SAndroid Build Coastguard Worker  * receiving some cdata chars from the parser.
1439*7c568831SAndroid Build Coastguard Worker  * Question: how much at a time ???
1440*7c568831SAndroid Build Coastguard Worker  */
1441*7c568831SAndroid Build Coastguard Worker static void
htmlcdataDebug(void * ctx ATTRIBUTE_UNUSED,const xmlChar * ch,int len)1442*7c568831SAndroid Build Coastguard Worker htmlcdataDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
1443*7c568831SAndroid Build Coastguard Worker {
1444*7c568831SAndroid Build Coastguard Worker     unsigned char output[40];
1445*7c568831SAndroid Build Coastguard Worker     int inlen = len, outlen = 30;
1446*7c568831SAndroid Build Coastguard Worker 
1447*7c568831SAndroid Build Coastguard Worker     htmlEncodeEntities(output, &outlen, ch, &inlen, 0);
1448*7c568831SAndroid Build Coastguard Worker     output[outlen] = 0;
1449*7c568831SAndroid Build Coastguard Worker 
1450*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "SAX.cdata(%s, %d)\n", output, len);
1451*7c568831SAndroid Build Coastguard Worker }
1452*7c568831SAndroid Build Coastguard Worker 
1453*7c568831SAndroid Build Coastguard Worker static xmlSAXHandler debugHTMLSAXHandlerStruct = {
1454*7c568831SAndroid Build Coastguard Worker     internalSubsetDebug,
1455*7c568831SAndroid Build Coastguard Worker     isStandaloneDebug,
1456*7c568831SAndroid Build Coastguard Worker     hasInternalSubsetDebug,
1457*7c568831SAndroid Build Coastguard Worker     hasExternalSubsetDebug,
1458*7c568831SAndroid Build Coastguard Worker     resolveEntityDebug,
1459*7c568831SAndroid Build Coastguard Worker     getEntityDebug,
1460*7c568831SAndroid Build Coastguard Worker     entityDeclDebug,
1461*7c568831SAndroid Build Coastguard Worker     notationDeclDebug,
1462*7c568831SAndroid Build Coastguard Worker     attributeDeclDebug,
1463*7c568831SAndroid Build Coastguard Worker     elementDeclDebug,
1464*7c568831SAndroid Build Coastguard Worker     unparsedEntityDeclDebug,
1465*7c568831SAndroid Build Coastguard Worker     setDocumentLocatorDebug,
1466*7c568831SAndroid Build Coastguard Worker     startDocumentDebug,
1467*7c568831SAndroid Build Coastguard Worker     endDocumentDebug,
1468*7c568831SAndroid Build Coastguard Worker     htmlstartElementDebug,
1469*7c568831SAndroid Build Coastguard Worker     endElementDebug,
1470*7c568831SAndroid Build Coastguard Worker     referenceDebug,
1471*7c568831SAndroid Build Coastguard Worker     htmlcharactersDebug,
1472*7c568831SAndroid Build Coastguard Worker     ignorableWhitespaceDebug,
1473*7c568831SAndroid Build Coastguard Worker     processingInstructionDebug,
1474*7c568831SAndroid Build Coastguard Worker     commentDebug,
1475*7c568831SAndroid Build Coastguard Worker     warningDebug,
1476*7c568831SAndroid Build Coastguard Worker     errorDebug,
1477*7c568831SAndroid Build Coastguard Worker     fatalErrorDebug,
1478*7c568831SAndroid Build Coastguard Worker     getParameterEntityDebug,
1479*7c568831SAndroid Build Coastguard Worker     htmlcdataDebug,
1480*7c568831SAndroid Build Coastguard Worker     externalSubsetDebug,
1481*7c568831SAndroid Build Coastguard Worker     1,
1482*7c568831SAndroid Build Coastguard Worker     NULL,
1483*7c568831SAndroid Build Coastguard Worker     NULL,
1484*7c568831SAndroid Build Coastguard Worker     NULL,
1485*7c568831SAndroid Build Coastguard Worker     NULL
1486*7c568831SAndroid Build Coastguard Worker };
1487*7c568831SAndroid Build Coastguard Worker 
1488*7c568831SAndroid Build Coastguard Worker static xmlSAXHandlerPtr debugHTMLSAXHandler = &debugHTMLSAXHandlerStruct;
1489*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_HTML_ENABLED */
1490*7c568831SAndroid Build Coastguard Worker 
1491*7c568831SAndroid Build Coastguard Worker static void
hashFreeEntity(void * payload,const xmlChar * name ATTRIBUTE_UNUSED)1492*7c568831SAndroid Build Coastguard Worker hashFreeEntity(void *payload, const xmlChar *name ATTRIBUTE_UNUSED) {
1493*7c568831SAndroid Build Coastguard Worker     xmlEntityPtr ent = payload;
1494*7c568831SAndroid Build Coastguard Worker 
1495*7c568831SAndroid Build Coastguard Worker     xmlFreeEntity(ent);
1496*7c568831SAndroid Build Coastguard Worker }
1497*7c568831SAndroid Build Coastguard Worker 
1498*7c568831SAndroid Build Coastguard Worker /**
1499*7c568831SAndroid Build Coastguard Worker  * saxParseTest:
1500*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
1501*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
1502*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
1503*7c568831SAndroid Build Coastguard Worker  *
1504*7c568831SAndroid Build Coastguard Worker  * Parse a file using the SAX API and check for errors.
1505*7c568831SAndroid Build Coastguard Worker  *
1506*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
1507*7c568831SAndroid Build Coastguard Worker  */
1508*7c568831SAndroid Build Coastguard Worker static int
saxParseTest(const char * filename,const char * result,const char * err ATTRIBUTE_UNUSED,int options)1509*7c568831SAndroid Build Coastguard Worker saxParseTest(const char *filename, const char *result,
1510*7c568831SAndroid Build Coastguard Worker              const char *err ATTRIBUTE_UNUSED,
1511*7c568831SAndroid Build Coastguard Worker              int options) {
1512*7c568831SAndroid Build Coastguard Worker     int ret;
1513*7c568831SAndroid Build Coastguard Worker     char *temp;
1514*7c568831SAndroid Build Coastguard Worker 
1515*7c568831SAndroid Build Coastguard Worker     nb_tests++;
1516*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, temp_directory, ".res");
1517*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
1518*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "out of memory\n");
1519*7c568831SAndroid Build Coastguard Worker         fatalError();
1520*7c568831SAndroid Build Coastguard Worker     }
1521*7c568831SAndroid Build Coastguard Worker     SAXdebug = fopen(temp, "wb");
1522*7c568831SAndroid Build Coastguard Worker     if (SAXdebug == NULL) {
1523*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to write to %s\n", temp);
1524*7c568831SAndroid Build Coastguard Worker 	free(temp);
1525*7c568831SAndroid Build Coastguard Worker 	return(-1);
1526*7c568831SAndroid Build Coastguard Worker     }
1527*7c568831SAndroid Build Coastguard Worker 
1528*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1529*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML) {
1530*7c568831SAndroid Build Coastguard Worker         htmlParserCtxtPtr ctxt;
1531*7c568831SAndroid Build Coastguard Worker 
1532*7c568831SAndroid Build Coastguard Worker         ctxt = htmlNewSAXParserCtxt(emptySAXHandler, NULL);
1533*7c568831SAndroid Build Coastguard Worker         htmlCtxtReadFile(ctxt, filename, NULL, options);
1534*7c568831SAndroid Build Coastguard Worker         htmlFreeParserCtxt(ctxt);
1535*7c568831SAndroid Build Coastguard Worker 	ret = 0;
1536*7c568831SAndroid Build Coastguard Worker     } else
1537*7c568831SAndroid Build Coastguard Worker #endif
1538*7c568831SAndroid Build Coastguard Worker     {
1539*7c568831SAndroid Build Coastguard Worker         xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(filename);
1540*7c568831SAndroid Build Coastguard Worker         memcpy(ctxt->sax, emptySAXHandler, sizeof(xmlSAXHandler));
1541*7c568831SAndroid Build Coastguard Worker         xmlCtxtUseOptions(ctxt, options);
1542*7c568831SAndroid Build Coastguard Worker         xmlParseDocument(ctxt);
1543*7c568831SAndroid Build Coastguard Worker         ret = ctxt->wellFormed ? 0 : ctxt->errNo;
1544*7c568831SAndroid Build Coastguard Worker         xmlFreeDoc(ctxt->myDoc);
1545*7c568831SAndroid Build Coastguard Worker         xmlFreeParserCtxt(ctxt);
1546*7c568831SAndroid Build Coastguard Worker     }
1547*7c568831SAndroid Build Coastguard Worker     if (ret == XML_ERR_UNDECLARED_ENTITY) {
1548*7c568831SAndroid Build Coastguard Worker         fprintf(SAXdebug, "xmlParseDocument returned error %d\n", ret);
1549*7c568831SAndroid Build Coastguard Worker         ret = 0;
1550*7c568831SAndroid Build Coastguard Worker     }
1551*7c568831SAndroid Build Coastguard Worker     if (ret != 0) {
1552*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to parse %s\n", filename);
1553*7c568831SAndroid Build Coastguard Worker 	ret = 1;
1554*7c568831SAndroid Build Coastguard Worker 	goto done;
1555*7c568831SAndroid Build Coastguard Worker     }
1556*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1557*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML) {
1558*7c568831SAndroid Build Coastguard Worker         htmlParserCtxtPtr ctxt;
1559*7c568831SAndroid Build Coastguard Worker 
1560*7c568831SAndroid Build Coastguard Worker         ctxt = htmlNewSAXParserCtxt(debugHTMLSAXHandler, NULL);
1561*7c568831SAndroid Build Coastguard Worker         htmlCtxtReadFile(ctxt, filename, NULL, options);
1562*7c568831SAndroid Build Coastguard Worker         htmlFreeParserCtxt(ctxt);
1563*7c568831SAndroid Build Coastguard Worker 	ret = 0;
1564*7c568831SAndroid Build Coastguard Worker     } else
1565*7c568831SAndroid Build Coastguard Worker #endif
1566*7c568831SAndroid Build Coastguard Worker     {
1567*7c568831SAndroid Build Coastguard Worker         debugContext userData;
1568*7c568831SAndroid Build Coastguard Worker         xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(filename);
1569*7c568831SAndroid Build Coastguard Worker 
1570*7c568831SAndroid Build Coastguard Worker         if (options & XML_PARSE_SAX1) {
1571*7c568831SAndroid Build Coastguard Worker             memcpy(ctxt->sax, debugSAXHandler, sizeof(xmlSAXHandler));
1572*7c568831SAndroid Build Coastguard Worker             options -= XML_PARSE_SAX1;
1573*7c568831SAndroid Build Coastguard Worker         } else {
1574*7c568831SAndroid Build Coastguard Worker             memcpy(ctxt->sax, debugSAX2Handler, sizeof(xmlSAXHandler));
1575*7c568831SAndroid Build Coastguard Worker         }
1576*7c568831SAndroid Build Coastguard Worker         userData.filename = filename;
1577*7c568831SAndroid Build Coastguard Worker         userData.generalEntities = xmlHashCreate(0);
1578*7c568831SAndroid Build Coastguard Worker         userData.parameterEntities = xmlHashCreate(0);
1579*7c568831SAndroid Build Coastguard Worker         ctxt->userData = &userData;
1580*7c568831SAndroid Build Coastguard Worker         xmlCtxtUseOptions(ctxt, options);
1581*7c568831SAndroid Build Coastguard Worker         xmlParseDocument(ctxt);
1582*7c568831SAndroid Build Coastguard Worker         ret = ctxt->wellFormed ? 0 : ctxt->errNo;
1583*7c568831SAndroid Build Coastguard Worker         xmlHashFree(userData.generalEntities, hashFreeEntity);
1584*7c568831SAndroid Build Coastguard Worker         xmlHashFree(userData.parameterEntities, hashFreeEntity);
1585*7c568831SAndroid Build Coastguard Worker         xmlFreeDoc(ctxt->myDoc);
1586*7c568831SAndroid Build Coastguard Worker         xmlFreeParserCtxt(ctxt);
1587*7c568831SAndroid Build Coastguard Worker     }
1588*7c568831SAndroid Build Coastguard Worker     fclose(SAXdebug);
1589*7c568831SAndroid Build Coastguard Worker     if (compareFiles(temp, result)) {
1590*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Got a difference for %s\n", filename);
1591*7c568831SAndroid Build Coastguard Worker         ret = 1;
1592*7c568831SAndroid Build Coastguard Worker     }
1593*7c568831SAndroid Build Coastguard Worker 
1594*7c568831SAndroid Build Coastguard Worker done:
1595*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
1596*7c568831SAndroid Build Coastguard Worker         unlink(temp);
1597*7c568831SAndroid Build Coastguard Worker         free(temp);
1598*7c568831SAndroid Build Coastguard Worker     }
1599*7c568831SAndroid Build Coastguard Worker 
1600*7c568831SAndroid Build Coastguard Worker     return(ret);
1601*7c568831SAndroid Build Coastguard Worker }
1602*7c568831SAndroid Build Coastguard Worker 
1603*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED)
1604*7c568831SAndroid Build Coastguard Worker typedef struct {
1605*7c568831SAndroid Build Coastguard Worker     int dataState;
1606*7c568831SAndroid Build Coastguard Worker     int inCharacters;
1607*7c568831SAndroid Build Coastguard Worker     const xmlChar *startTag;
1608*7c568831SAndroid Build Coastguard Worker } xmlTokenizerConfig;
1609*7c568831SAndroid Build Coastguard Worker 
1610*7c568831SAndroid Build Coastguard Worker static void
startDocumentTokenizer(void * ctx)1611*7c568831SAndroid Build Coastguard Worker startDocumentTokenizer(void *ctx) {
1612*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = ctx;
1613*7c568831SAndroid Build Coastguard Worker     xmlTokenizerConfig *config = ctxt->_private;
1614*7c568831SAndroid Build Coastguard Worker 
1615*7c568831SAndroid Build Coastguard Worker     ctxt->instate = XML_PARSER_CONTENT;
1616*7c568831SAndroid Build Coastguard Worker 
1617*7c568831SAndroid Build Coastguard Worker     if (config->dataState != 0) {
1618*7c568831SAndroid Build Coastguard Worker         ctxt->endCheckState = config->dataState;
1619*7c568831SAndroid Build Coastguard Worker         ctxt->name = config->startTag;
1620*7c568831SAndroid Build Coastguard Worker     }
1621*7c568831SAndroid Build Coastguard Worker }
1622*7c568831SAndroid Build Coastguard Worker 
1623*7c568831SAndroid Build Coastguard Worker static void
pendingTokenizer(xmlTokenizerConfig * config)1624*7c568831SAndroid Build Coastguard Worker pendingTokenizer(xmlTokenizerConfig *config) {
1625*7c568831SAndroid Build Coastguard Worker     if (config->inCharacters) {
1626*7c568831SAndroid Build Coastguard Worker         fprintf(SAXdebug, "\n");
1627*7c568831SAndroid Build Coastguard Worker         config->inCharacters = 0;
1628*7c568831SAndroid Build Coastguard Worker     }
1629*7c568831SAndroid Build Coastguard Worker }
1630*7c568831SAndroid Build Coastguard Worker 
1631*7c568831SAndroid Build Coastguard Worker static void
internalSubsetTokenizer(void * ctx,const xmlChar * name,const xmlChar * publicId,const xmlChar * systemId)1632*7c568831SAndroid Build Coastguard Worker internalSubsetTokenizer(void *ctx, const xmlChar *name,
1633*7c568831SAndroid Build Coastguard Worker                         const xmlChar *publicId, const xmlChar *systemId) {
1634*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = ctx;
1635*7c568831SAndroid Build Coastguard Worker     xmlTokenizerConfig *config = ctxt->_private;
1636*7c568831SAndroid Build Coastguard Worker 
1637*7c568831SAndroid Build Coastguard Worker     pendingTokenizer(config);
1638*7c568831SAndroid Build Coastguard Worker 
1639*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "DOCTYPE\n%s\n%s\n%s\n",
1640*7c568831SAndroid Build Coastguard Worker             name ? name : BAD_CAST "<none>",
1641*7c568831SAndroid Build Coastguard Worker             publicId ? publicId : BAD_CAST "<none>",
1642*7c568831SAndroid Build Coastguard Worker             systemId ? systemId : BAD_CAST "<none>");
1643*7c568831SAndroid Build Coastguard Worker }
1644*7c568831SAndroid Build Coastguard Worker 
1645*7c568831SAndroid Build Coastguard Worker static void
startElementTokenizer(void * ctx,const xmlChar * name,const xmlChar ** atts)1646*7c568831SAndroid Build Coastguard Worker startElementTokenizer(void *ctx, const xmlChar *name, const xmlChar **atts) {
1647*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = ctx;
1648*7c568831SAndroid Build Coastguard Worker     xmlTokenizerConfig *config = ctxt->_private;
1649*7c568831SAndroid Build Coastguard Worker     int i;
1650*7c568831SAndroid Build Coastguard Worker 
1651*7c568831SAndroid Build Coastguard Worker     pendingTokenizer(config);
1652*7c568831SAndroid Build Coastguard Worker 
1653*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "StartTag\n%s", name);
1654*7c568831SAndroid Build Coastguard Worker     if (atts != NULL) {
1655*7c568831SAndroid Build Coastguard Worker         for (i = 0; atts[i] != NULL; i += 2) {
1656*7c568831SAndroid Build Coastguard Worker 	    fprintf(SAXdebug, " %s=", atts[i]);
1657*7c568831SAndroid Build Coastguard Worker             if (atts[i+1] != NULL)
1658*7c568831SAndroid Build Coastguard Worker 	        fprintf(SAXdebug, "%s", atts[i+1]);
1659*7c568831SAndroid Build Coastguard Worker         }
1660*7c568831SAndroid Build Coastguard Worker     }
1661*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "\n");
1662*7c568831SAndroid Build Coastguard Worker }
1663*7c568831SAndroid Build Coastguard Worker 
1664*7c568831SAndroid Build Coastguard Worker static void
endElementTokenizer(void * ctx,const xmlChar * name)1665*7c568831SAndroid Build Coastguard Worker endElementTokenizer(void *ctx, const xmlChar *name) {
1666*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = ctx;
1667*7c568831SAndroid Build Coastguard Worker     xmlTokenizerConfig *config = ctxt->_private;
1668*7c568831SAndroid Build Coastguard Worker 
1669*7c568831SAndroid Build Coastguard Worker     pendingTokenizer(config);
1670*7c568831SAndroid Build Coastguard Worker 
1671*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "EndTag\n%s\n", name);
1672*7c568831SAndroid Build Coastguard Worker }
1673*7c568831SAndroid Build Coastguard Worker 
1674*7c568831SAndroid Build Coastguard Worker static void
charactersTokenizer(void * ctx,const xmlChar * ch,int len)1675*7c568831SAndroid Build Coastguard Worker charactersTokenizer(void *ctx, const xmlChar *ch, int len) {
1676*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = ctx;
1677*7c568831SAndroid Build Coastguard Worker     xmlTokenizerConfig *config = ctxt->_private;
1678*7c568831SAndroid Build Coastguard Worker 
1679*7c568831SAndroid Build Coastguard Worker     if (!config->inCharacters) {
1680*7c568831SAndroid Build Coastguard Worker         fprintf(SAXdebug, "Character\n");
1681*7c568831SAndroid Build Coastguard Worker         config->inCharacters = 1;
1682*7c568831SAndroid Build Coastguard Worker     }
1683*7c568831SAndroid Build Coastguard Worker 
1684*7c568831SAndroid Build Coastguard Worker     fwrite(ch, 1, len, SAXdebug);
1685*7c568831SAndroid Build Coastguard Worker }
1686*7c568831SAndroid Build Coastguard Worker 
1687*7c568831SAndroid Build Coastguard Worker static void
commentTokenizer(void * ctx,const xmlChar * value)1688*7c568831SAndroid Build Coastguard Worker commentTokenizer(void *ctx, const xmlChar *value) {
1689*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = ctx;
1690*7c568831SAndroid Build Coastguard Worker     xmlTokenizerConfig *config = ctxt->_private;
1691*7c568831SAndroid Build Coastguard Worker 
1692*7c568831SAndroid Build Coastguard Worker     pendingTokenizer(config);
1693*7c568831SAndroid Build Coastguard Worker 
1694*7c568831SAndroid Build Coastguard Worker     fprintf(SAXdebug, "Comment\n%s\n", value);
1695*7c568831SAndroid Build Coastguard Worker }
1696*7c568831SAndroid Build Coastguard Worker 
1697*7c568831SAndroid Build Coastguard Worker static void
endDocumentTokenizer(void * ctx)1698*7c568831SAndroid Build Coastguard Worker endDocumentTokenizer(void *ctx) {
1699*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = ctx;
1700*7c568831SAndroid Build Coastguard Worker     xmlTokenizerConfig *config = ctxt->_private;
1701*7c568831SAndroid Build Coastguard Worker 
1702*7c568831SAndroid Build Coastguard Worker     pendingTokenizer(config);
1703*7c568831SAndroid Build Coastguard Worker }
1704*7c568831SAndroid Build Coastguard Worker 
1705*7c568831SAndroid Build Coastguard Worker static xmlSAXHandler tokenizeHtmlSAXHandler = {
1706*7c568831SAndroid Build Coastguard Worker     internalSubsetTokenizer,
1707*7c568831SAndroid Build Coastguard Worker     NULL,
1708*7c568831SAndroid Build Coastguard Worker     NULL,
1709*7c568831SAndroid Build Coastguard Worker     NULL,
1710*7c568831SAndroid Build Coastguard Worker     NULL,
1711*7c568831SAndroid Build Coastguard Worker     NULL,
1712*7c568831SAndroid Build Coastguard Worker     NULL,
1713*7c568831SAndroid Build Coastguard Worker     NULL,
1714*7c568831SAndroid Build Coastguard Worker     NULL,
1715*7c568831SAndroid Build Coastguard Worker     NULL,
1716*7c568831SAndroid Build Coastguard Worker     NULL,
1717*7c568831SAndroid Build Coastguard Worker     NULL,
1718*7c568831SAndroid Build Coastguard Worker     startDocumentTokenizer,
1719*7c568831SAndroid Build Coastguard Worker     endDocumentTokenizer,
1720*7c568831SAndroid Build Coastguard Worker     startElementTokenizer,
1721*7c568831SAndroid Build Coastguard Worker     endElementTokenizer,
1722*7c568831SAndroid Build Coastguard Worker     NULL,
1723*7c568831SAndroid Build Coastguard Worker     charactersTokenizer,
1724*7c568831SAndroid Build Coastguard Worker     NULL,
1725*7c568831SAndroid Build Coastguard Worker     NULL,
1726*7c568831SAndroid Build Coastguard Worker     commentTokenizer,
1727*7c568831SAndroid Build Coastguard Worker     NULL,
1728*7c568831SAndroid Build Coastguard Worker     NULL,
1729*7c568831SAndroid Build Coastguard Worker     NULL,
1730*7c568831SAndroid Build Coastguard Worker     NULL,
1731*7c568831SAndroid Build Coastguard Worker     NULL,
1732*7c568831SAndroid Build Coastguard Worker     NULL,
1733*7c568831SAndroid Build Coastguard Worker     1,
1734*7c568831SAndroid Build Coastguard Worker     NULL,
1735*7c568831SAndroid Build Coastguard Worker     NULL,
1736*7c568831SAndroid Build Coastguard Worker     NULL,
1737*7c568831SAndroid Build Coastguard Worker     NULL
1738*7c568831SAndroid Build Coastguard Worker };
1739*7c568831SAndroid Build Coastguard Worker 
1740*7c568831SAndroid Build Coastguard Worker /**
1741*7c568831SAndroid Build Coastguard Worker  * htmlTokenizerTest:
1742*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
1743*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
1744*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
1745*7c568831SAndroid Build Coastguard Worker  *
1746*7c568831SAndroid Build Coastguard Worker  * Parse a file using the SAX API and check for errors.
1747*7c568831SAndroid Build Coastguard Worker  *
1748*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
1749*7c568831SAndroid Build Coastguard Worker  */
1750*7c568831SAndroid Build Coastguard Worker static int
htmlTokenizerTest(const char * filename,const char * result,const char * err ATTRIBUTE_UNUSED,int options)1751*7c568831SAndroid Build Coastguard Worker htmlTokenizerTest(const char *filename, const char *result,
1752*7c568831SAndroid Build Coastguard Worker                   const char *err ATTRIBUTE_UNUSED,
1753*7c568831SAndroid Build Coastguard Worker                   int options) {
1754*7c568831SAndroid Build Coastguard Worker     xmlTokenizerConfig config;
1755*7c568831SAndroid Build Coastguard Worker     char startTag[31];
1756*7c568831SAndroid Build Coastguard Worker     FILE *input;
1757*7c568831SAndroid Build Coastguard Worker     char *temp;
1758*7c568831SAndroid Build Coastguard Worker     unsigned testNum, dataState, size;
1759*7c568831SAndroid Build Coastguard Worker     int ret = 0, counter = 0;
1760*7c568831SAndroid Build Coastguard Worker 
1761*7c568831SAndroid Build Coastguard Worker     nb_tests++;
1762*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, temp_directory, ".res");
1763*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
1764*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "out of memory\n");
1765*7c568831SAndroid Build Coastguard Worker         fatalError();
1766*7c568831SAndroid Build Coastguard Worker     }
1767*7c568831SAndroid Build Coastguard Worker 
1768*7c568831SAndroid Build Coastguard Worker     SAXdebug = fopen(temp, "wb");
1769*7c568831SAndroid Build Coastguard Worker     if (SAXdebug == NULL) {
1770*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to write to %s\n", temp);
1771*7c568831SAndroid Build Coastguard Worker 	free(temp);
1772*7c568831SAndroid Build Coastguard Worker 	return(-1);
1773*7c568831SAndroid Build Coastguard Worker     }
1774*7c568831SAndroid Build Coastguard Worker 
1775*7c568831SAndroid Build Coastguard Worker     input = fopen(filename, "rb");
1776*7c568831SAndroid Build Coastguard Worker     if (input == NULL) {
1777*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "%s: failed to open\n", filename);
1778*7c568831SAndroid Build Coastguard Worker         return(-1);
1779*7c568831SAndroid Build Coastguard Worker     }
1780*7c568831SAndroid Build Coastguard Worker 
1781*7c568831SAndroid Build Coastguard Worker     while (fscanf(input, "%u %30s %u %u%*1[\n]",
1782*7c568831SAndroid Build Coastguard Worker                   &testNum, startTag, &dataState, &size) >= 4) {
1783*7c568831SAndroid Build Coastguard Worker         htmlParserCtxtPtr ctxt;
1784*7c568831SAndroid Build Coastguard Worker         char *data;
1785*7c568831SAndroid Build Coastguard Worker 
1786*7c568831SAndroid Build Coastguard Worker         fprintf(SAXdebug, "%d\n", counter++);
1787*7c568831SAndroid Build Coastguard Worker 
1788*7c568831SAndroid Build Coastguard Worker         data = xmlMalloc(size + 1);
1789*7c568831SAndroid Build Coastguard Worker         if (fread(data, 1, size, input) != size) {
1790*7c568831SAndroid Build Coastguard Worker             fprintf(stderr, "%s:%d: unexpected eof\n", filename, counter);
1791*7c568831SAndroid Build Coastguard Worker             return(-1);
1792*7c568831SAndroid Build Coastguard Worker         }
1793*7c568831SAndroid Build Coastguard Worker 
1794*7c568831SAndroid Build Coastguard Worker         ctxt = htmlCreatePushParserCtxt(&tokenizeHtmlSAXHandler, NULL, NULL, 0,
1795*7c568831SAndroid Build Coastguard Worker                                         NULL, XML_CHAR_ENCODING_UTF8);
1796*7c568831SAndroid Build Coastguard Worker         config.dataState = dataState;
1797*7c568831SAndroid Build Coastguard Worker         config.startTag = BAD_CAST startTag;
1798*7c568831SAndroid Build Coastguard Worker         config.inCharacters = 0;
1799*7c568831SAndroid Build Coastguard Worker         ctxt->_private = &config;
1800*7c568831SAndroid Build Coastguard Worker         htmlCtxtUseOptions(ctxt, options | HTML_PARSE_HTML5);
1801*7c568831SAndroid Build Coastguard Worker         htmlParseChunk(ctxt, data, size, 1);
1802*7c568831SAndroid Build Coastguard Worker         htmlFreeParserCtxt(ctxt);
1803*7c568831SAndroid Build Coastguard Worker 
1804*7c568831SAndroid Build Coastguard Worker         xmlFree(data);
1805*7c568831SAndroid Build Coastguard Worker     }
1806*7c568831SAndroid Build Coastguard Worker     if (!feof(input)) {
1807*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "%s:%d: invalid format\n", filename, counter);
1808*7c568831SAndroid Build Coastguard Worker         return(-1);
1809*7c568831SAndroid Build Coastguard Worker     }
1810*7c568831SAndroid Build Coastguard Worker 
1811*7c568831SAndroid Build Coastguard Worker     fclose(input);
1812*7c568831SAndroid Build Coastguard Worker     fclose(SAXdebug);
1813*7c568831SAndroid Build Coastguard Worker 
1814*7c568831SAndroid Build Coastguard Worker     if (compareFiles(temp, result)) {
1815*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Got a difference for %s\n", filename);
1816*7c568831SAndroid Build Coastguard Worker         ret = 1;
1817*7c568831SAndroid Build Coastguard Worker     }
1818*7c568831SAndroid Build Coastguard Worker 
1819*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
1820*7c568831SAndroid Build Coastguard Worker         unlink(temp);
1821*7c568831SAndroid Build Coastguard Worker         free(temp);
1822*7c568831SAndroid Build Coastguard Worker     }
1823*7c568831SAndroid Build Coastguard Worker 
1824*7c568831SAndroid Build Coastguard Worker     return(ret);
1825*7c568831SAndroid Build Coastguard Worker }
1826*7c568831SAndroid Build Coastguard Worker #endif /* HTML */
1827*7c568831SAndroid Build Coastguard Worker 
1828*7c568831SAndroid Build Coastguard Worker /************************************************************************
1829*7c568831SAndroid Build Coastguard Worker  *									*
1830*7c568831SAndroid Build Coastguard Worker  *		Parse to tree based tests				*
1831*7c568831SAndroid Build Coastguard Worker  *									*
1832*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
1833*7c568831SAndroid Build Coastguard Worker /**
1834*7c568831SAndroid Build Coastguard Worker  * oldParseTest:
1835*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
1836*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
1837*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages: unused
1838*7c568831SAndroid Build Coastguard Worker  *
1839*7c568831SAndroid Build Coastguard Worker  * Parse a file using the old xmlParseFile API, then serialize back
1840*7c568831SAndroid Build Coastguard Worker  * reparse the result and serialize again, then check for deviation
1841*7c568831SAndroid Build Coastguard Worker  * in serialization.
1842*7c568831SAndroid Build Coastguard Worker  *
1843*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
1844*7c568831SAndroid Build Coastguard Worker  */
1845*7c568831SAndroid Build Coastguard Worker static int
oldParseTest(const char * filename,const char * result,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)1846*7c568831SAndroid Build Coastguard Worker oldParseTest(const char *filename, const char *result,
1847*7c568831SAndroid Build Coastguard Worker              const char *err ATTRIBUTE_UNUSED,
1848*7c568831SAndroid Build Coastguard Worker 	     int options ATTRIBUTE_UNUSED) {
1849*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
1850*7c568831SAndroid Build Coastguard Worker     char *temp;
1851*7c568831SAndroid Build Coastguard Worker     int res = 0;
1852*7c568831SAndroid Build Coastguard Worker 
1853*7c568831SAndroid Build Coastguard Worker     nb_tests++;
1854*7c568831SAndroid Build Coastguard Worker     /*
1855*7c568831SAndroid Build Coastguard Worker      * base of the test, parse with the old API
1856*7c568831SAndroid Build Coastguard Worker      */
1857*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
1858*7c568831SAndroid Build Coastguard Worker     xmlGetWarningsDefaultValue = 0;
1859*7c568831SAndroid Build Coastguard Worker     doc = xmlParseFile(filename);
1860*7c568831SAndroid Build Coastguard Worker     xmlGetWarningsDefaultValue = 1;
1861*7c568831SAndroid Build Coastguard Worker #else
1862*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL, XML_PARSE_NOWARNING);
1863*7c568831SAndroid Build Coastguard Worker #endif
1864*7c568831SAndroid Build Coastguard Worker     if (doc == NULL)
1865*7c568831SAndroid Build Coastguard Worker         return(1);
1866*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, temp_directory, ".res");
1867*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
1868*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "out of memory\n");
1869*7c568831SAndroid Build Coastguard Worker         fatalError();
1870*7c568831SAndroid Build Coastguard Worker     }
1871*7c568831SAndroid Build Coastguard Worker     xmlSaveFile(temp, doc);
1872*7c568831SAndroid Build Coastguard Worker     if (compareFiles(temp, result)) {
1873*7c568831SAndroid Build Coastguard Worker         res = 1;
1874*7c568831SAndroid Build Coastguard Worker     }
1875*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
1876*7c568831SAndroid Build Coastguard Worker 
1877*7c568831SAndroid Build Coastguard Worker     /*
1878*7c568831SAndroid Build Coastguard Worker      * Parse the saved result to make sure the round trip is okay
1879*7c568831SAndroid Build Coastguard Worker      */
1880*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
1881*7c568831SAndroid Build Coastguard Worker     xmlGetWarningsDefaultValue = 0;
1882*7c568831SAndroid Build Coastguard Worker     doc = xmlParseFile(temp);
1883*7c568831SAndroid Build Coastguard Worker     xmlGetWarningsDefaultValue = 1;
1884*7c568831SAndroid Build Coastguard Worker #else
1885*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(temp, NULL, XML_PARSE_NOWARNING);
1886*7c568831SAndroid Build Coastguard Worker #endif
1887*7c568831SAndroid Build Coastguard Worker     if (doc == NULL)
1888*7c568831SAndroid Build Coastguard Worker         return(1);
1889*7c568831SAndroid Build Coastguard Worker     xmlSaveFile(temp, doc);
1890*7c568831SAndroid Build Coastguard Worker     if (compareFiles(temp, result)) {
1891*7c568831SAndroid Build Coastguard Worker         res = 1;
1892*7c568831SAndroid Build Coastguard Worker     }
1893*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
1894*7c568831SAndroid Build Coastguard Worker 
1895*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
1896*7c568831SAndroid Build Coastguard Worker         unlink(temp);
1897*7c568831SAndroid Build Coastguard Worker         free(temp);
1898*7c568831SAndroid Build Coastguard Worker     }
1899*7c568831SAndroid Build Coastguard Worker 
1900*7c568831SAndroid Build Coastguard Worker     return(res);
1901*7c568831SAndroid Build Coastguard Worker }
1902*7c568831SAndroid Build Coastguard Worker 
1903*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PUSH_ENABLED
1904*7c568831SAndroid Build Coastguard Worker /**
1905*7c568831SAndroid Build Coastguard Worker  * pushParseTest:
1906*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
1907*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
1908*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages: unused
1909*7c568831SAndroid Build Coastguard Worker  *
1910*7c568831SAndroid Build Coastguard Worker  * Parse a file using the Push API, then serialize back
1911*7c568831SAndroid Build Coastguard Worker  * to check for content.
1912*7c568831SAndroid Build Coastguard Worker  *
1913*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
1914*7c568831SAndroid Build Coastguard Worker  */
1915*7c568831SAndroid Build Coastguard Worker static int
pushParseTest(const char * filename,const char * result,const char * err ATTRIBUTE_UNUSED,int options)1916*7c568831SAndroid Build Coastguard Worker pushParseTest(const char *filename, const char *result,
1917*7c568831SAndroid Build Coastguard Worker              const char *err ATTRIBUTE_UNUSED,
1918*7c568831SAndroid Build Coastguard Worker 	     int options) {
1919*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
1920*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
1921*7c568831SAndroid Build Coastguard Worker     const char *base;
1922*7c568831SAndroid Build Coastguard Worker     int size, res;
1923*7c568831SAndroid Build Coastguard Worker     int cur = 0;
1924*7c568831SAndroid Build Coastguard Worker     int chunkSize = 4;
1925*7c568831SAndroid Build Coastguard Worker 
1926*7c568831SAndroid Build Coastguard Worker     nb_tests++;
1927*7c568831SAndroid Build Coastguard Worker     /*
1928*7c568831SAndroid Build Coastguard Worker      * load the document in memory and work from there.
1929*7c568831SAndroid Build Coastguard Worker      */
1930*7c568831SAndroid Build Coastguard Worker     if (loadMem(filename, &base, &size) != 0) {
1931*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to load %s\n", filename);
1932*7c568831SAndroid Build Coastguard Worker 	return(-1);
1933*7c568831SAndroid Build Coastguard Worker     }
1934*7c568831SAndroid Build Coastguard Worker 
1935*7c568831SAndroid Build Coastguard Worker     if (chunkSize > size)
1936*7c568831SAndroid Build Coastguard Worker         chunkSize = size;
1937*7c568831SAndroid Build Coastguard Worker 
1938*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1939*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML)
1940*7c568831SAndroid Build Coastguard Worker 	ctxt = htmlCreatePushParserCtxt(NULL, NULL, base + cur, chunkSize, filename,
1941*7c568831SAndroid Build Coastguard Worker 	                                XML_CHAR_ENCODING_NONE);
1942*7c568831SAndroid Build Coastguard Worker     else
1943*7c568831SAndroid Build Coastguard Worker #endif
1944*7c568831SAndroid Build Coastguard Worker     ctxt = xmlCreatePushParserCtxt(NULL, NULL, base + cur, chunkSize, filename);
1945*7c568831SAndroid Build Coastguard Worker     xmlCtxtSetErrorHandler(ctxt, testStructuredErrorHandler, NULL);
1946*7c568831SAndroid Build Coastguard Worker     xmlCtxtUseOptions(ctxt, options);
1947*7c568831SAndroid Build Coastguard Worker     cur += chunkSize;
1948*7c568831SAndroid Build Coastguard Worker     chunkSize = 1024;
1949*7c568831SAndroid Build Coastguard Worker     do {
1950*7c568831SAndroid Build Coastguard Worker         if (cur + chunkSize >= size) {
1951*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1952*7c568831SAndroid Build Coastguard Worker 	    if (options & XML_PARSE_HTML)
1953*7c568831SAndroid Build Coastguard Worker 		htmlParseChunk(ctxt, base + cur, size - cur, 1);
1954*7c568831SAndroid Build Coastguard Worker 	    else
1955*7c568831SAndroid Build Coastguard Worker #endif
1956*7c568831SAndroid Build Coastguard Worker 	    xmlParseChunk(ctxt, base + cur, size - cur, 1);
1957*7c568831SAndroid Build Coastguard Worker 	    break;
1958*7c568831SAndroid Build Coastguard Worker 	} else {
1959*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1960*7c568831SAndroid Build Coastguard Worker 	    if (options & XML_PARSE_HTML)
1961*7c568831SAndroid Build Coastguard Worker 		htmlParseChunk(ctxt, base + cur, chunkSize, 0);
1962*7c568831SAndroid Build Coastguard Worker 	    else
1963*7c568831SAndroid Build Coastguard Worker #endif
1964*7c568831SAndroid Build Coastguard Worker 	    xmlParseChunk(ctxt, base + cur, chunkSize, 0);
1965*7c568831SAndroid Build Coastguard Worker 	    cur += chunkSize;
1966*7c568831SAndroid Build Coastguard Worker 	}
1967*7c568831SAndroid Build Coastguard Worker     } while (cur < size);
1968*7c568831SAndroid Build Coastguard Worker     doc = ctxt->myDoc;
1969*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1970*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML)
1971*7c568831SAndroid Build Coastguard Worker         res = 1;
1972*7c568831SAndroid Build Coastguard Worker     else
1973*7c568831SAndroid Build Coastguard Worker #endif
1974*7c568831SAndroid Build Coastguard Worker     res = ctxt->wellFormed;
1975*7c568831SAndroid Build Coastguard Worker     xmlFreeParserCtxt(ctxt);
1976*7c568831SAndroid Build Coastguard Worker     free((char *)base);
1977*7c568831SAndroid Build Coastguard Worker     if (!res) {
1978*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
1979*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "Failed to parse %s\n", filename);
1980*7c568831SAndroid Build Coastguard Worker 	return(-1);
1981*7c568831SAndroid Build Coastguard Worker     }
1982*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1983*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML)
1984*7c568831SAndroid Build Coastguard Worker 	htmlDocDumpMemory(doc, (xmlChar **) &base, &size);
1985*7c568831SAndroid Build Coastguard Worker     else
1986*7c568831SAndroid Build Coastguard Worker #endif
1987*7c568831SAndroid Build Coastguard Worker     xmlDocDumpMemory(doc, (xmlChar **) &base, &size);
1988*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
1989*7c568831SAndroid Build Coastguard Worker     res = compareFileMem(result, base, size);
1990*7c568831SAndroid Build Coastguard Worker     if ((base == NULL) || (res != 0)) {
1991*7c568831SAndroid Build Coastguard Worker 	if (base != NULL)
1992*7c568831SAndroid Build Coastguard Worker 	    xmlFree((char *)base);
1993*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Result for %s failed in %s\n", filename, result);
1994*7c568831SAndroid Build Coastguard Worker 	return(-1);
1995*7c568831SAndroid Build Coastguard Worker     }
1996*7c568831SAndroid Build Coastguard Worker     xmlFree((char *)base);
1997*7c568831SAndroid Build Coastguard Worker     if (err != NULL) {
1998*7c568831SAndroid Build Coastguard Worker 	res = compareFileMem(err, testErrors, testErrorsSize);
1999*7c568831SAndroid Build Coastguard Worker 	if (res != 0) {
2000*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Error for %s failed\n", filename);
2001*7c568831SAndroid Build Coastguard Worker 	    return(-1);
2002*7c568831SAndroid Build Coastguard Worker 	}
2003*7c568831SAndroid Build Coastguard Worker     }
2004*7c568831SAndroid Build Coastguard Worker     return(0);
2005*7c568831SAndroid Build Coastguard Worker }
2006*7c568831SAndroid Build Coastguard Worker 
2007*7c568831SAndroid Build Coastguard Worker static int pushBoundaryCount;
2008*7c568831SAndroid Build Coastguard Worker static int pushBoundaryRefCount;
2009*7c568831SAndroid Build Coastguard Worker static int pushBoundaryCharsCount;
2010*7c568831SAndroid Build Coastguard Worker static int pushBoundaryCDataCount;
2011*7c568831SAndroid Build Coastguard Worker 
2012*7c568831SAndroid Build Coastguard Worker static void
internalSubsetBnd(void * ctx,const xmlChar * name,const xmlChar * externalID,const xmlChar * systemID)2013*7c568831SAndroid Build Coastguard Worker internalSubsetBnd(void *ctx, const xmlChar *name, const xmlChar *externalID,
2014*7c568831SAndroid Build Coastguard Worker                   const xmlChar *systemID) {
2015*7c568831SAndroid Build Coastguard Worker     pushBoundaryCount++;
2016*7c568831SAndroid Build Coastguard Worker     xmlSAX2InternalSubset(ctx, name, externalID, systemID);
2017*7c568831SAndroid Build Coastguard Worker }
2018*7c568831SAndroid Build Coastguard Worker 
2019*7c568831SAndroid Build Coastguard Worker static void
referenceBnd(void * ctx,const xmlChar * name)2020*7c568831SAndroid Build Coastguard Worker referenceBnd(void *ctx, const xmlChar *name) {
2021*7c568831SAndroid Build Coastguard Worker     pushBoundaryRefCount++;
2022*7c568831SAndroid Build Coastguard Worker     xmlSAX2Reference(ctx, name);
2023*7c568831SAndroid Build Coastguard Worker }
2024*7c568831SAndroid Build Coastguard Worker 
2025*7c568831SAndroid Build Coastguard Worker static void
charactersBnd(void * ctx,const xmlChar * ch,int len)2026*7c568831SAndroid Build Coastguard Worker charactersBnd(void *ctx, const xmlChar *ch, int len) {
2027*7c568831SAndroid Build Coastguard Worker     pushBoundaryCount++;
2028*7c568831SAndroid Build Coastguard Worker     pushBoundaryCharsCount++;
2029*7c568831SAndroid Build Coastguard Worker     xmlSAX2Characters(ctx, ch, len);
2030*7c568831SAndroid Build Coastguard Worker }
2031*7c568831SAndroid Build Coastguard Worker 
2032*7c568831SAndroid Build Coastguard Worker static void
cdataBlockBnd(void * ctx,const xmlChar * ch,int len)2033*7c568831SAndroid Build Coastguard Worker cdataBlockBnd(void *ctx, const xmlChar *ch, int len) {
2034*7c568831SAndroid Build Coastguard Worker     pushBoundaryCount++;
2035*7c568831SAndroid Build Coastguard Worker     pushBoundaryCDataCount++;
2036*7c568831SAndroid Build Coastguard Worker     xmlSAX2CDataBlock(ctx, ch, len);
2037*7c568831SAndroid Build Coastguard Worker }
2038*7c568831SAndroid Build Coastguard Worker 
2039*7c568831SAndroid Build Coastguard Worker static void
processingInstructionBnd(void * ctx,const xmlChar * target,const xmlChar * data)2040*7c568831SAndroid Build Coastguard Worker processingInstructionBnd(void *ctx, const xmlChar *target,
2041*7c568831SAndroid Build Coastguard Worker                          const xmlChar *data) {
2042*7c568831SAndroid Build Coastguard Worker     pushBoundaryCount++;
2043*7c568831SAndroid Build Coastguard Worker     xmlSAX2ProcessingInstruction(ctx, target, data);
2044*7c568831SAndroid Build Coastguard Worker }
2045*7c568831SAndroid Build Coastguard Worker 
2046*7c568831SAndroid Build Coastguard Worker static void
commentBnd(void * ctx,const xmlChar * value)2047*7c568831SAndroid Build Coastguard Worker commentBnd(void *ctx, const xmlChar *value) {
2048*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = ctx;
2049*7c568831SAndroid Build Coastguard Worker     if (ctxt->inSubset == 0)
2050*7c568831SAndroid Build Coastguard Worker         pushBoundaryCount++;
2051*7c568831SAndroid Build Coastguard Worker     xmlSAX2Comment(ctx, value);
2052*7c568831SAndroid Build Coastguard Worker }
2053*7c568831SAndroid Build Coastguard Worker 
2054*7c568831SAndroid Build Coastguard Worker static void
startElementBnd(void * ctx,const xmlChar * xname,const xmlChar ** atts)2055*7c568831SAndroid Build Coastguard Worker startElementBnd(void *ctx, const xmlChar *xname, const xmlChar **atts) {
2056*7c568831SAndroid Build Coastguard Worker     const char *name = (const char *)xname;
2057*7c568831SAndroid Build Coastguard Worker 
2058*7c568831SAndroid Build Coastguard Worker     /* Some elements might be created automatically. */
2059*7c568831SAndroid Build Coastguard Worker     if ((strcmp(name, "html") != 0) &&
2060*7c568831SAndroid Build Coastguard Worker         (strcmp(name, "body") != 0) &&
2061*7c568831SAndroid Build Coastguard Worker         (strcmp(name, "head") != 0) &&
2062*7c568831SAndroid Build Coastguard Worker         (strcmp(name, "p") != 0)) {
2063*7c568831SAndroid Build Coastguard Worker         pushBoundaryCount++;
2064*7c568831SAndroid Build Coastguard Worker     }
2065*7c568831SAndroid Build Coastguard Worker     xmlSAX2StartElement(ctx, xname, atts);
2066*7c568831SAndroid Build Coastguard Worker }
2067*7c568831SAndroid Build Coastguard Worker 
2068*7c568831SAndroid Build Coastguard Worker static void
endElementBnd(void * ctx,const xmlChar * name)2069*7c568831SAndroid Build Coastguard Worker endElementBnd(void *ctx, const xmlChar *name) {
2070*7c568831SAndroid Build Coastguard Worker     /*pushBoundaryCount++;*/
2071*7c568831SAndroid Build Coastguard Worker     xmlSAX2EndElement(ctx, name);
2072*7c568831SAndroid Build Coastguard Worker }
2073*7c568831SAndroid Build Coastguard Worker 
2074*7c568831SAndroid Build Coastguard Worker static void
startElementNsBnd(void * ctx,const xmlChar * localname,const xmlChar * prefix,const xmlChar * URI,int nb_namespaces,const xmlChar ** namespaces,int nb_attributes,int nb_defaulted,const xmlChar ** attributes)2075*7c568831SAndroid Build Coastguard Worker startElementNsBnd(void *ctx, const xmlChar *localname, const xmlChar *prefix,
2076*7c568831SAndroid Build Coastguard Worker                   const xmlChar *URI, int nb_namespaces,
2077*7c568831SAndroid Build Coastguard Worker                   const xmlChar **namespaces, int nb_attributes,
2078*7c568831SAndroid Build Coastguard Worker                   int nb_defaulted, const xmlChar **attributes) {
2079*7c568831SAndroid Build Coastguard Worker     pushBoundaryCount++;
2080*7c568831SAndroid Build Coastguard Worker     xmlSAX2StartElementNs(ctx, localname, prefix, URI, nb_namespaces,
2081*7c568831SAndroid Build Coastguard Worker                           namespaces, nb_attributes, nb_defaulted, attributes);
2082*7c568831SAndroid Build Coastguard Worker }
2083*7c568831SAndroid Build Coastguard Worker 
2084*7c568831SAndroid Build Coastguard Worker static void
endElementNsBnd(void * ctx,const xmlChar * localname,const xmlChar * prefix,const xmlChar * URI)2085*7c568831SAndroid Build Coastguard Worker endElementNsBnd(void *ctx, const xmlChar *localname, const xmlChar *prefix,
2086*7c568831SAndroid Build Coastguard Worker                 const xmlChar *URI) {
2087*7c568831SAndroid Build Coastguard Worker     /*pushBoundaryCount++;*/
2088*7c568831SAndroid Build Coastguard Worker     xmlSAX2EndElementNs(ctx, localname, prefix, URI);
2089*7c568831SAndroid Build Coastguard Worker }
2090*7c568831SAndroid Build Coastguard Worker 
2091*7c568831SAndroid Build Coastguard Worker /**
2092*7c568831SAndroid Build Coastguard Worker  * pushBoundaryTest:
2093*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2094*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2095*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages: unused
2096*7c568831SAndroid Build Coastguard Worker  *
2097*7c568831SAndroid Build Coastguard Worker  * Test whether the push parser detects boundaries between syntactical
2098*7c568831SAndroid Build Coastguard Worker  * elements correctly.
2099*7c568831SAndroid Build Coastguard Worker  *
2100*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2101*7c568831SAndroid Build Coastguard Worker  */
2102*7c568831SAndroid Build Coastguard Worker static int
pushBoundaryTest(const char * filename,const char * result,const char * err ATTRIBUTE_UNUSED,int options)2103*7c568831SAndroid Build Coastguard Worker pushBoundaryTest(const char *filename, const char *result,
2104*7c568831SAndroid Build Coastguard Worker                  const char *err ATTRIBUTE_UNUSED,
2105*7c568831SAndroid Build Coastguard Worker                  int options) {
2106*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
2107*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
2108*7c568831SAndroid Build Coastguard Worker     xmlSAXHandler bndSAX;
2109*7c568831SAndroid Build Coastguard Worker     const char *base;
2110*7c568831SAndroid Build Coastguard Worker     int size, res, numCallbacks;
2111*7c568831SAndroid Build Coastguard Worker     int cur = 0;
2112*7c568831SAndroid Build Coastguard Worker     unsigned long avail, oldConsumed, consumed;
2113*7c568831SAndroid Build Coastguard Worker 
2114*7c568831SAndroid Build Coastguard Worker     /*
2115*7c568831SAndroid Build Coastguard Worker      * HTML encoding detection doesn't work when data is fed bytewise.
2116*7c568831SAndroid Build Coastguard Worker      */
2117*7c568831SAndroid Build Coastguard Worker     if (strcmp(filename, "./test/HTML/xml-declaration-1.html") == 0)
2118*7c568831SAndroid Build Coastguard Worker         return(0);
2119*7c568831SAndroid Build Coastguard Worker 
2120*7c568831SAndroid Build Coastguard Worker     /*
2121*7c568831SAndroid Build Coastguard Worker      * If the parser made progress, check that exactly one construct was
2122*7c568831SAndroid Build Coastguard Worker      * processed and that the input buffer is (almost) empty.
2123*7c568831SAndroid Build Coastguard Worker      * Since we use a chunk size of 1, this tests whether content is
2124*7c568831SAndroid Build Coastguard Worker      * processed as early as possible.
2125*7c568831SAndroid Build Coastguard Worker      */
2126*7c568831SAndroid Build Coastguard Worker 
2127*7c568831SAndroid Build Coastguard Worker     nb_tests++;
2128*7c568831SAndroid Build Coastguard Worker 
2129*7c568831SAndroid Build Coastguard Worker     memset(&bndSAX, 0, sizeof(bndSAX));
2130*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2131*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML) {
2132*7c568831SAndroid Build Coastguard Worker         xmlSAX2InitHtmlDefaultSAXHandler(&bndSAX);
2133*7c568831SAndroid Build Coastguard Worker         bndSAX.startElement = startElementBnd;
2134*7c568831SAndroid Build Coastguard Worker         bndSAX.endElement = endElementBnd;
2135*7c568831SAndroid Build Coastguard Worker     } else
2136*7c568831SAndroid Build Coastguard Worker #endif
2137*7c568831SAndroid Build Coastguard Worker     {
2138*7c568831SAndroid Build Coastguard Worker         xmlSAXVersion(&bndSAX, 2);
2139*7c568831SAndroid Build Coastguard Worker         bndSAX.startElementNs = startElementNsBnd;
2140*7c568831SAndroid Build Coastguard Worker         bndSAX.endElementNs = endElementNsBnd;
2141*7c568831SAndroid Build Coastguard Worker     }
2142*7c568831SAndroid Build Coastguard Worker 
2143*7c568831SAndroid Build Coastguard Worker     bndSAX.internalSubset = internalSubsetBnd;
2144*7c568831SAndroid Build Coastguard Worker     bndSAX.reference = referenceBnd;
2145*7c568831SAndroid Build Coastguard Worker     bndSAX.characters = charactersBnd;
2146*7c568831SAndroid Build Coastguard Worker     bndSAX.cdataBlock = cdataBlockBnd;
2147*7c568831SAndroid Build Coastguard Worker     bndSAX.processingInstruction = processingInstructionBnd;
2148*7c568831SAndroid Build Coastguard Worker     bndSAX.comment = commentBnd;
2149*7c568831SAndroid Build Coastguard Worker 
2150*7c568831SAndroid Build Coastguard Worker     /*
2151*7c568831SAndroid Build Coastguard Worker      * load the document in memory and work from there.
2152*7c568831SAndroid Build Coastguard Worker      */
2153*7c568831SAndroid Build Coastguard Worker     if (loadMem(filename, &base, &size) != 0) {
2154*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to load %s\n", filename);
2155*7c568831SAndroid Build Coastguard Worker 	return(-1);
2156*7c568831SAndroid Build Coastguard Worker     }
2157*7c568831SAndroid Build Coastguard Worker 
2158*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2159*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML)
2160*7c568831SAndroid Build Coastguard Worker 	ctxt = htmlCreatePushParserCtxt(&bndSAX, NULL, base, 1, filename,
2161*7c568831SAndroid Build Coastguard Worker 	                                XML_CHAR_ENCODING_NONE);
2162*7c568831SAndroid Build Coastguard Worker     else
2163*7c568831SAndroid Build Coastguard Worker #endif
2164*7c568831SAndroid Build Coastguard Worker     ctxt = xmlCreatePushParserCtxt(&bndSAX, NULL, base, 1, filename);
2165*7c568831SAndroid Build Coastguard Worker     xmlCtxtSetErrorHandler(ctxt, testStructuredErrorHandler, NULL);
2166*7c568831SAndroid Build Coastguard Worker     xmlCtxtUseOptions(ctxt, options);
2167*7c568831SAndroid Build Coastguard Worker     cur = 1;
2168*7c568831SAndroid Build Coastguard Worker     consumed = 0;
2169*7c568831SAndroid Build Coastguard Worker     numCallbacks = 0;
2170*7c568831SAndroid Build Coastguard Worker     avail = 0;
2171*7c568831SAndroid Build Coastguard Worker     while ((cur < size) && (numCallbacks <= 1) && (avail <= 0)) {
2172*7c568831SAndroid Build Coastguard Worker         int terminate = (cur + 1 >= size);
2173*7c568831SAndroid Build Coastguard Worker         int isText = 0;
2174*7c568831SAndroid Build Coastguard Worker 
2175*7c568831SAndroid Build Coastguard Worker         if (ctxt->instate == XML_PARSER_CONTENT) {
2176*7c568831SAndroid Build Coastguard Worker             int firstChar = (ctxt->input->end > ctxt->input->cur) ?
2177*7c568831SAndroid Build Coastguard Worker                             *ctxt->input->cur :
2178*7c568831SAndroid Build Coastguard Worker                             base[cur];
2179*7c568831SAndroid Build Coastguard Worker 
2180*7c568831SAndroid Build Coastguard Worker             if (options & XML_PARSE_HTML) {
2181*7c568831SAndroid Build Coastguard Worker                 isText = ((ctxt->endCheckState) || (firstChar != '<'));
2182*7c568831SAndroid Build Coastguard Worker             } else {
2183*7c568831SAndroid Build Coastguard Worker                 isText = ((firstChar != '<') && (firstChar != '&'));
2184*7c568831SAndroid Build Coastguard Worker             }
2185*7c568831SAndroid Build Coastguard Worker         }
2186*7c568831SAndroid Build Coastguard Worker 
2187*7c568831SAndroid Build Coastguard Worker         oldConsumed = ctxt->input->consumed +
2188*7c568831SAndroid Build Coastguard Worker                       (unsigned long) (ctxt->input->cur - ctxt->input->base);
2189*7c568831SAndroid Build Coastguard Worker 
2190*7c568831SAndroid Build Coastguard Worker         pushBoundaryCount = 0;
2191*7c568831SAndroid Build Coastguard Worker         pushBoundaryRefCount = 0;
2192*7c568831SAndroid Build Coastguard Worker         pushBoundaryCharsCount = 0;
2193*7c568831SAndroid Build Coastguard Worker         pushBoundaryCDataCount = 0;
2194*7c568831SAndroid Build Coastguard Worker 
2195*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2196*7c568831SAndroid Build Coastguard Worker         if (options & XML_PARSE_HTML)
2197*7c568831SAndroid Build Coastguard Worker             htmlParseChunk(ctxt, base + cur, 1, terminate);
2198*7c568831SAndroid Build Coastguard Worker         else
2199*7c568831SAndroid Build Coastguard Worker #endif
2200*7c568831SAndroid Build Coastguard Worker         xmlParseChunk(ctxt, base + cur, 1, terminate);
2201*7c568831SAndroid Build Coastguard Worker 	cur += 1;
2202*7c568831SAndroid Build Coastguard Worker 
2203*7c568831SAndroid Build Coastguard Worker         /*
2204*7c568831SAndroid Build Coastguard Worker          * Callback check: Check that only a single construct was parsed.
2205*7c568831SAndroid Build Coastguard Worker          */
2206*7c568831SAndroid Build Coastguard Worker         if (pushBoundaryRefCount > 0) {
2207*7c568831SAndroid Build Coastguard Worker             numCallbacks = 1;
2208*7c568831SAndroid Build Coastguard Worker         } else {
2209*7c568831SAndroid Build Coastguard Worker             numCallbacks = pushBoundaryCount;
2210*7c568831SAndroid Build Coastguard Worker             if (pushBoundaryCharsCount > 1) {
2211*7c568831SAndroid Build Coastguard Worker                 if (options & XML_PARSE_HTML) {
2212*7c568831SAndroid Build Coastguard Worker                     /*
2213*7c568831SAndroid Build Coastguard Worker                      * The HTML parser can generate a mix of chars and
2214*7c568831SAndroid Build Coastguard Worker                      * references.
2215*7c568831SAndroid Build Coastguard Worker                      */
2216*7c568831SAndroid Build Coastguard Worker                     numCallbacks -= pushBoundaryCharsCount - 1;
2217*7c568831SAndroid Build Coastguard Worker                 } else {
2218*7c568831SAndroid Build Coastguard Worker                     /*
2219*7c568831SAndroid Build Coastguard Worker                      * Allow two chars callbacks. This can happen when
2220*7c568831SAndroid Build Coastguard Worker                      * multi-byte chars are split across buffer boundaries.
2221*7c568831SAndroid Build Coastguard Worker                      */
2222*7c568831SAndroid Build Coastguard Worker                     numCallbacks -= 1;
2223*7c568831SAndroid Build Coastguard Worker                 }
2224*7c568831SAndroid Build Coastguard Worker             }
2225*7c568831SAndroid Build Coastguard Worker             if (options & XML_PARSE_HTML) {
2226*7c568831SAndroid Build Coastguard Worker                 /*
2227*7c568831SAndroid Build Coastguard Worker                  * Allow multiple cdata callbacks in HTML mode.
2228*7c568831SAndroid Build Coastguard Worker                  */
2229*7c568831SAndroid Build Coastguard Worker                 if (pushBoundaryCDataCount > 1)
2230*7c568831SAndroid Build Coastguard Worker                     numCallbacks -= pushBoundaryCDataCount - 1;
2231*7c568831SAndroid Build Coastguard Worker             }
2232*7c568831SAndroid Build Coastguard Worker         }
2233*7c568831SAndroid Build Coastguard Worker 
2234*7c568831SAndroid Build Coastguard Worker         /*
2235*7c568831SAndroid Build Coastguard Worker          * Buffer check: If input was consumed, check that the input
2236*7c568831SAndroid Build Coastguard Worker          * buffer is (almost) empty.
2237*7c568831SAndroid Build Coastguard Worker          */
2238*7c568831SAndroid Build Coastguard Worker         consumed = ctxt->input->consumed +
2239*7c568831SAndroid Build Coastguard Worker                    (unsigned long) (ctxt->input->cur - ctxt->input->base);
2240*7c568831SAndroid Build Coastguard Worker         if ((ctxt->instate != XML_PARSER_DTD) &&
2241*7c568831SAndroid Build Coastguard Worker             (consumed >= 4) &&
2242*7c568831SAndroid Build Coastguard Worker             (consumed != oldConsumed)) {
2243*7c568831SAndroid Build Coastguard Worker             size_t max = 0;
2244*7c568831SAndroid Build Coastguard Worker 
2245*7c568831SAndroid Build Coastguard Worker             avail = ctxt->input->end - ctxt->input->cur;
2246*7c568831SAndroid Build Coastguard Worker 
2247*7c568831SAndroid Build Coastguard Worker             if ((options & XML_PARSE_HTML) &&
2248*7c568831SAndroid Build Coastguard Worker                 (ctxt->instate == XML_PARSER_END_TAG)) {
2249*7c568831SAndroid Build Coastguard Worker                 /* Something related to script parsing. */
2250*7c568831SAndroid Build Coastguard Worker                 max = 3;
2251*7c568831SAndroid Build Coastguard Worker             } else if (isText) {
2252*7c568831SAndroid Build Coastguard Worker                 int c = *ctxt->input->cur;
2253*7c568831SAndroid Build Coastguard Worker 
2254*7c568831SAndroid Build Coastguard Worker                 if ((options & XML_PARSE_HTML) &&
2255*7c568831SAndroid Build Coastguard Worker                     (ctxt->endCheckState)) {
2256*7c568831SAndroid Build Coastguard Worker                     max = strlen((const char *) ctxt->name) + 2;
2257*7c568831SAndroid Build Coastguard Worker                 } else {
2258*7c568831SAndroid Build Coastguard Worker                     /* 3 bytes for partial UTF-8 */
2259*7c568831SAndroid Build Coastguard Worker                     max = ((c == '<') || (c == '&')) ? 1 : 3;
2260*7c568831SAndroid Build Coastguard Worker                 }
2261*7c568831SAndroid Build Coastguard Worker             } else if (ctxt->instate == XML_PARSER_CDATA_SECTION) {
2262*7c568831SAndroid Build Coastguard Worker                 /* 2 bytes for terminator, 3 bytes for UTF-8 */
2263*7c568831SAndroid Build Coastguard Worker                 max = 5;
2264*7c568831SAndroid Build Coastguard Worker             }
2265*7c568831SAndroid Build Coastguard Worker 
2266*7c568831SAndroid Build Coastguard Worker             if (avail <= max)
2267*7c568831SAndroid Build Coastguard Worker                 avail = 0;
2268*7c568831SAndroid Build Coastguard Worker         }
2269*7c568831SAndroid Build Coastguard Worker     }
2270*7c568831SAndroid Build Coastguard Worker     doc = ctxt->myDoc;
2271*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2272*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML)
2273*7c568831SAndroid Build Coastguard Worker         res = 1;
2274*7c568831SAndroid Build Coastguard Worker     else
2275*7c568831SAndroid Build Coastguard Worker #endif
2276*7c568831SAndroid Build Coastguard Worker     res = ctxt->wellFormed;
2277*7c568831SAndroid Build Coastguard Worker     xmlFreeParserCtxt(ctxt);
2278*7c568831SAndroid Build Coastguard Worker     free((char *)base);
2279*7c568831SAndroid Build Coastguard Worker     if (numCallbacks > 1) {
2280*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
2281*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "Failed push boundary callback test (%d@%lu-%lu): %s\n",
2282*7c568831SAndroid Build Coastguard Worker                 numCallbacks, oldConsumed, consumed, filename);
2283*7c568831SAndroid Build Coastguard Worker 	return(-1);
2284*7c568831SAndroid Build Coastguard Worker     }
2285*7c568831SAndroid Build Coastguard Worker     if (avail > 0) {
2286*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
2287*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "Failed push boundary buffer test (%lu@%lu): %s\n",
2288*7c568831SAndroid Build Coastguard Worker                 avail, consumed, filename);
2289*7c568831SAndroid Build Coastguard Worker 	return(-1);
2290*7c568831SAndroid Build Coastguard Worker     }
2291*7c568831SAndroid Build Coastguard Worker     if (!res) {
2292*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
2293*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "Failed to parse %s\n", filename);
2294*7c568831SAndroid Build Coastguard Worker 	return(-1);
2295*7c568831SAndroid Build Coastguard Worker     }
2296*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2297*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML)
2298*7c568831SAndroid Build Coastguard Worker 	htmlDocDumpMemory(doc, (xmlChar **) &base, &size);
2299*7c568831SAndroid Build Coastguard Worker     else
2300*7c568831SAndroid Build Coastguard Worker #endif
2301*7c568831SAndroid Build Coastguard Worker     xmlDocDumpMemory(doc, (xmlChar **) &base, &size);
2302*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
2303*7c568831SAndroid Build Coastguard Worker     res = compareFileMem(result, base, size);
2304*7c568831SAndroid Build Coastguard Worker     if ((base == NULL) || (res != 0)) {
2305*7c568831SAndroid Build Coastguard Worker 	if (base != NULL)
2306*7c568831SAndroid Build Coastguard Worker 	    xmlFree((char *)base);
2307*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Result for %s failed in %s\n", filename, result);
2308*7c568831SAndroid Build Coastguard Worker 	return(-1);
2309*7c568831SAndroid Build Coastguard Worker     }
2310*7c568831SAndroid Build Coastguard Worker     xmlFree((char *)base);
2311*7c568831SAndroid Build Coastguard Worker     if (err != NULL) {
2312*7c568831SAndroid Build Coastguard Worker 	res = compareFileMem(err, testErrors, testErrorsSize);
2313*7c568831SAndroid Build Coastguard Worker 	if (res != 0) {
2314*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Error for %s failed\n", filename);
2315*7c568831SAndroid Build Coastguard Worker 	    return(-1);
2316*7c568831SAndroid Build Coastguard Worker 	}
2317*7c568831SAndroid Build Coastguard Worker     }
2318*7c568831SAndroid Build Coastguard Worker     return(0);
2319*7c568831SAndroid Build Coastguard Worker }
2320*7c568831SAndroid Build Coastguard Worker #endif
2321*7c568831SAndroid Build Coastguard Worker 
2322*7c568831SAndroid Build Coastguard Worker static char *
dumpNodeList(xmlNodePtr list)2323*7c568831SAndroid Build Coastguard Worker dumpNodeList(xmlNodePtr list) {
2324*7c568831SAndroid Build Coastguard Worker     xmlBufferPtr buffer;
2325*7c568831SAndroid Build Coastguard Worker     xmlSaveCtxtPtr save;
2326*7c568831SAndroid Build Coastguard Worker     xmlNodePtr cur;
2327*7c568831SAndroid Build Coastguard Worker     char *ret;
2328*7c568831SAndroid Build Coastguard Worker 
2329*7c568831SAndroid Build Coastguard Worker     buffer = xmlBufferCreate();
2330*7c568831SAndroid Build Coastguard Worker     save = xmlSaveToBuffer(buffer, "UTF-8", 0);
2331*7c568831SAndroid Build Coastguard Worker     for (cur = list; cur != NULL; cur = cur->next)
2332*7c568831SAndroid Build Coastguard Worker         xmlSaveTree(save, cur);
2333*7c568831SAndroid Build Coastguard Worker     xmlSaveClose(save);
2334*7c568831SAndroid Build Coastguard Worker 
2335*7c568831SAndroid Build Coastguard Worker     ret = (char *) xmlBufferDetach(buffer);
2336*7c568831SAndroid Build Coastguard Worker     xmlBufferFree(buffer);
2337*7c568831SAndroid Build Coastguard Worker     return(ret);
2338*7c568831SAndroid Build Coastguard Worker }
2339*7c568831SAndroid Build Coastguard Worker 
2340*7c568831SAndroid Build Coastguard Worker static int
testParseContent(xmlParserCtxtPtr ctxt,xmlDocPtr doc,const char * filename)2341*7c568831SAndroid Build Coastguard Worker testParseContent(xmlParserCtxtPtr ctxt, xmlDocPtr doc, const char *filename) {
2342*7c568831SAndroid Build Coastguard Worker     xmlParserInputPtr input;
2343*7c568831SAndroid Build Coastguard Worker     xmlNodePtr root = NULL, list;
2344*7c568831SAndroid Build Coastguard Worker     char *content, *roundTrip;
2345*7c568831SAndroid Build Coastguard Worker     int ret = 0;
2346*7c568831SAndroid Build Coastguard Worker 
2347*7c568831SAndroid Build Coastguard Worker     if (ctxt->html) {
2348*7c568831SAndroid Build Coastguard Worker         xmlNodePtr cur;
2349*7c568831SAndroid Build Coastguard Worker 
2350*7c568831SAndroid Build Coastguard Worker         if (doc == NULL || doc->children == NULL)
2351*7c568831SAndroid Build Coastguard Worker             return 0;
2352*7c568831SAndroid Build Coastguard Worker         for (cur = doc->children->children; cur != NULL; cur = cur->next) {
2353*7c568831SAndroid Build Coastguard Worker             if (xmlStrEqual(cur->name, BAD_CAST "body")) {
2354*7c568831SAndroid Build Coastguard Worker                 root = cur;
2355*7c568831SAndroid Build Coastguard Worker                 break;
2356*7c568831SAndroid Build Coastguard Worker             }
2357*7c568831SAndroid Build Coastguard Worker         }
2358*7c568831SAndroid Build Coastguard Worker     } else {
2359*7c568831SAndroid Build Coastguard Worker         root = xmlDocGetRootElement(doc);
2360*7c568831SAndroid Build Coastguard Worker     }
2361*7c568831SAndroid Build Coastguard Worker     if (root == NULL)
2362*7c568831SAndroid Build Coastguard Worker         return 0;
2363*7c568831SAndroid Build Coastguard Worker 
2364*7c568831SAndroid Build Coastguard Worker     content = dumpNodeList(root->children);
2365*7c568831SAndroid Build Coastguard Worker 
2366*7c568831SAndroid Build Coastguard Worker     input = xmlNewInputFromString(NULL, content, XML_INPUT_BUF_STATIC);
2367*7c568831SAndroid Build Coastguard Worker     list = xmlCtxtParseContent(ctxt, input, root, 0);
2368*7c568831SAndroid Build Coastguard Worker     roundTrip = dumpNodeList(list);
2369*7c568831SAndroid Build Coastguard Worker     if (strcmp(content, roundTrip) != 0) {
2370*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "xmlCtxtParseContent failed for %s\n", filename);
2371*7c568831SAndroid Build Coastguard Worker         ret = -1;
2372*7c568831SAndroid Build Coastguard Worker     }
2373*7c568831SAndroid Build Coastguard Worker     xmlFree(roundTrip);
2374*7c568831SAndroid Build Coastguard Worker     xmlFreeNodeList(list);
2375*7c568831SAndroid Build Coastguard Worker 
2376*7c568831SAndroid Build Coastguard Worker     /* xmlParseInNodeContext uses the document's encoding. */
2377*7c568831SAndroid Build Coastguard Worker     xmlFree((xmlChar *) doc->encoding);
2378*7c568831SAndroid Build Coastguard Worker     doc->encoding = (const xmlChar *) xmlStrdup(BAD_CAST "UTF-8");
2379*7c568831SAndroid Build Coastguard Worker     xmlParseInNodeContext(root, content, strlen(content),
2380*7c568831SAndroid Build Coastguard Worker                           ctxt->options | XML_PARSE_NOERROR,
2381*7c568831SAndroid Build Coastguard Worker                           &list);
2382*7c568831SAndroid Build Coastguard Worker     roundTrip = dumpNodeList(list);
2383*7c568831SAndroid Build Coastguard Worker     if (strcmp(content, roundTrip) != 0) {
2384*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "xmlParseInNodeContext failed for %s\n", filename);
2385*7c568831SAndroid Build Coastguard Worker         ret = -1;
2386*7c568831SAndroid Build Coastguard Worker     }
2387*7c568831SAndroid Build Coastguard Worker     xmlFree(roundTrip);
2388*7c568831SAndroid Build Coastguard Worker     xmlFreeNodeList(list);
2389*7c568831SAndroid Build Coastguard Worker 
2390*7c568831SAndroid Build Coastguard Worker     xmlFree(content);
2391*7c568831SAndroid Build Coastguard Worker     return(ret);
2392*7c568831SAndroid Build Coastguard Worker }
2393*7c568831SAndroid Build Coastguard Worker 
2394*7c568831SAndroid Build Coastguard Worker /**
2395*7c568831SAndroid Build Coastguard Worker  * memParseTest:
2396*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2397*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2398*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages: unused
2399*7c568831SAndroid Build Coastguard Worker  *
2400*7c568831SAndroid Build Coastguard Worker  * Parse a file using the old xmlReadMemory API, then serialize back
2401*7c568831SAndroid Build Coastguard Worker  * reparse the result and serialize again, then check for deviation
2402*7c568831SAndroid Build Coastguard Worker  * in serialization.
2403*7c568831SAndroid Build Coastguard Worker  *
2404*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2405*7c568831SAndroid Build Coastguard Worker  */
2406*7c568831SAndroid Build Coastguard Worker static int
memParseTest(const char * filename,const char * result,const char * err ATTRIBUTE_UNUSED,int options)2407*7c568831SAndroid Build Coastguard Worker memParseTest(const char *filename, const char *result,
2408*7c568831SAndroid Build Coastguard Worker              const char *err ATTRIBUTE_UNUSED,
2409*7c568831SAndroid Build Coastguard Worker 	     int options) {
2410*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
2411*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
2412*7c568831SAndroid Build Coastguard Worker     const char *base;
2413*7c568831SAndroid Build Coastguard Worker     int size, res;
2414*7c568831SAndroid Build Coastguard Worker     int ret = 0;
2415*7c568831SAndroid Build Coastguard Worker 
2416*7c568831SAndroid Build Coastguard Worker     options |= XML_PARSE_NOWARNING;
2417*7c568831SAndroid Build Coastguard Worker 
2418*7c568831SAndroid Build Coastguard Worker     nb_tests++;
2419*7c568831SAndroid Build Coastguard Worker     /*
2420*7c568831SAndroid Build Coastguard Worker      * load and parse the memory
2421*7c568831SAndroid Build Coastguard Worker      */
2422*7c568831SAndroid Build Coastguard Worker     if (loadMem(filename, &base, &size) != 0) {
2423*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to load %s\n", filename);
2424*7c568831SAndroid Build Coastguard Worker 	return(-1);
2425*7c568831SAndroid Build Coastguard Worker     }
2426*7c568831SAndroid Build Coastguard Worker 
2427*7c568831SAndroid Build Coastguard Worker     ctxt = xmlNewParserCtxt();
2428*7c568831SAndroid Build Coastguard Worker     doc = xmlCtxtReadMemory(ctxt, base, size, filename, NULL, options);
2429*7c568831SAndroid Build Coastguard Worker     unloadMem(base);
2430*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
2431*7c568831SAndroid Build Coastguard Worker         return(1);
2432*7c568831SAndroid Build Coastguard Worker     }
2433*7c568831SAndroid Build Coastguard Worker     xmlDocDumpMemory(doc, (xmlChar **) &base, &size);
2434*7c568831SAndroid Build Coastguard Worker     res = compareFileMem(result, base, size);
2435*7c568831SAndroid Build Coastguard Worker     if ((base == NULL) || (res != 0)) {
2436*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Result for %s failed in %s\n", filename, result);
2437*7c568831SAndroid Build Coastguard Worker 	ret = -1;
2438*7c568831SAndroid Build Coastguard Worker     }
2439*7c568831SAndroid Build Coastguard Worker 
2440*7c568831SAndroid Build Coastguard Worker     if (testParseContent(ctxt, doc, filename) < 0)
2441*7c568831SAndroid Build Coastguard Worker 	ret = -1;
2442*7c568831SAndroid Build Coastguard Worker 
2443*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
2444*7c568831SAndroid Build Coastguard Worker     xmlFreeParserCtxt(ctxt);
2445*7c568831SAndroid Build Coastguard Worker     xmlFree((char *)base);
2446*7c568831SAndroid Build Coastguard Worker     return(ret);
2447*7c568831SAndroid Build Coastguard Worker }
2448*7c568831SAndroid Build Coastguard Worker 
2449*7c568831SAndroid Build Coastguard Worker /**
2450*7c568831SAndroid Build Coastguard Worker  * noentParseTest:
2451*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2452*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2453*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages: unused
2454*7c568831SAndroid Build Coastguard Worker  *
2455*7c568831SAndroid Build Coastguard Worker  * Parse a file with entity resolution, then serialize back
2456*7c568831SAndroid Build Coastguard Worker  * reparse the result and serialize again, then check for deviation
2457*7c568831SAndroid Build Coastguard Worker  * in serialization.
2458*7c568831SAndroid Build Coastguard Worker  *
2459*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2460*7c568831SAndroid Build Coastguard Worker  */
2461*7c568831SAndroid Build Coastguard Worker static int
noentParseTest(const char * filename,const char * result,const char * err ATTRIBUTE_UNUSED,int options)2462*7c568831SAndroid Build Coastguard Worker noentParseTest(const char *filename, const char *result,
2463*7c568831SAndroid Build Coastguard Worker                const char *err  ATTRIBUTE_UNUSED,
2464*7c568831SAndroid Build Coastguard Worker 	       int options) {
2465*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
2466*7c568831SAndroid Build Coastguard Worker     char *temp;
2467*7c568831SAndroid Build Coastguard Worker     int res = 0;
2468*7c568831SAndroid Build Coastguard Worker 
2469*7c568831SAndroid Build Coastguard Worker     nb_tests++;
2470*7c568831SAndroid Build Coastguard Worker     /*
2471*7c568831SAndroid Build Coastguard Worker      * base of the test, parse with the old API
2472*7c568831SAndroid Build Coastguard Worker      */
2473*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL,
2474*7c568831SAndroid Build Coastguard Worker                       options | XML_PARSE_NOWARNING | XML_PARSE_NOERROR);
2475*7c568831SAndroid Build Coastguard Worker     if (doc == NULL)
2476*7c568831SAndroid Build Coastguard Worker         return(1);
2477*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, temp_directory, ".res");
2478*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
2479*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Out of memory\n");
2480*7c568831SAndroid Build Coastguard Worker         fatalError();
2481*7c568831SAndroid Build Coastguard Worker     }
2482*7c568831SAndroid Build Coastguard Worker     xmlSaveFile(temp, doc);
2483*7c568831SAndroid Build Coastguard Worker     if (compareFiles(temp, result)) {
2484*7c568831SAndroid Build Coastguard Worker         res = 1;
2485*7c568831SAndroid Build Coastguard Worker     }
2486*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
2487*7c568831SAndroid Build Coastguard Worker 
2488*7c568831SAndroid Build Coastguard Worker     /*
2489*7c568831SAndroid Build Coastguard Worker      * Parse the saved result to make sure the round trip is okay
2490*7c568831SAndroid Build Coastguard Worker      */
2491*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL,
2492*7c568831SAndroid Build Coastguard Worker                       options | XML_PARSE_NOWARNING | XML_PARSE_NOERROR);
2493*7c568831SAndroid Build Coastguard Worker     if (doc == NULL)
2494*7c568831SAndroid Build Coastguard Worker         return(1);
2495*7c568831SAndroid Build Coastguard Worker     xmlSaveFile(temp, doc);
2496*7c568831SAndroid Build Coastguard Worker     if (compareFiles(temp, result)) {
2497*7c568831SAndroid Build Coastguard Worker         res = 1;
2498*7c568831SAndroid Build Coastguard Worker     }
2499*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
2500*7c568831SAndroid Build Coastguard Worker 
2501*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
2502*7c568831SAndroid Build Coastguard Worker         unlink(temp);
2503*7c568831SAndroid Build Coastguard Worker         free(temp);
2504*7c568831SAndroid Build Coastguard Worker     }
2505*7c568831SAndroid Build Coastguard Worker     return(res);
2506*7c568831SAndroid Build Coastguard Worker }
2507*7c568831SAndroid Build Coastguard Worker 
2508*7c568831SAndroid Build Coastguard Worker /**
2509*7c568831SAndroid Build Coastguard Worker  * errParseTest:
2510*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2511*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2512*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
2513*7c568831SAndroid Build Coastguard Worker  *
2514*7c568831SAndroid Build Coastguard Worker  * Parse a file using the xmlReadFile API and check for errors.
2515*7c568831SAndroid Build Coastguard Worker  *
2516*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2517*7c568831SAndroid Build Coastguard Worker  */
2518*7c568831SAndroid Build Coastguard Worker static int
errParseTest(const char * filename,const char * result,const char * err,int options)2519*7c568831SAndroid Build Coastguard Worker errParseTest(const char *filename, const char *result, const char *err,
2520*7c568831SAndroid Build Coastguard Worker              int options) {
2521*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
2522*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
2523*7c568831SAndroid Build Coastguard Worker     int size, res = 0;
2524*7c568831SAndroid Build Coastguard Worker     int ret = 0;
2525*7c568831SAndroid Build Coastguard Worker 
2526*7c568831SAndroid Build Coastguard Worker     nb_tests++;
2527*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2528*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML) {
2529*7c568831SAndroid Build Coastguard Worker         ctxt = htmlNewParserCtxt();
2530*7c568831SAndroid Build Coastguard Worker         xmlCtxtSetErrorHandler(ctxt, testStructuredErrorHandler, NULL);
2531*7c568831SAndroid Build Coastguard Worker         doc = htmlCtxtReadFile(ctxt, filename, NULL, options);
2532*7c568831SAndroid Build Coastguard Worker     } else
2533*7c568831SAndroid Build Coastguard Worker #endif
2534*7c568831SAndroid Build Coastguard Worker     {
2535*7c568831SAndroid Build Coastguard Worker         ctxt = xmlNewParserCtxt();
2536*7c568831SAndroid Build Coastguard Worker         xmlCtxtSetErrorHandler(ctxt, testStructuredErrorHandler, NULL);
2537*7c568831SAndroid Build Coastguard Worker 	doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
2538*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
2539*7c568831SAndroid Build Coastguard Worker         if (options & XML_PARSE_XINCLUDE) {
2540*7c568831SAndroid Build Coastguard Worker             xmlXIncludeCtxtPtr xinc = NULL;
2541*7c568831SAndroid Build Coastguard Worker 
2542*7c568831SAndroid Build Coastguard Worker             xinc = xmlXIncludeNewContext(doc);
2543*7c568831SAndroid Build Coastguard Worker             xmlXIncludeSetErrorHandler(xinc, testStructuredErrorHandler, NULL);
2544*7c568831SAndroid Build Coastguard Worker             xmlXIncludeSetFlags(xinc, options);
2545*7c568831SAndroid Build Coastguard Worker             if (xmlXIncludeProcessNode(xinc, (xmlNodePtr) doc) < 0) {
2546*7c568831SAndroid Build Coastguard Worker                 testErrorHandler(NULL, "%s : failed to parse\n", filename);
2547*7c568831SAndroid Build Coastguard Worker                 xmlFreeDoc(doc);
2548*7c568831SAndroid Build Coastguard Worker                 doc = NULL;
2549*7c568831SAndroid Build Coastguard Worker             }
2550*7c568831SAndroid Build Coastguard Worker             xmlXIncludeFreeContext(xinc);
2551*7c568831SAndroid Build Coastguard Worker         }
2552*7c568831SAndroid Build Coastguard Worker #endif
2553*7c568831SAndroid Build Coastguard Worker     }
2554*7c568831SAndroid Build Coastguard Worker     if (result) {
2555*7c568831SAndroid Build Coastguard Worker         xmlChar *base = NULL;
2556*7c568831SAndroid Build Coastguard Worker 
2557*7c568831SAndroid Build Coastguard Worker 	if (doc == NULL) {
2558*7c568831SAndroid Build Coastguard Worker 	    base = xmlStrdup(BAD_CAST "");
2559*7c568831SAndroid Build Coastguard Worker 	    size = 0;
2560*7c568831SAndroid Build Coastguard Worker 	} else {
2561*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2562*7c568831SAndroid Build Coastguard Worker 	    if (options & XML_PARSE_HTML) {
2563*7c568831SAndroid Build Coastguard Worker 		htmlDocDumpMemory(doc, &base, &size);
2564*7c568831SAndroid Build Coastguard Worker 	    } else
2565*7c568831SAndroid Build Coastguard Worker #endif
2566*7c568831SAndroid Build Coastguard Worker 	    xmlDocDumpMemory(doc, &base, &size);
2567*7c568831SAndroid Build Coastguard Worker 	}
2568*7c568831SAndroid Build Coastguard Worker 	res = compareFileMem(result, (char *) base, size);
2569*7c568831SAndroid Build Coastguard Worker 	xmlFree(base);
2570*7c568831SAndroid Build Coastguard Worker     }
2571*7c568831SAndroid Build Coastguard Worker 
2572*7c568831SAndroid Build Coastguard Worker     if (res != 0) {
2573*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Result for %s failed in %s\n", filename, result);
2574*7c568831SAndroid Build Coastguard Worker         ret = -1;
2575*7c568831SAndroid Build Coastguard Worker     } else if (err != NULL) {
2576*7c568831SAndroid Build Coastguard Worker 	res = compareFileMem(err, testErrors, testErrorsSize);
2577*7c568831SAndroid Build Coastguard Worker 	if (res != 0) {
2578*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Error for %s failed\n", filename);
2579*7c568831SAndroid Build Coastguard Worker 	    ret = -1;
2580*7c568831SAndroid Build Coastguard Worker 	}
2581*7c568831SAndroid Build Coastguard Worker     } else if (options & XML_PARSE_DTDVALID) {
2582*7c568831SAndroid Build Coastguard Worker         if (testErrorsSize != 0) {
2583*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Validation for %s failed\n", filename);
2584*7c568831SAndroid Build Coastguard Worker             ret = -1;
2585*7c568831SAndroid Build Coastguard Worker         }
2586*7c568831SAndroid Build Coastguard Worker     }
2587*7c568831SAndroid Build Coastguard Worker 
2588*7c568831SAndroid Build Coastguard Worker     if (testParseContent(ctxt, doc, filename) < 0)
2589*7c568831SAndroid Build Coastguard Worker 	ret = -1;
2590*7c568831SAndroid Build Coastguard Worker 
2591*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
2592*7c568831SAndroid Build Coastguard Worker     xmlFreeParserCtxt(ctxt);
2593*7c568831SAndroid Build Coastguard Worker     return(ret);
2594*7c568831SAndroid Build Coastguard Worker }
2595*7c568831SAndroid Build Coastguard Worker 
2596*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_HTML_ENABLED)
2597*7c568831SAndroid Build Coastguard Worker /**
2598*7c568831SAndroid Build Coastguard Worker  * fdParseTest:
2599*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2600*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2601*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
2602*7c568831SAndroid Build Coastguard Worker  *
2603*7c568831SAndroid Build Coastguard Worker  * Parse a file using the xmlReadFd API and check for errors.
2604*7c568831SAndroid Build Coastguard Worker  *
2605*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2606*7c568831SAndroid Build Coastguard Worker  */
2607*7c568831SAndroid Build Coastguard Worker static int
fdParseTest(const char * filename,const char * result,const char * err,int options)2608*7c568831SAndroid Build Coastguard Worker fdParseTest(const char *filename, const char *result, const char *err,
2609*7c568831SAndroid Build Coastguard Worker              int options) {
2610*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
2611*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
2612*7c568831SAndroid Build Coastguard Worker     const char *base = NULL;
2613*7c568831SAndroid Build Coastguard Worker     int size, res = 0, fd;
2614*7c568831SAndroid Build Coastguard Worker 
2615*7c568831SAndroid Build Coastguard Worker     nb_tests++;
2616*7c568831SAndroid Build Coastguard Worker     fd = open(filename, RD_FLAGS);
2617*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2618*7c568831SAndroid Build Coastguard Worker     if (options & XML_PARSE_HTML) {
2619*7c568831SAndroid Build Coastguard Worker         ctxt = htmlNewParserCtxt();
2620*7c568831SAndroid Build Coastguard Worker         xmlCtxtSetErrorHandler(ctxt, testStructuredErrorHandler, NULL);
2621*7c568831SAndroid Build Coastguard Worker         doc = htmlCtxtReadFd(ctxt, fd, filename, NULL, options);
2622*7c568831SAndroid Build Coastguard Worker         htmlFreeParserCtxt(ctxt);
2623*7c568831SAndroid Build Coastguard Worker     } else
2624*7c568831SAndroid Build Coastguard Worker #endif
2625*7c568831SAndroid Build Coastguard Worker     {
2626*7c568831SAndroid Build Coastguard Worker         ctxt = xmlNewParserCtxt();
2627*7c568831SAndroid Build Coastguard Worker         xmlCtxtSetErrorHandler(ctxt, testStructuredErrorHandler, NULL);
2628*7c568831SAndroid Build Coastguard Worker 	doc = xmlCtxtReadFd(ctxt, fd, filename, NULL, options);
2629*7c568831SAndroid Build Coastguard Worker         xmlFreeParserCtxt(ctxt);
2630*7c568831SAndroid Build Coastguard Worker     }
2631*7c568831SAndroid Build Coastguard Worker     close(fd);
2632*7c568831SAndroid Build Coastguard Worker     if (result) {
2633*7c568831SAndroid Build Coastguard Worker 	if (doc == NULL) {
2634*7c568831SAndroid Build Coastguard Worker 	    base = "";
2635*7c568831SAndroid Build Coastguard Worker 	    size = 0;
2636*7c568831SAndroid Build Coastguard Worker 	} else {
2637*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2638*7c568831SAndroid Build Coastguard Worker 	    if (options & XML_PARSE_HTML) {
2639*7c568831SAndroid Build Coastguard Worker 		htmlDocDumpMemory(doc, (xmlChar **) &base, &size);
2640*7c568831SAndroid Build Coastguard Worker 	    } else
2641*7c568831SAndroid Build Coastguard Worker #endif
2642*7c568831SAndroid Build Coastguard Worker 	    xmlDocDumpMemory(doc, (xmlChar **) &base, &size);
2643*7c568831SAndroid Build Coastguard Worker 	}
2644*7c568831SAndroid Build Coastguard Worker 	res = compareFileMem(result, base, size);
2645*7c568831SAndroid Build Coastguard Worker     }
2646*7c568831SAndroid Build Coastguard Worker     if (doc != NULL) {
2647*7c568831SAndroid Build Coastguard Worker 	if (base != NULL)
2648*7c568831SAndroid Build Coastguard Worker 	    xmlFree((char *)base);
2649*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
2650*7c568831SAndroid Build Coastguard Worker     }
2651*7c568831SAndroid Build Coastguard Worker     if (res != 0) {
2652*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Result for %s failed in %s\n", filename, result);
2653*7c568831SAndroid Build Coastguard Worker         return(-1);
2654*7c568831SAndroid Build Coastguard Worker     }
2655*7c568831SAndroid Build Coastguard Worker     if (err != NULL) {
2656*7c568831SAndroid Build Coastguard Worker 	res = compareFileMem(err, testErrors, testErrorsSize);
2657*7c568831SAndroid Build Coastguard Worker 	if (res != 0) {
2658*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Error for %s failed\n", filename);
2659*7c568831SAndroid Build Coastguard Worker 	    return(-1);
2660*7c568831SAndroid Build Coastguard Worker 	}
2661*7c568831SAndroid Build Coastguard Worker     } else if (options & XML_PARSE_DTDVALID) {
2662*7c568831SAndroid Build Coastguard Worker         if (testErrorsSize != 0)
2663*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Validation for %s failed\n", filename);
2664*7c568831SAndroid Build Coastguard Worker     }
2665*7c568831SAndroid Build Coastguard Worker 
2666*7c568831SAndroid Build Coastguard Worker     return(0);
2667*7c568831SAndroid Build Coastguard Worker }
2668*7c568831SAndroid Build Coastguard Worker #endif
2669*7c568831SAndroid Build Coastguard Worker 
2670*7c568831SAndroid Build Coastguard Worker 
2671*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
2672*7c568831SAndroid Build Coastguard Worker /************************************************************************
2673*7c568831SAndroid Build Coastguard Worker  *									*
2674*7c568831SAndroid Build Coastguard Worker  *		Reader based tests					*
2675*7c568831SAndroid Build Coastguard Worker  *									*
2676*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
2677*7c568831SAndroid Build Coastguard Worker 
processNode(FILE * out,xmlTextReaderPtr reader)2678*7c568831SAndroid Build Coastguard Worker static void processNode(FILE *out, xmlTextReaderPtr reader) {
2679*7c568831SAndroid Build Coastguard Worker     const xmlChar *name, *value;
2680*7c568831SAndroid Build Coastguard Worker     int type, empty;
2681*7c568831SAndroid Build Coastguard Worker 
2682*7c568831SAndroid Build Coastguard Worker     type = xmlTextReaderNodeType(reader);
2683*7c568831SAndroid Build Coastguard Worker     empty = xmlTextReaderIsEmptyElement(reader);
2684*7c568831SAndroid Build Coastguard Worker 
2685*7c568831SAndroid Build Coastguard Worker     name = xmlTextReaderConstName(reader);
2686*7c568831SAndroid Build Coastguard Worker     if (name == NULL)
2687*7c568831SAndroid Build Coastguard Worker 	name = BAD_CAST "--";
2688*7c568831SAndroid Build Coastguard Worker 
2689*7c568831SAndroid Build Coastguard Worker     value = xmlTextReaderConstValue(reader);
2690*7c568831SAndroid Build Coastguard Worker 
2691*7c568831SAndroid Build Coastguard Worker 
2692*7c568831SAndroid Build Coastguard Worker     fprintf(out, "%d %d %s %d %d",
2693*7c568831SAndroid Build Coastguard Worker 	    xmlTextReaderDepth(reader),
2694*7c568831SAndroid Build Coastguard Worker 	    type,
2695*7c568831SAndroid Build Coastguard Worker 	    name,
2696*7c568831SAndroid Build Coastguard Worker 	    empty,
2697*7c568831SAndroid Build Coastguard Worker 	    xmlTextReaderHasValue(reader));
2698*7c568831SAndroid Build Coastguard Worker     if (value == NULL)
2699*7c568831SAndroid Build Coastguard Worker 	fprintf(out, "\n");
2700*7c568831SAndroid Build Coastguard Worker     else {
2701*7c568831SAndroid Build Coastguard Worker 	fprintf(out, " %s\n", value);
2702*7c568831SAndroid Build Coastguard Worker     }
2703*7c568831SAndroid Build Coastguard Worker }
2704*7c568831SAndroid Build Coastguard Worker static int
streamProcessTest(const char * filename,const char * result,const char * err,xmlTextReaderPtr reader,const char * rng,int options ATTRIBUTE_UNUSED)2705*7c568831SAndroid Build Coastguard Worker streamProcessTest(const char *filename, const char *result, const char *err,
2706*7c568831SAndroid Build Coastguard Worker                   xmlTextReaderPtr reader, const char *rng,
2707*7c568831SAndroid Build Coastguard Worker                   int options ATTRIBUTE_UNUSED) {
2708*7c568831SAndroid Build Coastguard Worker     int ret;
2709*7c568831SAndroid Build Coastguard Worker     char *temp = NULL;
2710*7c568831SAndroid Build Coastguard Worker     FILE *t = NULL;
2711*7c568831SAndroid Build Coastguard Worker 
2712*7c568831SAndroid Build Coastguard Worker     if (reader == NULL)
2713*7c568831SAndroid Build Coastguard Worker         return(-1);
2714*7c568831SAndroid Build Coastguard Worker 
2715*7c568831SAndroid Build Coastguard Worker     nb_tests++;
2716*7c568831SAndroid Build Coastguard Worker     if (result != NULL) {
2717*7c568831SAndroid Build Coastguard Worker 	temp = resultFilename(filename, temp_directory, ".res");
2718*7c568831SAndroid Build Coastguard Worker 	if (temp == NULL) {
2719*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Out of memory\n");
2720*7c568831SAndroid Build Coastguard Worker 	    fatalError();
2721*7c568831SAndroid Build Coastguard Worker 	}
2722*7c568831SAndroid Build Coastguard Worker 	t = fopen(temp, "wb");
2723*7c568831SAndroid Build Coastguard Worker 	if (t == NULL) {
2724*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Can't open temp file %s\n", temp);
2725*7c568831SAndroid Build Coastguard Worker 	    free(temp);
2726*7c568831SAndroid Build Coastguard Worker 	    return(-1);
2727*7c568831SAndroid Build Coastguard Worker 	}
2728*7c568831SAndroid Build Coastguard Worker     }
2729*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
2730*7c568831SAndroid Build Coastguard Worker     if (rng != NULL) {
2731*7c568831SAndroid Build Coastguard Worker 	ret = xmlTextReaderRelaxNGValidate(reader, rng);
2732*7c568831SAndroid Build Coastguard Worker 	if (ret < 0) {
2733*7c568831SAndroid Build Coastguard Worker 	    testErrorHandler(NULL, "Relax-NG schema %s failed to compile\n",
2734*7c568831SAndroid Build Coastguard Worker 	                     rng);
2735*7c568831SAndroid Build Coastguard Worker 	    fclose(t);
2736*7c568831SAndroid Build Coastguard Worker             if (temp != NULL) {
2737*7c568831SAndroid Build Coastguard Worker                 unlink(temp);
2738*7c568831SAndroid Build Coastguard Worker                 free(temp);
2739*7c568831SAndroid Build Coastguard Worker             }
2740*7c568831SAndroid Build Coastguard Worker 	    return(0);
2741*7c568831SAndroid Build Coastguard Worker 	}
2742*7c568831SAndroid Build Coastguard Worker     }
2743*7c568831SAndroid Build Coastguard Worker #endif
2744*7c568831SAndroid Build Coastguard Worker     ret = xmlTextReaderRead(reader);
2745*7c568831SAndroid Build Coastguard Worker     while (ret == 1) {
2746*7c568831SAndroid Build Coastguard Worker 	if ((t != NULL) && (rng == NULL))
2747*7c568831SAndroid Build Coastguard Worker 	    processNode(t, reader);
2748*7c568831SAndroid Build Coastguard Worker         ret = xmlTextReaderRead(reader);
2749*7c568831SAndroid Build Coastguard Worker     }
2750*7c568831SAndroid Build Coastguard Worker     if (ret != 0) {
2751*7c568831SAndroid Build Coastguard Worker         testErrorHandler(NULL, "%s : failed to parse\n", filename);
2752*7c568831SAndroid Build Coastguard Worker     }
2753*7c568831SAndroid Build Coastguard Worker     if (rng != NULL) {
2754*7c568831SAndroid Build Coastguard Worker         if (xmlTextReaderIsValid(reader) != 1) {
2755*7c568831SAndroid Build Coastguard Worker 	    testErrorHandler(NULL, "%s fails to validate\n", filename);
2756*7c568831SAndroid Build Coastguard Worker 	} else {
2757*7c568831SAndroid Build Coastguard Worker 	    testErrorHandler(NULL, "%s validates\n", filename);
2758*7c568831SAndroid Build Coastguard Worker 	}
2759*7c568831SAndroid Build Coastguard Worker     }
2760*7c568831SAndroid Build Coastguard Worker     if (t != NULL) {
2761*7c568831SAndroid Build Coastguard Worker         fclose(t);
2762*7c568831SAndroid Build Coastguard Worker 	ret = compareFiles(temp, result);
2763*7c568831SAndroid Build Coastguard Worker         if (temp != NULL) {
2764*7c568831SAndroid Build Coastguard Worker             unlink(temp);
2765*7c568831SAndroid Build Coastguard Worker             free(temp);
2766*7c568831SAndroid Build Coastguard Worker         }
2767*7c568831SAndroid Build Coastguard Worker 	if (ret) {
2768*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Result for %s failed in %s\n", filename, result);
2769*7c568831SAndroid Build Coastguard Worker 	    return(-1);
2770*7c568831SAndroid Build Coastguard Worker 	}
2771*7c568831SAndroid Build Coastguard Worker     }
2772*7c568831SAndroid Build Coastguard Worker     if (err != NULL) {
2773*7c568831SAndroid Build Coastguard Worker 	ret = compareFileMem(err, testErrors, testErrorsSize);
2774*7c568831SAndroid Build Coastguard Worker 	if (ret != 0) {
2775*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Error for %s failed\n", filename);
2776*7c568831SAndroid Build Coastguard Worker 	    printf("%s", testErrors);
2777*7c568831SAndroid Build Coastguard Worker 	    return(-1);
2778*7c568831SAndroid Build Coastguard Worker 	}
2779*7c568831SAndroid Build Coastguard Worker     }
2780*7c568831SAndroid Build Coastguard Worker 
2781*7c568831SAndroid Build Coastguard Worker     return(0);
2782*7c568831SAndroid Build Coastguard Worker }
2783*7c568831SAndroid Build Coastguard Worker 
2784*7c568831SAndroid Build Coastguard Worker /**
2785*7c568831SAndroid Build Coastguard Worker  * streamParseTest:
2786*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2787*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2788*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
2789*7c568831SAndroid Build Coastguard Worker  *
2790*7c568831SAndroid Build Coastguard Worker  * Parse a file using the reader API and check for errors.
2791*7c568831SAndroid Build Coastguard Worker  *
2792*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2793*7c568831SAndroid Build Coastguard Worker  */
2794*7c568831SAndroid Build Coastguard Worker static int
streamParseTest(const char * filename,const char * result,const char * err,int options)2795*7c568831SAndroid Build Coastguard Worker streamParseTest(const char *filename, const char *result, const char *err,
2796*7c568831SAndroid Build Coastguard Worker                 int options) {
2797*7c568831SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
2798*7c568831SAndroid Build Coastguard Worker     int ret;
2799*7c568831SAndroid Build Coastguard Worker 
2800*7c568831SAndroid Build Coastguard Worker     reader = xmlReaderForFile(filename, NULL, options);
2801*7c568831SAndroid Build Coastguard Worker     xmlTextReaderSetStructuredErrorHandler(reader, testStructuredErrorHandler,
2802*7c568831SAndroid Build Coastguard Worker                                            NULL);
2803*7c568831SAndroid Build Coastguard Worker     ret = streamProcessTest(filename, result, err, reader, NULL, options);
2804*7c568831SAndroid Build Coastguard Worker     xmlFreeTextReader(reader);
2805*7c568831SAndroid Build Coastguard Worker     return(ret);
2806*7c568831SAndroid Build Coastguard Worker }
2807*7c568831SAndroid Build Coastguard Worker 
2808*7c568831SAndroid Build Coastguard Worker /**
2809*7c568831SAndroid Build Coastguard Worker  * walkerParseTest:
2810*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2811*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2812*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
2813*7c568831SAndroid Build Coastguard Worker  *
2814*7c568831SAndroid Build Coastguard Worker  * Parse a file using the walker, i.e. a reader built from a atree.
2815*7c568831SAndroid Build Coastguard Worker  *
2816*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2817*7c568831SAndroid Build Coastguard Worker  */
2818*7c568831SAndroid Build Coastguard Worker static int
walkerParseTest(const char * filename,const char * result,const char * err,int options)2819*7c568831SAndroid Build Coastguard Worker walkerParseTest(const char *filename, const char *result, const char *err,
2820*7c568831SAndroid Build Coastguard Worker                 int options) {
2821*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
2822*7c568831SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
2823*7c568831SAndroid Build Coastguard Worker     int ret;
2824*7c568831SAndroid Build Coastguard Worker 
2825*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL, options | XML_PARSE_NOWARNING);
2826*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
2827*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to parse %s\n", filename);
2828*7c568831SAndroid Build Coastguard Worker 	return(-1);
2829*7c568831SAndroid Build Coastguard Worker     }
2830*7c568831SAndroid Build Coastguard Worker     reader = xmlReaderWalker(doc);
2831*7c568831SAndroid Build Coastguard Worker     ret = streamProcessTest(filename, result, err, reader, NULL, options);
2832*7c568831SAndroid Build Coastguard Worker     xmlFreeTextReader(reader);
2833*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
2834*7c568831SAndroid Build Coastguard Worker     return(ret);
2835*7c568831SAndroid Build Coastguard Worker }
2836*7c568831SAndroid Build Coastguard Worker 
2837*7c568831SAndroid Build Coastguard Worker /**
2838*7c568831SAndroid Build Coastguard Worker  * streamMemParseTest:
2839*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2840*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2841*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
2842*7c568831SAndroid Build Coastguard Worker  *
2843*7c568831SAndroid Build Coastguard Worker  * Parse a file using the reader API from memory and check for errors.
2844*7c568831SAndroid Build Coastguard Worker  *
2845*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2846*7c568831SAndroid Build Coastguard Worker  */
2847*7c568831SAndroid Build Coastguard Worker static int
streamMemParseTest(const char * filename,const char * result,const char * err,int options)2848*7c568831SAndroid Build Coastguard Worker streamMemParseTest(const char *filename, const char *result, const char *err,
2849*7c568831SAndroid Build Coastguard Worker                    int options) {
2850*7c568831SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
2851*7c568831SAndroid Build Coastguard Worker     int ret;
2852*7c568831SAndroid Build Coastguard Worker     const char *base;
2853*7c568831SAndroid Build Coastguard Worker     int size;
2854*7c568831SAndroid Build Coastguard Worker 
2855*7c568831SAndroid Build Coastguard Worker     /*
2856*7c568831SAndroid Build Coastguard Worker      * load and parse the memory
2857*7c568831SAndroid Build Coastguard Worker      */
2858*7c568831SAndroid Build Coastguard Worker     if (loadMem(filename, &base, &size) != 0) {
2859*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to load %s\n", filename);
2860*7c568831SAndroid Build Coastguard Worker 	return(-1);
2861*7c568831SAndroid Build Coastguard Worker     }
2862*7c568831SAndroid Build Coastguard Worker     reader = xmlReaderForMemory(base, size, filename, NULL, options);
2863*7c568831SAndroid Build Coastguard Worker     xmlTextReaderSetStructuredErrorHandler(reader, testStructuredErrorHandler,
2864*7c568831SAndroid Build Coastguard Worker                                            NULL);
2865*7c568831SAndroid Build Coastguard Worker     ret = streamProcessTest(filename, result, err, reader, NULL, options);
2866*7c568831SAndroid Build Coastguard Worker     free((char *)base);
2867*7c568831SAndroid Build Coastguard Worker     xmlFreeTextReader(reader);
2868*7c568831SAndroid Build Coastguard Worker     return(ret);
2869*7c568831SAndroid Build Coastguard Worker }
2870*7c568831SAndroid Build Coastguard Worker #endif
2871*7c568831SAndroid Build Coastguard Worker 
2872*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XPATH_ENABLED
2873*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_DEBUG_ENABLED
2874*7c568831SAndroid Build Coastguard Worker /************************************************************************
2875*7c568831SAndroid Build Coastguard Worker  *									*
2876*7c568831SAndroid Build Coastguard Worker  *		XPath and XPointer based tests				*
2877*7c568831SAndroid Build Coastguard Worker  *									*
2878*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
2879*7c568831SAndroid Build Coastguard Worker 
2880*7c568831SAndroid Build Coastguard Worker static FILE *xpathOutput;
2881*7c568831SAndroid Build Coastguard Worker static xmlDocPtr xpathDocument;
2882*7c568831SAndroid Build Coastguard Worker 
2883*7c568831SAndroid Build Coastguard Worker static void
testXPath(const char * str,int xptr,int expr)2884*7c568831SAndroid Build Coastguard Worker testXPath(const char *str, int xptr, int expr) {
2885*7c568831SAndroid Build Coastguard Worker     xmlXPathObjectPtr res;
2886*7c568831SAndroid Build Coastguard Worker     xmlXPathContextPtr ctxt;
2887*7c568831SAndroid Build Coastguard Worker 
2888*7c568831SAndroid Build Coastguard Worker     nb_tests++;
2889*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_XPTR_ENABLED)
2890*7c568831SAndroid Build Coastguard Worker     if (xptr) {
2891*7c568831SAndroid Build Coastguard Worker 	ctxt = xmlXPathNewContext(xpathDocument);
2892*7c568831SAndroid Build Coastguard Worker         xmlXPathSetErrorHandler(ctxt, testStructuredErrorHandler, NULL);
2893*7c568831SAndroid Build Coastguard Worker 	res = xmlXPtrEval(BAD_CAST str, ctxt);
2894*7c568831SAndroid Build Coastguard Worker     } else {
2895*7c568831SAndroid Build Coastguard Worker #endif
2896*7c568831SAndroid Build Coastguard Worker 	ctxt = xmlXPathNewContext(xpathDocument);
2897*7c568831SAndroid Build Coastguard Worker         xmlXPathSetErrorHandler(ctxt, testStructuredErrorHandler, NULL);
2898*7c568831SAndroid Build Coastguard Worker 	ctxt->node = xmlDocGetRootElement(xpathDocument);
2899*7c568831SAndroid Build Coastguard Worker 	if (expr)
2900*7c568831SAndroid Build Coastguard Worker 	    res = xmlXPathEvalExpression(BAD_CAST str, ctxt);
2901*7c568831SAndroid Build Coastguard Worker 	else {
2902*7c568831SAndroid Build Coastguard Worker 	    /* res = xmlXPathEval(BAD_CAST str, ctxt); */
2903*7c568831SAndroid Build Coastguard Worker 	    xmlXPathCompExprPtr comp;
2904*7c568831SAndroid Build Coastguard Worker 
2905*7c568831SAndroid Build Coastguard Worker 	    comp = xmlXPathCompile(BAD_CAST str);
2906*7c568831SAndroid Build Coastguard Worker 	    if (comp != NULL) {
2907*7c568831SAndroid Build Coastguard Worker 		res = xmlXPathCompiledEval(comp, ctxt);
2908*7c568831SAndroid Build Coastguard Worker 		xmlXPathFreeCompExpr(comp);
2909*7c568831SAndroid Build Coastguard Worker 	    } else
2910*7c568831SAndroid Build Coastguard Worker 		res = NULL;
2911*7c568831SAndroid Build Coastguard Worker 	}
2912*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_XPTR_ENABLED)
2913*7c568831SAndroid Build Coastguard Worker     }
2914*7c568831SAndroid Build Coastguard Worker #endif
2915*7c568831SAndroid Build Coastguard Worker     xmlXPathDebugDumpObject(xpathOutput, res, 0);
2916*7c568831SAndroid Build Coastguard Worker     xmlXPathFreeObject(res);
2917*7c568831SAndroid Build Coastguard Worker     xmlXPathFreeContext(ctxt);
2918*7c568831SAndroid Build Coastguard Worker }
2919*7c568831SAndroid Build Coastguard Worker 
2920*7c568831SAndroid Build Coastguard Worker /**
2921*7c568831SAndroid Build Coastguard Worker  * xpathExprTest:
2922*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2923*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2924*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
2925*7c568831SAndroid Build Coastguard Worker  *
2926*7c568831SAndroid Build Coastguard Worker  * Parse a file containing XPath standalone expressions and evaluate them
2927*7c568831SAndroid Build Coastguard Worker  *
2928*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2929*7c568831SAndroid Build Coastguard Worker  */
2930*7c568831SAndroid Build Coastguard Worker static int
xpathCommonTest(const char * filename,const char * result,int xptr,int expr)2931*7c568831SAndroid Build Coastguard Worker xpathCommonTest(const char *filename, const char *result,
2932*7c568831SAndroid Build Coastguard Worker                 int xptr, int expr) {
2933*7c568831SAndroid Build Coastguard Worker     FILE *input;
2934*7c568831SAndroid Build Coastguard Worker     char expression[5000];
2935*7c568831SAndroid Build Coastguard Worker     int len, ret = 0;
2936*7c568831SAndroid Build Coastguard Worker     char *temp;
2937*7c568831SAndroid Build Coastguard Worker 
2938*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, temp_directory, ".res");
2939*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
2940*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Out of memory\n");
2941*7c568831SAndroid Build Coastguard Worker         fatalError();
2942*7c568831SAndroid Build Coastguard Worker     }
2943*7c568831SAndroid Build Coastguard Worker     xpathOutput = fopen(temp, "wb");
2944*7c568831SAndroid Build Coastguard Worker     if (xpathOutput == NULL) {
2945*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "failed to open output file %s\n", temp);
2946*7c568831SAndroid Build Coastguard Worker         free(temp);
2947*7c568831SAndroid Build Coastguard Worker 	return(-1);
2948*7c568831SAndroid Build Coastguard Worker     }
2949*7c568831SAndroid Build Coastguard Worker 
2950*7c568831SAndroid Build Coastguard Worker     input = fopen(filename, "rb");
2951*7c568831SAndroid Build Coastguard Worker     if (input == NULL) {
2952*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,
2953*7c568831SAndroid Build Coastguard Worker 		"Cannot open %s for reading\n", filename);
2954*7c568831SAndroid Build Coastguard Worker         free(temp);
2955*7c568831SAndroid Build Coastguard Worker 	return(-1);
2956*7c568831SAndroid Build Coastguard Worker     }
2957*7c568831SAndroid Build Coastguard Worker     while (fgets(expression, 4500, input) != NULL) {
2958*7c568831SAndroid Build Coastguard Worker 	len = strlen(expression);
2959*7c568831SAndroid Build Coastguard Worker 	len--;
2960*7c568831SAndroid Build Coastguard Worker 	while ((len >= 0) &&
2961*7c568831SAndroid Build Coastguard Worker 	       ((expression[len] == '\n') || (expression[len] == '\t') ||
2962*7c568831SAndroid Build Coastguard Worker 		(expression[len] == '\r') || (expression[len] == ' '))) len--;
2963*7c568831SAndroid Build Coastguard Worker 	expression[len + 1] = 0;
2964*7c568831SAndroid Build Coastguard Worker 	if (len >= 0) {
2965*7c568831SAndroid Build Coastguard Worker 	    fprintf(xpathOutput,
2966*7c568831SAndroid Build Coastguard Worker 	            "\n========================\nExpression: %s\n",
2967*7c568831SAndroid Build Coastguard Worker 		    expression) ;
2968*7c568831SAndroid Build Coastguard Worker 	    testXPath(expression, xptr, expr);
2969*7c568831SAndroid Build Coastguard Worker 	}
2970*7c568831SAndroid Build Coastguard Worker     }
2971*7c568831SAndroid Build Coastguard Worker 
2972*7c568831SAndroid Build Coastguard Worker     fclose(input);
2973*7c568831SAndroid Build Coastguard Worker     fclose(xpathOutput);
2974*7c568831SAndroid Build Coastguard Worker     if (result != NULL) {
2975*7c568831SAndroid Build Coastguard Worker 	ret = compareFiles(temp, result);
2976*7c568831SAndroid Build Coastguard Worker 	if (ret) {
2977*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Result for %s failed in %s\n", filename, result);
2978*7c568831SAndroid Build Coastguard Worker 	}
2979*7c568831SAndroid Build Coastguard Worker     }
2980*7c568831SAndroid Build Coastguard Worker 
2981*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
2982*7c568831SAndroid Build Coastguard Worker         unlink(temp);
2983*7c568831SAndroid Build Coastguard Worker         free(temp);
2984*7c568831SAndroid Build Coastguard Worker     }
2985*7c568831SAndroid Build Coastguard Worker     return(ret);
2986*7c568831SAndroid Build Coastguard Worker }
2987*7c568831SAndroid Build Coastguard Worker 
2988*7c568831SAndroid Build Coastguard Worker /**
2989*7c568831SAndroid Build Coastguard Worker  * xpathExprTest:
2990*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
2991*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
2992*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
2993*7c568831SAndroid Build Coastguard Worker  *
2994*7c568831SAndroid Build Coastguard Worker  * Parse a file containing XPath standalone expressions and evaluate them
2995*7c568831SAndroid Build Coastguard Worker  *
2996*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
2997*7c568831SAndroid Build Coastguard Worker  */
2998*7c568831SAndroid Build Coastguard Worker static int
xpathExprTest(const char * filename,const char * result,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)2999*7c568831SAndroid Build Coastguard Worker xpathExprTest(const char *filename, const char *result,
3000*7c568831SAndroid Build Coastguard Worker               const char *err ATTRIBUTE_UNUSED,
3001*7c568831SAndroid Build Coastguard Worker               int options ATTRIBUTE_UNUSED) {
3002*7c568831SAndroid Build Coastguard Worker     return(xpathCommonTest(filename, result, 0, 1));
3003*7c568831SAndroid Build Coastguard Worker }
3004*7c568831SAndroid Build Coastguard Worker 
3005*7c568831SAndroid Build Coastguard Worker /**
3006*7c568831SAndroid Build Coastguard Worker  * xpathDocTest:
3007*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
3008*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3009*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3010*7c568831SAndroid Build Coastguard Worker  *
3011*7c568831SAndroid Build Coastguard Worker  * Parse a file containing XPath expressions and evaluate them against
3012*7c568831SAndroid Build Coastguard Worker  * a set of corresponding documents.
3013*7c568831SAndroid Build Coastguard Worker  *
3014*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3015*7c568831SAndroid Build Coastguard Worker  */
3016*7c568831SAndroid Build Coastguard Worker static int
xpathDocTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * err ATTRIBUTE_UNUSED,int options)3017*7c568831SAndroid Build Coastguard Worker xpathDocTest(const char *filename,
3018*7c568831SAndroid Build Coastguard Worker              const char *resul ATTRIBUTE_UNUSED,
3019*7c568831SAndroid Build Coastguard Worker              const char *err ATTRIBUTE_UNUSED,
3020*7c568831SAndroid Build Coastguard Worker              int options) {
3021*7c568831SAndroid Build Coastguard Worker 
3022*7c568831SAndroid Build Coastguard Worker     char pattern[500];
3023*7c568831SAndroid Build Coastguard Worker     char result[500];
3024*7c568831SAndroid Build Coastguard Worker     glob_t globbuf;
3025*7c568831SAndroid Build Coastguard Worker     size_t i;
3026*7c568831SAndroid Build Coastguard Worker     int ret = 0, res;
3027*7c568831SAndroid Build Coastguard Worker 
3028*7c568831SAndroid Build Coastguard Worker     xpathDocument = xmlReadFile(filename, NULL,
3029*7c568831SAndroid Build Coastguard Worker                                 options | XML_PARSE_DTDATTR | XML_PARSE_NOENT);
3030*7c568831SAndroid Build Coastguard Worker     if (xpathDocument == NULL) {
3031*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to load %s\n", filename);
3032*7c568831SAndroid Build Coastguard Worker 	return(-1);
3033*7c568831SAndroid Build Coastguard Worker     }
3034*7c568831SAndroid Build Coastguard Worker 
3035*7c568831SAndroid Build Coastguard Worker     res = snprintf(pattern, 499, "./test/XPath/tests/%s*",
3036*7c568831SAndroid Build Coastguard Worker             baseFilename(filename));
3037*7c568831SAndroid Build Coastguard Worker     if (res >= 499)
3038*7c568831SAndroid Build Coastguard Worker         pattern[499] = 0;
3039*7c568831SAndroid Build Coastguard Worker     globbuf.gl_offs = 0;
3040*7c568831SAndroid Build Coastguard Worker     glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
3041*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < globbuf.gl_pathc;i++) {
3042*7c568831SAndroid Build Coastguard Worker         res = snprintf(result, 499, "result/XPath/tests/%s",
3043*7c568831SAndroid Build Coastguard Worker 	         baseFilename(globbuf.gl_pathv[i]));
3044*7c568831SAndroid Build Coastguard Worker         if (res >= 499)
3045*7c568831SAndroid Build Coastguard Worker             result[499] = 0;
3046*7c568831SAndroid Build Coastguard Worker 	res = xpathCommonTest(globbuf.gl_pathv[i], &result[0], 0, 0);
3047*7c568831SAndroid Build Coastguard Worker 	if (res != 0)
3048*7c568831SAndroid Build Coastguard Worker 	    ret = res;
3049*7c568831SAndroid Build Coastguard Worker     }
3050*7c568831SAndroid Build Coastguard Worker     globfree(&globbuf);
3051*7c568831SAndroid Build Coastguard Worker 
3052*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(xpathDocument);
3053*7c568831SAndroid Build Coastguard Worker     return(ret);
3054*7c568831SAndroid Build Coastguard Worker }
3055*7c568831SAndroid Build Coastguard Worker 
3056*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XPTR_ENABLED
3057*7c568831SAndroid Build Coastguard Worker /**
3058*7c568831SAndroid Build Coastguard Worker  * xptrDocTest:
3059*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
3060*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3061*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3062*7c568831SAndroid Build Coastguard Worker  *
3063*7c568831SAndroid Build Coastguard Worker  * Parse a file containing XPath expressions and evaluate them against
3064*7c568831SAndroid Build Coastguard Worker  * a set of corresponding documents.
3065*7c568831SAndroid Build Coastguard Worker  *
3066*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3067*7c568831SAndroid Build Coastguard Worker  */
3068*7c568831SAndroid Build Coastguard Worker static int
xptrDocTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)3069*7c568831SAndroid Build Coastguard Worker xptrDocTest(const char *filename,
3070*7c568831SAndroid Build Coastguard Worker             const char *resul ATTRIBUTE_UNUSED,
3071*7c568831SAndroid Build Coastguard Worker             const char *err ATTRIBUTE_UNUSED,
3072*7c568831SAndroid Build Coastguard Worker             int options ATTRIBUTE_UNUSED) {
3073*7c568831SAndroid Build Coastguard Worker 
3074*7c568831SAndroid Build Coastguard Worker     char pattern[500];
3075*7c568831SAndroid Build Coastguard Worker     char result[500];
3076*7c568831SAndroid Build Coastguard Worker     glob_t globbuf;
3077*7c568831SAndroid Build Coastguard Worker     size_t i;
3078*7c568831SAndroid Build Coastguard Worker     int ret = 0, res;
3079*7c568831SAndroid Build Coastguard Worker 
3080*7c568831SAndroid Build Coastguard Worker     xpathDocument = xmlReadFile(filename, NULL,
3081*7c568831SAndroid Build Coastguard Worker                                 XML_PARSE_DTDATTR | XML_PARSE_NOENT);
3082*7c568831SAndroid Build Coastguard Worker     if (xpathDocument == NULL) {
3083*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to load %s\n", filename);
3084*7c568831SAndroid Build Coastguard Worker 	return(-1);
3085*7c568831SAndroid Build Coastguard Worker     }
3086*7c568831SAndroid Build Coastguard Worker 
3087*7c568831SAndroid Build Coastguard Worker     res = snprintf(pattern, 499, "./test/XPath/xptr/%s*",
3088*7c568831SAndroid Build Coastguard Worker                    baseFilename(filename));
3089*7c568831SAndroid Build Coastguard Worker     if (res >= 499)
3090*7c568831SAndroid Build Coastguard Worker         pattern[499] = 0;
3091*7c568831SAndroid Build Coastguard Worker     globbuf.gl_offs = 0;
3092*7c568831SAndroid Build Coastguard Worker     glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
3093*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < globbuf.gl_pathc;i++) {
3094*7c568831SAndroid Build Coastguard Worker         res = snprintf(result, 499, "result/XPath/xptr/%s",
3095*7c568831SAndroid Build Coastguard Worker 	               baseFilename(globbuf.gl_pathv[i]));
3096*7c568831SAndroid Build Coastguard Worker         if (res >= 499)
3097*7c568831SAndroid Build Coastguard Worker             result[499] = 0;
3098*7c568831SAndroid Build Coastguard Worker 	res = xpathCommonTest(globbuf.gl_pathv[i], &result[0], 1, 0);
3099*7c568831SAndroid Build Coastguard Worker 	if (res != 0)
3100*7c568831SAndroid Build Coastguard Worker 	    ret = res;
3101*7c568831SAndroid Build Coastguard Worker     }
3102*7c568831SAndroid Build Coastguard Worker     globfree(&globbuf);
3103*7c568831SAndroid Build Coastguard Worker 
3104*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(xpathDocument);
3105*7c568831SAndroid Build Coastguard Worker     return(ret);
3106*7c568831SAndroid Build Coastguard Worker }
3107*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_XPTR_ENABLED */
3108*7c568831SAndroid Build Coastguard Worker 
3109*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
3110*7c568831SAndroid Build Coastguard Worker /**
3111*7c568831SAndroid Build Coastguard Worker  * xmlidDocTest:
3112*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
3113*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3114*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3115*7c568831SAndroid Build Coastguard Worker  *
3116*7c568831SAndroid Build Coastguard Worker  * Parse a file containing xml:id and check for errors and verify
3117*7c568831SAndroid Build Coastguard Worker  * that XPath queries will work on them as expected.
3118*7c568831SAndroid Build Coastguard Worker  *
3119*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3120*7c568831SAndroid Build Coastguard Worker  */
3121*7c568831SAndroid Build Coastguard Worker static int
xmlidDocTest(const char * filename,const char * result,const char * err,int options)3122*7c568831SAndroid Build Coastguard Worker xmlidDocTest(const char *filename,
3123*7c568831SAndroid Build Coastguard Worker              const char *result,
3124*7c568831SAndroid Build Coastguard Worker              const char *err,
3125*7c568831SAndroid Build Coastguard Worker              int options) {
3126*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
3127*7c568831SAndroid Build Coastguard Worker     int res = 0;
3128*7c568831SAndroid Build Coastguard Worker     int ret = 0;
3129*7c568831SAndroid Build Coastguard Worker     char *temp;
3130*7c568831SAndroid Build Coastguard Worker 
3131*7c568831SAndroid Build Coastguard Worker     ctxt = xmlNewParserCtxt();
3132*7c568831SAndroid Build Coastguard Worker     xmlCtxtSetErrorHandler(ctxt, testStructuredErrorHandler, NULL);
3133*7c568831SAndroid Build Coastguard Worker     xpathDocument = xmlCtxtReadFile(ctxt, filename, NULL,
3134*7c568831SAndroid Build Coastguard Worker             options | XML_PARSE_DTDATTR | XML_PARSE_NOENT);
3135*7c568831SAndroid Build Coastguard Worker     xmlFreeParserCtxt(ctxt);
3136*7c568831SAndroid Build Coastguard Worker     if (xpathDocument == NULL) {
3137*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to load %s\n", filename);
3138*7c568831SAndroid Build Coastguard Worker 	return(-1);
3139*7c568831SAndroid Build Coastguard Worker     }
3140*7c568831SAndroid Build Coastguard Worker 
3141*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, temp_directory, ".res");
3142*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
3143*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Out of memory\n");
3144*7c568831SAndroid Build Coastguard Worker         fatalError();
3145*7c568831SAndroid Build Coastguard Worker     }
3146*7c568831SAndroid Build Coastguard Worker     xpathOutput = fopen(temp, "wb");
3147*7c568831SAndroid Build Coastguard Worker     if (xpathOutput == NULL) {
3148*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "failed to open output file %s\n", temp);
3149*7c568831SAndroid Build Coastguard Worker         xmlFreeDoc(xpathDocument);
3150*7c568831SAndroid Build Coastguard Worker         free(temp);
3151*7c568831SAndroid Build Coastguard Worker 	return(-1);
3152*7c568831SAndroid Build Coastguard Worker     }
3153*7c568831SAndroid Build Coastguard Worker 
3154*7c568831SAndroid Build Coastguard Worker     testXPath("id('bar')", 0, 0);
3155*7c568831SAndroid Build Coastguard Worker 
3156*7c568831SAndroid Build Coastguard Worker     fclose(xpathOutput);
3157*7c568831SAndroid Build Coastguard Worker     if (result != NULL) {
3158*7c568831SAndroid Build Coastguard Worker 	ret = compareFiles(temp, result);
3159*7c568831SAndroid Build Coastguard Worker 	if (ret) {
3160*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Result for %s failed in %s\n", filename, result);
3161*7c568831SAndroid Build Coastguard Worker 	    res = 1;
3162*7c568831SAndroid Build Coastguard Worker 	}
3163*7c568831SAndroid Build Coastguard Worker     }
3164*7c568831SAndroid Build Coastguard Worker 
3165*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
3166*7c568831SAndroid Build Coastguard Worker         unlink(temp);
3167*7c568831SAndroid Build Coastguard Worker         free(temp);
3168*7c568831SAndroid Build Coastguard Worker     }
3169*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(xpathDocument);
3170*7c568831SAndroid Build Coastguard Worker 
3171*7c568831SAndroid Build Coastguard Worker     if (err != NULL) {
3172*7c568831SAndroid Build Coastguard Worker 	ret = compareFileMem(err, testErrors, testErrorsSize);
3173*7c568831SAndroid Build Coastguard Worker 	if (ret != 0) {
3174*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Error for %s failed\n", filename);
3175*7c568831SAndroid Build Coastguard Worker 	    res = 1;
3176*7c568831SAndroid Build Coastguard Worker 	}
3177*7c568831SAndroid Build Coastguard Worker     }
3178*7c568831SAndroid Build Coastguard Worker     return(res);
3179*7c568831SAndroid Build Coastguard Worker }
3180*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
3181*7c568831SAndroid Build Coastguard Worker 
3182*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_DEBUG_ENABLED */
3183*7c568831SAndroid Build Coastguard Worker #endif /* XPATH */
3184*7c568831SAndroid Build Coastguard Worker /************************************************************************
3185*7c568831SAndroid Build Coastguard Worker  *									*
3186*7c568831SAndroid Build Coastguard Worker  *			URI based tests					*
3187*7c568831SAndroid Build Coastguard Worker  *									*
3188*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
3189*7c568831SAndroid Build Coastguard Worker 
3190*7c568831SAndroid Build Coastguard Worker static void
handleURI(const char * str,const char * base,FILE * o)3191*7c568831SAndroid Build Coastguard Worker handleURI(const char *str, const char *base, FILE *o) {
3192*7c568831SAndroid Build Coastguard Worker     int ret;
3193*7c568831SAndroid Build Coastguard Worker     xmlURIPtr uri;
3194*7c568831SAndroid Build Coastguard Worker     xmlChar *res = NULL;
3195*7c568831SAndroid Build Coastguard Worker 
3196*7c568831SAndroid Build Coastguard Worker     uri = xmlCreateURI();
3197*7c568831SAndroid Build Coastguard Worker 
3198*7c568831SAndroid Build Coastguard Worker     if (base == NULL) {
3199*7c568831SAndroid Build Coastguard Worker 	ret = xmlParseURIReference(uri, str);
3200*7c568831SAndroid Build Coastguard Worker 	if (ret != 0)
3201*7c568831SAndroid Build Coastguard Worker 	    fprintf(o, "%s : error %d\n", str, ret);
3202*7c568831SAndroid Build Coastguard Worker 	else {
3203*7c568831SAndroid Build Coastguard Worker 	    xmlNormalizeURIPath(uri->path);
3204*7c568831SAndroid Build Coastguard Worker 	    xmlPrintURI(o, uri);
3205*7c568831SAndroid Build Coastguard Worker 	    fprintf(o, "\n");
3206*7c568831SAndroid Build Coastguard Worker 	}
3207*7c568831SAndroid Build Coastguard Worker     } else {
3208*7c568831SAndroid Build Coastguard Worker 	res = xmlBuildURI((xmlChar *)str, (xmlChar *) base);
3209*7c568831SAndroid Build Coastguard Worker 	if (res != NULL) {
3210*7c568831SAndroid Build Coastguard Worker 	    fprintf(o, "%s\n", (char *) res);
3211*7c568831SAndroid Build Coastguard Worker 	}
3212*7c568831SAndroid Build Coastguard Worker 	else
3213*7c568831SAndroid Build Coastguard Worker 	    fprintf(o, "::ERROR::\n");
3214*7c568831SAndroid Build Coastguard Worker     }
3215*7c568831SAndroid Build Coastguard Worker     if (res != NULL)
3216*7c568831SAndroid Build Coastguard Worker 	xmlFree(res);
3217*7c568831SAndroid Build Coastguard Worker     xmlFreeURI(uri);
3218*7c568831SAndroid Build Coastguard Worker }
3219*7c568831SAndroid Build Coastguard Worker 
3220*7c568831SAndroid Build Coastguard Worker /**
3221*7c568831SAndroid Build Coastguard Worker  * uriCommonTest:
3222*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
3223*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3224*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3225*7c568831SAndroid Build Coastguard Worker  *
3226*7c568831SAndroid Build Coastguard Worker  * Parse a file containing URI and check for errors
3227*7c568831SAndroid Build Coastguard Worker  *
3228*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3229*7c568831SAndroid Build Coastguard Worker  */
3230*7c568831SAndroid Build Coastguard Worker static int
uriCommonTest(const char * filename,const char * result,const char * err,const char * base)3231*7c568831SAndroid Build Coastguard Worker uriCommonTest(const char *filename,
3232*7c568831SAndroid Build Coastguard Worker              const char *result,
3233*7c568831SAndroid Build Coastguard Worker              const char *err,
3234*7c568831SAndroid Build Coastguard Worker              const char *base) {
3235*7c568831SAndroid Build Coastguard Worker     char *temp;
3236*7c568831SAndroid Build Coastguard Worker     FILE *o, *f;
3237*7c568831SAndroid Build Coastguard Worker     char str[1024];
3238*7c568831SAndroid Build Coastguard Worker     int res = 0, i, ret;
3239*7c568831SAndroid Build Coastguard Worker 
3240*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, temp_directory, ".res");
3241*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
3242*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Out of memory\n");
3243*7c568831SAndroid Build Coastguard Worker         fatalError();
3244*7c568831SAndroid Build Coastguard Worker     }
3245*7c568831SAndroid Build Coastguard Worker     o = fopen(temp, "wb");
3246*7c568831SAndroid Build Coastguard Worker     if (o == NULL) {
3247*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "failed to open output file %s\n", temp);
3248*7c568831SAndroid Build Coastguard Worker         free(temp);
3249*7c568831SAndroid Build Coastguard Worker 	return(-1);
3250*7c568831SAndroid Build Coastguard Worker     }
3251*7c568831SAndroid Build Coastguard Worker     f = fopen(filename, "rb");
3252*7c568831SAndroid Build Coastguard Worker     if (f == NULL) {
3253*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "failed to open input file %s\n", filename);
3254*7c568831SAndroid Build Coastguard Worker 	fclose(o);
3255*7c568831SAndroid Build Coastguard Worker         if (temp != NULL) {
3256*7c568831SAndroid Build Coastguard Worker             unlink(temp);
3257*7c568831SAndroid Build Coastguard Worker             free(temp);
3258*7c568831SAndroid Build Coastguard Worker         }
3259*7c568831SAndroid Build Coastguard Worker 	return(-1);
3260*7c568831SAndroid Build Coastguard Worker     }
3261*7c568831SAndroid Build Coastguard Worker 
3262*7c568831SAndroid Build Coastguard Worker     while (1) {
3263*7c568831SAndroid Build Coastguard Worker 	/*
3264*7c568831SAndroid Build Coastguard Worker 	 * read one line in string buffer.
3265*7c568831SAndroid Build Coastguard Worker 	 */
3266*7c568831SAndroid Build Coastguard Worker 	if (fgets (&str[0], sizeof (str) - 1, f) == NULL)
3267*7c568831SAndroid Build Coastguard Worker 	   break;
3268*7c568831SAndroid Build Coastguard Worker 
3269*7c568831SAndroid Build Coastguard Worker 	/*
3270*7c568831SAndroid Build Coastguard Worker 	 * remove the ending spaces
3271*7c568831SAndroid Build Coastguard Worker 	 */
3272*7c568831SAndroid Build Coastguard Worker 	i = strlen(str);
3273*7c568831SAndroid Build Coastguard Worker 	while ((i > 0) &&
3274*7c568831SAndroid Build Coastguard Worker 	       ((str[i - 1] == '\n') || (str[i - 1] == '\r') ||
3275*7c568831SAndroid Build Coastguard Worker 		(str[i - 1] == ' ') || (str[i - 1] == '\t'))) {
3276*7c568831SAndroid Build Coastguard Worker 	    i--;
3277*7c568831SAndroid Build Coastguard Worker 	    str[i] = 0;
3278*7c568831SAndroid Build Coastguard Worker 	}
3279*7c568831SAndroid Build Coastguard Worker 	nb_tests++;
3280*7c568831SAndroid Build Coastguard Worker 	handleURI(str, base, o);
3281*7c568831SAndroid Build Coastguard Worker     }
3282*7c568831SAndroid Build Coastguard Worker 
3283*7c568831SAndroid Build Coastguard Worker     fclose(f);
3284*7c568831SAndroid Build Coastguard Worker     fclose(o);
3285*7c568831SAndroid Build Coastguard Worker 
3286*7c568831SAndroid Build Coastguard Worker     if (result != NULL) {
3287*7c568831SAndroid Build Coastguard Worker 	ret = compareFiles(temp, result);
3288*7c568831SAndroid Build Coastguard Worker 	if (ret) {
3289*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Result for %s failed in %s\n", filename, result);
3290*7c568831SAndroid Build Coastguard Worker 	    res = 1;
3291*7c568831SAndroid Build Coastguard Worker 	}
3292*7c568831SAndroid Build Coastguard Worker     }
3293*7c568831SAndroid Build Coastguard Worker     if (err != NULL) {
3294*7c568831SAndroid Build Coastguard Worker 	ret = compareFileMem(err, testErrors, testErrorsSize);
3295*7c568831SAndroid Build Coastguard Worker 	if (ret != 0) {
3296*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Error for %s failed\n", filename);
3297*7c568831SAndroid Build Coastguard Worker 	    res = 1;
3298*7c568831SAndroid Build Coastguard Worker 	}
3299*7c568831SAndroid Build Coastguard Worker     }
3300*7c568831SAndroid Build Coastguard Worker 
3301*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
3302*7c568831SAndroid Build Coastguard Worker         unlink(temp);
3303*7c568831SAndroid Build Coastguard Worker         free(temp);
3304*7c568831SAndroid Build Coastguard Worker     }
3305*7c568831SAndroid Build Coastguard Worker     return(res);
3306*7c568831SAndroid Build Coastguard Worker }
3307*7c568831SAndroid Build Coastguard Worker 
3308*7c568831SAndroid Build Coastguard Worker /**
3309*7c568831SAndroid Build Coastguard Worker  * uriParseTest:
3310*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
3311*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3312*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3313*7c568831SAndroid Build Coastguard Worker  *
3314*7c568831SAndroid Build Coastguard Worker  * Parse a file containing URI and check for errors
3315*7c568831SAndroid Build Coastguard Worker  *
3316*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3317*7c568831SAndroid Build Coastguard Worker  */
3318*7c568831SAndroid Build Coastguard Worker static int
uriParseTest(const char * filename,const char * result,const char * err,int options ATTRIBUTE_UNUSED)3319*7c568831SAndroid Build Coastguard Worker uriParseTest(const char *filename,
3320*7c568831SAndroid Build Coastguard Worker              const char *result,
3321*7c568831SAndroid Build Coastguard Worker              const char *err,
3322*7c568831SAndroid Build Coastguard Worker              int options ATTRIBUTE_UNUSED) {
3323*7c568831SAndroid Build Coastguard Worker     return(uriCommonTest(filename, result, err, NULL));
3324*7c568831SAndroid Build Coastguard Worker }
3325*7c568831SAndroid Build Coastguard Worker 
3326*7c568831SAndroid Build Coastguard Worker /**
3327*7c568831SAndroid Build Coastguard Worker  * uriBaseTest:
3328*7c568831SAndroid Build Coastguard Worker  * @filename: the file to parse
3329*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3330*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3331*7c568831SAndroid Build Coastguard Worker  *
3332*7c568831SAndroid Build Coastguard Worker  * Parse a file containing URI, compose them against a fixed base and
3333*7c568831SAndroid Build Coastguard Worker  * check for errors
3334*7c568831SAndroid Build Coastguard Worker  *
3335*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3336*7c568831SAndroid Build Coastguard Worker  */
3337*7c568831SAndroid Build Coastguard Worker static int
uriBaseTest(const char * filename,const char * result,const char * err,int options ATTRIBUTE_UNUSED)3338*7c568831SAndroid Build Coastguard Worker uriBaseTest(const char *filename,
3339*7c568831SAndroid Build Coastguard Worker              const char *result,
3340*7c568831SAndroid Build Coastguard Worker              const char *err,
3341*7c568831SAndroid Build Coastguard Worker              int options ATTRIBUTE_UNUSED) {
3342*7c568831SAndroid Build Coastguard Worker     return(uriCommonTest(filename, result, err,
3343*7c568831SAndroid Build Coastguard Worker                          "http://foo.com/path/to/index.html?orig#help"));
3344*7c568831SAndroid Build Coastguard Worker }
3345*7c568831SAndroid Build Coastguard Worker 
3346*7c568831SAndroid Build Coastguard Worker static int urip_success = 1;
3347*7c568831SAndroid Build Coastguard Worker static int urip_current = 0;
3348*7c568831SAndroid Build Coastguard Worker static const char *urip_testURLs[] = {
3349*7c568831SAndroid Build Coastguard Worker     "urip://example.com/a b.html",
3350*7c568831SAndroid Build Coastguard Worker     "urip://example.com/a%20b.html",
3351*7c568831SAndroid Build Coastguard Worker     "file:///path/to/a b.html",
3352*7c568831SAndroid Build Coastguard Worker     "file:///path/to/a%20b.html",
3353*7c568831SAndroid Build Coastguard Worker     "/path/to/a b.html",
3354*7c568831SAndroid Build Coastguard Worker     "/path/to/a%20b.html",
3355*7c568831SAndroid Build Coastguard Worker     "urip://example.com/r" "\xe9" "sum" "\xe9" ".html",
3356*7c568831SAndroid Build Coastguard Worker     "urip://example.com/test?a=1&b=2%263&c=4#foo",
3357*7c568831SAndroid Build Coastguard Worker     NULL
3358*7c568831SAndroid Build Coastguard Worker };
3359*7c568831SAndroid Build Coastguard Worker static const char *urip_rcvsURLs[] = {
3360*7c568831SAndroid Build Coastguard Worker     /* it is an URI the strings must be escaped */
3361*7c568831SAndroid Build Coastguard Worker     "urip://example.com/a%20b.html",
3362*7c568831SAndroid Build Coastguard Worker     /* check that % escaping is not broken */
3363*7c568831SAndroid Build Coastguard Worker     "urip://example.com/a%20b.html",
3364*7c568831SAndroid Build Coastguard Worker     /* it's an URI path the strings must be escaped */
3365*7c568831SAndroid Build Coastguard Worker     "file:///path/to/a%20b.html",
3366*7c568831SAndroid Build Coastguard Worker     /* check that % escaping is not broken */
3367*7c568831SAndroid Build Coastguard Worker     "file:///path/to/a%20b.html",
3368*7c568831SAndroid Build Coastguard Worker     /* this is not an URI, this is a path, so this should not be escaped */
3369*7c568831SAndroid Build Coastguard Worker     "/path/to/a b.html",
3370*7c568831SAndroid Build Coastguard Worker     /* check that paths with % are not broken */
3371*7c568831SAndroid Build Coastguard Worker     "/path/to/a%20b.html",
3372*7c568831SAndroid Build Coastguard Worker     /* out of context the encoding can't be guessed byte by byte conversion */
3373*7c568831SAndroid Build Coastguard Worker     "urip://example.com/r%E9sum%E9.html",
3374*7c568831SAndroid Build Coastguard Worker     /* verify we don't destroy URIs especially the query part */
3375*7c568831SAndroid Build Coastguard Worker     "urip://example.com/test?a=1&b=2%263&c=4#foo",
3376*7c568831SAndroid Build Coastguard Worker     NULL
3377*7c568831SAndroid Build Coastguard Worker };
3378*7c568831SAndroid Build Coastguard Worker static const char *urip_res = "<list/>";
3379*7c568831SAndroid Build Coastguard Worker static const char *urip_cur = NULL;
3380*7c568831SAndroid Build Coastguard Worker static int urip_rlen;
3381*7c568831SAndroid Build Coastguard Worker 
3382*7c568831SAndroid Build Coastguard Worker /**
3383*7c568831SAndroid Build Coastguard Worker  * uripMatch:
3384*7c568831SAndroid Build Coastguard Worker  * @URI: an URI to test
3385*7c568831SAndroid Build Coastguard Worker  *
3386*7c568831SAndroid Build Coastguard Worker  * Check for an urip: query
3387*7c568831SAndroid Build Coastguard Worker  *
3388*7c568831SAndroid Build Coastguard Worker  * Returns 1 if yes and 0 if another Input module should be used
3389*7c568831SAndroid Build Coastguard Worker  */
3390*7c568831SAndroid Build Coastguard Worker static int
uripMatch(const char * URI)3391*7c568831SAndroid Build Coastguard Worker uripMatch(const char * URI) {
3392*7c568831SAndroid Build Coastguard Worker     if ((URI == NULL) || (!strcmp(URI, "file://" SYSCONFDIR "/xml/catalog")))
3393*7c568831SAndroid Build Coastguard Worker         return(0);
3394*7c568831SAndroid Build Coastguard Worker     /* Verify we received the escaped URL */
3395*7c568831SAndroid Build Coastguard Worker     if (strcmp(urip_rcvsURLs[urip_current], URI))
3396*7c568831SAndroid Build Coastguard Worker 	urip_success = 0;
3397*7c568831SAndroid Build Coastguard Worker     return(1);
3398*7c568831SAndroid Build Coastguard Worker }
3399*7c568831SAndroid Build Coastguard Worker 
3400*7c568831SAndroid Build Coastguard Worker /**
3401*7c568831SAndroid Build Coastguard Worker  * uripOpen:
3402*7c568831SAndroid Build Coastguard Worker  * @URI: an URI to test
3403*7c568831SAndroid Build Coastguard Worker  *
3404*7c568831SAndroid Build Coastguard Worker  * Return a pointer to the urip: query handler, in this example simply
3405*7c568831SAndroid Build Coastguard Worker  * the urip_current pointer...
3406*7c568831SAndroid Build Coastguard Worker  *
3407*7c568831SAndroid Build Coastguard Worker  * Returns an Input context or NULL in case or error
3408*7c568831SAndroid Build Coastguard Worker  */
3409*7c568831SAndroid Build Coastguard Worker static void *
uripOpen(const char * URI)3410*7c568831SAndroid Build Coastguard Worker uripOpen(const char * URI) {
3411*7c568831SAndroid Build Coastguard Worker     if ((URI == NULL) || (!strcmp(URI, "file://" SYSCONFDIR "/xml/catalog")))
3412*7c568831SAndroid Build Coastguard Worker         return(NULL);
3413*7c568831SAndroid Build Coastguard Worker     /* Verify we received the escaped URL */
3414*7c568831SAndroid Build Coastguard Worker     if (strcmp(urip_rcvsURLs[urip_current], URI))
3415*7c568831SAndroid Build Coastguard Worker 	urip_success = 0;
3416*7c568831SAndroid Build Coastguard Worker     urip_cur = urip_res;
3417*7c568831SAndroid Build Coastguard Worker     urip_rlen = strlen(urip_res);
3418*7c568831SAndroid Build Coastguard Worker     return((void *) urip_cur);
3419*7c568831SAndroid Build Coastguard Worker }
3420*7c568831SAndroid Build Coastguard Worker 
3421*7c568831SAndroid Build Coastguard Worker /**
3422*7c568831SAndroid Build Coastguard Worker  * uripClose:
3423*7c568831SAndroid Build Coastguard Worker  * @context: the read context
3424*7c568831SAndroid Build Coastguard Worker  *
3425*7c568831SAndroid Build Coastguard Worker  * Close the urip: query handler
3426*7c568831SAndroid Build Coastguard Worker  *
3427*7c568831SAndroid Build Coastguard Worker  * Returns 0 or -1 in case of error
3428*7c568831SAndroid Build Coastguard Worker  */
3429*7c568831SAndroid Build Coastguard Worker static int
uripClose(void * context)3430*7c568831SAndroid Build Coastguard Worker uripClose(void * context) {
3431*7c568831SAndroid Build Coastguard Worker     if (context == NULL) return(-1);
3432*7c568831SAndroid Build Coastguard Worker     urip_cur = NULL;
3433*7c568831SAndroid Build Coastguard Worker     urip_rlen = 0;
3434*7c568831SAndroid Build Coastguard Worker     return(0);
3435*7c568831SAndroid Build Coastguard Worker }
3436*7c568831SAndroid Build Coastguard Worker 
3437*7c568831SAndroid Build Coastguard Worker /**
3438*7c568831SAndroid Build Coastguard Worker  * uripRead:
3439*7c568831SAndroid Build Coastguard Worker  * @context: the read context
3440*7c568831SAndroid Build Coastguard Worker  * @buffer: where to store data
3441*7c568831SAndroid Build Coastguard Worker  * @len: number of bytes to read
3442*7c568831SAndroid Build Coastguard Worker  *
3443*7c568831SAndroid Build Coastguard Worker  * Implement an urip: query read.
3444*7c568831SAndroid Build Coastguard Worker  *
3445*7c568831SAndroid Build Coastguard Worker  * Returns the number of bytes read or -1 in case of error
3446*7c568831SAndroid Build Coastguard Worker  */
3447*7c568831SAndroid Build Coastguard Worker static int
uripRead(void * context,char * buffer,int len)3448*7c568831SAndroid Build Coastguard Worker uripRead(void * context, char * buffer, int len) {
3449*7c568831SAndroid Build Coastguard Worker    const char *ptr = (const char *) context;
3450*7c568831SAndroid Build Coastguard Worker 
3451*7c568831SAndroid Build Coastguard Worker    if ((context == NULL) || (buffer == NULL) || (len < 0))
3452*7c568831SAndroid Build Coastguard Worker        return(-1);
3453*7c568831SAndroid Build Coastguard Worker 
3454*7c568831SAndroid Build Coastguard Worker    if (len > urip_rlen) len = urip_rlen;
3455*7c568831SAndroid Build Coastguard Worker    memcpy(buffer, ptr, len);
3456*7c568831SAndroid Build Coastguard Worker    urip_rlen -= len;
3457*7c568831SAndroid Build Coastguard Worker    return(len);
3458*7c568831SAndroid Build Coastguard Worker }
3459*7c568831SAndroid Build Coastguard Worker 
3460*7c568831SAndroid Build Coastguard Worker static int
urip_checkURL(const char * URL)3461*7c568831SAndroid Build Coastguard Worker urip_checkURL(const char *URL) {
3462*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
3463*7c568831SAndroid Build Coastguard Worker 
3464*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(URL, NULL, 0);
3465*7c568831SAndroid Build Coastguard Worker     if (doc == NULL)
3466*7c568831SAndroid Build Coastguard Worker         return(-1);
3467*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
3468*7c568831SAndroid Build Coastguard Worker     return(1);
3469*7c568831SAndroid Build Coastguard Worker }
3470*7c568831SAndroid Build Coastguard Worker 
3471*7c568831SAndroid Build Coastguard Worker /**
3472*7c568831SAndroid Build Coastguard Worker  * uriPathTest:
3473*7c568831SAndroid Build Coastguard Worker  * @filename: ignored
3474*7c568831SAndroid Build Coastguard Worker  * @result: ignored
3475*7c568831SAndroid Build Coastguard Worker  * @err: ignored
3476*7c568831SAndroid Build Coastguard Worker  *
3477*7c568831SAndroid Build Coastguard Worker  * Run a set of tests to check how Path and URI are handled before
3478*7c568831SAndroid Build Coastguard Worker  * being passed to the I/O layer
3479*7c568831SAndroid Build Coastguard Worker  *
3480*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3481*7c568831SAndroid Build Coastguard Worker  */
3482*7c568831SAndroid Build Coastguard Worker static int
uriPathTest(const char * filename ATTRIBUTE_UNUSED,const char * result ATTRIBUTE_UNUSED,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)3483*7c568831SAndroid Build Coastguard Worker uriPathTest(const char *filename ATTRIBUTE_UNUSED,
3484*7c568831SAndroid Build Coastguard Worker              const char *result ATTRIBUTE_UNUSED,
3485*7c568831SAndroid Build Coastguard Worker              const char *err ATTRIBUTE_UNUSED,
3486*7c568831SAndroid Build Coastguard Worker              int options ATTRIBUTE_UNUSED) {
3487*7c568831SAndroid Build Coastguard Worker     int parsed;
3488*7c568831SAndroid Build Coastguard Worker     int failures = 0;
3489*7c568831SAndroid Build Coastguard Worker 
3490*7c568831SAndroid Build Coastguard Worker     /*
3491*7c568831SAndroid Build Coastguard Worker      * register the new I/O handlers
3492*7c568831SAndroid Build Coastguard Worker      */
3493*7c568831SAndroid Build Coastguard Worker     if (xmlRegisterInputCallbacks(uripMatch, uripOpen, uripRead, uripClose) < 0)
3494*7c568831SAndroid Build Coastguard Worker     {
3495*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "failed to register HTTP handler\n");
3496*7c568831SAndroid Build Coastguard Worker 	return(-1);
3497*7c568831SAndroid Build Coastguard Worker     }
3498*7c568831SAndroid Build Coastguard Worker 
3499*7c568831SAndroid Build Coastguard Worker     for (urip_current = 0;urip_testURLs[urip_current] != NULL;urip_current++) {
3500*7c568831SAndroid Build Coastguard Worker         urip_success = 1;
3501*7c568831SAndroid Build Coastguard Worker         parsed = urip_checkURL(urip_testURLs[urip_current]);
3502*7c568831SAndroid Build Coastguard Worker 	if (urip_success != 1) {
3503*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "failed the URL passing test for %s",
3504*7c568831SAndroid Build Coastguard Worker 	            urip_testURLs[urip_current]);
3505*7c568831SAndroid Build Coastguard Worker 	    failures++;
3506*7c568831SAndroid Build Coastguard Worker 	} else if (parsed != 1) {
3507*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "failed the parsing test for %s",
3508*7c568831SAndroid Build Coastguard Worker 	            urip_testURLs[urip_current]);
3509*7c568831SAndroid Build Coastguard Worker 	    failures++;
3510*7c568831SAndroid Build Coastguard Worker 	}
3511*7c568831SAndroid Build Coastguard Worker 	nb_tests++;
3512*7c568831SAndroid Build Coastguard Worker     }
3513*7c568831SAndroid Build Coastguard Worker 
3514*7c568831SAndroid Build Coastguard Worker     xmlPopInputCallbacks();
3515*7c568831SAndroid Build Coastguard Worker     return(failures);
3516*7c568831SAndroid Build Coastguard Worker }
3517*7c568831SAndroid Build Coastguard Worker 
3518*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
3519*7c568831SAndroid Build Coastguard Worker /************************************************************************
3520*7c568831SAndroid Build Coastguard Worker  *									*
3521*7c568831SAndroid Build Coastguard Worker  *			Schemas tests					*
3522*7c568831SAndroid Build Coastguard Worker  *									*
3523*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
3524*7c568831SAndroid Build Coastguard Worker static int
schemasOneTest(const char * sch,const char * filename,const char * err,int options,xmlSchemaPtr schemas)3525*7c568831SAndroid Build Coastguard Worker schemasOneTest(const char *sch,
3526*7c568831SAndroid Build Coastguard Worker                const char *filename,
3527*7c568831SAndroid Build Coastguard Worker                const char *err,
3528*7c568831SAndroid Build Coastguard Worker 	       int options,
3529*7c568831SAndroid Build Coastguard Worker 	       xmlSchemaPtr schemas) {
3530*7c568831SAndroid Build Coastguard Worker     int ret = 0;
3531*7c568831SAndroid Build Coastguard Worker     int i;
3532*7c568831SAndroid Build Coastguard Worker     int parseErrorsSize = testErrorsSize;
3533*7c568831SAndroid Build Coastguard Worker 
3534*7c568831SAndroid Build Coastguard Worker     /*
3535*7c568831SAndroid Build Coastguard Worker      * Test both memory and streaming validation.
3536*7c568831SAndroid Build Coastguard Worker      */
3537*7c568831SAndroid Build Coastguard Worker     for (i = 0; i < 2; i++) {
3538*7c568831SAndroid Build Coastguard Worker         xmlSchemaValidCtxtPtr ctxt;
3539*7c568831SAndroid Build Coastguard Worker         int validResult = 0;
3540*7c568831SAndroid Build Coastguard Worker 
3541*7c568831SAndroid Build Coastguard Worker         testErrorsSize = parseErrorsSize;
3542*7c568831SAndroid Build Coastguard Worker         testErrors[parseErrorsSize] = 0;
3543*7c568831SAndroid Build Coastguard Worker 
3544*7c568831SAndroid Build Coastguard Worker         if (schemas == NULL)
3545*7c568831SAndroid Build Coastguard Worker             goto done;
3546*7c568831SAndroid Build Coastguard Worker 
3547*7c568831SAndroid Build Coastguard Worker         ctxt = xmlSchemaNewValidCtxt(schemas);
3548*7c568831SAndroid Build Coastguard Worker         xmlSchemaSetValidStructuredErrors(ctxt, testStructuredErrorHandler,
3549*7c568831SAndroid Build Coastguard Worker                                           NULL);
3550*7c568831SAndroid Build Coastguard Worker 
3551*7c568831SAndroid Build Coastguard Worker         if (i == 0) {
3552*7c568831SAndroid Build Coastguard Worker             xmlDocPtr doc;
3553*7c568831SAndroid Build Coastguard Worker 
3554*7c568831SAndroid Build Coastguard Worker             doc = xmlReadFile(filename, NULL, options);
3555*7c568831SAndroid Build Coastguard Worker             if (doc == NULL) {
3556*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "failed to parse instance %s for %s\n", filename, sch);
3557*7c568831SAndroid Build Coastguard Worker                 return(-1);
3558*7c568831SAndroid Build Coastguard Worker             }
3559*7c568831SAndroid Build Coastguard Worker             validResult = xmlSchemaValidateDoc(ctxt, doc);
3560*7c568831SAndroid Build Coastguard Worker             xmlFreeDoc(doc);
3561*7c568831SAndroid Build Coastguard Worker         } else {
3562*7c568831SAndroid Build Coastguard Worker             validResult = xmlSchemaValidateFile(ctxt, filename, options);
3563*7c568831SAndroid Build Coastguard Worker         }
3564*7c568831SAndroid Build Coastguard Worker 
3565*7c568831SAndroid Build Coastguard Worker         if (validResult == 0) {
3566*7c568831SAndroid Build Coastguard Worker             testErrorHandler(NULL, "%s validates\n", filename);
3567*7c568831SAndroid Build Coastguard Worker         } else if (validResult > 0) {
3568*7c568831SAndroid Build Coastguard Worker             testErrorHandler(NULL, "%s fails to validate\n", filename);
3569*7c568831SAndroid Build Coastguard Worker         } else {
3570*7c568831SAndroid Build Coastguard Worker             testErrorHandler(NULL, "%s validation generated an internal "
3571*7c568831SAndroid Build Coastguard Worker                              "error\n", filename);
3572*7c568831SAndroid Build Coastguard Worker         }
3573*7c568831SAndroid Build Coastguard Worker 
3574*7c568831SAndroid Build Coastguard Worker         xmlSchemaFreeValidCtxt(ctxt);
3575*7c568831SAndroid Build Coastguard Worker 
3576*7c568831SAndroid Build Coastguard Worker done:
3577*7c568831SAndroid Build Coastguard Worker         if (compareFileMem(err, testErrors, testErrorsSize)) {
3578*7c568831SAndroid Build Coastguard Worker             fprintf(stderr, "Error for %s on %s failed\n", filename, sch);
3579*7c568831SAndroid Build Coastguard Worker             ret = 1;
3580*7c568831SAndroid Build Coastguard Worker         }
3581*7c568831SAndroid Build Coastguard Worker     }
3582*7c568831SAndroid Build Coastguard Worker 
3583*7c568831SAndroid Build Coastguard Worker     return(ret);
3584*7c568831SAndroid Build Coastguard Worker }
3585*7c568831SAndroid Build Coastguard Worker /**
3586*7c568831SAndroid Build Coastguard Worker  * schemasTest:
3587*7c568831SAndroid Build Coastguard Worker  * @filename: the schemas file
3588*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3589*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3590*7c568831SAndroid Build Coastguard Worker  *
3591*7c568831SAndroid Build Coastguard Worker  * Parse a file containing URI, compose them against a fixed base and
3592*7c568831SAndroid Build Coastguard Worker  * check for errors
3593*7c568831SAndroid Build Coastguard Worker  *
3594*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3595*7c568831SAndroid Build Coastguard Worker  */
3596*7c568831SAndroid Build Coastguard Worker static int
schemasTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * errr ATTRIBUTE_UNUSED,int options)3597*7c568831SAndroid Build Coastguard Worker schemasTest(const char *filename,
3598*7c568831SAndroid Build Coastguard Worker             const char *resul ATTRIBUTE_UNUSED,
3599*7c568831SAndroid Build Coastguard Worker             const char *errr ATTRIBUTE_UNUSED,
3600*7c568831SAndroid Build Coastguard Worker             int options) {
3601*7c568831SAndroid Build Coastguard Worker     const char *base = baseFilename(filename);
3602*7c568831SAndroid Build Coastguard Worker     const char *base2;
3603*7c568831SAndroid Build Coastguard Worker     const char *instance;
3604*7c568831SAndroid Build Coastguard Worker     xmlSchemaParserCtxtPtr ctxt;
3605*7c568831SAndroid Build Coastguard Worker     xmlSchemaPtr schemas;
3606*7c568831SAndroid Build Coastguard Worker     int res = 0, len, ret;
3607*7c568831SAndroid Build Coastguard Worker     int parseErrorsSize;
3608*7c568831SAndroid Build Coastguard Worker     char pattern[500];
3609*7c568831SAndroid Build Coastguard Worker     char prefix[500];
3610*7c568831SAndroid Build Coastguard Worker     char err[500];
3611*7c568831SAndroid Build Coastguard Worker     glob_t globbuf;
3612*7c568831SAndroid Build Coastguard Worker     size_t i;
3613*7c568831SAndroid Build Coastguard Worker     char count = 0;
3614*7c568831SAndroid Build Coastguard Worker 
3615*7c568831SAndroid Build Coastguard Worker     /* first compile the schemas if possible */
3616*7c568831SAndroid Build Coastguard Worker     ctxt = xmlSchemaNewParserCtxt(filename);
3617*7c568831SAndroid Build Coastguard Worker     xmlSchemaSetParserStructuredErrors(ctxt, testStructuredErrorHandler, NULL);
3618*7c568831SAndroid Build Coastguard Worker     schemas = xmlSchemaParse(ctxt);
3619*7c568831SAndroid Build Coastguard Worker     xmlSchemaFreeParserCtxt(ctxt);
3620*7c568831SAndroid Build Coastguard Worker     parseErrorsSize = testErrorsSize;
3621*7c568831SAndroid Build Coastguard Worker 
3622*7c568831SAndroid Build Coastguard Worker     /*
3623*7c568831SAndroid Build Coastguard Worker      * most of the mess is about the output filenames generated by the Makefile
3624*7c568831SAndroid Build Coastguard Worker      */
3625*7c568831SAndroid Build Coastguard Worker     len = strlen(base);
3626*7c568831SAndroid Build Coastguard Worker     if ((len > 499) || (len < 5)) {
3627*7c568831SAndroid Build Coastguard Worker         xmlSchemaFree(schemas);
3628*7c568831SAndroid Build Coastguard Worker 	return(-1);
3629*7c568831SAndroid Build Coastguard Worker     }
3630*7c568831SAndroid Build Coastguard Worker     len -= 4; /* remove trailing .xsd */
3631*7c568831SAndroid Build Coastguard Worker     if (base[len - 2] == '_') {
3632*7c568831SAndroid Build Coastguard Worker         len -= 2; /* remove subtest number */
3633*7c568831SAndroid Build Coastguard Worker     }
3634*7c568831SAndroid Build Coastguard Worker     if (base[len - 2] == '_') {
3635*7c568831SAndroid Build Coastguard Worker         len -= 2; /* remove subtest number */
3636*7c568831SAndroid Build Coastguard Worker     }
3637*7c568831SAndroid Build Coastguard Worker     memcpy(prefix, base, len);
3638*7c568831SAndroid Build Coastguard Worker     prefix[len] = 0;
3639*7c568831SAndroid Build Coastguard Worker 
3640*7c568831SAndroid Build Coastguard Worker     if (snprintf(pattern, 499, "./test/schemas/%s_*.xml", prefix) >= 499)
3641*7c568831SAndroid Build Coastguard Worker         pattern[499] = 0;
3642*7c568831SAndroid Build Coastguard Worker 
3643*7c568831SAndroid Build Coastguard Worker     if (base[len] == '_') {
3644*7c568831SAndroid Build Coastguard Worker         len += 2;
3645*7c568831SAndroid Build Coastguard Worker 	memcpy(prefix, base, len);
3646*7c568831SAndroid Build Coastguard Worker 	prefix[len] = 0;
3647*7c568831SAndroid Build Coastguard Worker     }
3648*7c568831SAndroid Build Coastguard Worker 
3649*7c568831SAndroid Build Coastguard Worker     globbuf.gl_offs = 0;
3650*7c568831SAndroid Build Coastguard Worker     glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
3651*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < globbuf.gl_pathc;i++) {
3652*7c568831SAndroid Build Coastguard Worker         testErrorsSize = parseErrorsSize;
3653*7c568831SAndroid Build Coastguard Worker         testErrors[parseErrorsSize] = 0;
3654*7c568831SAndroid Build Coastguard Worker         instance = globbuf.gl_pathv[i];
3655*7c568831SAndroid Build Coastguard Worker 	base2 = baseFilename(instance);
3656*7c568831SAndroid Build Coastguard Worker 	len = strlen(base2);
3657*7c568831SAndroid Build Coastguard Worker 	if ((len > 6) && (base2[len - 6] == '_')) {
3658*7c568831SAndroid Build Coastguard Worker 	    count = base2[len - 5];
3659*7c568831SAndroid Build Coastguard Worker 	    ret = snprintf(err, 499, "result/schemas/%s_%c.err",
3660*7c568831SAndroid Build Coastguard Worker 		     prefix, count);
3661*7c568831SAndroid Build Coastguard Worker             if (ret >= 499)
3662*7c568831SAndroid Build Coastguard Worker 	        err[499] = 0;
3663*7c568831SAndroid Build Coastguard Worker 	} else {
3664*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "don't know how to process %s\n", instance);
3665*7c568831SAndroid Build Coastguard Worker 	    continue;
3666*7c568831SAndroid Build Coastguard Worker 	}
3667*7c568831SAndroid Build Coastguard Worker 
3668*7c568831SAndroid Build Coastguard Worker         nb_tests++;
3669*7c568831SAndroid Build Coastguard Worker         ret = schemasOneTest(filename, instance, err, options, schemas);
3670*7c568831SAndroid Build Coastguard Worker         if (ret != 0)
3671*7c568831SAndroid Build Coastguard Worker             res = ret;
3672*7c568831SAndroid Build Coastguard Worker     }
3673*7c568831SAndroid Build Coastguard Worker     globfree(&globbuf);
3674*7c568831SAndroid Build Coastguard Worker     xmlSchemaFree(schemas);
3675*7c568831SAndroid Build Coastguard Worker 
3676*7c568831SAndroid Build Coastguard Worker     return(res);
3677*7c568831SAndroid Build Coastguard Worker }
3678*7c568831SAndroid Build Coastguard Worker 
3679*7c568831SAndroid Build Coastguard Worker /************************************************************************
3680*7c568831SAndroid Build Coastguard Worker  *									*
3681*7c568831SAndroid Build Coastguard Worker  *			Schemas tests					*
3682*7c568831SAndroid Build Coastguard Worker  *									*
3683*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
3684*7c568831SAndroid Build Coastguard Worker static int
rngOneTest(const char * sch,const char * filename,int options,xmlRelaxNGPtr schemas)3685*7c568831SAndroid Build Coastguard Worker rngOneTest(const char *sch,
3686*7c568831SAndroid Build Coastguard Worker                const char *filename,
3687*7c568831SAndroid Build Coastguard Worker 	       int options,
3688*7c568831SAndroid Build Coastguard Worker 	       xmlRelaxNGPtr schemas) {
3689*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
3690*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGValidCtxtPtr ctxt;
3691*7c568831SAndroid Build Coastguard Worker     int ret = 0;
3692*7c568831SAndroid Build Coastguard Worker 
3693*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL, options);
3694*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
3695*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "failed to parse instance %s for %s\n", filename, sch);
3696*7c568831SAndroid Build Coastguard Worker 	return(-1);
3697*7c568831SAndroid Build Coastguard Worker     }
3698*7c568831SAndroid Build Coastguard Worker 
3699*7c568831SAndroid Build Coastguard Worker     ctxt = xmlRelaxNGNewValidCtxt(schemas);
3700*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGSetValidStructuredErrors(ctxt, testStructuredErrorHandler, NULL);
3701*7c568831SAndroid Build Coastguard Worker     ret = xmlRelaxNGValidateDoc(ctxt, doc);
3702*7c568831SAndroid Build Coastguard Worker     if (ret == 0) {
3703*7c568831SAndroid Build Coastguard Worker 	testErrorHandler(NULL, "%s validates\n", filename);
3704*7c568831SAndroid Build Coastguard Worker     } else if (ret > 0) {
3705*7c568831SAndroid Build Coastguard Worker 	testErrorHandler(NULL, "%s fails to validate\n", filename);
3706*7c568831SAndroid Build Coastguard Worker     } else {
3707*7c568831SAndroid Build Coastguard Worker 	testErrorHandler(NULL, "%s validation generated an internal error\n",
3708*7c568831SAndroid Build Coastguard Worker 	       filename);
3709*7c568831SAndroid Build Coastguard Worker     }
3710*7c568831SAndroid Build Coastguard Worker 
3711*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGFreeValidCtxt(ctxt);
3712*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
3713*7c568831SAndroid Build Coastguard Worker     return(0);
3714*7c568831SAndroid Build Coastguard Worker }
3715*7c568831SAndroid Build Coastguard Worker /**
3716*7c568831SAndroid Build Coastguard Worker  * rngTest:
3717*7c568831SAndroid Build Coastguard Worker  * @filename: the schemas file
3718*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3719*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3720*7c568831SAndroid Build Coastguard Worker  *
3721*7c568831SAndroid Build Coastguard Worker  * Parse an RNG schemas and then apply it to the related .xml
3722*7c568831SAndroid Build Coastguard Worker  *
3723*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3724*7c568831SAndroid Build Coastguard Worker  */
3725*7c568831SAndroid Build Coastguard Worker static int
rngTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * errr ATTRIBUTE_UNUSED,int options)3726*7c568831SAndroid Build Coastguard Worker rngTest(const char *filename,
3727*7c568831SAndroid Build Coastguard Worker             const char *resul ATTRIBUTE_UNUSED,
3728*7c568831SAndroid Build Coastguard Worker             const char *errr ATTRIBUTE_UNUSED,
3729*7c568831SAndroid Build Coastguard Worker             int options) {
3730*7c568831SAndroid Build Coastguard Worker     const char *base = baseFilename(filename);
3731*7c568831SAndroid Build Coastguard Worker     const char *base2;
3732*7c568831SAndroid Build Coastguard Worker     const char *instance;
3733*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGParserCtxtPtr ctxt;
3734*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGPtr schemas;
3735*7c568831SAndroid Build Coastguard Worker     int res = 0, len, ret = 0;
3736*7c568831SAndroid Build Coastguard Worker     int parseErrorsSize;
3737*7c568831SAndroid Build Coastguard Worker     char pattern[500];
3738*7c568831SAndroid Build Coastguard Worker     char prefix[500];
3739*7c568831SAndroid Build Coastguard Worker     char err[500];
3740*7c568831SAndroid Build Coastguard Worker     glob_t globbuf;
3741*7c568831SAndroid Build Coastguard Worker     size_t i;
3742*7c568831SAndroid Build Coastguard Worker     char count = 0;
3743*7c568831SAndroid Build Coastguard Worker 
3744*7c568831SAndroid Build Coastguard Worker     /* first compile the schemas if possible */
3745*7c568831SAndroid Build Coastguard Worker     ctxt = xmlRelaxNGNewParserCtxt(filename);
3746*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGSetParserStructuredErrors(ctxt, testStructuredErrorHandler,
3747*7c568831SAndroid Build Coastguard Worker                                         NULL);
3748*7c568831SAndroid Build Coastguard Worker     schemas = xmlRelaxNGParse(ctxt);
3749*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGFreeParserCtxt(ctxt);
3750*7c568831SAndroid Build Coastguard Worker     if (schemas == NULL)
3751*7c568831SAndroid Build Coastguard Worker         testErrorHandler(NULL, "Relax-NG schema %s failed to compile\n",
3752*7c568831SAndroid Build Coastguard Worker                          filename);
3753*7c568831SAndroid Build Coastguard Worker     parseErrorsSize = testErrorsSize;
3754*7c568831SAndroid Build Coastguard Worker 
3755*7c568831SAndroid Build Coastguard Worker     /*
3756*7c568831SAndroid Build Coastguard Worker      * most of the mess is about the output filenames generated by the Makefile
3757*7c568831SAndroid Build Coastguard Worker      */
3758*7c568831SAndroid Build Coastguard Worker     len = strlen(base);
3759*7c568831SAndroid Build Coastguard Worker     if ((len > 499) || (len < 5)) {
3760*7c568831SAndroid Build Coastguard Worker         xmlRelaxNGFree(schemas);
3761*7c568831SAndroid Build Coastguard Worker 	return(-1);
3762*7c568831SAndroid Build Coastguard Worker     }
3763*7c568831SAndroid Build Coastguard Worker     len -= 4; /* remove trailing .rng */
3764*7c568831SAndroid Build Coastguard Worker     memcpy(prefix, base, len);
3765*7c568831SAndroid Build Coastguard Worker     prefix[len] = 0;
3766*7c568831SAndroid Build Coastguard Worker 
3767*7c568831SAndroid Build Coastguard Worker     if (snprintf(pattern, 499, "./test/relaxng/%s_?.xml", prefix) >= 499)
3768*7c568831SAndroid Build Coastguard Worker         pattern[499] = 0;
3769*7c568831SAndroid Build Coastguard Worker 
3770*7c568831SAndroid Build Coastguard Worker     globbuf.gl_offs = 0;
3771*7c568831SAndroid Build Coastguard Worker     glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
3772*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < globbuf.gl_pathc;i++) {
3773*7c568831SAndroid Build Coastguard Worker         testErrorsSize = parseErrorsSize;
3774*7c568831SAndroid Build Coastguard Worker         testErrors[parseErrorsSize] = 0;
3775*7c568831SAndroid Build Coastguard Worker         instance = globbuf.gl_pathv[i];
3776*7c568831SAndroid Build Coastguard Worker 	base2 = baseFilename(instance);
3777*7c568831SAndroid Build Coastguard Worker 	len = strlen(base2);
3778*7c568831SAndroid Build Coastguard Worker 	if ((len > 6) && (base2[len - 6] == '_')) {
3779*7c568831SAndroid Build Coastguard Worker 	    count = base2[len - 5];
3780*7c568831SAndroid Build Coastguard Worker 	    res = snprintf(err, 499, "result/relaxng/%s_%c.err",
3781*7c568831SAndroid Build Coastguard Worker 		     prefix, count);
3782*7c568831SAndroid Build Coastguard Worker             if (res >= 499)
3783*7c568831SAndroid Build Coastguard Worker 	        err[499] = 0;
3784*7c568831SAndroid Build Coastguard Worker 	} else {
3785*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "don't know how to process %s\n", instance);
3786*7c568831SAndroid Build Coastguard Worker 	    continue;
3787*7c568831SAndroid Build Coastguard Worker 	}
3788*7c568831SAndroid Build Coastguard Worker 	if (schemas != NULL) {
3789*7c568831SAndroid Build Coastguard Worker 	    nb_tests++;
3790*7c568831SAndroid Build Coastguard Worker 	    res = rngOneTest(filename, instance, options, schemas);
3791*7c568831SAndroid Build Coastguard Worker 	    if (res != 0)
3792*7c568831SAndroid Build Coastguard Worker 		ret = res;
3793*7c568831SAndroid Build Coastguard Worker 	}
3794*7c568831SAndroid Build Coastguard Worker         if (compareFileMem(err, testErrors, testErrorsSize)) {
3795*7c568831SAndroid Build Coastguard Worker             fprintf(stderr, "Error for %s on %s failed\n", instance,
3796*7c568831SAndroid Build Coastguard Worker                     filename);
3797*7c568831SAndroid Build Coastguard Worker             ret = 1;
3798*7c568831SAndroid Build Coastguard Worker         }
3799*7c568831SAndroid Build Coastguard Worker     }
3800*7c568831SAndroid Build Coastguard Worker     globfree(&globbuf);
3801*7c568831SAndroid Build Coastguard Worker     xmlRelaxNGFree(schemas);
3802*7c568831SAndroid Build Coastguard Worker 
3803*7c568831SAndroid Build Coastguard Worker     return(ret);
3804*7c568831SAndroid Build Coastguard Worker }
3805*7c568831SAndroid Build Coastguard Worker 
3806*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
3807*7c568831SAndroid Build Coastguard Worker /**
3808*7c568831SAndroid Build Coastguard Worker  * rngStreamTest:
3809*7c568831SAndroid Build Coastguard Worker  * @filename: the schemas file
3810*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3811*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3812*7c568831SAndroid Build Coastguard Worker  *
3813*7c568831SAndroid Build Coastguard Worker  * Parse a set of files with streaming, applying an RNG schemas
3814*7c568831SAndroid Build Coastguard Worker  *
3815*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3816*7c568831SAndroid Build Coastguard Worker  */
3817*7c568831SAndroid Build Coastguard Worker static int
rngStreamTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * errr ATTRIBUTE_UNUSED,int options)3818*7c568831SAndroid Build Coastguard Worker rngStreamTest(const char *filename,
3819*7c568831SAndroid Build Coastguard Worker             const char *resul ATTRIBUTE_UNUSED,
3820*7c568831SAndroid Build Coastguard Worker             const char *errr ATTRIBUTE_UNUSED,
3821*7c568831SAndroid Build Coastguard Worker             int options) {
3822*7c568831SAndroid Build Coastguard Worker     const char *base = baseFilename(filename);
3823*7c568831SAndroid Build Coastguard Worker     const char *base2;
3824*7c568831SAndroid Build Coastguard Worker     const char *instance;
3825*7c568831SAndroid Build Coastguard Worker     int res = 0, len, ret;
3826*7c568831SAndroid Build Coastguard Worker     char pattern[500];
3827*7c568831SAndroid Build Coastguard Worker     char prefix[500];
3828*7c568831SAndroid Build Coastguard Worker     char result[500];
3829*7c568831SAndroid Build Coastguard Worker     char err[500];
3830*7c568831SAndroid Build Coastguard Worker     glob_t globbuf;
3831*7c568831SAndroid Build Coastguard Worker     size_t i;
3832*7c568831SAndroid Build Coastguard Worker     char count = 0;
3833*7c568831SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
3834*7c568831SAndroid Build Coastguard Worker     int disable_err = 0;
3835*7c568831SAndroid Build Coastguard Worker 
3836*7c568831SAndroid Build Coastguard Worker     /*
3837*7c568831SAndroid Build Coastguard Worker      * most of the mess is about the output filenames generated by the Makefile
3838*7c568831SAndroid Build Coastguard Worker      */
3839*7c568831SAndroid Build Coastguard Worker     len = strlen(base);
3840*7c568831SAndroid Build Coastguard Worker     if ((len > 499) || (len < 5)) {
3841*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "len(base) == %d !\n", len);
3842*7c568831SAndroid Build Coastguard Worker 	return(-1);
3843*7c568831SAndroid Build Coastguard Worker     }
3844*7c568831SAndroid Build Coastguard Worker     len -= 4; /* remove trailing .rng */
3845*7c568831SAndroid Build Coastguard Worker     memcpy(prefix, base, len);
3846*7c568831SAndroid Build Coastguard Worker     prefix[len] = 0;
3847*7c568831SAndroid Build Coastguard Worker 
3848*7c568831SAndroid Build Coastguard Worker     /*
3849*7c568831SAndroid Build Coastguard Worker      * strictly unifying the error messages is nearly impossible this
3850*7c568831SAndroid Build Coastguard Worker      * hack is also done in the Makefile
3851*7c568831SAndroid Build Coastguard Worker      */
3852*7c568831SAndroid Build Coastguard Worker     if ((!strcmp(prefix, "tutor10_1")) || (!strcmp(prefix, "tutor10_2")) ||
3853*7c568831SAndroid Build Coastguard Worker         (!strcmp(prefix, "tutor3_2")) || (!strcmp(prefix, "307377")) ||
3854*7c568831SAndroid Build Coastguard Worker         (!strcmp(prefix, "tutor8_2")))
3855*7c568831SAndroid Build Coastguard Worker 	disable_err = 1;
3856*7c568831SAndroid Build Coastguard Worker 
3857*7c568831SAndroid Build Coastguard Worker     if (snprintf(pattern, 499, "./test/relaxng/%s_?.xml", prefix) >= 499)
3858*7c568831SAndroid Build Coastguard Worker         pattern[499] = 0;
3859*7c568831SAndroid Build Coastguard Worker 
3860*7c568831SAndroid Build Coastguard Worker     globbuf.gl_offs = 0;
3861*7c568831SAndroid Build Coastguard Worker     glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
3862*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < globbuf.gl_pathc;i++) {
3863*7c568831SAndroid Build Coastguard Worker         testErrorsSize = 0;
3864*7c568831SAndroid Build Coastguard Worker 	testErrors[0] = 0;
3865*7c568831SAndroid Build Coastguard Worker         instance = globbuf.gl_pathv[i];
3866*7c568831SAndroid Build Coastguard Worker 	base2 = baseFilename(instance);
3867*7c568831SAndroid Build Coastguard Worker 	len = strlen(base2);
3868*7c568831SAndroid Build Coastguard Worker 	if ((len > 6) && (base2[len - 6] == '_')) {
3869*7c568831SAndroid Build Coastguard Worker 	    count = base2[len - 5];
3870*7c568831SAndroid Build Coastguard Worker 	    ret = snprintf(result, 499, "result/relaxng/%s_%c",
3871*7c568831SAndroid Build Coastguard Worker 		     prefix, count);
3872*7c568831SAndroid Build Coastguard Worker             if (ret >= 499)
3873*7c568831SAndroid Build Coastguard Worker 	        result[499] = 0;
3874*7c568831SAndroid Build Coastguard Worker 	    ret = snprintf(err, 499, "result/relaxng/%s_%c.err",
3875*7c568831SAndroid Build Coastguard Worker 		     prefix, count);
3876*7c568831SAndroid Build Coastguard Worker             if (ret >= 499)
3877*7c568831SAndroid Build Coastguard Worker 	        err[499] = 0;
3878*7c568831SAndroid Build Coastguard Worker 	} else {
3879*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "don't know how to process %s\n", instance);
3880*7c568831SAndroid Build Coastguard Worker 	    continue;
3881*7c568831SAndroid Build Coastguard Worker 	}
3882*7c568831SAndroid Build Coastguard Worker 	reader = xmlReaderForFile(instance, NULL, options);
3883*7c568831SAndroid Build Coastguard Worker         xmlTextReaderSetStructuredErrorHandler(reader,
3884*7c568831SAndroid Build Coastguard Worker                 testStructuredErrorHandler, NULL);
3885*7c568831SAndroid Build Coastguard Worker 	if (reader == NULL) {
3886*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Failed to build reader for %s\n", instance);
3887*7c568831SAndroid Build Coastguard Worker 	}
3888*7c568831SAndroid Build Coastguard Worker 	if (disable_err == 1)
3889*7c568831SAndroid Build Coastguard Worker 	    ret = streamProcessTest(instance, result, NULL, reader, filename,
3890*7c568831SAndroid Build Coastguard Worker 	                            options);
3891*7c568831SAndroid Build Coastguard Worker 	else
3892*7c568831SAndroid Build Coastguard Worker 	    ret = streamProcessTest(instance, result, err, reader, filename,
3893*7c568831SAndroid Build Coastguard Worker 	                            options);
3894*7c568831SAndroid Build Coastguard Worker 	xmlFreeTextReader(reader);
3895*7c568831SAndroid Build Coastguard Worker 	if (ret != 0) {
3896*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "instance %s failed\n", instance);
3897*7c568831SAndroid Build Coastguard Worker 	    res = ret;
3898*7c568831SAndroid Build Coastguard Worker 	}
3899*7c568831SAndroid Build Coastguard Worker     }
3900*7c568831SAndroid Build Coastguard Worker     globfree(&globbuf);
3901*7c568831SAndroid Build Coastguard Worker 
3902*7c568831SAndroid Build Coastguard Worker     return(res);
3903*7c568831SAndroid Build Coastguard Worker }
3904*7c568831SAndroid Build Coastguard Worker #endif /* READER */
3905*7c568831SAndroid Build Coastguard Worker 
3906*7c568831SAndroid Build Coastguard Worker #endif
3907*7c568831SAndroid Build Coastguard Worker 
3908*7c568831SAndroid Build Coastguard Worker /************************************************************************
3909*7c568831SAndroid Build Coastguard Worker  *									*
3910*7c568831SAndroid Build Coastguard Worker  *			Schematron tests				*
3911*7c568831SAndroid Build Coastguard Worker  *									*
3912*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
3913*7c568831SAndroid Build Coastguard Worker 
3914*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMATRON_ENABLED
3915*7c568831SAndroid Build Coastguard Worker static int
schematronOneTest(const char * sch,const char * filename,int options,xmlSchematronPtr schematron)3916*7c568831SAndroid Build Coastguard Worker schematronOneTest(const char *sch, const char *filename, int options,
3917*7c568831SAndroid Build Coastguard Worker                   xmlSchematronPtr schematron) {
3918*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
3919*7c568831SAndroid Build Coastguard Worker     xmlSchematronValidCtxtPtr ctxt;
3920*7c568831SAndroid Build Coastguard Worker     int ret;
3921*7c568831SAndroid Build Coastguard Worker 
3922*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL, options);
3923*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
3924*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "failed to parse instance %s for %s\n", filename, sch);
3925*7c568831SAndroid Build Coastguard Worker 	return(-1);
3926*7c568831SAndroid Build Coastguard Worker     }
3927*7c568831SAndroid Build Coastguard Worker 
3928*7c568831SAndroid Build Coastguard Worker     ctxt = xmlSchematronNewValidCtxt(schematron, XML_SCHEMATRON_OUT_ERROR);
3929*7c568831SAndroid Build Coastguard Worker     xmlSchematronSetValidStructuredErrors(ctxt, testStructuredErrorHandler,
3930*7c568831SAndroid Build Coastguard Worker                                           NULL);
3931*7c568831SAndroid Build Coastguard Worker     ret = xmlSchematronValidateDoc(ctxt, doc);
3932*7c568831SAndroid Build Coastguard Worker     if (ret == 0) {
3933*7c568831SAndroid Build Coastguard Worker 	testErrorHandler(NULL, "%s validates\n", filename);
3934*7c568831SAndroid Build Coastguard Worker     } else if (ret > 0) {
3935*7c568831SAndroid Build Coastguard Worker 	testErrorHandler(NULL, "%s fails to validate\n", filename);
3936*7c568831SAndroid Build Coastguard Worker     } else {
3937*7c568831SAndroid Build Coastguard Worker 	testErrorHandler(NULL, "%s validation generated an internal error\n",
3938*7c568831SAndroid Build Coastguard Worker 	       filename);
3939*7c568831SAndroid Build Coastguard Worker     }
3940*7c568831SAndroid Build Coastguard Worker 
3941*7c568831SAndroid Build Coastguard Worker     xmlSchematronFreeValidCtxt(ctxt);
3942*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
3943*7c568831SAndroid Build Coastguard Worker     return(0);
3944*7c568831SAndroid Build Coastguard Worker }
3945*7c568831SAndroid Build Coastguard Worker 
3946*7c568831SAndroid Build Coastguard Worker /**
3947*7c568831SAndroid Build Coastguard Worker  * schematronTest:
3948*7c568831SAndroid Build Coastguard Worker  * @filename: the schemas file
3949*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
3950*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
3951*7c568831SAndroid Build Coastguard Worker  *
3952*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
3953*7c568831SAndroid Build Coastguard Worker  */
3954*7c568831SAndroid Build Coastguard Worker static int
schematronTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * errr ATTRIBUTE_UNUSED,int options)3955*7c568831SAndroid Build Coastguard Worker schematronTest(const char *filename,
3956*7c568831SAndroid Build Coastguard Worker                const char *resul ATTRIBUTE_UNUSED,
3957*7c568831SAndroid Build Coastguard Worker                const char *errr ATTRIBUTE_UNUSED,
3958*7c568831SAndroid Build Coastguard Worker                int options) {
3959*7c568831SAndroid Build Coastguard Worker     const char *base = baseFilename(filename);
3960*7c568831SAndroid Build Coastguard Worker     const char *base2;
3961*7c568831SAndroid Build Coastguard Worker     const char *instance;
3962*7c568831SAndroid Build Coastguard Worker     xmlSchematronParserCtxtPtr pctxt;
3963*7c568831SAndroid Build Coastguard Worker     xmlSchematronPtr schematron;
3964*7c568831SAndroid Build Coastguard Worker     int res = 0, len, ret = 0;
3965*7c568831SAndroid Build Coastguard Worker     int parseErrorsSize;
3966*7c568831SAndroid Build Coastguard Worker     char pattern[500];
3967*7c568831SAndroid Build Coastguard Worker     char prefix[500];
3968*7c568831SAndroid Build Coastguard Worker     char err[500];
3969*7c568831SAndroid Build Coastguard Worker     glob_t globbuf;
3970*7c568831SAndroid Build Coastguard Worker     size_t i;
3971*7c568831SAndroid Build Coastguard Worker     char count = 0;
3972*7c568831SAndroid Build Coastguard Worker 
3973*7c568831SAndroid Build Coastguard Worker     pctxt = xmlSchematronNewParserCtxt(filename);
3974*7c568831SAndroid Build Coastguard Worker     schematron = xmlSchematronParse(pctxt);
3975*7c568831SAndroid Build Coastguard Worker     xmlSchematronFreeParserCtxt(pctxt);
3976*7c568831SAndroid Build Coastguard Worker     if (schematron == NULL)
3977*7c568831SAndroid Build Coastguard Worker         testErrorHandler(NULL, "Schematron schema %s failed to compile\n",
3978*7c568831SAndroid Build Coastguard Worker                          filename);
3979*7c568831SAndroid Build Coastguard Worker     parseErrorsSize = testErrorsSize;
3980*7c568831SAndroid Build Coastguard Worker 
3981*7c568831SAndroid Build Coastguard Worker     /*
3982*7c568831SAndroid Build Coastguard Worker      * most of the mess is about the output filenames generated by the Makefile
3983*7c568831SAndroid Build Coastguard Worker      */
3984*7c568831SAndroid Build Coastguard Worker     len = strlen(base);
3985*7c568831SAndroid Build Coastguard Worker     if ((len > 499) || (len < 5)) {
3986*7c568831SAndroid Build Coastguard Worker         xmlSchematronFree(schematron);
3987*7c568831SAndroid Build Coastguard Worker 	return(-1);
3988*7c568831SAndroid Build Coastguard Worker     }
3989*7c568831SAndroid Build Coastguard Worker     len -= 4; /* remove trailing .sct */
3990*7c568831SAndroid Build Coastguard Worker     memcpy(prefix, base, len);
3991*7c568831SAndroid Build Coastguard Worker     prefix[len] = 0;
3992*7c568831SAndroid Build Coastguard Worker 
3993*7c568831SAndroid Build Coastguard Worker     if (snprintf(pattern, 499, "./test/schematron/%s_?.xml", prefix) >= 499)
3994*7c568831SAndroid Build Coastguard Worker         pattern[499] = 0;
3995*7c568831SAndroid Build Coastguard Worker 
3996*7c568831SAndroid Build Coastguard Worker     globbuf.gl_offs = 0;
3997*7c568831SAndroid Build Coastguard Worker     glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
3998*7c568831SAndroid Build Coastguard Worker     for (i = 0;i < globbuf.gl_pathc;i++) {
3999*7c568831SAndroid Build Coastguard Worker         testErrorsSize = parseErrorsSize;
4000*7c568831SAndroid Build Coastguard Worker         testErrors[parseErrorsSize] = 0;
4001*7c568831SAndroid Build Coastguard Worker         instance = globbuf.gl_pathv[i];
4002*7c568831SAndroid Build Coastguard Worker 	base2 = baseFilename(instance);
4003*7c568831SAndroid Build Coastguard Worker 	len = strlen(base2);
4004*7c568831SAndroid Build Coastguard Worker 	if ((len > 6) && (base2[len - 6] == '_')) {
4005*7c568831SAndroid Build Coastguard Worker 	    count = base2[len - 5];
4006*7c568831SAndroid Build Coastguard Worker 	    res = snprintf(err, 499, "result/schematron/%s_%c.err",
4007*7c568831SAndroid Build Coastguard Worker 		     prefix, count);
4008*7c568831SAndroid Build Coastguard Worker             if (res >= 499)
4009*7c568831SAndroid Build Coastguard Worker 	        err[499] = 0;
4010*7c568831SAndroid Build Coastguard Worker 	} else {
4011*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "don't know how to process %s\n", instance);
4012*7c568831SAndroid Build Coastguard Worker 	    continue;
4013*7c568831SAndroid Build Coastguard Worker 	}
4014*7c568831SAndroid Build Coastguard Worker 	if (schematron != NULL) {
4015*7c568831SAndroid Build Coastguard Worker 	    nb_tests++;
4016*7c568831SAndroid Build Coastguard Worker 	    res = schematronOneTest(filename, instance, options, schematron);
4017*7c568831SAndroid Build Coastguard Worker 	    if (res != 0)
4018*7c568831SAndroid Build Coastguard Worker 		ret = res;
4019*7c568831SAndroid Build Coastguard Worker 	}
4020*7c568831SAndroid Build Coastguard Worker         if (compareFileMem(err, testErrors, testErrorsSize)) {
4021*7c568831SAndroid Build Coastguard Worker             fprintf(stderr, "Error for %s on %s failed\n", instance,
4022*7c568831SAndroid Build Coastguard Worker                     filename);
4023*7c568831SAndroid Build Coastguard Worker             ret = 1;
4024*7c568831SAndroid Build Coastguard Worker         }
4025*7c568831SAndroid Build Coastguard Worker     }
4026*7c568831SAndroid Build Coastguard Worker     globfree(&globbuf);
4027*7c568831SAndroid Build Coastguard Worker     xmlSchematronFree(schematron);
4028*7c568831SAndroid Build Coastguard Worker 
4029*7c568831SAndroid Build Coastguard Worker     return(ret);
4030*7c568831SAndroid Build Coastguard Worker }
4031*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_SCHEMATRON_ENABLED */
4032*7c568831SAndroid Build Coastguard Worker 
4033*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
4034*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
4035*7c568831SAndroid Build Coastguard Worker /************************************************************************
4036*7c568831SAndroid Build Coastguard Worker  *									*
4037*7c568831SAndroid Build Coastguard Worker  *			Patterns tests					*
4038*7c568831SAndroid Build Coastguard Worker  *									*
4039*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
patternNode(FILE * out,xmlTextReaderPtr reader,const char * pattern,xmlPatternPtr patternc,xmlStreamCtxtPtr patstream)4040*7c568831SAndroid Build Coastguard Worker static void patternNode(FILE *out, xmlTextReaderPtr reader,
4041*7c568831SAndroid Build Coastguard Worker                         const char *pattern, xmlPatternPtr patternc,
4042*7c568831SAndroid Build Coastguard Worker 			xmlStreamCtxtPtr patstream) {
4043*7c568831SAndroid Build Coastguard Worker     xmlChar *path = NULL;
4044*7c568831SAndroid Build Coastguard Worker     int match = -1;
4045*7c568831SAndroid Build Coastguard Worker     int type, empty;
4046*7c568831SAndroid Build Coastguard Worker 
4047*7c568831SAndroid Build Coastguard Worker     type = xmlTextReaderNodeType(reader);
4048*7c568831SAndroid Build Coastguard Worker     empty = xmlTextReaderIsEmptyElement(reader);
4049*7c568831SAndroid Build Coastguard Worker 
4050*7c568831SAndroid Build Coastguard Worker     if (type == XML_READER_TYPE_ELEMENT) {
4051*7c568831SAndroid Build Coastguard Worker 	/* do the check only on element start */
4052*7c568831SAndroid Build Coastguard Worker 	match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader));
4053*7c568831SAndroid Build Coastguard Worker 
4054*7c568831SAndroid Build Coastguard Worker 	if (match) {
4055*7c568831SAndroid Build Coastguard Worker 	    path = xmlGetNodePath(xmlTextReaderCurrentNode(reader));
4056*7c568831SAndroid Build Coastguard Worker 	    fprintf(out, "Node %s matches pattern %s\n", path, pattern);
4057*7c568831SAndroid Build Coastguard Worker 	}
4058*7c568831SAndroid Build Coastguard Worker     }
4059*7c568831SAndroid Build Coastguard Worker     if (patstream != NULL) {
4060*7c568831SAndroid Build Coastguard Worker 	int ret;
4061*7c568831SAndroid Build Coastguard Worker 
4062*7c568831SAndroid Build Coastguard Worker 	if (type == XML_READER_TYPE_ELEMENT) {
4063*7c568831SAndroid Build Coastguard Worker 	    ret = xmlStreamPush(patstream,
4064*7c568831SAndroid Build Coastguard Worker 				xmlTextReaderConstLocalName(reader),
4065*7c568831SAndroid Build Coastguard Worker 				xmlTextReaderConstNamespaceUri(reader));
4066*7c568831SAndroid Build Coastguard Worker 	    if (ret < 0) {
4067*7c568831SAndroid Build Coastguard Worker 		fprintf(out, "xmlStreamPush() failure\n");
4068*7c568831SAndroid Build Coastguard Worker 		xmlFreeStreamCtxt(patstream);
4069*7c568831SAndroid Build Coastguard Worker 		patstream = NULL;
4070*7c568831SAndroid Build Coastguard Worker 	    } else if (ret != match) {
4071*7c568831SAndroid Build Coastguard Worker 		if (path == NULL) {
4072*7c568831SAndroid Build Coastguard Worker 		    path = xmlGetNodePath(
4073*7c568831SAndroid Build Coastguard Worker 				   xmlTextReaderCurrentNode(reader));
4074*7c568831SAndroid Build Coastguard Worker 		}
4075*7c568831SAndroid Build Coastguard Worker 		fprintf(out,
4076*7c568831SAndroid Build Coastguard Worker 			"xmlPatternMatch and xmlStreamPush disagree\n");
4077*7c568831SAndroid Build Coastguard Worker 		fprintf(out,
4078*7c568831SAndroid Build Coastguard Worker 			"  pattern %s node %s\n",
4079*7c568831SAndroid Build Coastguard Worker 			pattern, path);
4080*7c568831SAndroid Build Coastguard Worker 	    }
4081*7c568831SAndroid Build Coastguard Worker 
4082*7c568831SAndroid Build Coastguard Worker 
4083*7c568831SAndroid Build Coastguard Worker 	}
4084*7c568831SAndroid Build Coastguard Worker 	if ((type == XML_READER_TYPE_END_ELEMENT) ||
4085*7c568831SAndroid Build Coastguard Worker 	    ((type == XML_READER_TYPE_ELEMENT) && (empty))) {
4086*7c568831SAndroid Build Coastguard Worker 	    ret = xmlStreamPop(patstream);
4087*7c568831SAndroid Build Coastguard Worker 	    if (ret < 0) {
4088*7c568831SAndroid Build Coastguard Worker 		fprintf(out, "xmlStreamPop() failure\n");
4089*7c568831SAndroid Build Coastguard Worker 		xmlFreeStreamCtxt(patstream);
4090*7c568831SAndroid Build Coastguard Worker 		patstream = NULL;
4091*7c568831SAndroid Build Coastguard Worker 	    }
4092*7c568831SAndroid Build Coastguard Worker 	}
4093*7c568831SAndroid Build Coastguard Worker     }
4094*7c568831SAndroid Build Coastguard Worker     if (path != NULL)
4095*7c568831SAndroid Build Coastguard Worker 	xmlFree(path);
4096*7c568831SAndroid Build Coastguard Worker }
4097*7c568831SAndroid Build Coastguard Worker 
4098*7c568831SAndroid Build Coastguard Worker /**
4099*7c568831SAndroid Build Coastguard Worker  * patternTest:
4100*7c568831SAndroid Build Coastguard Worker  * @filename: the schemas file
4101*7c568831SAndroid Build Coastguard Worker  * @result: the file with expected result
4102*7c568831SAndroid Build Coastguard Worker  * @err: the file with error messages
4103*7c568831SAndroid Build Coastguard Worker  *
4104*7c568831SAndroid Build Coastguard Worker  * Parse a set of files with streaming, applying an RNG schemas
4105*7c568831SAndroid Build Coastguard Worker  *
4106*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success, an error code otherwise
4107*7c568831SAndroid Build Coastguard Worker  */
4108*7c568831SAndroid Build Coastguard Worker static int
patternTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * err ATTRIBUTE_UNUSED,int options)4109*7c568831SAndroid Build Coastguard Worker patternTest(const char *filename,
4110*7c568831SAndroid Build Coastguard Worker             const char *resul ATTRIBUTE_UNUSED,
4111*7c568831SAndroid Build Coastguard Worker             const char *err ATTRIBUTE_UNUSED,
4112*7c568831SAndroid Build Coastguard Worker             int options) {
4113*7c568831SAndroid Build Coastguard Worker     xmlPatternPtr patternc = NULL;
4114*7c568831SAndroid Build Coastguard Worker     xmlStreamCtxtPtr patstream = NULL;
4115*7c568831SAndroid Build Coastguard Worker     FILE *o, *f;
4116*7c568831SAndroid Build Coastguard Worker     char str[1024];
4117*7c568831SAndroid Build Coastguard Worker     char xml[500];
4118*7c568831SAndroid Build Coastguard Worker     char result[500];
4119*7c568831SAndroid Build Coastguard Worker     int len, i;
4120*7c568831SAndroid Build Coastguard Worker     int ret = 0, res;
4121*7c568831SAndroid Build Coastguard Worker     char *temp;
4122*7c568831SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
4123*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
4124*7c568831SAndroid Build Coastguard Worker 
4125*7c568831SAndroid Build Coastguard Worker     len = strlen(filename);
4126*7c568831SAndroid Build Coastguard Worker     len -= 4;
4127*7c568831SAndroid Build Coastguard Worker     memcpy(xml, filename, len);
4128*7c568831SAndroid Build Coastguard Worker     xml[len] = 0;
4129*7c568831SAndroid Build Coastguard Worker     if (snprintf(result, 499, "result/pattern/%s", baseFilename(xml)) >= 499)
4130*7c568831SAndroid Build Coastguard Worker         result[499] = 0;
4131*7c568831SAndroid Build Coastguard Worker     memcpy(xml + len, ".xml", 5);
4132*7c568831SAndroid Build Coastguard Worker 
4133*7c568831SAndroid Build Coastguard Worker     if (!checkTestFile(xml) && !update_results) {
4134*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "Missing xml file %s\n", xml);
4135*7c568831SAndroid Build Coastguard Worker 	return(-1);
4136*7c568831SAndroid Build Coastguard Worker     }
4137*7c568831SAndroid Build Coastguard Worker     f = fopen(filename, "rb");
4138*7c568831SAndroid Build Coastguard Worker     if (f == NULL) {
4139*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to open %s\n", filename);
4140*7c568831SAndroid Build Coastguard Worker 	return(-1);
4141*7c568831SAndroid Build Coastguard Worker     }
4142*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, temp_directory, ".res");
4143*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
4144*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Out of memory\n");
4145*7c568831SAndroid Build Coastguard Worker         fatalError();
4146*7c568831SAndroid Build Coastguard Worker     }
4147*7c568831SAndroid Build Coastguard Worker     o = fopen(temp, "wb");
4148*7c568831SAndroid Build Coastguard Worker     if (o == NULL) {
4149*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "failed to open output file %s\n", temp);
4150*7c568831SAndroid Build Coastguard Worker 	fclose(f);
4151*7c568831SAndroid Build Coastguard Worker         free(temp);
4152*7c568831SAndroid Build Coastguard Worker 	return(-1);
4153*7c568831SAndroid Build Coastguard Worker     }
4154*7c568831SAndroid Build Coastguard Worker     while (1) {
4155*7c568831SAndroid Build Coastguard Worker 	/*
4156*7c568831SAndroid Build Coastguard Worker 	 * read one line in string buffer.
4157*7c568831SAndroid Build Coastguard Worker 	 */
4158*7c568831SAndroid Build Coastguard Worker 	if (fgets (&str[0], sizeof (str) - 1, f) == NULL)
4159*7c568831SAndroid Build Coastguard Worker 	   break;
4160*7c568831SAndroid Build Coastguard Worker 
4161*7c568831SAndroid Build Coastguard Worker 	/*
4162*7c568831SAndroid Build Coastguard Worker 	 * remove the ending spaces
4163*7c568831SAndroid Build Coastguard Worker 	 */
4164*7c568831SAndroid Build Coastguard Worker 	i = strlen(str);
4165*7c568831SAndroid Build Coastguard Worker 	while ((i > 0) &&
4166*7c568831SAndroid Build Coastguard Worker 	       ((str[i - 1] == '\n') || (str[i - 1] == '\r') ||
4167*7c568831SAndroid Build Coastguard Worker 		(str[i - 1] == ' ') || (str[i - 1] == '\t'))) {
4168*7c568831SAndroid Build Coastguard Worker 	    i--;
4169*7c568831SAndroid Build Coastguard Worker 	    str[i] = 0;
4170*7c568831SAndroid Build Coastguard Worker 	}
4171*7c568831SAndroid Build Coastguard Worker 	doc = xmlReadFile(xml, NULL, options);
4172*7c568831SAndroid Build Coastguard Worker 	if (doc == NULL) {
4173*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr, "Failed to parse %s\n", xml);
4174*7c568831SAndroid Build Coastguard Worker 	    ret = 1;
4175*7c568831SAndroid Build Coastguard Worker 	} else {
4176*7c568831SAndroid Build Coastguard Worker 	    xmlNodePtr root;
4177*7c568831SAndroid Build Coastguard Worker 	    const xmlChar *namespaces[22];
4178*7c568831SAndroid Build Coastguard Worker 	    int j;
4179*7c568831SAndroid Build Coastguard Worker 	    xmlNsPtr ns;
4180*7c568831SAndroid Build Coastguard Worker 
4181*7c568831SAndroid Build Coastguard Worker 	    root = xmlDocGetRootElement(doc);
4182*7c568831SAndroid Build Coastguard Worker 	    for (ns = root->nsDef, j = 0;ns != NULL && j < 20;ns=ns->next) {
4183*7c568831SAndroid Build Coastguard Worker 		namespaces[j++] = ns->href;
4184*7c568831SAndroid Build Coastguard Worker 		namespaces[j++] = ns->prefix;
4185*7c568831SAndroid Build Coastguard Worker 	    }
4186*7c568831SAndroid Build Coastguard Worker 	    namespaces[j++] = NULL;
4187*7c568831SAndroid Build Coastguard Worker 	    namespaces[j] = NULL;
4188*7c568831SAndroid Build Coastguard Worker 
4189*7c568831SAndroid Build Coastguard Worker 	    patternc = xmlPatterncompile((const xmlChar *) str, doc->dict,
4190*7c568831SAndroid Build Coastguard Worker 					 0, &namespaces[0]);
4191*7c568831SAndroid Build Coastguard Worker 	    if (patternc == NULL) {
4192*7c568831SAndroid Build Coastguard Worker 		testErrorHandler(NULL,
4193*7c568831SAndroid Build Coastguard Worker 			"Pattern %s failed to compile\n", str);
4194*7c568831SAndroid Build Coastguard Worker 		xmlFreeDoc(doc);
4195*7c568831SAndroid Build Coastguard Worker 		ret = 1;
4196*7c568831SAndroid Build Coastguard Worker 		continue;
4197*7c568831SAndroid Build Coastguard Worker 	    }
4198*7c568831SAndroid Build Coastguard Worker 	    patstream = xmlPatternGetStreamCtxt(patternc);
4199*7c568831SAndroid Build Coastguard Worker 	    if (patstream != NULL) {
4200*7c568831SAndroid Build Coastguard Worker 		ret = xmlStreamPush(patstream, NULL, NULL);
4201*7c568831SAndroid Build Coastguard Worker 		if (ret < 0) {
4202*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr, "xmlStreamPush() failure\n");
4203*7c568831SAndroid Build Coastguard Worker 		    xmlFreeStreamCtxt(patstream);
4204*7c568831SAndroid Build Coastguard Worker 		    patstream = NULL;
4205*7c568831SAndroid Build Coastguard Worker 		}
4206*7c568831SAndroid Build Coastguard Worker 	    }
4207*7c568831SAndroid Build Coastguard Worker 	    nb_tests++;
4208*7c568831SAndroid Build Coastguard Worker 
4209*7c568831SAndroid Build Coastguard Worker 	    reader = xmlReaderWalker(doc);
4210*7c568831SAndroid Build Coastguard Worker 	    res = xmlTextReaderRead(reader);
4211*7c568831SAndroid Build Coastguard Worker 	    while (res == 1) {
4212*7c568831SAndroid Build Coastguard Worker 		patternNode(o, reader, str, patternc, patstream);
4213*7c568831SAndroid Build Coastguard Worker 		res = xmlTextReaderRead(reader);
4214*7c568831SAndroid Build Coastguard Worker 	    }
4215*7c568831SAndroid Build Coastguard Worker 	    if (res != 0) {
4216*7c568831SAndroid Build Coastguard Worker 		fprintf(o, "%s : failed to parse\n", filename);
4217*7c568831SAndroid Build Coastguard Worker 	    }
4218*7c568831SAndroid Build Coastguard Worker 	    xmlFreeTextReader(reader);
4219*7c568831SAndroid Build Coastguard Worker 	    xmlFreeDoc(doc);
4220*7c568831SAndroid Build Coastguard Worker 	    xmlFreeStreamCtxt(patstream);
4221*7c568831SAndroid Build Coastguard Worker 	    patstream = NULL;
4222*7c568831SAndroid Build Coastguard Worker 	    xmlFreePattern(patternc);
4223*7c568831SAndroid Build Coastguard Worker 
4224*7c568831SAndroid Build Coastguard Worker 	}
4225*7c568831SAndroid Build Coastguard Worker     }
4226*7c568831SAndroid Build Coastguard Worker 
4227*7c568831SAndroid Build Coastguard Worker     fclose(f);
4228*7c568831SAndroid Build Coastguard Worker     fclose(o);
4229*7c568831SAndroid Build Coastguard Worker 
4230*7c568831SAndroid Build Coastguard Worker     ret = compareFiles(temp, result);
4231*7c568831SAndroid Build Coastguard Worker     if (ret) {
4232*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "Result for %s failed in %s\n", filename, result);
4233*7c568831SAndroid Build Coastguard Worker 	ret = 1;
4234*7c568831SAndroid Build Coastguard Worker     }
4235*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
4236*7c568831SAndroid Build Coastguard Worker         unlink(temp);
4237*7c568831SAndroid Build Coastguard Worker         free(temp);
4238*7c568831SAndroid Build Coastguard Worker     }
4239*7c568831SAndroid Build Coastguard Worker     return(ret);
4240*7c568831SAndroid Build Coastguard Worker }
4241*7c568831SAndroid Build Coastguard Worker #endif /* READER */
4242*7c568831SAndroid Build Coastguard Worker #endif /* PATTERN */
4243*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_C14N_ENABLED
4244*7c568831SAndroid Build Coastguard Worker /************************************************************************
4245*7c568831SAndroid Build Coastguard Worker  *									*
4246*7c568831SAndroid Build Coastguard Worker  *			Canonicalization tests				*
4247*7c568831SAndroid Build Coastguard Worker  *									*
4248*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
4249*7c568831SAndroid Build Coastguard Worker static xmlXPathObjectPtr
load_xpath_expr(xmlDocPtr parent_doc,const char * filename)4250*7c568831SAndroid Build Coastguard Worker load_xpath_expr (xmlDocPtr parent_doc, const char* filename) {
4251*7c568831SAndroid Build Coastguard Worker     xmlXPathObjectPtr xpath;
4252*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
4253*7c568831SAndroid Build Coastguard Worker     xmlChar *expr;
4254*7c568831SAndroid Build Coastguard Worker     xmlXPathContextPtr ctx;
4255*7c568831SAndroid Build Coastguard Worker     xmlNodePtr node;
4256*7c568831SAndroid Build Coastguard Worker     xmlNsPtr ns;
4257*7c568831SAndroid Build Coastguard Worker 
4258*7c568831SAndroid Build Coastguard Worker     /*
4259*7c568831SAndroid Build Coastguard Worker      * load XPath expr as a file
4260*7c568831SAndroid Build Coastguard Worker      */
4261*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(filename, NULL, XML_PARSE_DTDATTR | XML_PARSE_NOENT);
4262*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
4263*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename);
4264*7c568831SAndroid Build Coastguard Worker 	return(NULL);
4265*7c568831SAndroid Build Coastguard Worker     }
4266*7c568831SAndroid Build Coastguard Worker 
4267*7c568831SAndroid Build Coastguard Worker     /*
4268*7c568831SAndroid Build Coastguard Worker      * Check the document is of the right kind
4269*7c568831SAndroid Build Coastguard Worker      */
4270*7c568831SAndroid Build Coastguard Worker     if(xmlDocGetRootElement(doc) == NULL) {
4271*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,"Error: empty document for file \"%s\"\n", filename);
4272*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
4273*7c568831SAndroid Build Coastguard Worker 	return(NULL);
4274*7c568831SAndroid Build Coastguard Worker     }
4275*7c568831SAndroid Build Coastguard Worker 
4276*7c568831SAndroid Build Coastguard Worker     node = doc->children;
4277*7c568831SAndroid Build Coastguard Worker     while(node != NULL && !xmlStrEqual(node->name, (const xmlChar *)"XPath")) {
4278*7c568831SAndroid Build Coastguard Worker 	node = node->next;
4279*7c568831SAndroid Build Coastguard Worker     }
4280*7c568831SAndroid Build Coastguard Worker 
4281*7c568831SAndroid Build Coastguard Worker     if(node == NULL) {
4282*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,"Error: XPath element expected in the file  \"%s\"\n", filename);
4283*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
4284*7c568831SAndroid Build Coastguard Worker 	return(NULL);
4285*7c568831SAndroid Build Coastguard Worker     }
4286*7c568831SAndroid Build Coastguard Worker 
4287*7c568831SAndroid Build Coastguard Worker     expr = xmlNodeGetContent(node);
4288*7c568831SAndroid Build Coastguard Worker     if(expr == NULL) {
4289*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,"Error: XPath content element is NULL \"%s\"\n", filename);
4290*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
4291*7c568831SAndroid Build Coastguard Worker 	return(NULL);
4292*7c568831SAndroid Build Coastguard Worker     }
4293*7c568831SAndroid Build Coastguard Worker 
4294*7c568831SAndroid Build Coastguard Worker     ctx = xmlXPathNewContext(parent_doc);
4295*7c568831SAndroid Build Coastguard Worker     if(ctx == NULL) {
4296*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,"Error: unable to create new context\n");
4297*7c568831SAndroid Build Coastguard Worker         xmlFree(expr);
4298*7c568831SAndroid Build Coastguard Worker         xmlFreeDoc(doc);
4299*7c568831SAndroid Build Coastguard Worker         return(NULL);
4300*7c568831SAndroid Build Coastguard Worker     }
4301*7c568831SAndroid Build Coastguard Worker 
4302*7c568831SAndroid Build Coastguard Worker     /*
4303*7c568831SAndroid Build Coastguard Worker      * Register namespaces
4304*7c568831SAndroid Build Coastguard Worker      */
4305*7c568831SAndroid Build Coastguard Worker     ns = node->nsDef;
4306*7c568831SAndroid Build Coastguard Worker     while(ns != NULL) {
4307*7c568831SAndroid Build Coastguard Worker 	if(xmlXPathRegisterNs(ctx, ns->prefix, ns->href) != 0) {
4308*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", ns->prefix, ns->href);
4309*7c568831SAndroid Build Coastguard Worker     xmlFree(expr);
4310*7c568831SAndroid Build Coastguard Worker 	    xmlXPathFreeContext(ctx);
4311*7c568831SAndroid Build Coastguard Worker 	    xmlFreeDoc(doc);
4312*7c568831SAndroid Build Coastguard Worker 	    return(NULL);
4313*7c568831SAndroid Build Coastguard Worker 	}
4314*7c568831SAndroid Build Coastguard Worker 	ns = ns->next;
4315*7c568831SAndroid Build Coastguard Worker     }
4316*7c568831SAndroid Build Coastguard Worker 
4317*7c568831SAndroid Build Coastguard Worker     /*
4318*7c568831SAndroid Build Coastguard Worker      * Evaluate xpath
4319*7c568831SAndroid Build Coastguard Worker      */
4320*7c568831SAndroid Build Coastguard Worker     xpath = xmlXPathEvalExpression(expr, ctx);
4321*7c568831SAndroid Build Coastguard Worker     if(xpath == NULL) {
4322*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,"Error: unable to evaluate xpath expression\n");
4323*7c568831SAndroid Build Coastguard Worker xmlFree(expr);
4324*7c568831SAndroid Build Coastguard Worker         xmlXPathFreeContext(ctx);
4325*7c568831SAndroid Build Coastguard Worker         xmlFreeDoc(doc);
4326*7c568831SAndroid Build Coastguard Worker         return(NULL);
4327*7c568831SAndroid Build Coastguard Worker     }
4328*7c568831SAndroid Build Coastguard Worker 
4329*7c568831SAndroid Build Coastguard Worker     /* print_xpath_nodes(xpath->nodesetval); */
4330*7c568831SAndroid Build Coastguard Worker 
4331*7c568831SAndroid Build Coastguard Worker     xmlFree(expr);
4332*7c568831SAndroid Build Coastguard Worker     xmlXPathFreeContext(ctx);
4333*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
4334*7c568831SAndroid Build Coastguard Worker     return(xpath);
4335*7c568831SAndroid Build Coastguard Worker }
4336*7c568831SAndroid Build Coastguard Worker 
4337*7c568831SAndroid Build Coastguard Worker /*
4338*7c568831SAndroid Build Coastguard Worker  * Macro used to grow the current buffer.
4339*7c568831SAndroid Build Coastguard Worker  */
4340*7c568831SAndroid Build Coastguard Worker #define xxx_growBufferReentrant() {						\
4341*7c568831SAndroid Build Coastguard Worker     buffer_size *= 2;							\
4342*7c568831SAndroid Build Coastguard Worker     buffer = (xmlChar **)						\
4343*7c568831SAndroid Build Coastguard Worker 	xmlRealloc(buffer, buffer_size * sizeof(xmlChar*));	\
4344*7c568831SAndroid Build Coastguard Worker     if (buffer == NULL) {						\
4345*7c568831SAndroid Build Coastguard Worker 	perror("realloc failed");					\
4346*7c568831SAndroid Build Coastguard Worker 	return(NULL);							\
4347*7c568831SAndroid Build Coastguard Worker     }									\
4348*7c568831SAndroid Build Coastguard Worker }
4349*7c568831SAndroid Build Coastguard Worker 
4350*7c568831SAndroid Build Coastguard Worker static xmlChar **
parse_list(xmlChar * str)4351*7c568831SAndroid Build Coastguard Worker parse_list(xmlChar *str) {
4352*7c568831SAndroid Build Coastguard Worker     xmlChar **buffer;
4353*7c568831SAndroid Build Coastguard Worker     xmlChar **out = NULL;
4354*7c568831SAndroid Build Coastguard Worker     int buffer_size = 0;
4355*7c568831SAndroid Build Coastguard Worker     int len;
4356*7c568831SAndroid Build Coastguard Worker 
4357*7c568831SAndroid Build Coastguard Worker     if(str == NULL) {
4358*7c568831SAndroid Build Coastguard Worker 	return(NULL);
4359*7c568831SAndroid Build Coastguard Worker     }
4360*7c568831SAndroid Build Coastguard Worker 
4361*7c568831SAndroid Build Coastguard Worker     len = xmlStrlen(str);
4362*7c568831SAndroid Build Coastguard Worker     if((str[0] == '\'') && (str[len - 1] == '\'')) {
4363*7c568831SAndroid Build Coastguard Worker 	str[len - 1] = '\0';
4364*7c568831SAndroid Build Coastguard Worker 	str++;
4365*7c568831SAndroid Build Coastguard Worker     }
4366*7c568831SAndroid Build Coastguard Worker     /*
4367*7c568831SAndroid Build Coastguard Worker      * allocate an translation buffer.
4368*7c568831SAndroid Build Coastguard Worker      */
4369*7c568831SAndroid Build Coastguard Worker     buffer_size = 1000;
4370*7c568831SAndroid Build Coastguard Worker     buffer = (xmlChar **) xmlMalloc(buffer_size * sizeof(xmlChar*));
4371*7c568831SAndroid Build Coastguard Worker     if (buffer == NULL) {
4372*7c568831SAndroid Build Coastguard Worker 	perror("malloc failed");
4373*7c568831SAndroid Build Coastguard Worker 	return(NULL);
4374*7c568831SAndroid Build Coastguard Worker     }
4375*7c568831SAndroid Build Coastguard Worker     out = buffer;
4376*7c568831SAndroid Build Coastguard Worker 
4377*7c568831SAndroid Build Coastguard Worker     while(*str != '\0') {
4378*7c568831SAndroid Build Coastguard Worker 	if (out - buffer > buffer_size - 10) {
4379*7c568831SAndroid Build Coastguard Worker 	    int indx = out - buffer;
4380*7c568831SAndroid Build Coastguard Worker 
4381*7c568831SAndroid Build Coastguard Worker 	    xxx_growBufferReentrant();
4382*7c568831SAndroid Build Coastguard Worker 	    out = &buffer[indx];
4383*7c568831SAndroid Build Coastguard Worker 	}
4384*7c568831SAndroid Build Coastguard Worker 	(*out++) = str;
4385*7c568831SAndroid Build Coastguard Worker 	while(*str != ',' && *str != '\0') ++str;
4386*7c568831SAndroid Build Coastguard Worker 	if(*str == ',') *(str++) = '\0';
4387*7c568831SAndroid Build Coastguard Worker     }
4388*7c568831SAndroid Build Coastguard Worker     (*out) = NULL;
4389*7c568831SAndroid Build Coastguard Worker     return buffer;
4390*7c568831SAndroid Build Coastguard Worker }
4391*7c568831SAndroid Build Coastguard Worker 
4392*7c568831SAndroid Build Coastguard Worker static int
c14nRunTest(const char * xml_filename,int with_comments,int mode,const char * xpath_filename,const char * ns_filename,const char * result_file)4393*7c568831SAndroid Build Coastguard Worker c14nRunTest(const char* xml_filename, int with_comments, int mode,
4394*7c568831SAndroid Build Coastguard Worker 	    const char* xpath_filename, const char *ns_filename,
4395*7c568831SAndroid Build Coastguard Worker 	    const char* result_file) {
4396*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
4397*7c568831SAndroid Build Coastguard Worker     xmlXPathObjectPtr xpath = NULL;
4398*7c568831SAndroid Build Coastguard Worker     xmlChar *result = NULL;
4399*7c568831SAndroid Build Coastguard Worker     int ret;
4400*7c568831SAndroid Build Coastguard Worker     xmlChar **inclusive_namespaces = NULL;
4401*7c568831SAndroid Build Coastguard Worker     const char *nslist = NULL;
4402*7c568831SAndroid Build Coastguard Worker     int nssize;
4403*7c568831SAndroid Build Coastguard Worker 
4404*7c568831SAndroid Build Coastguard Worker 
4405*7c568831SAndroid Build Coastguard Worker     /*
4406*7c568831SAndroid Build Coastguard Worker      * build an XML tree from a the file; we need to add default
4407*7c568831SAndroid Build Coastguard Worker      * attributes and resolve all character and entities references
4408*7c568831SAndroid Build Coastguard Worker      */
4409*7c568831SAndroid Build Coastguard Worker     doc = xmlReadFile(xml_filename, NULL,
4410*7c568831SAndroid Build Coastguard Worker             XML_PARSE_DTDATTR | XML_PARSE_NOENT | XML_PARSE_NOWARNING);
4411*7c568831SAndroid Build Coastguard Worker     if (doc == NULL) {
4412*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "Error: unable to parse file \"%s\"\n", xml_filename);
4413*7c568831SAndroid Build Coastguard Worker 	return(-1);
4414*7c568831SAndroid Build Coastguard Worker     }
4415*7c568831SAndroid Build Coastguard Worker 
4416*7c568831SAndroid Build Coastguard Worker     /*
4417*7c568831SAndroid Build Coastguard Worker      * Check the document is of the right kind
4418*7c568831SAndroid Build Coastguard Worker      */
4419*7c568831SAndroid Build Coastguard Worker     if(xmlDocGetRootElement(doc) == NULL) {
4420*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,"Error: empty document for file \"%s\"\n", xml_filename);
4421*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
4422*7c568831SAndroid Build Coastguard Worker 	return(-1);
4423*7c568831SAndroid Build Coastguard Worker     }
4424*7c568831SAndroid Build Coastguard Worker 
4425*7c568831SAndroid Build Coastguard Worker     /*
4426*7c568831SAndroid Build Coastguard Worker      * load xpath file if specified
4427*7c568831SAndroid Build Coastguard Worker      */
4428*7c568831SAndroid Build Coastguard Worker     if(xpath_filename) {
4429*7c568831SAndroid Build Coastguard Worker 	xpath = load_xpath_expr(doc, xpath_filename);
4430*7c568831SAndroid Build Coastguard Worker 	if(xpath == NULL) {
4431*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr,"Error: unable to evaluate xpath expression\n");
4432*7c568831SAndroid Build Coastguard Worker 	    xmlFreeDoc(doc);
4433*7c568831SAndroid Build Coastguard Worker 	    return(-1);
4434*7c568831SAndroid Build Coastguard Worker 	}
4435*7c568831SAndroid Build Coastguard Worker     }
4436*7c568831SAndroid Build Coastguard Worker 
4437*7c568831SAndroid Build Coastguard Worker     if (ns_filename != NULL) {
4438*7c568831SAndroid Build Coastguard Worker         if (loadMem(ns_filename, &nslist, &nssize)) {
4439*7c568831SAndroid Build Coastguard Worker 	    fprintf(stderr,"Error: unable to evaluate xpath expression\n");
4440*7c568831SAndroid Build Coastguard Worker 	    if(xpath != NULL) xmlXPathFreeObject(xpath);
4441*7c568831SAndroid Build Coastguard Worker 	    xmlFreeDoc(doc);
4442*7c568831SAndroid Build Coastguard Worker 	    return(-1);
4443*7c568831SAndroid Build Coastguard Worker 	}
4444*7c568831SAndroid Build Coastguard Worker         inclusive_namespaces = parse_list((xmlChar *) nslist);
4445*7c568831SAndroid Build Coastguard Worker     }
4446*7c568831SAndroid Build Coastguard Worker 
4447*7c568831SAndroid Build Coastguard Worker     /*
4448*7c568831SAndroid Build Coastguard Worker      * Canonical form
4449*7c568831SAndroid Build Coastguard Worker      */
4450*7c568831SAndroid Build Coastguard Worker     /* fprintf(stderr,"File \"%s\" loaded: start canonization\n", xml_filename); */
4451*7c568831SAndroid Build Coastguard Worker     ret = xmlC14NDocDumpMemory(doc,
4452*7c568831SAndroid Build Coastguard Worker 	    (xpath) ? xpath->nodesetval : NULL,
4453*7c568831SAndroid Build Coastguard Worker 	    mode, inclusive_namespaces,
4454*7c568831SAndroid Build Coastguard Worker 	    with_comments, &result);
4455*7c568831SAndroid Build Coastguard Worker     if (ret >= 0) {
4456*7c568831SAndroid Build Coastguard Worker 	if(result != NULL) {
4457*7c568831SAndroid Build Coastguard Worker 	    if (compareFileMem(result_file, (const char *) result, ret)) {
4458*7c568831SAndroid Build Coastguard Worker 		fprintf(stderr, "Result mismatch for %s\n", xml_filename);
4459*7c568831SAndroid Build Coastguard Worker 		fprintf(stderr, "RESULT:\n%s\n", (const char*)result);
4460*7c568831SAndroid Build Coastguard Worker 	        ret = -1;
4461*7c568831SAndroid Build Coastguard Worker 	    }
4462*7c568831SAndroid Build Coastguard Worker 	}
4463*7c568831SAndroid Build Coastguard Worker     } else {
4464*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr,"Error: failed to canonicalize XML file \"%s\" (ret=%d)\n", xml_filename, ret);
4465*7c568831SAndroid Build Coastguard Worker 	ret = -1;
4466*7c568831SAndroid Build Coastguard Worker     }
4467*7c568831SAndroid Build Coastguard Worker 
4468*7c568831SAndroid Build Coastguard Worker     /*
4469*7c568831SAndroid Build Coastguard Worker      * Cleanup
4470*7c568831SAndroid Build Coastguard Worker      */
4471*7c568831SAndroid Build Coastguard Worker     if (result != NULL) xmlFree(result);
4472*7c568831SAndroid Build Coastguard Worker     if(xpath != NULL) xmlXPathFreeObject(xpath);
4473*7c568831SAndroid Build Coastguard Worker     if (inclusive_namespaces != NULL) xmlFree(inclusive_namespaces);
4474*7c568831SAndroid Build Coastguard Worker     if (nslist != NULL) free((char *) nslist);
4475*7c568831SAndroid Build Coastguard Worker     xmlFreeDoc(doc);
4476*7c568831SAndroid Build Coastguard Worker 
4477*7c568831SAndroid Build Coastguard Worker     return(ret);
4478*7c568831SAndroid Build Coastguard Worker }
4479*7c568831SAndroid Build Coastguard Worker 
4480*7c568831SAndroid Build Coastguard Worker static int
c14nCommonTest(const char * filename,int with_comments,int mode,const char * subdir)4481*7c568831SAndroid Build Coastguard Worker c14nCommonTest(const char *filename, int with_comments, int mode,
4482*7c568831SAndroid Build Coastguard Worker                const char *subdir) {
4483*7c568831SAndroid Build Coastguard Worker     char buf[500];
4484*7c568831SAndroid Build Coastguard Worker     char prefix[500];
4485*7c568831SAndroid Build Coastguard Worker     const char *base;
4486*7c568831SAndroid Build Coastguard Worker     int len;
4487*7c568831SAndroid Build Coastguard Worker     char *result = NULL;
4488*7c568831SAndroid Build Coastguard Worker     char *xpath = NULL;
4489*7c568831SAndroid Build Coastguard Worker     char *ns = NULL;
4490*7c568831SAndroid Build Coastguard Worker     int ret = 0;
4491*7c568831SAndroid Build Coastguard Worker 
4492*7c568831SAndroid Build Coastguard Worker     base = baseFilename(filename);
4493*7c568831SAndroid Build Coastguard Worker     len = strlen(base);
4494*7c568831SAndroid Build Coastguard Worker     len -= 4;
4495*7c568831SAndroid Build Coastguard Worker     memcpy(prefix, base, len);
4496*7c568831SAndroid Build Coastguard Worker     prefix[len] = 0;
4497*7c568831SAndroid Build Coastguard Worker 
4498*7c568831SAndroid Build Coastguard Worker     if (snprintf(buf, 499, "result/c14n/%s/%s", subdir, prefix) >= 499)
4499*7c568831SAndroid Build Coastguard Worker         buf[499] = 0;
4500*7c568831SAndroid Build Coastguard Worker     result = strdup(buf);
4501*7c568831SAndroid Build Coastguard Worker     if (snprintf(buf, 499, "test/c14n/%s/%s.xpath", subdir, prefix) >= 499)
4502*7c568831SAndroid Build Coastguard Worker         buf[499] = 0;
4503*7c568831SAndroid Build Coastguard Worker     if (checkTestFile(buf)) {
4504*7c568831SAndroid Build Coastguard Worker 	xpath = strdup(buf);
4505*7c568831SAndroid Build Coastguard Worker     }
4506*7c568831SAndroid Build Coastguard Worker     if (snprintf(buf, 499, "test/c14n/%s/%s.ns", subdir, prefix) >= 499)
4507*7c568831SAndroid Build Coastguard Worker         buf[499] = 0;
4508*7c568831SAndroid Build Coastguard Worker     if (checkTestFile(buf)) {
4509*7c568831SAndroid Build Coastguard Worker 	ns = strdup(buf);
4510*7c568831SAndroid Build Coastguard Worker     }
4511*7c568831SAndroid Build Coastguard Worker 
4512*7c568831SAndroid Build Coastguard Worker     nb_tests++;
4513*7c568831SAndroid Build Coastguard Worker     if (c14nRunTest(filename, with_comments, mode,
4514*7c568831SAndroid Build Coastguard Worker                     xpath, ns, result) < 0)
4515*7c568831SAndroid Build Coastguard Worker         ret = 1;
4516*7c568831SAndroid Build Coastguard Worker 
4517*7c568831SAndroid Build Coastguard Worker     if (result != NULL) free(result);
4518*7c568831SAndroid Build Coastguard Worker     if (xpath != NULL) free(xpath);
4519*7c568831SAndroid Build Coastguard Worker     if (ns != NULL) free(ns);
4520*7c568831SAndroid Build Coastguard Worker     return(ret);
4521*7c568831SAndroid Build Coastguard Worker }
4522*7c568831SAndroid Build Coastguard Worker 
4523*7c568831SAndroid Build Coastguard Worker static int
c14nWithCommentTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)4524*7c568831SAndroid Build Coastguard Worker c14nWithCommentTest(const char *filename,
4525*7c568831SAndroid Build Coastguard Worker                     const char *resul ATTRIBUTE_UNUSED,
4526*7c568831SAndroid Build Coastguard Worker 		    const char *err ATTRIBUTE_UNUSED,
4527*7c568831SAndroid Build Coastguard Worker 		    int options ATTRIBUTE_UNUSED) {
4528*7c568831SAndroid Build Coastguard Worker     return(c14nCommonTest(filename, 1, XML_C14N_1_0, "with-comments"));
4529*7c568831SAndroid Build Coastguard Worker }
4530*7c568831SAndroid Build Coastguard Worker static int
c14nWithoutCommentTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)4531*7c568831SAndroid Build Coastguard Worker c14nWithoutCommentTest(const char *filename,
4532*7c568831SAndroid Build Coastguard Worker                     const char *resul ATTRIBUTE_UNUSED,
4533*7c568831SAndroid Build Coastguard Worker 		    const char *err ATTRIBUTE_UNUSED,
4534*7c568831SAndroid Build Coastguard Worker 		    int options ATTRIBUTE_UNUSED) {
4535*7c568831SAndroid Build Coastguard Worker     return(c14nCommonTest(filename, 0, XML_C14N_1_0, "without-comments"));
4536*7c568831SAndroid Build Coastguard Worker }
4537*7c568831SAndroid Build Coastguard Worker static int
c14nExcWithoutCommentTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)4538*7c568831SAndroid Build Coastguard Worker c14nExcWithoutCommentTest(const char *filename,
4539*7c568831SAndroid Build Coastguard Worker                     const char *resul ATTRIBUTE_UNUSED,
4540*7c568831SAndroid Build Coastguard Worker 		    const char *err ATTRIBUTE_UNUSED,
4541*7c568831SAndroid Build Coastguard Worker 		    int options ATTRIBUTE_UNUSED) {
4542*7c568831SAndroid Build Coastguard Worker     return(c14nCommonTest(filename, 0, XML_C14N_EXCLUSIVE_1_0, "exc-without-comments"));
4543*7c568831SAndroid Build Coastguard Worker }
4544*7c568831SAndroid Build Coastguard Worker static int
c14n11WithoutCommentTest(const char * filename,const char * resul ATTRIBUTE_UNUSED,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)4545*7c568831SAndroid Build Coastguard Worker c14n11WithoutCommentTest(const char *filename,
4546*7c568831SAndroid Build Coastguard Worker                     const char *resul ATTRIBUTE_UNUSED,
4547*7c568831SAndroid Build Coastguard Worker 		    const char *err ATTRIBUTE_UNUSED,
4548*7c568831SAndroid Build Coastguard Worker 		    int options ATTRIBUTE_UNUSED) {
4549*7c568831SAndroid Build Coastguard Worker     return(c14nCommonTest(filename, 0, XML_C14N_1_1, "1-1-without-comments"));
4550*7c568831SAndroid Build Coastguard Worker }
4551*7c568831SAndroid Build Coastguard Worker #endif
4552*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
4553*7c568831SAndroid Build Coastguard Worker /************************************************************************
4554*7c568831SAndroid Build Coastguard Worker  *									*
4555*7c568831SAndroid Build Coastguard Worker  *			Catalog and threads test			*
4556*7c568831SAndroid Build Coastguard Worker  *									*
4557*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
4558*7c568831SAndroid Build Coastguard Worker 
4559*7c568831SAndroid Build Coastguard Worker #define	MAX_ARGC	20
4560*7c568831SAndroid Build Coastguard Worker 
4561*7c568831SAndroid Build Coastguard Worker typedef struct {
4562*7c568831SAndroid Build Coastguard Worker     const char *filename;
4563*7c568831SAndroid Build Coastguard Worker     int okay;
4564*7c568831SAndroid Build Coastguard Worker } xmlThreadParams;
4565*7c568831SAndroid Build Coastguard Worker 
4566*7c568831SAndroid Build Coastguard Worker static const char *catalog = "test/threads/complex.xml";
4567*7c568831SAndroid Build Coastguard Worker static xmlThreadParams threadParams[] = {
4568*7c568831SAndroid Build Coastguard Worker     { "test/threads/abc.xml", 0 },
4569*7c568831SAndroid Build Coastguard Worker     { "test/threads/acb.xml", 0 },
4570*7c568831SAndroid Build Coastguard Worker     { "test/threads/bac.xml", 0 },
4571*7c568831SAndroid Build Coastguard Worker     { "test/threads/bca.xml", 0 },
4572*7c568831SAndroid Build Coastguard Worker     { "test/threads/cab.xml", 0 },
4573*7c568831SAndroid Build Coastguard Worker     { "test/threads/cba.xml", 0 },
4574*7c568831SAndroid Build Coastguard Worker     { "test/threads/invalid.xml", 0 }
4575*7c568831SAndroid Build Coastguard Worker };
4576*7c568831SAndroid Build Coastguard Worker static const unsigned int num_threads = sizeof(threadParams) /
4577*7c568831SAndroid Build Coastguard Worker                                         sizeof(threadParams[0]);
4578*7c568831SAndroid Build Coastguard Worker 
4579*7c568831SAndroid Build Coastguard Worker static void *
thread_specific_data(void * private_data)4580*7c568831SAndroid Build Coastguard Worker thread_specific_data(void *private_data)
4581*7c568831SAndroid Build Coastguard Worker {
4582*7c568831SAndroid Build Coastguard Worker     xmlDocPtr myDoc;
4583*7c568831SAndroid Build Coastguard Worker     xmlThreadParams *params = (xmlThreadParams *) private_data;
4584*7c568831SAndroid Build Coastguard Worker     const char *filename = params->filename;
4585*7c568831SAndroid Build Coastguard Worker     int okay = 1;
4586*7c568831SAndroid Build Coastguard Worker 
4587*7c568831SAndroid Build Coastguard Worker     if (xmlCheckThreadLocalStorage() != 0) {
4588*7c568831SAndroid Build Coastguard Worker         printf("xmlCheckThreadLocalStorage failed\n");
4589*7c568831SAndroid Build Coastguard Worker         params->okay = 0;
4590*7c568831SAndroid Build Coastguard Worker         return(NULL);
4591*7c568831SAndroid Build Coastguard Worker     }
4592*7c568831SAndroid Build Coastguard Worker 
4593*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_THREAD_ALLOC_ENABLED
4594*7c568831SAndroid Build Coastguard Worker     xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);
4595*7c568831SAndroid Build Coastguard Worker #endif
4596*7c568831SAndroid Build Coastguard Worker 
4597*7c568831SAndroid Build Coastguard Worker     myDoc = xmlReadFile(filename, NULL, XML_PARSE_NOENT | XML_PARSE_DTDLOAD);
4598*7c568831SAndroid Build Coastguard Worker     if (myDoc) {
4599*7c568831SAndroid Build Coastguard Worker         xmlFreeDoc(myDoc);
4600*7c568831SAndroid Build Coastguard Worker     } else {
4601*7c568831SAndroid Build Coastguard Worker         printf("parse failed\n");
4602*7c568831SAndroid Build Coastguard Worker         okay = 0;
4603*7c568831SAndroid Build Coastguard Worker     }
4604*7c568831SAndroid Build Coastguard Worker     params->okay = okay;
4605*7c568831SAndroid Build Coastguard Worker     return(NULL);
4606*7c568831SAndroid Build Coastguard Worker }
4607*7c568831SAndroid Build Coastguard Worker 
4608*7c568831SAndroid Build Coastguard Worker #if defined(_WIN32)
4609*7c568831SAndroid Build Coastguard Worker #include <windows.h>
4610*7c568831SAndroid Build Coastguard Worker #include <string.h>
4611*7c568831SAndroid Build Coastguard Worker 
4612*7c568831SAndroid Build Coastguard Worker #define TEST_REPEAT_COUNT 500
4613*7c568831SAndroid Build Coastguard Worker 
4614*7c568831SAndroid Build Coastguard Worker static HANDLE tid[MAX_ARGC];
4615*7c568831SAndroid Build Coastguard Worker 
4616*7c568831SAndroid Build Coastguard Worker static DWORD WINAPI
win32_thread_specific_data(void * private_data)4617*7c568831SAndroid Build Coastguard Worker win32_thread_specific_data(void *private_data)
4618*7c568831SAndroid Build Coastguard Worker {
4619*7c568831SAndroid Build Coastguard Worker     thread_specific_data(private_data);
4620*7c568831SAndroid Build Coastguard Worker     return(0);
4621*7c568831SAndroid Build Coastguard Worker }
4622*7c568831SAndroid Build Coastguard Worker 
4623*7c568831SAndroid Build Coastguard Worker static int
testThread(void)4624*7c568831SAndroid Build Coastguard Worker testThread(void)
4625*7c568831SAndroid Build Coastguard Worker {
4626*7c568831SAndroid Build Coastguard Worker     unsigned int i, repeat;
4627*7c568831SAndroid Build Coastguard Worker     BOOL ret;
4628*7c568831SAndroid Build Coastguard Worker     int res = 0;
4629*7c568831SAndroid Build Coastguard Worker 
4630*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
4631*7c568831SAndroid Build Coastguard Worker     for (repeat = 0; repeat < TEST_REPEAT_COUNT; repeat++) {
4632*7c568831SAndroid Build Coastguard Worker         xmlLoadCatalog(catalog);
4633*7c568831SAndroid Build Coastguard Worker         nb_tests++;
4634*7c568831SAndroid Build Coastguard Worker 
4635*7c568831SAndroid Build Coastguard Worker         for (i = 0; i < num_threads; i++) {
4636*7c568831SAndroid Build Coastguard Worker             tid[i] = (HANDLE) - 1;
4637*7c568831SAndroid Build Coastguard Worker         }
4638*7c568831SAndroid Build Coastguard Worker 
4639*7c568831SAndroid Build Coastguard Worker         for (i = 0; i < num_threads; i++) {
4640*7c568831SAndroid Build Coastguard Worker             DWORD useless;
4641*7c568831SAndroid Build Coastguard Worker 
4642*7c568831SAndroid Build Coastguard Worker             tid[i] = CreateThread(NULL, 0,
4643*7c568831SAndroid Build Coastguard Worker                                   win32_thread_specific_data,
4644*7c568831SAndroid Build Coastguard Worker 				  (void *) &threadParams[i], 0,
4645*7c568831SAndroid Build Coastguard Worker                                   &useless);
4646*7c568831SAndroid Build Coastguard Worker             if (tid[i] == NULL) {
4647*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "CreateThread failed\n");
4648*7c568831SAndroid Build Coastguard Worker                 return(1);
4649*7c568831SAndroid Build Coastguard Worker             }
4650*7c568831SAndroid Build Coastguard Worker         }
4651*7c568831SAndroid Build Coastguard Worker 
4652*7c568831SAndroid Build Coastguard Worker         if (WaitForMultipleObjects(num_threads, tid, TRUE, INFINITE) ==
4653*7c568831SAndroid Build Coastguard Worker             WAIT_FAILED) {
4654*7c568831SAndroid Build Coastguard Worker             fprintf(stderr, "WaitForMultipleObjects failed\n");
4655*7c568831SAndroid Build Coastguard Worker 	    return(1);
4656*7c568831SAndroid Build Coastguard Worker 	}
4657*7c568831SAndroid Build Coastguard Worker 
4658*7c568831SAndroid Build Coastguard Worker         for (i = 0; i < num_threads; i++) {
4659*7c568831SAndroid Build Coastguard Worker             DWORD exitCode;
4660*7c568831SAndroid Build Coastguard Worker             ret = GetExitCodeThread(tid[i], &exitCode);
4661*7c568831SAndroid Build Coastguard Worker             if (ret == 0) {
4662*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "GetExitCodeThread failed\n");
4663*7c568831SAndroid Build Coastguard Worker                 return(1);
4664*7c568831SAndroid Build Coastguard Worker             }
4665*7c568831SAndroid Build Coastguard Worker             CloseHandle(tid[i]);
4666*7c568831SAndroid Build Coastguard Worker         }
4667*7c568831SAndroid Build Coastguard Worker 
4668*7c568831SAndroid Build Coastguard Worker         xmlCatalogCleanup();
4669*7c568831SAndroid Build Coastguard Worker         for (i = 0; i < num_threads; i++) {
4670*7c568831SAndroid Build Coastguard Worker             if (threadParams[i].okay == 0) {
4671*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "Thread %d handling %s failed\n",
4672*7c568831SAndroid Build Coastguard Worker 		        i, threadParams[i].filename);
4673*7c568831SAndroid Build Coastguard Worker 	        res = 1;
4674*7c568831SAndroid Build Coastguard Worker 	    }
4675*7c568831SAndroid Build Coastguard Worker         }
4676*7c568831SAndroid Build Coastguard Worker     }
4677*7c568831SAndroid Build Coastguard Worker 
4678*7c568831SAndroid Build Coastguard Worker     return (res);
4679*7c568831SAndroid Build Coastguard Worker }
4680*7c568831SAndroid Build Coastguard Worker 
4681*7c568831SAndroid Build Coastguard Worker #else
4682*7c568831SAndroid Build Coastguard Worker #include <pthread.h>
4683*7c568831SAndroid Build Coastguard Worker 
4684*7c568831SAndroid Build Coastguard Worker static pthread_t tid[MAX_ARGC];
4685*7c568831SAndroid Build Coastguard Worker 
4686*7c568831SAndroid Build Coastguard Worker static int
testThread(void)4687*7c568831SAndroid Build Coastguard Worker testThread(void)
4688*7c568831SAndroid Build Coastguard Worker {
4689*7c568831SAndroid Build Coastguard Worker     unsigned int i, repeat;
4690*7c568831SAndroid Build Coastguard Worker     int ret;
4691*7c568831SAndroid Build Coastguard Worker     int res = 0;
4692*7c568831SAndroid Build Coastguard Worker 
4693*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
4694*7c568831SAndroid Build Coastguard Worker 
4695*7c568831SAndroid Build Coastguard Worker     for (repeat = 0; repeat < 500; repeat++) {
4696*7c568831SAndroid Build Coastguard Worker         xmlLoadCatalog(catalog);
4697*7c568831SAndroid Build Coastguard Worker         nb_tests++;
4698*7c568831SAndroid Build Coastguard Worker 
4699*7c568831SAndroid Build Coastguard Worker         for (i = 0; i < num_threads; i++) {
4700*7c568831SAndroid Build Coastguard Worker             tid[i] = (pthread_t) - 1;
4701*7c568831SAndroid Build Coastguard Worker         }
4702*7c568831SAndroid Build Coastguard Worker 
4703*7c568831SAndroid Build Coastguard Worker         for (i = 0; i < num_threads; i++) {
4704*7c568831SAndroid Build Coastguard Worker             ret = pthread_create(&tid[i], 0, thread_specific_data,
4705*7c568831SAndroid Build Coastguard Worker                                  (void *) &threadParams[i]);
4706*7c568831SAndroid Build Coastguard Worker             if (ret != 0) {
4707*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "pthread_create failed\n");
4708*7c568831SAndroid Build Coastguard Worker                 return (1);
4709*7c568831SAndroid Build Coastguard Worker             }
4710*7c568831SAndroid Build Coastguard Worker         }
4711*7c568831SAndroid Build Coastguard Worker         for (i = 0; i < num_threads; i++) {
4712*7c568831SAndroid Build Coastguard Worker             void *result;
4713*7c568831SAndroid Build Coastguard Worker             ret = pthread_join(tid[i], &result);
4714*7c568831SAndroid Build Coastguard Worker             if (ret != 0) {
4715*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "pthread_join failed\n");
4716*7c568831SAndroid Build Coastguard Worker                 return (1);
4717*7c568831SAndroid Build Coastguard Worker             }
4718*7c568831SAndroid Build Coastguard Worker         }
4719*7c568831SAndroid Build Coastguard Worker 
4720*7c568831SAndroid Build Coastguard Worker         xmlCatalogCleanup();
4721*7c568831SAndroid Build Coastguard Worker         for (i = 0; i < num_threads; i++)
4722*7c568831SAndroid Build Coastguard Worker             if (threadParams[i].okay == 0) {
4723*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "Thread %d handling %s failed\n",
4724*7c568831SAndroid Build Coastguard Worker                         i, threadParams[i].filename);
4725*7c568831SAndroid Build Coastguard Worker                 res = 1;
4726*7c568831SAndroid Build Coastguard Worker             }
4727*7c568831SAndroid Build Coastguard Worker     }
4728*7c568831SAndroid Build Coastguard Worker     return (res);
4729*7c568831SAndroid Build Coastguard Worker }
4730*7c568831SAndroid Build Coastguard Worker #endif
4731*7c568831SAndroid Build Coastguard Worker static int
threadsTest(const char * filename ATTRIBUTE_UNUSED,const char * resul ATTRIBUTE_UNUSED,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)4732*7c568831SAndroid Build Coastguard Worker threadsTest(const char *filename ATTRIBUTE_UNUSED,
4733*7c568831SAndroid Build Coastguard Worker 	    const char *resul ATTRIBUTE_UNUSED,
4734*7c568831SAndroid Build Coastguard Worker 	    const char *err ATTRIBUTE_UNUSED,
4735*7c568831SAndroid Build Coastguard Worker 	    int options ATTRIBUTE_UNUSED) {
4736*7c568831SAndroid Build Coastguard Worker     return(testThread());
4737*7c568831SAndroid Build Coastguard Worker }
4738*7c568831SAndroid Build Coastguard Worker #endif
4739*7c568831SAndroid Build Coastguard Worker 
4740*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_REGEXP_ENABLED)
4741*7c568831SAndroid Build Coastguard Worker /************************************************************************
4742*7c568831SAndroid Build Coastguard Worker  *									*
4743*7c568831SAndroid Build Coastguard Worker  *			Regexp tests					*
4744*7c568831SAndroid Build Coastguard Worker  *									*
4745*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
4746*7c568831SAndroid Build Coastguard Worker 
testRegexp(FILE * output,xmlRegexpPtr comp,const char * value)4747*7c568831SAndroid Build Coastguard Worker static void testRegexp(FILE *output, xmlRegexpPtr comp, const char *value) {
4748*7c568831SAndroid Build Coastguard Worker     int ret;
4749*7c568831SAndroid Build Coastguard Worker 
4750*7c568831SAndroid Build Coastguard Worker     ret = xmlRegexpExec(comp, (const xmlChar *) value);
4751*7c568831SAndroid Build Coastguard Worker     if (ret == 1)
4752*7c568831SAndroid Build Coastguard Worker 	fprintf(output, "%s: Ok\n", value);
4753*7c568831SAndroid Build Coastguard Worker     else if (ret == 0)
4754*7c568831SAndroid Build Coastguard Worker 	fprintf(output, "%s: Fail\n", value);
4755*7c568831SAndroid Build Coastguard Worker     else
4756*7c568831SAndroid Build Coastguard Worker 	fprintf(output, "%s: Error: %d\n", value, ret);
4757*7c568831SAndroid Build Coastguard Worker }
4758*7c568831SAndroid Build Coastguard Worker 
4759*7c568831SAndroid Build Coastguard Worker static int
regexpTest(const char * filename,const char * result,const char * err,int options ATTRIBUTE_UNUSED)4760*7c568831SAndroid Build Coastguard Worker regexpTest(const char *filename, const char *result, const char *err,
4761*7c568831SAndroid Build Coastguard Worker 	   int options ATTRIBUTE_UNUSED) {
4762*7c568831SAndroid Build Coastguard Worker     xmlRegexpPtr comp = NULL;
4763*7c568831SAndroid Build Coastguard Worker     FILE *input, *output;
4764*7c568831SAndroid Build Coastguard Worker     char *temp;
4765*7c568831SAndroid Build Coastguard Worker     char expression[5000];
4766*7c568831SAndroid Build Coastguard Worker     int len, ret, res = 0;
4767*7c568831SAndroid Build Coastguard Worker 
4768*7c568831SAndroid Build Coastguard Worker     /*
4769*7c568831SAndroid Build Coastguard Worker      * TODO: Custom error handler for regexp
4770*7c568831SAndroid Build Coastguard Worker      */
4771*7c568831SAndroid Build Coastguard Worker     xmlSetStructuredErrorFunc(NULL, testStructuredErrorHandler);
4772*7c568831SAndroid Build Coastguard Worker 
4773*7c568831SAndroid Build Coastguard Worker     nb_tests++;
4774*7c568831SAndroid Build Coastguard Worker 
4775*7c568831SAndroid Build Coastguard Worker     input = fopen(filename, "rb");
4776*7c568831SAndroid Build Coastguard Worker     if (input == NULL) {
4777*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,
4778*7c568831SAndroid Build Coastguard Worker 		"Cannot open %s for reading\n", filename);
4779*7c568831SAndroid Build Coastguard Worker 	ret = -1;
4780*7c568831SAndroid Build Coastguard Worker         goto done;
4781*7c568831SAndroid Build Coastguard Worker     }
4782*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, "", ".res");
4783*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
4784*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Out of memory\n");
4785*7c568831SAndroid Build Coastguard Worker         fatalError();
4786*7c568831SAndroid Build Coastguard Worker     }
4787*7c568831SAndroid Build Coastguard Worker     output = fopen(temp, "wb");
4788*7c568831SAndroid Build Coastguard Worker     if (output == NULL) {
4789*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "failed to open output file %s\n", temp);
4790*7c568831SAndroid Build Coastguard Worker         free(temp);
4791*7c568831SAndroid Build Coastguard Worker 	ret = -1;
4792*7c568831SAndroid Build Coastguard Worker         goto done;
4793*7c568831SAndroid Build Coastguard Worker     }
4794*7c568831SAndroid Build Coastguard Worker     while (fgets(expression, 4500, input) != NULL) {
4795*7c568831SAndroid Build Coastguard Worker 	len = strlen(expression);
4796*7c568831SAndroid Build Coastguard Worker 	len--;
4797*7c568831SAndroid Build Coastguard Worker 	while ((len >= 0) &&
4798*7c568831SAndroid Build Coastguard Worker 	       ((expression[len] == '\n') || (expression[len] == '\t') ||
4799*7c568831SAndroid Build Coastguard Worker 		(expression[len] == '\r') || (expression[len] == ' '))) len--;
4800*7c568831SAndroid Build Coastguard Worker 	expression[len + 1] = 0;
4801*7c568831SAndroid Build Coastguard Worker 	if (len >= 0) {
4802*7c568831SAndroid Build Coastguard Worker 	    if (expression[0] == '#')
4803*7c568831SAndroid Build Coastguard Worker 		continue;
4804*7c568831SAndroid Build Coastguard Worker 	    if ((expression[0] == '=') && (expression[1] == '>')) {
4805*7c568831SAndroid Build Coastguard Worker 		char *pattern = &expression[2];
4806*7c568831SAndroid Build Coastguard Worker 
4807*7c568831SAndroid Build Coastguard Worker 		if (comp != NULL) {
4808*7c568831SAndroid Build Coastguard Worker 		    xmlRegFreeRegexp(comp);
4809*7c568831SAndroid Build Coastguard Worker 		    comp = NULL;
4810*7c568831SAndroid Build Coastguard Worker 		}
4811*7c568831SAndroid Build Coastguard Worker 		fprintf(output, "Regexp: %s\n", pattern) ;
4812*7c568831SAndroid Build Coastguard Worker 		comp = xmlRegexpCompile((const xmlChar *) pattern);
4813*7c568831SAndroid Build Coastguard Worker 		if (comp == NULL) {
4814*7c568831SAndroid Build Coastguard Worker 		    fprintf(output, "   failed to compile\n");
4815*7c568831SAndroid Build Coastguard Worker 		    break;
4816*7c568831SAndroid Build Coastguard Worker 		}
4817*7c568831SAndroid Build Coastguard Worker 	    } else if (comp == NULL) {
4818*7c568831SAndroid Build Coastguard Worker 		fprintf(output, "Regexp: %s\n", expression) ;
4819*7c568831SAndroid Build Coastguard Worker 		comp = xmlRegexpCompile((const xmlChar *) expression);
4820*7c568831SAndroid Build Coastguard Worker 		if (comp == NULL) {
4821*7c568831SAndroid Build Coastguard Worker 		    fprintf(output, "   failed to compile\n");
4822*7c568831SAndroid Build Coastguard Worker 		    break;
4823*7c568831SAndroid Build Coastguard Worker 		}
4824*7c568831SAndroid Build Coastguard Worker 	    } else if (comp != NULL) {
4825*7c568831SAndroid Build Coastguard Worker 		testRegexp(output, comp, expression);
4826*7c568831SAndroid Build Coastguard Worker 	    }
4827*7c568831SAndroid Build Coastguard Worker 	}
4828*7c568831SAndroid Build Coastguard Worker     }
4829*7c568831SAndroid Build Coastguard Worker     fclose(output);
4830*7c568831SAndroid Build Coastguard Worker     fclose(input);
4831*7c568831SAndroid Build Coastguard Worker     if (comp != NULL)
4832*7c568831SAndroid Build Coastguard Worker 	xmlRegFreeRegexp(comp);
4833*7c568831SAndroid Build Coastguard Worker 
4834*7c568831SAndroid Build Coastguard Worker     ret = compareFiles(temp, result);
4835*7c568831SAndroid Build Coastguard Worker     if (ret) {
4836*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Result for %s failed in %s\n", filename, result);
4837*7c568831SAndroid Build Coastguard Worker         res = 1;
4838*7c568831SAndroid Build Coastguard Worker     }
4839*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
4840*7c568831SAndroid Build Coastguard Worker         unlink(temp);
4841*7c568831SAndroid Build Coastguard Worker         free(temp);
4842*7c568831SAndroid Build Coastguard Worker     }
4843*7c568831SAndroid Build Coastguard Worker 
4844*7c568831SAndroid Build Coastguard Worker     ret = compareFileMem(err, testErrors, testErrorsSize);
4845*7c568831SAndroid Build Coastguard Worker     if (ret != 0) {
4846*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Error for %s failed\n", filename);
4847*7c568831SAndroid Build Coastguard Worker         res = 1;
4848*7c568831SAndroid Build Coastguard Worker     }
4849*7c568831SAndroid Build Coastguard Worker 
4850*7c568831SAndroid Build Coastguard Worker done:
4851*7c568831SAndroid Build Coastguard Worker     xmlSetStructuredErrorFunc(NULL, NULL);
4852*7c568831SAndroid Build Coastguard Worker 
4853*7c568831SAndroid Build Coastguard Worker     return(res);
4854*7c568831SAndroid Build Coastguard Worker }
4855*7c568831SAndroid Build Coastguard Worker 
4856*7c568831SAndroid Build Coastguard Worker /************************************************************************
4857*7c568831SAndroid Build Coastguard Worker  *									*
4858*7c568831SAndroid Build Coastguard Worker  *			Automata tests					*
4859*7c568831SAndroid Build Coastguard Worker  *									*
4860*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
4861*7c568831SAndroid Build Coastguard Worker 
scanNumber(char ** ptr)4862*7c568831SAndroid Build Coastguard Worker static int scanNumber(char **ptr) {
4863*7c568831SAndroid Build Coastguard Worker     int ret = 0;
4864*7c568831SAndroid Build Coastguard Worker     char *cur;
4865*7c568831SAndroid Build Coastguard Worker 
4866*7c568831SAndroid Build Coastguard Worker     cur = *ptr;
4867*7c568831SAndroid Build Coastguard Worker     while ((*cur >= '0') && (*cur <= '9')) {
4868*7c568831SAndroid Build Coastguard Worker 	ret = ret * 10 + (*cur - '0');
4869*7c568831SAndroid Build Coastguard Worker 	cur++;
4870*7c568831SAndroid Build Coastguard Worker     }
4871*7c568831SAndroid Build Coastguard Worker     *ptr = cur;
4872*7c568831SAndroid Build Coastguard Worker     return(ret);
4873*7c568831SAndroid Build Coastguard Worker }
4874*7c568831SAndroid Build Coastguard Worker 
4875*7c568831SAndroid Build Coastguard Worker static int
automataTest(const char * filename,const char * result,const char * err ATTRIBUTE_UNUSED,int options ATTRIBUTE_UNUSED)4876*7c568831SAndroid Build Coastguard Worker automataTest(const char *filename, const char *result,
4877*7c568831SAndroid Build Coastguard Worker              const char *err ATTRIBUTE_UNUSED, int options ATTRIBUTE_UNUSED) {
4878*7c568831SAndroid Build Coastguard Worker     FILE *input, *output;
4879*7c568831SAndroid Build Coastguard Worker     char *temp;
4880*7c568831SAndroid Build Coastguard Worker     char expr[5000];
4881*7c568831SAndroid Build Coastguard Worker     int len;
4882*7c568831SAndroid Build Coastguard Worker     int ret;
4883*7c568831SAndroid Build Coastguard Worker     int i;
4884*7c568831SAndroid Build Coastguard Worker     int res = 0;
4885*7c568831SAndroid Build Coastguard Worker     xmlAutomataPtr am;
4886*7c568831SAndroid Build Coastguard Worker     xmlAutomataStatePtr states[1000];
4887*7c568831SAndroid Build Coastguard Worker     xmlRegexpPtr regexp = NULL;
4888*7c568831SAndroid Build Coastguard Worker     xmlRegExecCtxtPtr exec = NULL;
4889*7c568831SAndroid Build Coastguard Worker 
4890*7c568831SAndroid Build Coastguard Worker     nb_tests++;
4891*7c568831SAndroid Build Coastguard Worker 
4892*7c568831SAndroid Build Coastguard Worker     for (i = 0;i<1000;i++)
4893*7c568831SAndroid Build Coastguard Worker 	states[i] = NULL;
4894*7c568831SAndroid Build Coastguard Worker 
4895*7c568831SAndroid Build Coastguard Worker     input = fopen(filename, "rb");
4896*7c568831SAndroid Build Coastguard Worker     if (input == NULL) {
4897*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,
4898*7c568831SAndroid Build Coastguard Worker 		"Cannot open %s for reading\n", filename);
4899*7c568831SAndroid Build Coastguard Worker 	return(-1);
4900*7c568831SAndroid Build Coastguard Worker     }
4901*7c568831SAndroid Build Coastguard Worker     temp = resultFilename(filename, "", ".res");
4902*7c568831SAndroid Build Coastguard Worker     if (temp == NULL) {
4903*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Out of memory\n");
4904*7c568831SAndroid Build Coastguard Worker         fatalError();
4905*7c568831SAndroid Build Coastguard Worker     }
4906*7c568831SAndroid Build Coastguard Worker     output = fopen(temp, "wb");
4907*7c568831SAndroid Build Coastguard Worker     if (output == NULL) {
4908*7c568831SAndroid Build Coastguard Worker 	fprintf(stderr, "failed to open output file %s\n", temp);
4909*7c568831SAndroid Build Coastguard Worker         free(temp);
4910*7c568831SAndroid Build Coastguard Worker 	return(-1);
4911*7c568831SAndroid Build Coastguard Worker     }
4912*7c568831SAndroid Build Coastguard Worker 
4913*7c568831SAndroid Build Coastguard Worker     am = xmlNewAutomata();
4914*7c568831SAndroid Build Coastguard Worker     if (am == NULL) {
4915*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,
4916*7c568831SAndroid Build Coastguard Worker 		"Cannot create automata\n");
4917*7c568831SAndroid Build Coastguard Worker 	fclose(input);
4918*7c568831SAndroid Build Coastguard Worker 	return(-1);
4919*7c568831SAndroid Build Coastguard Worker     }
4920*7c568831SAndroid Build Coastguard Worker     states[0] = xmlAutomataGetInitState(am);
4921*7c568831SAndroid Build Coastguard Worker     if (states[0] == NULL) {
4922*7c568831SAndroid Build Coastguard Worker         fprintf(stderr,
4923*7c568831SAndroid Build Coastguard Worker 		"Cannot get start state\n");
4924*7c568831SAndroid Build Coastguard Worker 	xmlFreeAutomata(am);
4925*7c568831SAndroid Build Coastguard Worker 	fclose(input);
4926*7c568831SAndroid Build Coastguard Worker 	return(-1);
4927*7c568831SAndroid Build Coastguard Worker     }
4928*7c568831SAndroid Build Coastguard Worker     ret = 0;
4929*7c568831SAndroid Build Coastguard Worker 
4930*7c568831SAndroid Build Coastguard Worker     while (fgets(expr, 4500, input) != NULL) {
4931*7c568831SAndroid Build Coastguard Worker 	if (expr[0] == '#')
4932*7c568831SAndroid Build Coastguard Worker 	    continue;
4933*7c568831SAndroid Build Coastguard Worker 	len = strlen(expr);
4934*7c568831SAndroid Build Coastguard Worker 	len--;
4935*7c568831SAndroid Build Coastguard Worker 	while ((len >= 0) &&
4936*7c568831SAndroid Build Coastguard Worker 	       ((expr[len] == '\n') || (expr[len] == '\t') ||
4937*7c568831SAndroid Build Coastguard Worker 		(expr[len] == '\r') || (expr[len] == ' '))) len--;
4938*7c568831SAndroid Build Coastguard Worker 	expr[len + 1] = 0;
4939*7c568831SAndroid Build Coastguard Worker 	if (len >= 0) {
4940*7c568831SAndroid Build Coastguard Worker 	    if ((am != NULL) && (expr[0] == 't') && (expr[1] == ' ')) {
4941*7c568831SAndroid Build Coastguard Worker 		char *ptr = &expr[2];
4942*7c568831SAndroid Build Coastguard Worker 		int from, to;
4943*7c568831SAndroid Build Coastguard Worker 
4944*7c568831SAndroid Build Coastguard Worker 		from = scanNumber(&ptr);
4945*7c568831SAndroid Build Coastguard Worker 		if (*ptr != ' ') {
4946*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr,
4947*7c568831SAndroid Build Coastguard Worker 			    "Bad line %s\n", expr);
4948*7c568831SAndroid Build Coastguard Worker 		    break;
4949*7c568831SAndroid Build Coastguard Worker 		}
4950*7c568831SAndroid Build Coastguard Worker 		if (states[from] == NULL)
4951*7c568831SAndroid Build Coastguard Worker 		    states[from] = xmlAutomataNewState(am);
4952*7c568831SAndroid Build Coastguard Worker 		ptr++;
4953*7c568831SAndroid Build Coastguard Worker 		to = scanNumber(&ptr);
4954*7c568831SAndroid Build Coastguard Worker 		if (*ptr != ' ') {
4955*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr,
4956*7c568831SAndroid Build Coastguard Worker 			    "Bad line %s\n", expr);
4957*7c568831SAndroid Build Coastguard Worker 		    break;
4958*7c568831SAndroid Build Coastguard Worker 		}
4959*7c568831SAndroid Build Coastguard Worker 		if (states[to] == NULL)
4960*7c568831SAndroid Build Coastguard Worker 		    states[to] = xmlAutomataNewState(am);
4961*7c568831SAndroid Build Coastguard Worker 		ptr++;
4962*7c568831SAndroid Build Coastguard Worker 		xmlAutomataNewTransition(am, states[from], states[to],
4963*7c568831SAndroid Build Coastguard Worker 			                 BAD_CAST ptr, NULL);
4964*7c568831SAndroid Build Coastguard Worker 	    } else if ((am != NULL) && (expr[0] == 'e') && (expr[1] == ' ')) {
4965*7c568831SAndroid Build Coastguard Worker 		char *ptr = &expr[2];
4966*7c568831SAndroid Build Coastguard Worker 		int from, to;
4967*7c568831SAndroid Build Coastguard Worker 
4968*7c568831SAndroid Build Coastguard Worker 		from = scanNumber(&ptr);
4969*7c568831SAndroid Build Coastguard Worker 		if (*ptr != ' ') {
4970*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr,
4971*7c568831SAndroid Build Coastguard Worker 			    "Bad line %s\n", expr);
4972*7c568831SAndroid Build Coastguard Worker 		    break;
4973*7c568831SAndroid Build Coastguard Worker 		}
4974*7c568831SAndroid Build Coastguard Worker 		if (states[from] == NULL)
4975*7c568831SAndroid Build Coastguard Worker 		    states[from] = xmlAutomataNewState(am);
4976*7c568831SAndroid Build Coastguard Worker 		ptr++;
4977*7c568831SAndroid Build Coastguard Worker 		to = scanNumber(&ptr);
4978*7c568831SAndroid Build Coastguard Worker 		if (states[to] == NULL)
4979*7c568831SAndroid Build Coastguard Worker 		    states[to] = xmlAutomataNewState(am);
4980*7c568831SAndroid Build Coastguard Worker 		xmlAutomataNewEpsilon(am, states[from], states[to]);
4981*7c568831SAndroid Build Coastguard Worker 	    } else if ((am != NULL) && (expr[0] == 'f') && (expr[1] == ' ')) {
4982*7c568831SAndroid Build Coastguard Worker 		char *ptr = &expr[2];
4983*7c568831SAndroid Build Coastguard Worker 		int state;
4984*7c568831SAndroid Build Coastguard Worker 
4985*7c568831SAndroid Build Coastguard Worker 		state = scanNumber(&ptr);
4986*7c568831SAndroid Build Coastguard Worker 		if (states[state] == NULL) {
4987*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr,
4988*7c568831SAndroid Build Coastguard Worker 			    "Bad state %d : %s\n", state, expr);
4989*7c568831SAndroid Build Coastguard Worker 		    break;
4990*7c568831SAndroid Build Coastguard Worker 		}
4991*7c568831SAndroid Build Coastguard Worker 		xmlAutomataSetFinalState(am, states[state]);
4992*7c568831SAndroid Build Coastguard Worker 	    } else if ((am != NULL) && (expr[0] == 'c') && (expr[1] == ' ')) {
4993*7c568831SAndroid Build Coastguard Worker 		char *ptr = &expr[2];
4994*7c568831SAndroid Build Coastguard Worker 		int from, to;
4995*7c568831SAndroid Build Coastguard Worker 		int min, max;
4996*7c568831SAndroid Build Coastguard Worker 
4997*7c568831SAndroid Build Coastguard Worker 		from = scanNumber(&ptr);
4998*7c568831SAndroid Build Coastguard Worker 		if (*ptr != ' ') {
4999*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr,
5000*7c568831SAndroid Build Coastguard Worker 			    "Bad line %s\n", expr);
5001*7c568831SAndroid Build Coastguard Worker 		    break;
5002*7c568831SAndroid Build Coastguard Worker 		}
5003*7c568831SAndroid Build Coastguard Worker 		if (states[from] == NULL)
5004*7c568831SAndroid Build Coastguard Worker 		    states[from] = xmlAutomataNewState(am);
5005*7c568831SAndroid Build Coastguard Worker 		ptr++;
5006*7c568831SAndroid Build Coastguard Worker 		to = scanNumber(&ptr);
5007*7c568831SAndroid Build Coastguard Worker 		if (*ptr != ' ') {
5008*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr,
5009*7c568831SAndroid Build Coastguard Worker 			    "Bad line %s\n", expr);
5010*7c568831SAndroid Build Coastguard Worker 		    break;
5011*7c568831SAndroid Build Coastguard Worker 		}
5012*7c568831SAndroid Build Coastguard Worker 		if (states[to] == NULL)
5013*7c568831SAndroid Build Coastguard Worker 		    states[to] = xmlAutomataNewState(am);
5014*7c568831SAndroid Build Coastguard Worker 		ptr++;
5015*7c568831SAndroid Build Coastguard Worker 		min = scanNumber(&ptr);
5016*7c568831SAndroid Build Coastguard Worker 		if (*ptr != ' ') {
5017*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr,
5018*7c568831SAndroid Build Coastguard Worker 			    "Bad line %s\n", expr);
5019*7c568831SAndroid Build Coastguard Worker 		    break;
5020*7c568831SAndroid Build Coastguard Worker 		}
5021*7c568831SAndroid Build Coastguard Worker 		ptr++;
5022*7c568831SAndroid Build Coastguard Worker 		max = scanNumber(&ptr);
5023*7c568831SAndroid Build Coastguard Worker 		if (*ptr != ' ') {
5024*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr,
5025*7c568831SAndroid Build Coastguard Worker 			    "Bad line %s\n", expr);
5026*7c568831SAndroid Build Coastguard Worker 		    break;
5027*7c568831SAndroid Build Coastguard Worker 		}
5028*7c568831SAndroid Build Coastguard Worker 		ptr++;
5029*7c568831SAndroid Build Coastguard Worker 		xmlAutomataNewCountTrans(am, states[from], states[to],
5030*7c568831SAndroid Build Coastguard Worker 			                 BAD_CAST ptr, min, max, NULL);
5031*7c568831SAndroid Build Coastguard Worker 	    } else if ((am != NULL) && (expr[0] == '-') && (expr[1] == '-')) {
5032*7c568831SAndroid Build Coastguard Worker 		/* end of the automata */
5033*7c568831SAndroid Build Coastguard Worker 		regexp = xmlAutomataCompile(am);
5034*7c568831SAndroid Build Coastguard Worker 		xmlFreeAutomata(am);
5035*7c568831SAndroid Build Coastguard Worker 		am = NULL;
5036*7c568831SAndroid Build Coastguard Worker 		if (regexp == NULL) {
5037*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr,
5038*7c568831SAndroid Build Coastguard Worker 			    "Failed to compile the automata");
5039*7c568831SAndroid Build Coastguard Worker 		    break;
5040*7c568831SAndroid Build Coastguard Worker 		}
5041*7c568831SAndroid Build Coastguard Worker 	    } else if ((expr[0] == '=') && (expr[1] == '>')) {
5042*7c568831SAndroid Build Coastguard Worker 		if (regexp == NULL) {
5043*7c568831SAndroid Build Coastguard Worker 		    fprintf(output, "=> failed not compiled\n");
5044*7c568831SAndroid Build Coastguard Worker 		} else {
5045*7c568831SAndroid Build Coastguard Worker 		    if (exec == NULL)
5046*7c568831SAndroid Build Coastguard Worker 			exec = xmlRegNewExecCtxt(regexp, NULL, NULL);
5047*7c568831SAndroid Build Coastguard Worker 		    if (ret == 0) {
5048*7c568831SAndroid Build Coastguard Worker 			ret = xmlRegExecPushString(exec, NULL, NULL);
5049*7c568831SAndroid Build Coastguard Worker 		    }
5050*7c568831SAndroid Build Coastguard Worker 		    if (ret == 1)
5051*7c568831SAndroid Build Coastguard Worker 			fprintf(output, "=> Passed\n");
5052*7c568831SAndroid Build Coastguard Worker 		    else if ((ret == 0) || (ret == -1))
5053*7c568831SAndroid Build Coastguard Worker 			fprintf(output, "=> Failed\n");
5054*7c568831SAndroid Build Coastguard Worker 		    else if (ret < 0)
5055*7c568831SAndroid Build Coastguard Worker 			fprintf(output, "=> Error\n");
5056*7c568831SAndroid Build Coastguard Worker 		    xmlRegFreeExecCtxt(exec);
5057*7c568831SAndroid Build Coastguard Worker 		    exec = NULL;
5058*7c568831SAndroid Build Coastguard Worker 		}
5059*7c568831SAndroid Build Coastguard Worker 		ret = 0;
5060*7c568831SAndroid Build Coastguard Worker 	    } else if (regexp != NULL) {
5061*7c568831SAndroid Build Coastguard Worker 		if (exec == NULL)
5062*7c568831SAndroid Build Coastguard Worker 		    exec = xmlRegNewExecCtxt(regexp, NULL, NULL);
5063*7c568831SAndroid Build Coastguard Worker 		ret = xmlRegExecPushString(exec, BAD_CAST expr, NULL);
5064*7c568831SAndroid Build Coastguard Worker 	    } else {
5065*7c568831SAndroid Build Coastguard Worker 		fprintf(stderr,
5066*7c568831SAndroid Build Coastguard Worker 			"Unexpected line %s\n", expr);
5067*7c568831SAndroid Build Coastguard Worker 	    }
5068*7c568831SAndroid Build Coastguard Worker 	}
5069*7c568831SAndroid Build Coastguard Worker     }
5070*7c568831SAndroid Build Coastguard Worker     fclose(output);
5071*7c568831SAndroid Build Coastguard Worker     fclose(input);
5072*7c568831SAndroid Build Coastguard Worker     if (regexp != NULL)
5073*7c568831SAndroid Build Coastguard Worker 	xmlRegFreeRegexp(regexp);
5074*7c568831SAndroid Build Coastguard Worker     if (exec != NULL)
5075*7c568831SAndroid Build Coastguard Worker 	xmlRegFreeExecCtxt(exec);
5076*7c568831SAndroid Build Coastguard Worker     if (am != NULL)
5077*7c568831SAndroid Build Coastguard Worker 	xmlFreeAutomata(am);
5078*7c568831SAndroid Build Coastguard Worker 
5079*7c568831SAndroid Build Coastguard Worker     ret = compareFiles(temp, result);
5080*7c568831SAndroid Build Coastguard Worker     if (ret) {
5081*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Result for %s failed in %s\n", filename, result);
5082*7c568831SAndroid Build Coastguard Worker         res = 1;
5083*7c568831SAndroid Build Coastguard Worker     }
5084*7c568831SAndroid Build Coastguard Worker     if (temp != NULL) {
5085*7c568831SAndroid Build Coastguard Worker         unlink(temp);
5086*7c568831SAndroid Build Coastguard Worker         free(temp);
5087*7c568831SAndroid Build Coastguard Worker     }
5088*7c568831SAndroid Build Coastguard Worker 
5089*7c568831SAndroid Build Coastguard Worker     return(res);
5090*7c568831SAndroid Build Coastguard Worker }
5091*7c568831SAndroid Build Coastguard Worker 
5092*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_REGEXP_ENABLED */
5093*7c568831SAndroid Build Coastguard Worker 
5094*7c568831SAndroid Build Coastguard Worker /************************************************************************
5095*7c568831SAndroid Build Coastguard Worker  *									*
5096*7c568831SAndroid Build Coastguard Worker  *			Tests Descriptions				*
5097*7c568831SAndroid Build Coastguard Worker  *									*
5098*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
5099*7c568831SAndroid Build Coastguard Worker 
5100*7c568831SAndroid Build Coastguard Worker static
5101*7c568831SAndroid Build Coastguard Worker testDesc testDescriptions[] = {
5102*7c568831SAndroid Build Coastguard Worker     { "XML regression tests" ,
5103*7c568831SAndroid Build Coastguard Worker       oldParseTest, "./test/*", "result/", "", NULL,
5104*7c568831SAndroid Build Coastguard Worker       0 },
5105*7c568831SAndroid Build Coastguard Worker     { "XML regression tests on memory" ,
5106*7c568831SAndroid Build Coastguard Worker       memParseTest, "./test/*", "result/", "", NULL,
5107*7c568831SAndroid Build Coastguard Worker       0 },
5108*7c568831SAndroid Build Coastguard Worker     { "XML entity subst regression tests" ,
5109*7c568831SAndroid Build Coastguard Worker       noentParseTest, "./test/*", "result/noent/", "", NULL,
5110*7c568831SAndroid Build Coastguard Worker       XML_PARSE_NOENT },
5111*7c568831SAndroid Build Coastguard Worker     { "XML Namespaces regression tests",
5112*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/namespaces/*", "result/namespaces/", "", ".err",
5113*7c568831SAndroid Build Coastguard Worker       0 },
5114*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
5115*7c568831SAndroid Build Coastguard Worker     { "Error cases regression tests",
5116*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/errors/*.xml", "result/errors/", "", ".err",
5117*7c568831SAndroid Build Coastguard Worker       0 },
5118*7c568831SAndroid Build Coastguard Worker     { "Error cases regression tests from file descriptor",
5119*7c568831SAndroid Build Coastguard Worker       fdParseTest, "./test/errors/*.xml", "result/errors/", "", ".err",
5120*7c568831SAndroid Build Coastguard Worker       0 },
5121*7c568831SAndroid Build Coastguard Worker     { "Error cases regression tests with entity substitution",
5122*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/errors/*.xml", "result/errors/", NULL, ".ent",
5123*7c568831SAndroid Build Coastguard Worker       XML_PARSE_NOENT },
5124*7c568831SAndroid Build Coastguard Worker     { "Error cases regression tests (old 1.0)",
5125*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/errors10/*.xml", "result/errors10/", "", ".err",
5126*7c568831SAndroid Build Coastguard Worker       XML_PARSE_OLD10 },
5127*7c568831SAndroid Build Coastguard Worker #endif
5128*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
5129*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
5130*7c568831SAndroid Build Coastguard Worker     { "Error cases stream regression tests",
5131*7c568831SAndroid Build Coastguard Worker       streamParseTest, "./test/errors/*.xml", "result/errors/", NULL, ".str",
5132*7c568831SAndroid Build Coastguard Worker       0 },
5133*7c568831SAndroid Build Coastguard Worker #endif
5134*7c568831SAndroid Build Coastguard Worker     { "Reader regression tests",
5135*7c568831SAndroid Build Coastguard Worker       streamParseTest, "./test/*", "result/", ".rdr", NULL,
5136*7c568831SAndroid Build Coastguard Worker       0 },
5137*7c568831SAndroid Build Coastguard Worker     { "Reader entities substitution regression tests",
5138*7c568831SAndroid Build Coastguard Worker       streamParseTest, "./test/*", "result/", ".rde", NULL,
5139*7c568831SAndroid Build Coastguard Worker       XML_PARSE_NOENT },
5140*7c568831SAndroid Build Coastguard Worker     { "Reader on memory regression tests",
5141*7c568831SAndroid Build Coastguard Worker       streamMemParseTest, "./test/*", "result/", ".rdr", NULL,
5142*7c568831SAndroid Build Coastguard Worker       0 },
5143*7c568831SAndroid Build Coastguard Worker     { "Walker regression tests",
5144*7c568831SAndroid Build Coastguard Worker       walkerParseTest, "./test/*", "result/", ".rdr", NULL,
5145*7c568831SAndroid Build Coastguard Worker       0 },
5146*7c568831SAndroid Build Coastguard Worker #endif
5147*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
5148*7c568831SAndroid Build Coastguard Worker     { "SAX1 callbacks regression tests" ,
5149*7c568831SAndroid Build Coastguard Worker       saxParseTest, "./test/*", "result/", ".sax", NULL,
5150*7c568831SAndroid Build Coastguard Worker       XML_PARSE_SAX1 },
5151*7c568831SAndroid Build Coastguard Worker #endif
5152*7c568831SAndroid Build Coastguard Worker     { "SAX2 callbacks regression tests" ,
5153*7c568831SAndroid Build Coastguard Worker       saxParseTest, "./test/*", "result/", ".sax2", NULL,
5154*7c568831SAndroid Build Coastguard Worker       0 },
5155*7c568831SAndroid Build Coastguard Worker     { "SAX2 callbacks regression tests with entity substitution" ,
5156*7c568831SAndroid Build Coastguard Worker       saxParseTest, "./test/*", "result/noent/", ".sax2", NULL,
5157*7c568831SAndroid Build Coastguard Worker       XML_PARSE_NOENT },
5158*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PUSH_ENABLED
5159*7c568831SAndroid Build Coastguard Worker     { "XML push regression tests" ,
5160*7c568831SAndroid Build Coastguard Worker       pushParseTest, "./test/*", "result/", "", NULL,
5161*7c568831SAndroid Build Coastguard Worker       0 },
5162*7c568831SAndroid Build Coastguard Worker     { "XML push boundary tests" ,
5163*7c568831SAndroid Build Coastguard Worker       pushBoundaryTest, "./test/*", "result/", "", NULL,
5164*7c568831SAndroid Build Coastguard Worker       0 },
5165*7c568831SAndroid Build Coastguard Worker #endif
5166*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
5167*7c568831SAndroid Build Coastguard Worker     { "HTML regression tests" ,
5168*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/HTML/*", "result/HTML/", "", ".err",
5169*7c568831SAndroid Build Coastguard Worker       XML_PARSE_HTML },
5170*7c568831SAndroid Build Coastguard Worker     { "HTML regression tests from file descriptor",
5171*7c568831SAndroid Build Coastguard Worker       fdParseTest, "./test/HTML/*", "result/HTML/", "", ".err",
5172*7c568831SAndroid Build Coastguard Worker       XML_PARSE_HTML },
5173*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PUSH_ENABLED
5174*7c568831SAndroid Build Coastguard Worker     { "Push HTML regression tests" ,
5175*7c568831SAndroid Build Coastguard Worker       pushParseTest, "./test/HTML/*", "result/HTML/", "", ".err",
5176*7c568831SAndroid Build Coastguard Worker       XML_PARSE_HTML },
5177*7c568831SAndroid Build Coastguard Worker     { "Push HTML boundary tests" ,
5178*7c568831SAndroid Build Coastguard Worker       pushBoundaryTest, "./test/HTML/*", "result/HTML/", "", NULL,
5179*7c568831SAndroid Build Coastguard Worker       XML_PARSE_HTML },
5180*7c568831SAndroid Build Coastguard Worker #endif
5181*7c568831SAndroid Build Coastguard Worker     { "HTML SAX regression tests" ,
5182*7c568831SAndroid Build Coastguard Worker       saxParseTest, "./test/HTML/*", "result/HTML/", ".sax", NULL,
5183*7c568831SAndroid Build Coastguard Worker       XML_PARSE_HTML },
5184*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PUSH_ENABLED
5185*7c568831SAndroid Build Coastguard Worker     { "HTML tokenization tests",
5186*7c568831SAndroid Build Coastguard Worker       htmlTokenizerTest,
5187*7c568831SAndroid Build Coastguard Worker       "./test/html-tokenizer/*.test", "result/html-tokenizer/", "", NULL, 0 },
5188*7c568831SAndroid Build Coastguard Worker #endif
5189*7c568831SAndroid Build Coastguard Worker #endif
5190*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
5191*7c568831SAndroid Build Coastguard Worker     { "Valid documents regression tests" ,
5192*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/VCM/*", NULL, NULL, NULL,
5193*7c568831SAndroid Build Coastguard Worker       XML_PARSE_DTDVALID },
5194*7c568831SAndroid Build Coastguard Worker     { "Validity checking regression tests" ,
5195*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/VC/*", "result/VC/", NULL, "",
5196*7c568831SAndroid Build Coastguard Worker       XML_PARSE_DTDVALID },
5197*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
5198*7c568831SAndroid Build Coastguard Worker     { "Streaming validity checking regression tests" ,
5199*7c568831SAndroid Build Coastguard Worker       streamParseTest, "./test/valid/*.xml", "result/valid/", NULL, ".err.rdr",
5200*7c568831SAndroid Build Coastguard Worker       XML_PARSE_DTDVALID },
5201*7c568831SAndroid Build Coastguard Worker     { "Streaming validity error checking regression tests" ,
5202*7c568831SAndroid Build Coastguard Worker       streamParseTest, "./test/VC/*", "result/VC/", NULL, ".rdr",
5203*7c568831SAndroid Build Coastguard Worker       XML_PARSE_DTDVALID },
5204*7c568831SAndroid Build Coastguard Worker #endif
5205*7c568831SAndroid Build Coastguard Worker     { "General documents valid regression tests" ,
5206*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/valid/*", "result/valid/", "", ".err",
5207*7c568831SAndroid Build Coastguard Worker       XML_PARSE_DTDVALID },
5208*7c568831SAndroid Build Coastguard Worker #endif
5209*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
5210*7c568831SAndroid Build Coastguard Worker     { "XInclude regression tests" ,
5211*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/XInclude/docs/*", "result/XInclude/", "", ".err",
5212*7c568831SAndroid Build Coastguard Worker       XML_PARSE_XINCLUDE },
5213*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
5214*7c568831SAndroid Build Coastguard Worker     { "XInclude xmlReader regression tests",
5215*7c568831SAndroid Build Coastguard Worker       streamParseTest, "./test/XInclude/docs/*", "result/XInclude/", ".rdr",
5216*7c568831SAndroid Build Coastguard Worker       ".err", XML_PARSE_XINCLUDE },
5217*7c568831SAndroid Build Coastguard Worker #endif
5218*7c568831SAndroid Build Coastguard Worker     { "XInclude regression tests stripping include nodes" ,
5219*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/XInclude/docs/*", "result/XInclude/", "", ".err",
5220*7c568831SAndroid Build Coastguard Worker       XML_PARSE_XINCLUDE | XML_PARSE_NOXINCNODE },
5221*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
5222*7c568831SAndroid Build Coastguard Worker     { "XInclude xmlReader regression tests stripping include nodes",
5223*7c568831SAndroid Build Coastguard Worker       streamParseTest, "./test/XInclude/docs/*", "result/XInclude/", ".rdr",
5224*7c568831SAndroid Build Coastguard Worker       ".err", XML_PARSE_XINCLUDE | XML_PARSE_NOXINCNODE },
5225*7c568831SAndroid Build Coastguard Worker #endif
5226*7c568831SAndroid Build Coastguard Worker     { "XInclude regression tests without reader",
5227*7c568831SAndroid Build Coastguard Worker       errParseTest, "./test/XInclude/without-reader/*", "result/XInclude/", "",
5228*7c568831SAndroid Build Coastguard Worker       ".err", XML_PARSE_XINCLUDE },
5229*7c568831SAndroid Build Coastguard Worker #endif
5230*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XPATH_ENABLED
5231*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_DEBUG_ENABLED
5232*7c568831SAndroid Build Coastguard Worker     { "XPath expressions regression tests" ,
5233*7c568831SAndroid Build Coastguard Worker       xpathExprTest, "./test/XPath/expr/*", "result/XPath/expr/", "", NULL,
5234*7c568831SAndroid Build Coastguard Worker       0 },
5235*7c568831SAndroid Build Coastguard Worker     { "XPath document queries regression tests" ,
5236*7c568831SAndroid Build Coastguard Worker       xpathDocTest, "./test/XPath/docs/*", NULL, NULL, NULL,
5237*7c568831SAndroid Build Coastguard Worker       0 },
5238*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_XPTR_ENABLED
5239*7c568831SAndroid Build Coastguard Worker     { "XPointer document queries regression tests" ,
5240*7c568831SAndroid Build Coastguard Worker       xptrDocTest, "./test/XPath/docs/*", NULL, NULL, NULL,
5241*7c568831SAndroid Build Coastguard Worker       0 },
5242*7c568831SAndroid Build Coastguard Worker #endif
5243*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
5244*7c568831SAndroid Build Coastguard Worker     { "xml:id regression tests" ,
5245*7c568831SAndroid Build Coastguard Worker       xmlidDocTest, "./test/xmlid/*", "result/xmlid/", "", ".err",
5246*7c568831SAndroid Build Coastguard Worker       0 },
5247*7c568831SAndroid Build Coastguard Worker #endif
5248*7c568831SAndroid Build Coastguard Worker #endif
5249*7c568831SAndroid Build Coastguard Worker #endif
5250*7c568831SAndroid Build Coastguard Worker     { "URI parsing tests" ,
5251*7c568831SAndroid Build Coastguard Worker       uriParseTest, "./test/URI/*.uri", "result/URI/", "", NULL,
5252*7c568831SAndroid Build Coastguard Worker       0 },
5253*7c568831SAndroid Build Coastguard Worker     { "URI base composition tests" ,
5254*7c568831SAndroid Build Coastguard Worker       uriBaseTest, "./test/URI/*.data", "result/URI/", "", NULL,
5255*7c568831SAndroid Build Coastguard Worker       0 },
5256*7c568831SAndroid Build Coastguard Worker     { "Path URI conversion tests" ,
5257*7c568831SAndroid Build Coastguard Worker       uriPathTest, NULL, NULL, NULL, NULL,
5258*7c568831SAndroid Build Coastguard Worker       0 },
5259*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
5260*7c568831SAndroid Build Coastguard Worker     { "Schemas regression tests" ,
5261*7c568831SAndroid Build Coastguard Worker       schemasTest, "./test/schemas/*_*.xsd", NULL, NULL, NULL,
5262*7c568831SAndroid Build Coastguard Worker       0 },
5263*7c568831SAndroid Build Coastguard Worker     { "Relax-NG regression tests" ,
5264*7c568831SAndroid Build Coastguard Worker       rngTest, "./test/relaxng/*.rng", NULL, NULL, NULL,
5265*7c568831SAndroid Build Coastguard Worker       XML_PARSE_DTDATTR | XML_PARSE_NOENT },
5266*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
5267*7c568831SAndroid Build Coastguard Worker     { "Relax-NG streaming regression tests" ,
5268*7c568831SAndroid Build Coastguard Worker       rngStreamTest, "./test/relaxng/*.rng", NULL, NULL, NULL,
5269*7c568831SAndroid Build Coastguard Worker       XML_PARSE_DTDATTR | XML_PARSE_NOENT },
5270*7c568831SAndroid Build Coastguard Worker #endif
5271*7c568831SAndroid Build Coastguard Worker #endif
5272*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_SCHEMATRON_ENABLED)
5273*7c568831SAndroid Build Coastguard Worker     { "Schematron regression tests" ,
5274*7c568831SAndroid Build Coastguard Worker       schematronTest, "./test/schematron/*.sct", NULL, NULL, NULL,
5275*7c568831SAndroid Build Coastguard Worker       0 },
5276*7c568831SAndroid Build Coastguard Worker #endif
5277*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
5278*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
5279*7c568831SAndroid Build Coastguard Worker     { "Pattern regression tests" ,
5280*7c568831SAndroid Build Coastguard Worker       patternTest, "./test/pattern/*.pat", "result/pattern/", NULL, NULL,
5281*7c568831SAndroid Build Coastguard Worker       0 },
5282*7c568831SAndroid Build Coastguard Worker #endif
5283*7c568831SAndroid Build Coastguard Worker #endif
5284*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_C14N_ENABLED
5285*7c568831SAndroid Build Coastguard Worker     { "C14N with comments regression tests" ,
5286*7c568831SAndroid Build Coastguard Worker       c14nWithCommentTest, "./test/c14n/with-comments/*.xml", NULL, NULL, NULL,
5287*7c568831SAndroid Build Coastguard Worker       0 },
5288*7c568831SAndroid Build Coastguard Worker     { "C14N without comments regression tests" ,
5289*7c568831SAndroid Build Coastguard Worker       c14nWithoutCommentTest, "./test/c14n/without-comments/*.xml", NULL, NULL, NULL,
5290*7c568831SAndroid Build Coastguard Worker       0 },
5291*7c568831SAndroid Build Coastguard Worker     { "C14N exclusive without comments regression tests" ,
5292*7c568831SAndroid Build Coastguard Worker       c14nExcWithoutCommentTest, "./test/c14n/exc-without-comments/*.xml", NULL, NULL, NULL,
5293*7c568831SAndroid Build Coastguard Worker       0 },
5294*7c568831SAndroid Build Coastguard Worker     { "C14N 1.1 without comments regression tests" ,
5295*7c568831SAndroid Build Coastguard Worker       c14n11WithoutCommentTest, "./test/c14n/1-1-without-comments/*.xml", NULL, NULL, NULL,
5296*7c568831SAndroid Build Coastguard Worker       0 },
5297*7c568831SAndroid Build Coastguard Worker #endif
5298*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
5299*7c568831SAndroid Build Coastguard Worker     { "Catalog and Threads regression tests" ,
5300*7c568831SAndroid Build Coastguard Worker       threadsTest, NULL, NULL, NULL, NULL,
5301*7c568831SAndroid Build Coastguard Worker       0 },
5302*7c568831SAndroid Build Coastguard Worker #endif
5303*7c568831SAndroid Build Coastguard Worker     { "SVG parsing regression tests" ,
5304*7c568831SAndroid Build Coastguard Worker       oldParseTest, "./test/SVG/*.xml", "result/SVG/", "", NULL,
5305*7c568831SAndroid Build Coastguard Worker       0 },
5306*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_REGEXP_ENABLED)
5307*7c568831SAndroid Build Coastguard Worker     { "Regexp regression tests" ,
5308*7c568831SAndroid Build Coastguard Worker       regexpTest, "./test/regexp/*", "result/regexp/", "", ".err",
5309*7c568831SAndroid Build Coastguard Worker       0 },
5310*7c568831SAndroid Build Coastguard Worker     { "Automata regression tests" ,
5311*7c568831SAndroid Build Coastguard Worker       automataTest, "./test/automata/*", "result/automata/", "", NULL,
5312*7c568831SAndroid Build Coastguard Worker       0 },
5313*7c568831SAndroid Build Coastguard Worker #endif
5314*7c568831SAndroid Build Coastguard Worker     {NULL, NULL, NULL, NULL, NULL, NULL, 0}
5315*7c568831SAndroid Build Coastguard Worker };
5316*7c568831SAndroid Build Coastguard Worker 
5317*7c568831SAndroid Build Coastguard Worker /************************************************************************
5318*7c568831SAndroid Build Coastguard Worker  *									*
5319*7c568831SAndroid Build Coastguard Worker  *		The main code driving the tests				*
5320*7c568831SAndroid Build Coastguard Worker  *									*
5321*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
5322*7c568831SAndroid Build Coastguard Worker 
5323*7c568831SAndroid Build Coastguard Worker static int
launchTests(testDescPtr tst)5324*7c568831SAndroid Build Coastguard Worker launchTests(testDescPtr tst) {
5325*7c568831SAndroid Build Coastguard Worker     int res = 0, err = 0;
5326*7c568831SAndroid Build Coastguard Worker     size_t i;
5327*7c568831SAndroid Build Coastguard Worker     char *result;
5328*7c568831SAndroid Build Coastguard Worker     char *error;
5329*7c568831SAndroid Build Coastguard Worker     int mem;
5330*7c568831SAndroid Build Coastguard Worker     xmlCharEncodingHandlerPtr ebcdicHandler, ibm1141Handler, eucJpHandler;
5331*7c568831SAndroid Build Coastguard Worker 
5332*7c568831SAndroid Build Coastguard Worker     ebcdicHandler = xmlGetCharEncodingHandler(XML_CHAR_ENCODING_EBCDIC);
5333*7c568831SAndroid Build Coastguard Worker     ibm1141Handler = xmlFindCharEncodingHandler("IBM-1141");
5334*7c568831SAndroid Build Coastguard Worker 
5335*7c568831SAndroid Build Coastguard Worker     /*
5336*7c568831SAndroid Build Coastguard Worker      * When decoding EUC-JP, musl doesn't seem to support 0x8F control
5337*7c568831SAndroid Build Coastguard Worker      * codes.
5338*7c568831SAndroid Build Coastguard Worker      */
5339*7c568831SAndroid Build Coastguard Worker     eucJpHandler = xmlGetCharEncodingHandler(XML_CHAR_ENCODING_EUC_JP);
5340*7c568831SAndroid Build Coastguard Worker     if (eucJpHandler != NULL) {
5341*7c568831SAndroid Build Coastguard Worker         xmlBufferPtr in, out;
5342*7c568831SAndroid Build Coastguard Worker 
5343*7c568831SAndroid Build Coastguard Worker         in = xmlBufferCreateSize(10);
5344*7c568831SAndroid Build Coastguard Worker         xmlBufferCCat(in, "\x8f\xe9\xae");
5345*7c568831SAndroid Build Coastguard Worker         out = xmlBufferCreateSize(10);
5346*7c568831SAndroid Build Coastguard Worker         if (xmlCharEncInFunc(eucJpHandler, out, in) != 3) {
5347*7c568831SAndroid Build Coastguard Worker             xmlCharEncCloseFunc(eucJpHandler);
5348*7c568831SAndroid Build Coastguard Worker             eucJpHandler = NULL;
5349*7c568831SAndroid Build Coastguard Worker         }
5350*7c568831SAndroid Build Coastguard Worker         xmlBufferFree(out);
5351*7c568831SAndroid Build Coastguard Worker         xmlBufferFree(in);
5352*7c568831SAndroid Build Coastguard Worker     }
5353*7c568831SAndroid Build Coastguard Worker 
5354*7c568831SAndroid Build Coastguard Worker     if (tst == NULL) return(-1);
5355*7c568831SAndroid Build Coastguard Worker     if (tst->in != NULL) {
5356*7c568831SAndroid Build Coastguard Worker 	glob_t globbuf;
5357*7c568831SAndroid Build Coastguard Worker 
5358*7c568831SAndroid Build Coastguard Worker 	globbuf.gl_offs = 0;
5359*7c568831SAndroid Build Coastguard Worker 	glob(tst->in, GLOB_DOOFFS, NULL, &globbuf);
5360*7c568831SAndroid Build Coastguard Worker 	for (i = 0;i < globbuf.gl_pathc;i++) {
5361*7c568831SAndroid Build Coastguard Worker 	    if (!checkTestFile(globbuf.gl_pathv[i]))
5362*7c568831SAndroid Build Coastguard Worker 	        continue;
5363*7c568831SAndroid Build Coastguard Worker             if ((((ebcdicHandler == NULL) || (ibm1141Handler == NULL)) &&
5364*7c568831SAndroid Build Coastguard Worker                  (strstr(globbuf.gl_pathv[i], "ebcdic") != NULL)) ||
5365*7c568831SAndroid Build Coastguard Worker                 ((eucJpHandler == NULL) &&
5366*7c568831SAndroid Build Coastguard Worker                  (strstr(globbuf.gl_pathv[i], "icu_parse_test") != NULL)))
5367*7c568831SAndroid Build Coastguard Worker                 continue;
5368*7c568831SAndroid Build Coastguard Worker #if !defined(LIBXML_ICONV_ENABLED) && !defined(LIBXML_ICU_ENABLED) && \
5369*7c568831SAndroid Build Coastguard Worker     !defined(LIBXML_ISO8859X_ENABLED)
5370*7c568831SAndroid Build Coastguard Worker             if (strstr(globbuf.gl_pathv[i], "iso-8859-5") != NULL)
5371*7c568831SAndroid Build Coastguard Worker                 continue;
5372*7c568831SAndroid Build Coastguard Worker #endif
5373*7c568831SAndroid Build Coastguard Worker 	    if (tst->suffix != NULL) {
5374*7c568831SAndroid Build Coastguard Worker 		result = resultFilename(globbuf.gl_pathv[i], tst->out,
5375*7c568831SAndroid Build Coastguard Worker 					tst->suffix);
5376*7c568831SAndroid Build Coastguard Worker 		if (result == NULL) {
5377*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr, "Out of memory !\n");
5378*7c568831SAndroid Build Coastguard Worker 		    fatalError();
5379*7c568831SAndroid Build Coastguard Worker 		}
5380*7c568831SAndroid Build Coastguard Worker 	    } else {
5381*7c568831SAndroid Build Coastguard Worker 	        result = NULL;
5382*7c568831SAndroid Build Coastguard Worker 	    }
5383*7c568831SAndroid Build Coastguard Worker 	    if (tst->err != NULL) {
5384*7c568831SAndroid Build Coastguard Worker 		error = resultFilename(globbuf.gl_pathv[i], tst->out,
5385*7c568831SAndroid Build Coastguard Worker 		                        tst->err);
5386*7c568831SAndroid Build Coastguard Worker 		if (error == NULL) {
5387*7c568831SAndroid Build Coastguard Worker 		    fprintf(stderr, "Out of memory !\n");
5388*7c568831SAndroid Build Coastguard Worker 		    fatalError();
5389*7c568831SAndroid Build Coastguard Worker 		}
5390*7c568831SAndroid Build Coastguard Worker 	    } else {
5391*7c568831SAndroid Build Coastguard Worker 	        error = NULL;
5392*7c568831SAndroid Build Coastguard Worker 	    }
5393*7c568831SAndroid Build Coastguard Worker             mem = xmlMemUsed();
5394*7c568831SAndroid Build Coastguard Worker             testErrorsSize = 0;
5395*7c568831SAndroid Build Coastguard Worker             testErrors[0] = 0;
5396*7c568831SAndroid Build Coastguard Worker             res = tst->func(globbuf.gl_pathv[i], result, error,
5397*7c568831SAndroid Build Coastguard Worker                             tst->options | XML_PARSE_COMPACT);
5398*7c568831SAndroid Build Coastguard Worker             xmlResetLastError();
5399*7c568831SAndroid Build Coastguard Worker             if (res != 0) {
5400*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "File %s generated an error\n",
5401*7c568831SAndroid Build Coastguard Worker                         globbuf.gl_pathv[i]);
5402*7c568831SAndroid Build Coastguard Worker                 nb_errors++;
5403*7c568831SAndroid Build Coastguard Worker                 err++;
5404*7c568831SAndroid Build Coastguard Worker             }
5405*7c568831SAndroid Build Coastguard Worker             else if (xmlMemUsed() != mem) {
5406*7c568831SAndroid Build Coastguard Worker                 fprintf(stderr, "File %s leaked %d bytes\n",
5407*7c568831SAndroid Build Coastguard Worker                         globbuf.gl_pathv[i], xmlMemUsed() - mem);
5408*7c568831SAndroid Build Coastguard Worker                 nb_leaks++;
5409*7c568831SAndroid Build Coastguard Worker                 err++;
5410*7c568831SAndroid Build Coastguard Worker             }
5411*7c568831SAndroid Build Coastguard Worker             testErrorsSize = 0;
5412*7c568831SAndroid Build Coastguard Worker 	    if (result)
5413*7c568831SAndroid Build Coastguard Worker 		free(result);
5414*7c568831SAndroid Build Coastguard Worker 	    if (error)
5415*7c568831SAndroid Build Coastguard Worker 		free(error);
5416*7c568831SAndroid Build Coastguard Worker 	}
5417*7c568831SAndroid Build Coastguard Worker 	globfree(&globbuf);
5418*7c568831SAndroid Build Coastguard Worker     } else {
5419*7c568831SAndroid Build Coastguard Worker         testErrorsSize = 0;
5420*7c568831SAndroid Build Coastguard Worker 	testErrors[0] = 0;
5421*7c568831SAndroid Build Coastguard Worker         res = tst->func(NULL, NULL, NULL, tst->options);
5422*7c568831SAndroid Build Coastguard Worker         xmlResetLastError();
5423*7c568831SAndroid Build Coastguard Worker 	if (res != 0) {
5424*7c568831SAndroid Build Coastguard Worker 	    nb_errors++;
5425*7c568831SAndroid Build Coastguard Worker 	    err++;
5426*7c568831SAndroid Build Coastguard Worker 	}
5427*7c568831SAndroid Build Coastguard Worker     }
5428*7c568831SAndroid Build Coastguard Worker 
5429*7c568831SAndroid Build Coastguard Worker     xmlCharEncCloseFunc(ebcdicHandler);
5430*7c568831SAndroid Build Coastguard Worker     xmlCharEncCloseFunc(ibm1141Handler);
5431*7c568831SAndroid Build Coastguard Worker     xmlCharEncCloseFunc(eucJpHandler);
5432*7c568831SAndroid Build Coastguard Worker 
5433*7c568831SAndroid Build Coastguard Worker     return(err);
5434*7c568831SAndroid Build Coastguard Worker }
5435*7c568831SAndroid Build Coastguard Worker 
5436*7c568831SAndroid Build Coastguard Worker static int verbose = 0;
5437*7c568831SAndroid Build Coastguard Worker static int tests_quiet = 0;
5438*7c568831SAndroid Build Coastguard Worker 
5439*7c568831SAndroid Build Coastguard Worker static int
runtest(int i)5440*7c568831SAndroid Build Coastguard Worker runtest(int i) {
5441*7c568831SAndroid Build Coastguard Worker     int ret = 0, res;
5442*7c568831SAndroid Build Coastguard Worker     int old_errors, old_tests, old_leaks;
5443*7c568831SAndroid Build Coastguard Worker 
5444*7c568831SAndroid Build Coastguard Worker     old_errors = nb_errors;
5445*7c568831SAndroid Build Coastguard Worker     old_tests = nb_tests;
5446*7c568831SAndroid Build Coastguard Worker     old_leaks = nb_leaks;
5447*7c568831SAndroid Build Coastguard Worker     if ((tests_quiet == 0) && (testDescriptions[i].desc != NULL))
5448*7c568831SAndroid Build Coastguard Worker 	printf("## %s\n", testDescriptions[i].desc);
5449*7c568831SAndroid Build Coastguard Worker     res = launchTests(&testDescriptions[i]);
5450*7c568831SAndroid Build Coastguard Worker     if (res != 0)
5451*7c568831SAndroid Build Coastguard Worker 	ret++;
5452*7c568831SAndroid Build Coastguard Worker     if (verbose) {
5453*7c568831SAndroid Build Coastguard Worker 	if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
5454*7c568831SAndroid Build Coastguard Worker 	    printf("Ran %d tests, no errors\n", nb_tests - old_tests);
5455*7c568831SAndroid Build Coastguard Worker 	else
5456*7c568831SAndroid Build Coastguard Worker 	    printf("Ran %d tests, %d errors, %d leaks\n",
5457*7c568831SAndroid Build Coastguard Worker 		   nb_tests - old_tests,
5458*7c568831SAndroid Build Coastguard Worker 		   nb_errors - old_errors,
5459*7c568831SAndroid Build Coastguard Worker 		   nb_leaks - old_leaks);
5460*7c568831SAndroid Build Coastguard Worker     }
5461*7c568831SAndroid Build Coastguard Worker     return(ret);
5462*7c568831SAndroid Build Coastguard Worker }
5463*7c568831SAndroid Build Coastguard Worker 
5464*7c568831SAndroid Build Coastguard Worker int
main(int argc ATTRIBUTE_UNUSED,char ** argv ATTRIBUTE_UNUSED)5465*7c568831SAndroid Build Coastguard Worker main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
5466*7c568831SAndroid Build Coastguard Worker     int i, a, ret = 0;
5467*7c568831SAndroid Build Coastguard Worker     int subset = 0;
5468*7c568831SAndroid Build Coastguard Worker 
5469*7c568831SAndroid Build Coastguard Worker #if defined(_WIN32)
5470*7c568831SAndroid Build Coastguard Worker     setvbuf(stdout, NULL, _IONBF, 0);
5471*7c568831SAndroid Build Coastguard Worker     setvbuf(stderr, NULL, _IONBF, 0);
5472*7c568831SAndroid Build Coastguard Worker #endif
5473*7c568831SAndroid Build Coastguard Worker 
5474*7c568831SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1900
5475*7c568831SAndroid Build Coastguard Worker     _set_output_format(_TWO_DIGIT_EXPONENT);
5476*7c568831SAndroid Build Coastguard Worker #endif
5477*7c568831SAndroid Build Coastguard Worker 
5478*7c568831SAndroid Build Coastguard Worker     initializeLibxml2();
5479*7c568831SAndroid Build Coastguard Worker 
5480*7c568831SAndroid Build Coastguard Worker     for (a = 1; a < argc;a++) {
5481*7c568831SAndroid Build Coastguard Worker         if (!strcmp(argv[a], "-v"))
5482*7c568831SAndroid Build Coastguard Worker 	    verbose = 1;
5483*7c568831SAndroid Build Coastguard Worker         else if (!strcmp(argv[a], "-u"))
5484*7c568831SAndroid Build Coastguard Worker 	    update_results = 1;
5485*7c568831SAndroid Build Coastguard Worker         else if (!strcmp(argv[a], "-quiet"))
5486*7c568831SAndroid Build Coastguard Worker 	    tests_quiet = 1;
5487*7c568831SAndroid Build Coastguard Worker         else if (!strcmp(argv[a], "--out"))
5488*7c568831SAndroid Build Coastguard Worker 	    temp_directory = argv[++a];
5489*7c568831SAndroid Build Coastguard Worker 	else {
5490*7c568831SAndroid Build Coastguard Worker 	    for (i = 0; testDescriptions[i].func != NULL; i++) {
5491*7c568831SAndroid Build Coastguard Worker 	        if (strstr(testDescriptions[i].desc, argv[a])) {
5492*7c568831SAndroid Build Coastguard Worker 		    ret += runtest(i);
5493*7c568831SAndroid Build Coastguard Worker 		    subset++;
5494*7c568831SAndroid Build Coastguard Worker 		}
5495*7c568831SAndroid Build Coastguard Worker 	    }
5496*7c568831SAndroid Build Coastguard Worker 	}
5497*7c568831SAndroid Build Coastguard Worker     }
5498*7c568831SAndroid Build Coastguard Worker     if (subset == 0) {
5499*7c568831SAndroid Build Coastguard Worker 	for (i = 0; testDescriptions[i].func != NULL; i++) {
5500*7c568831SAndroid Build Coastguard Worker 	    ret += runtest(i);
5501*7c568831SAndroid Build Coastguard Worker 	}
5502*7c568831SAndroid Build Coastguard Worker     }
5503*7c568831SAndroid Build Coastguard Worker     if ((nb_errors == 0) && (nb_leaks == 0)) {
5504*7c568831SAndroid Build Coastguard Worker         ret = 0;
5505*7c568831SAndroid Build Coastguard Worker 	printf("Total %d tests, no errors\n",
5506*7c568831SAndroid Build Coastguard Worker 	       nb_tests);
5507*7c568831SAndroid Build Coastguard Worker     } else {
5508*7c568831SAndroid Build Coastguard Worker         ret = 1;
5509*7c568831SAndroid Build Coastguard Worker 	printf("Total %d tests, %d errors, %d leaks\n",
5510*7c568831SAndroid Build Coastguard Worker 	       nb_tests, nb_errors, nb_leaks);
5511*7c568831SAndroid Build Coastguard Worker     }
5512*7c568831SAndroid Build Coastguard Worker     xmlCleanupParser();
5513*7c568831SAndroid Build Coastguard Worker 
5514*7c568831SAndroid Build Coastguard Worker     return(ret);
5515*7c568831SAndroid Build Coastguard Worker }
5516*7c568831SAndroid Build Coastguard Worker 
5517*7c568831SAndroid Build Coastguard Worker #else /* ! LIBXML_OUTPUT_ENABLED */
5518*7c568831SAndroid Build Coastguard Worker int
main(int argc ATTRIBUTE_UNUSED,char ** argv ATTRIBUTE_UNUSED)5519*7c568831SAndroid Build Coastguard Worker main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
5520*7c568831SAndroid Build Coastguard Worker     fprintf(stderr, "runtest requires output to be enabled in libxml2\n");
5521*7c568831SAndroid Build Coastguard Worker     return(0);
5522*7c568831SAndroid Build Coastguard Worker }
5523*7c568831SAndroid Build Coastguard Worker #endif
5524