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