blob: 31fc2628fbcef37afdad7f3d807312f167806eb5 [file] [log] [blame]
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001/*
2 * xmllint.c : a small tester program for XML input.
3 *
4 * See Copyright for the status of this software.
5 *
Daniel Veillardc5d64342001-06-24 12:13:24 +00006 * daniel@veillard.com
Daniel Veillardce8b83b2000-04-05 18:38:42 +00007 */
8
Bjorn Reese70a9da52001-04-21 16:57:29 +00009#include "libxml.h"
Daniel Veillardce8b83b2000-04-05 18:38:42 +000010
Daniel Veillardce8b83b2000-04-05 18:38:42 +000011#include <string.h>
Daniel Veillardce8b83b2000-04-05 18:38:42 +000012#include <stdarg.h>
Daniel Veillard8a1b1852003-01-05 22:37:17 +000013#include <assert.h>
14
Daniel Veillard3c5ed912002-01-08 10:36:16 +000015#if defined (_WIN32) && !defined(__CYGWIN__)
Daniel Veillard07cb8222003-09-10 10:51:05 +000016#if defined (_MSC_VER) || defined(__BORLANDC__)
Daniel Veillard2d90de42001-04-16 17:46:18 +000017#include <winsock2.h>
18#pragma comment(lib, "ws2_32.lib")
19#define gettimeofday(p1,p2)
20#endif /* _MSC_VER */
Igor Zlatkovic19b87642003-08-28 12:32:04 +000021#endif /* _WIN32 */
22
Daniel Veillarded472f32001-12-13 08:48:14 +000023#ifdef HAVE_SYS_TIME_H
Daniel Veillard48b2f892001-02-25 16:11:03 +000024#include <sys/time.h>
Daniel Veillarded472f32001-12-13 08:48:14 +000025#endif
Daniel Veillard01db67c2001-12-18 07:09:59 +000026#ifdef HAVE_TIME_H
27#include <time.h>
28#endif
Daniel Veillard48b2f892001-02-25 16:11:03 +000029
Daniel Veillard1638a472003-08-14 01:23:25 +000030#ifdef __MINGW32__
31#define _WINSOCKAPI_
32#include <wsockcompat.h>
33#include <winsock2.h>
34#undef SOCKLEN_T
35#define SOCKLEN_T unsigned int
36#endif
37
Daniel Veillard90bc3712002-03-07 15:12:58 +000038#ifdef HAVE_SYS_TIMEB_H
39#include <sys/timeb.h>
40#endif
Daniel Veillardce8b83b2000-04-05 18:38:42 +000041
42#ifdef HAVE_SYS_TYPES_H
43#include <sys/types.h>
44#endif
45#ifdef HAVE_SYS_STAT_H
46#include <sys/stat.h>
47#endif
48#ifdef HAVE_FCNTL_H
49#include <fcntl.h>
50#endif
51#ifdef HAVE_UNISTD_H
52#include <unistd.h>
53#endif
Daniel Veillard46e370e2000-07-21 20:32:03 +000054#ifdef HAVE_SYS_MMAN_H
55#include <sys/mman.h>
Daniel Veillard87b95392000-08-12 21:12:04 +000056/* seems needed for Solaris */
57#ifndef MAP_FAILED
58#define MAP_FAILED ((void *) -1)
59#endif
Daniel Veillard46e370e2000-07-21 20:32:03 +000060#endif
Daniel Veillardce8b83b2000-04-05 18:38:42 +000061#ifdef HAVE_STDLIB_H
62#include <stdlib.h>
63#endif
64#ifdef HAVE_LIBREADLINE
65#include <readline/readline.h>
66#ifdef HAVE_LIBHISTORY
67#include <readline/history.h>
68#endif
69#endif
70
71#include <libxml/xmlmemory.h>
72#include <libxml/parser.h>
73#include <libxml/parserInternals.h>
74#include <libxml/HTMLparser.h>
75#include <libxml/HTMLtree.h>
76#include <libxml/tree.h>
77#include <libxml/xpath.h>
78#include <libxml/debugXML.h>
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +000079#include <libxml/xmlerror.h>
Daniel Veillard9e8bfae2000-11-06 16:43:11 +000080#ifdef LIBXML_XINCLUDE_ENABLED
81#include <libxml/xinclude.h>
82#endif
Daniel Veillard81418e32001-05-22 15:08:55 +000083#ifdef LIBXML_CATALOG_ENABLED
84#include <libxml/catalog.h>
85#endif
Daniel Veillard3c01b1d2001-10-17 15:58:35 +000086#include <libxml/globals.h>
Daniel Veillard7704fb12003-01-03 16:19:51 +000087#include <libxml/xmlreader.h>
Daniel Veillard71531f32003-02-05 13:19:53 +000088#ifdef LIBXML_SCHEMAS_ENABLED
89#include <libxml/relaxng.h>
Daniel Veillard75bb3bb2003-05-12 15:25:56 +000090#include <libxml/xmlschemas.h>
Daniel Veillard71531f32003-02-05 13:19:53 +000091#endif
Daniel Veillardb3de70c2003-12-02 22:32:15 +000092#ifdef LIBXML_PATTERN_ENABLED
93#include <libxml/pattern.h>
94#endif
Daniel Veillardce8b83b2000-04-05 18:38:42 +000095
Daniel Veillard3be27512003-01-26 19:49:04 +000096#ifndef XML_XML_DEFAULT_CATALOG
97#define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
98#endif
99
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000100#ifdef LIBXML_DEBUG_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000101static int shell = 0;
102static int debugent = 0;
103#endif
Daniel Veillard8326e732003-01-07 00:19:07 +0000104static int debug = 0;
Daniel Veillard652327a2003-09-29 18:02:38 +0000105#ifdef LIBXML_TREE_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000106static int copy = 0;
Daniel Veillard652327a2003-09-29 18:02:38 +0000107#endif /* LIBXML_TREE_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000108static int recovery = 0;
109static int noent = 0;
Daniel Veillarda9cce9c2003-09-29 13:20:24 +0000110static int noblanks = 0;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000111static int noout = 0;
112static int nowrap = 0;
Daniel Veillarda9cce9c2003-09-29 13:20:24 +0000113#ifdef LIBXML_OUTPUT_ENABLED
114static int format = 0;
115static const char *output = NULL;
116static int compress = 0;
117#endif /* LIBXML_OUTPUT_ENABLED */
Daniel Veillard4432df22003-09-28 18:58:27 +0000118#ifdef LIBXML_VALID_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000119static int valid = 0;
120static int postvalid = 0;
Daniel Veillardcd429612000-10-11 15:57:05 +0000121static char * dtdvalid = NULL;
Daniel Veillard66f68e72003-08-18 16:39:51 +0000122static char * dtdvalidfpi = NULL;
Daniel Veillard4432df22003-09-28 18:58:27 +0000123#endif
Daniel Veillard71531f32003-02-05 13:19:53 +0000124#ifdef LIBXML_SCHEMAS_ENABLED
125static char * relaxng = NULL;
126static xmlRelaxNGPtr relaxngschemas = NULL;
Daniel Veillard75bb3bb2003-05-12 15:25:56 +0000127static char * schema = NULL;
128static xmlSchemaPtr wxschemas = NULL;
Daniel Veillard71531f32003-02-05 13:19:53 +0000129#endif
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000130static int repeat = 0;
131static int insert = 0;
Daniel Veillard4432df22003-09-28 18:58:27 +0000132#ifdef LIBXML_HTML_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000133static int html = 0;
Daniel Veillard42fd4122003-11-04 08:47:48 +0000134static int xmlout = 0;
Daniel Veillard4432df22003-09-28 18:58:27 +0000135#endif
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000136static int htmlout = 0;
Daniel Veillard73b013f2003-09-30 12:36:01 +0000137#ifdef LIBXML_PUSH_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000138static int push = 0;
Daniel Veillard73b013f2003-09-30 12:36:01 +0000139#endif /* LIBXML_PUSH_ENABLED */
Daniel Veillard46e370e2000-07-21 20:32:03 +0000140#ifdef HAVE_SYS_MMAN_H
141static int memory = 0;
142#endif
Daniel Veillard5e873c42000-04-12 13:27:38 +0000143static int testIO = 0;
Daniel Veillardbe803962000-06-28 23:40:59 +0000144static char *encoding = NULL;
Daniel Veillard9e8bfae2000-11-06 16:43:11 +0000145#ifdef LIBXML_XINCLUDE_ENABLED
146static int xinclude = 0;
147#endif
Daniel Veillard48da9102001-08-07 01:10:10 +0000148static int dtdattrs = 0;
Daniel Veillard10ea86c2001-06-20 13:55:33 +0000149static int loaddtd = 0;
Daniel Veillardf7cd4812001-02-23 18:44:52 +0000150static int progresult = 0;
Daniel Veillard48b2f892001-02-25 16:11:03 +0000151static int timing = 0;
Daniel Veillardd2f3ec72001-04-11 07:50:02 +0000152static int generate = 0;
Daniel Veillard29e43992001-12-13 22:21:58 +0000153static int dropdtd = 0;
Daniel Veillarde2940dd2001-08-22 00:06:49 +0000154#ifdef LIBXML_CATALOG_ENABLED
155static int catalogs = 0;
156static int nocatalogs = 0;
157#endif
Daniel Veillard81273902003-09-30 00:43:48 +0000158#ifdef LIBXML_READER_ENABLED
Daniel Veillard7704fb12003-01-03 16:19:51 +0000159static int stream = 0;
Daniel Veillard7899c5c2003-11-03 12:31:38 +0000160static int walker = 0;
Daniel Veillard81273902003-09-30 00:43:48 +0000161#endif /* LIBXML_READER_ENABLED */
Daniel Veillard8a1b1852003-01-05 22:37:17 +0000162static int chkregister = 0;
Daniel Veillard81273902003-09-30 00:43:48 +0000163#ifdef LIBXML_SAX1_ENABLED
Daniel Veillard07cb8222003-09-10 10:51:05 +0000164static int sax1 = 0;
Daniel Veillard81273902003-09-30 00:43:48 +0000165#endif /* LIBXML_SAX1_ENABLED */
Daniel Veillardb3de70c2003-12-02 22:32:15 +0000166#ifdef LIBXML_PATTERN_ENABLED
167static const char *pattern = NULL;
168static xmlPatternPtr patternc = NULL;
169#endif
Daniel Veillard16fa96c2003-09-23 21:50:54 +0000170static int options = 0;
Daniel Veillard1df3dfc2001-12-18 11:14:16 +0000171
Daniel Veillard01db67c2001-12-18 07:09:59 +0000172/*
173 * Internal timing routines to remove the necessity to have unix-specific
174 * function calls
175 */
176
Daniel Veillard8c1ae602002-03-07 11:21:00 +0000177#ifndef HAVE_GETTIMEOFDAY
178#ifdef HAVE_SYS_TIMEB_H
179#ifdef HAVE_SYS_TIME_H
180#ifdef HAVE_FTIME
181
Daniel Veillard01c13b52002-12-10 15:19:08 +0000182static int
Daniel Veillard8c1ae602002-03-07 11:21:00 +0000183my_gettimeofday(struct timeval *tvp, void *tzp)
184{
185 struct timeb timebuffer;
186
187 ftime(&timebuffer);
188 if (tvp) {
189 tvp->tv_sec = timebuffer.time;
190 tvp->tv_usec = timebuffer.millitm * 1000L;
191 }
192 return (0);
193}
194#define HAVE_GETTIMEOFDAY 1
195#define gettimeofday my_gettimeofday
196
197#endif /* HAVE_FTIME */
198#endif /* HAVE_SYS_TIME_H */
199#endif /* HAVE_SYS_TIMEB_H */
200#endif /* !HAVE_GETTIMEOFDAY */
201
Daniel Veillard01db67c2001-12-18 07:09:59 +0000202#if defined(HAVE_GETTIMEOFDAY)
203static struct timeval begin, end;
204
205/*
206 * startTimer: call where you want to start timing
207 */
208static void
209startTimer(void)
210{
211 gettimeofday(&begin, NULL);
212}
213
214/*
215 * endTimer: call where you want to stop timing and to print out a
216 * message about the timing performed; format is a printf
217 * type argument
218 */
219static void
Daniel Veillard118aed72002-09-24 14:13:13 +0000220endTimer(const char *fmt, ...)
Daniel Veillard01db67c2001-12-18 07:09:59 +0000221{
222 long msec;
223 va_list ap;
224
225 gettimeofday(&end, NULL);
226 msec = end.tv_sec - begin.tv_sec;
227 msec *= 1000;
228 msec += (end.tv_usec - begin.tv_usec) / 1000;
229
230#ifndef HAVE_STDARG_H
231#error "endTimer required stdarg functions"
232#endif
Daniel Veillard118aed72002-09-24 14:13:13 +0000233 va_start(ap, fmt);
234 vfprintf(stderr, fmt, ap);
Daniel Veillard01db67c2001-12-18 07:09:59 +0000235 va_end(ap);
236
237 fprintf(stderr, " took %ld ms\n", msec);
238}
239#elif defined(HAVE_TIME_H)
Daniel Veillard01db67c2001-12-18 07:09:59 +0000240/*
241 * No gettimeofday function, so we have to make do with calling clock.
242 * This is obviously less accurate, but there's little we can do about
243 * that.
244 */
Daniel Veillard90bc3712002-03-07 15:12:58 +0000245#ifndef CLOCKS_PER_SEC
246#define CLOCKS_PER_SEC 100
247#endif
Daniel Veillard01db67c2001-12-18 07:09:59 +0000248
249static clock_t begin, end;
250static void
251startTimer(void)
252{
253 begin = clock();
254}
255static void
256endTimer(const char *fmt, ...)
257{
258 long msec;
259 va_list ap;
260
261 end = clock();
262 msec = ((end - begin) * 1000) / CLOCKS_PER_SEC;
263
264#ifndef HAVE_STDARG_H
265#error "endTimer required stdarg functions"
266#endif
267 va_start(ap, fmt);
268 vfprintf(stderr, fmt, ap);
269 va_end(ap);
270 fprintf(stderr, " took %ld ms\n", msec);
271}
272#else
273
274/*
275 * We don't have a gettimeofday or time.h, so we just don't do timing
276 */
277static void
278startTimer(void)
279{
280 /*
281 * Do nothing
282 */
283}
284static void
285endTimer(char *format, ...)
286{
287 /*
288 * We cannot do anything because we don't have a timing function
289 */
290#ifdef HAVE_STDARG_H
291 va_start(ap, format);
292 vfprintf(stderr, format, ap);
293 va_end(ap);
294 fprintf(stderr, " was not timed\n", msec);
295#else
296 /* We don't have gettimeofday, time or stdarg.h, what crazy world is
297 * this ?!
298 */
299#endif
300}
301#endif
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000302/************************************************************************
303 * *
304 * HTML ouput *
305 * *
306 ************************************************************************/
307char buffer[50000];
308
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000309static void
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000310xmlHTMLEncodeSend(void) {
311 char *result;
312
313 result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer);
314 if (result) {
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000315 xmlGenericError(xmlGenericErrorContext, "%s", result);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000316 xmlFree(result);
317 }
318 buffer[0] = 0;
319}
320
321/**
322 * xmlHTMLPrintFileInfo:
323 * @input: an xmlParserInputPtr input
324 *
325 * Displays the associated file and line informations for the current input
326 */
327
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000328static void
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000329xmlHTMLPrintFileInfo(xmlParserInputPtr input) {
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000330 int len;
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000331 xmlGenericError(xmlGenericErrorContext, "<p>");
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000332
333 len = strlen(buffer);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000334 if (input != NULL) {
335 if (input->filename) {
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000336 snprintf(&buffer[len], sizeof(buffer) - len, "%s:%d: ", input->filename,
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000337 input->line);
338 } else {
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000339 snprintf(&buffer[len], sizeof(buffer) - len, "Entity: line %d: ", input->line);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000340 }
341 }
342 xmlHTMLEncodeSend();
343}
344
345/**
346 * xmlHTMLPrintFileContext:
347 * @input: an xmlParserInputPtr input
348 *
349 * Displays current context within the input content for error tracking
350 */
351
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000352static void
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000353xmlHTMLPrintFileContext(xmlParserInputPtr input) {
354 const xmlChar *cur, *base;
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000355 int len;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000356 int n;
357
358 if (input == NULL) return;
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000359 xmlGenericError(xmlGenericErrorContext, "<pre>\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000360 cur = input->cur;
361 base = input->base;
362 while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
363 cur--;
364 }
365 n = 0;
366 while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
367 cur--;
368 if ((*cur == '\n') || (*cur == '\r')) cur++;
369 base = cur;
370 n = 0;
371 while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000372 len = strlen(buffer);
373 snprintf(&buffer[len], sizeof(buffer) - len, "%c",
374 (unsigned char) *cur++);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000375 n++;
376 }
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000377 len = strlen(buffer);
378 snprintf(&buffer[len], sizeof(buffer) - len, "\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000379 cur = input->cur;
380 while ((*cur == '\n') || (*cur == '\r'))
381 cur--;
382 n = 0;
383 while ((cur != base) && (n++ < 80)) {
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000384 len = strlen(buffer);
385 snprintf(&buffer[len], sizeof(buffer) - len, " ");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000386 base++;
387 }
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000388 len = strlen(buffer);
389 snprintf(&buffer[len], sizeof(buffer) - len, "^\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000390 xmlHTMLEncodeSend();
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000391 xmlGenericError(xmlGenericErrorContext, "</pre>");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000392}
393
394/**
395 * xmlHTMLError:
396 * @ctx: an XML parser context
397 * @msg: the message to display/transmit
398 * @...: extra parameters for the message display
399 *
400 * Display and format an error messages, gives file, line, position and
401 * extra parameters.
402 */
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000403static void
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000404xmlHTMLError(void *ctx, const char *msg, ...)
405{
406 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
407 xmlParserInputPtr input;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000408 va_list args;
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000409 int len;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000410
411 buffer[0] = 0;
412 input = ctxt->input;
413 if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000414 input = ctxt->inputTab[ctxt->inputNr - 2];
415 }
416
417 xmlHTMLPrintFileInfo(input);
418
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000419 xmlGenericError(xmlGenericErrorContext, "<b>error</b>: ");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000420 va_start(args, msg);
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000421 len = strlen(buffer);
422 vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000423 va_end(args);
424 xmlHTMLEncodeSend();
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000425 xmlGenericError(xmlGenericErrorContext, "</p>\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000426
427 xmlHTMLPrintFileContext(input);
428 xmlHTMLEncodeSend();
429}
430
431/**
432 * xmlHTMLWarning:
433 * @ctx: an XML parser context
434 * @msg: the message to display/transmit
435 * @...: extra parameters for the message display
436 *
437 * Display and format a warning messages, gives file, line, position and
438 * extra parameters.
439 */
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000440static void
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000441xmlHTMLWarning(void *ctx, const char *msg, ...)
442{
443 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
444 xmlParserInputPtr input;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000445 va_list args;
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000446 int len;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000447
448 buffer[0] = 0;
449 input = ctxt->input;
450 if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000451 input = ctxt->inputTab[ctxt->inputNr - 2];
452 }
453
454
455 xmlHTMLPrintFileInfo(input);
456
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000457 xmlGenericError(xmlGenericErrorContext, "<b>warning</b>: ");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000458 va_start(args, msg);
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000459 len = strlen(buffer);
460 vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000461 va_end(args);
462 xmlHTMLEncodeSend();
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000463 xmlGenericError(xmlGenericErrorContext, "</p>\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000464
465 xmlHTMLPrintFileContext(input);
466 xmlHTMLEncodeSend();
467}
468
469/**
470 * xmlHTMLValidityError:
471 * @ctx: an XML parser context
472 * @msg: the message to display/transmit
473 * @...: extra parameters for the message display
474 *
475 * Display and format an validity error messages, gives file,
476 * line, position and extra parameters.
477 */
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000478static void
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000479xmlHTMLValidityError(void *ctx, const char *msg, ...)
480{
481 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
482 xmlParserInputPtr input;
483 va_list args;
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000484 int len;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000485
486 buffer[0] = 0;
487 input = ctxt->input;
488 if ((input->filename == NULL) && (ctxt->inputNr > 1))
489 input = ctxt->inputTab[ctxt->inputNr - 2];
490
491 xmlHTMLPrintFileInfo(input);
492
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000493 xmlGenericError(xmlGenericErrorContext, "<b>validity error</b>: ");
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000494 len = strlen(buffer);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000495 va_start(args, msg);
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000496 vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000497 va_end(args);
498 xmlHTMLEncodeSend();
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000499 xmlGenericError(xmlGenericErrorContext, "</p>\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000500
501 xmlHTMLPrintFileContext(input);
502 xmlHTMLEncodeSend();
503}
504
505/**
506 * xmlHTMLValidityWarning:
507 * @ctx: an XML parser context
508 * @msg: the message to display/transmit
509 * @...: extra parameters for the message display
510 *
511 * Display and format a validity warning messages, gives file, line,
512 * position and extra parameters.
513 */
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000514static void
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000515xmlHTMLValidityWarning(void *ctx, const char *msg, ...)
516{
517 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
518 xmlParserInputPtr input;
519 va_list args;
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000520 int len;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000521
522 buffer[0] = 0;
523 input = ctxt->input;
524 if ((input->filename == NULL) && (ctxt->inputNr > 1))
525 input = ctxt->inputTab[ctxt->inputNr - 2];
526
527 xmlHTMLPrintFileInfo(input);
528
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000529 xmlGenericError(xmlGenericErrorContext, "<b>validity warning</b>: ");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000530 va_start(args, msg);
Aleksey Sanin49cc9752002-06-14 17:07:10 +0000531 len = strlen(buffer);
532 vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000533 va_end(args);
534 xmlHTMLEncodeSend();
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +0000535 xmlGenericError(xmlGenericErrorContext, "</p>\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000536
537 xmlHTMLPrintFileContext(input);
538 xmlHTMLEncodeSend();
539}
540
541/************************************************************************
542 * *
543 * Shell Interface *
544 * *
545 ************************************************************************/
Daniel Veillard56ada1d2003-01-07 11:17:25 +0000546#ifdef LIBXML_DEBUG_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000547/**
548 * xmlShellReadline:
549 * @prompt: the prompt value
550 *
551 * Read a string
552 *
553 * Returns a pointer to it or NULL on EOF the caller is expected to
554 * free the returned string.
555 */
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000556static char *
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000557xmlShellReadline(char *prompt) {
558#ifdef HAVE_LIBREADLINE
559 char *line_read;
560
561 /* Get a line from the user. */
562 line_read = readline (prompt);
563
564 /* If the line has any text in it, save it on the history. */
565 if (line_read && *line_read)
566 add_history (line_read);
567
568 return (line_read);
569#else
570 char line_read[501];
Daniel Veillard29e43992001-12-13 22:21:58 +0000571 char *ret;
572 int len;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000573
574 if (prompt != NULL)
575 fprintf(stdout, "%s", prompt);
576 if (!fgets(line_read, 500, stdin))
577 return(NULL);
578 line_read[500] = 0;
Daniel Veillard29e43992001-12-13 22:21:58 +0000579 len = strlen(line_read);
580 ret = (char *) malloc(len + 1);
581 if (ret != NULL) {
582 memcpy (ret, line_read, len + 1);
583 }
584 return(ret);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000585#endif
586}
Daniel Veillard56ada1d2003-01-07 11:17:25 +0000587#endif /* LIBXML_DEBUG_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000588
589/************************************************************************
590 * *
Daniel Veillard5e873c42000-04-12 13:27:38 +0000591 * I/O Interfaces *
592 * *
593 ************************************************************************/
594
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000595static int myRead(FILE *f, char * buf, int len) {
596 return(fread(buf, 1, len, f));
Daniel Veillard5e873c42000-04-12 13:27:38 +0000597}
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000598static void myClose(FILE *f) {
Daniel Veillard4a6845d2001-01-03 13:32:39 +0000599 if (f != stdin) {
Daniel Veillard5e873c42000-04-12 13:27:38 +0000600 fclose(f);
Daniel Veillard4a6845d2001-01-03 13:32:39 +0000601 }
Daniel Veillard5e873c42000-04-12 13:27:38 +0000602}
603
Daniel Veillard81273902003-09-30 00:43:48 +0000604#ifdef LIBXML_READER_ENABLED
Daniel Veillard5e873c42000-04-12 13:27:38 +0000605/************************************************************************
606 * *
Daniel Veillard7704fb12003-01-03 16:19:51 +0000607 * Stream Test processing *
608 * *
609 ************************************************************************/
Daniel Veillard7704fb12003-01-03 16:19:51 +0000610static void processNode(xmlTextReaderPtr reader) {
Daniel Veillard198c1bf2003-10-20 17:07:41 +0000611 const xmlChar *name, *value;
Daniel Veillard7704fb12003-01-03 16:19:51 +0000612
Daniel Veillard198c1bf2003-10-20 17:07:41 +0000613 name = xmlTextReaderConstName(reader);
Daniel Veillarde59494f2003-01-04 16:35:29 +0000614 if (name == NULL)
Daniel Veillard7899c5c2003-11-03 12:31:38 +0000615 name = BAD_CAST "--";
Daniel Veillard99737f52003-03-22 14:55:50 +0000616
Daniel Veillard198c1bf2003-10-20 17:07:41 +0000617 value = xmlTextReaderConstValue(reader);
Daniel Veillard7704fb12003-01-03 16:19:51 +0000618
Daniel Veillard99737f52003-03-22 14:55:50 +0000619 printf("%d %d %s %d %d",
Daniel Veillarde59494f2003-01-04 16:35:29 +0000620 xmlTextReaderDepth(reader),
621 xmlTextReaderNodeType(reader),
622 name,
Daniel Veillard99737f52003-03-22 14:55:50 +0000623 xmlTextReaderIsEmptyElement(reader),
624 xmlTextReaderHasValue(reader));
Daniel Veillarde59494f2003-01-04 16:35:29 +0000625 if (value == NULL)
626 printf("\n");
627 else {
628 printf(" %s\n", value);
Daniel Veillard7704fb12003-01-03 16:19:51 +0000629 }
Daniel Veillardb3de70c2003-12-02 22:32:15 +0000630#ifdef LIBXML_PATTERN_ENABLED
631 if (patternc) {
632 if (xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader)) == 1) {
633 printf("Node matches pattern %s\n", pattern);
634 }
635 }
636#endif
Daniel Veillard7704fb12003-01-03 16:19:51 +0000637}
638
639static void streamFile(char *filename) {
640 xmlTextReaderPtr reader;
641 int ret;
Daniel Veillard8d8bf2c2003-09-17 19:36:25 +0000642#ifdef HAVE_SYS_MMAN_H
643 int fd = -1;
644 struct stat info;
645 const char *base = NULL;
646 xmlParserInputBufferPtr input = NULL;
Daniel Veillard7704fb12003-01-03 16:19:51 +0000647
Daniel Veillard8d8bf2c2003-09-17 19:36:25 +0000648 if (memory) {
649 if (stat(filename, &info) < 0)
650 return;
651 if ((fd = open(filename, O_RDONLY)) < 0)
652 return;
653 base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
654 if (base == (void *) MAP_FAILED)
655 return;
656
Daniel Veillard7899c5c2003-11-03 12:31:38 +0000657 reader = xmlReaderForMemory(base, info.st_size, filename,
658 NULL, options);
Daniel Veillard8d8bf2c2003-09-17 19:36:25 +0000659 } else
660#endif
Daniel Veillard7899c5c2003-11-03 12:31:38 +0000661 reader = xmlReaderForFile(filename, NULL, options);
662
Daniel Veillard8d8bf2c2003-09-17 19:36:25 +0000663
Daniel Veillard7704fb12003-01-03 16:19:51 +0000664 if (reader != NULL) {
Daniel Veillard4432df22003-09-28 18:58:27 +0000665#ifdef LIBXML_VALID_ENABLED
Daniel Veillard7704fb12003-01-03 16:19:51 +0000666 if (valid)
667 xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
Daniel Veillardce192eb2003-04-16 15:58:05 +0000668 else
Daniel Veillard4432df22003-09-28 18:58:27 +0000669#endif /* LIBXML_VALID_ENABLED */
Daniel Veillardce192eb2003-04-16 15:58:05 +0000670 xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1);
Daniel Veillard37fc84d2003-05-09 19:38:15 +0000671#ifdef LIBXML_SCHEMAS_ENABLED
Daniel Veillardce192eb2003-04-16 15:58:05 +0000672 if (relaxng != NULL) {
Daniel Veillard81514ba2003-09-16 23:17:26 +0000673 if ((timing) && (!repeat)) {
Daniel Veillardce192eb2003-04-16 15:58:05 +0000674 startTimer();
675 }
676 ret = xmlTextReaderRelaxNGValidate(reader, relaxng);
677 if (ret < 0) {
678 xmlGenericError(xmlGenericErrorContext,
679 "Relax-NG schema %s failed to compile\n", relaxng);
Daniel Veillard05d987b2003-10-08 11:54:57 +0000680 progresult = 5;
Daniel Veillardce192eb2003-04-16 15:58:05 +0000681 relaxng = NULL;
682 }
Daniel Veillard81514ba2003-09-16 23:17:26 +0000683 if ((timing) && (!repeat)) {
Daniel Veillardce192eb2003-04-16 15:58:05 +0000684 endTimer("Compiling the schemas");
685 }
686 }
Daniel Veillard37fc84d2003-05-09 19:38:15 +0000687#endif
Daniel Veillard7704fb12003-01-03 16:19:51 +0000688
689 /*
690 * Process all nodes in sequence
691 */
Daniel Veillard81514ba2003-09-16 23:17:26 +0000692 if ((timing) && (!repeat)) {
Daniel Veillardce192eb2003-04-16 15:58:05 +0000693 startTimer();
694 }
Daniel Veillard7704fb12003-01-03 16:19:51 +0000695 ret = xmlTextReaderRead(reader);
696 while (ret == 1) {
Daniel Veillardb3de70c2003-12-02 22:32:15 +0000697 if ((debug)
698#ifdef LIBXML_PATTERN_ENABLED
699 || (patternc)
700#endif
701 )
Daniel Veillard7704fb12003-01-03 16:19:51 +0000702 processNode(reader);
703 ret = xmlTextReaderRead(reader);
704 }
Daniel Veillard81514ba2003-09-16 23:17:26 +0000705 if ((timing) && (!repeat)) {
Daniel Veillard37fc84d2003-05-09 19:38:15 +0000706#ifdef LIBXML_SCHEMAS_ENABLED
Daniel Veillardf54cd532004-02-25 11:52:31 +0000707 if (relaxng != NULL)
Daniel Veillard49138f12004-02-19 12:58:36 +0000708 endTimer("Parsing and validating");
709 else
Daniel Veillardf54cd532004-02-25 11:52:31 +0000710#endif
Daniel Veillard4432df22003-09-28 18:58:27 +0000711#ifdef LIBXML_VALID_ENABLED
Daniel Veillard37fc84d2003-05-09 19:38:15 +0000712 if (valid)
Daniel Veillardce192eb2003-04-16 15:58:05 +0000713 endTimer("Parsing and validating");
714 else
Daniel Veillard4432df22003-09-28 18:58:27 +0000715#endif
Daniel Veillardf54cd532004-02-25 11:52:31 +0000716 endTimer("Parsing");
Daniel Veillardce192eb2003-04-16 15:58:05 +0000717 }
Daniel Veillard7704fb12003-01-03 16:19:51 +0000718
Daniel Veillard4432df22003-09-28 18:58:27 +0000719#ifdef LIBXML_VALID_ENABLED
Daniel Veillardf6bad792003-04-11 19:38:54 +0000720 if (valid) {
721 if (xmlTextReaderIsValid(reader) != 1) {
722 xmlGenericError(xmlGenericErrorContext,
723 "Document %s does not validate\n", filename);
724 progresult = 3;
725 }
726 }
Daniel Veillard4432df22003-09-28 18:58:27 +0000727#endif /* LIBXML_VALID_ENABLED */
Daniel Veillard37fc84d2003-05-09 19:38:15 +0000728#ifdef LIBXML_SCHEMAS_ENABLED
Daniel Veillardf4e55762003-04-15 23:32:22 +0000729 if (relaxng != NULL) {
730 if (xmlTextReaderIsValid(reader) != 1) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +0000731 fprintf(stderr, "%s fails to validate\n", filename);
Daniel Veillardf4e55762003-04-15 23:32:22 +0000732 progresult = 3;
733 } else {
Daniel Veillardd21f61b2003-12-29 10:31:21 +0000734 fprintf(stderr, "%s validates\n", filename);
Daniel Veillardf4e55762003-04-15 23:32:22 +0000735 }
736 }
Daniel Veillard37fc84d2003-05-09 19:38:15 +0000737#endif
Daniel Veillard7704fb12003-01-03 16:19:51 +0000738 /*
739 * Done, cleanup and status
740 */
741 xmlFreeTextReader(reader);
742 if (ret != 0) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +0000743 fprintf(stderr, "%s : failed to parse\n", filename);
Daniel Veillardf6bad792003-04-11 19:38:54 +0000744 progresult = 1;
Daniel Veillard7704fb12003-01-03 16:19:51 +0000745 }
746 } else {
747 fprintf(stderr, "Unable to open %s\n", filename);
Daniel Veillardf6bad792003-04-11 19:38:54 +0000748 progresult = 1;
Daniel Veillard7704fb12003-01-03 16:19:51 +0000749 }
Daniel Veillard8d8bf2c2003-09-17 19:36:25 +0000750#ifdef HAVE_SYS_MMAN_H
751 if (memory) {
752 xmlFreeParserInputBuffer(input);
753 munmap((char *) base, info.st_size);
754 close(fd);
755 }
756#endif
Daniel Veillard7704fb12003-01-03 16:19:51 +0000757}
Daniel Veillard7899c5c2003-11-03 12:31:38 +0000758
759static void walkDoc(xmlDocPtr doc) {
760 xmlTextReaderPtr reader;
761 int ret;
762
763 reader = xmlReaderWalker(doc);
764 if (reader != NULL) {
765 if ((timing) && (!repeat)) {
766 startTimer();
767 }
768 ret = xmlTextReaderRead(reader);
769 while (ret == 1) {
Daniel Veillardb3de70c2003-12-02 22:32:15 +0000770 if ((debug)
771#ifdef LIBXML_PATTERN_ENABLED
772 || (patternc)
773#endif
774 )
Daniel Veillard7899c5c2003-11-03 12:31:38 +0000775 processNode(reader);
776 ret = xmlTextReaderRead(reader);
777 }
778 if ((timing) && (!repeat)) {
779 endTimer("walking through the doc");
780 }
781 xmlFreeTextReader(reader);
782 if (ret != 0) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +0000783 fprintf(stderr, "failed to walk through the doc\n");
Daniel Veillard7899c5c2003-11-03 12:31:38 +0000784 progresult = 1;
785 }
786 } else {
787 fprintf(stderr, "Failed to crate a reader from the document\n");
788 progresult = 1;
789 }
790}
Daniel Veillard81273902003-09-30 00:43:48 +0000791#endif /* LIBXML_READER_ENABLED */
Daniel Veillard7704fb12003-01-03 16:19:51 +0000792
793/************************************************************************
794 * *
795 * Tree Test processing *
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000796 * *
797 ************************************************************************/
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000798static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
Daniel Veillard652327a2003-09-29 18:02:38 +0000799 xmlDocPtr doc = NULL;
800#ifdef LIBXML_TREE_ENABLED
801 xmlDocPtr tmp;
802#endif /* LIBXML_TREE_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000803
Daniel Veillard48b2f892001-02-25 16:11:03 +0000804 if ((timing) && (!repeat))
Daniel Veillard01db67c2001-12-18 07:09:59 +0000805 startTimer();
Daniel Veillard48b2f892001-02-25 16:11:03 +0000806
807
Daniel Veillard652327a2003-09-29 18:02:38 +0000808#ifdef LIBXML_TREE_ENABLED
Daniel Veillardd2f3ec72001-04-11 07:50:02 +0000809 if (filename == NULL) {
810 if (generate) {
811 xmlNodePtr n;
812
813 doc = xmlNewDoc(BAD_CAST "1.0");
814 n = xmlNewNode(NULL, BAD_CAST "info");
815 xmlNodeSetContent(n, BAD_CAST "abc");
816 xmlDocSetRootElement(doc, n);
817 }
818 }
Daniel Veillard652327a2003-09-29 18:02:38 +0000819#endif /* LIBXML_TREE_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000820#ifdef LIBXML_HTML_ENABLED
Daniel Veillard73b013f2003-09-30 12:36:01 +0000821#ifdef LIBXML_PUSH_ENABLED
William M. Brack78637da2003-07-31 14:47:38 +0000822 else if ((html) && (push)) {
823 FILE *f;
824
825 f = fopen(filename, "r");
826 if (f != NULL) {
827 int res, size = 3;
828 char chars[4096];
829 htmlParserCtxtPtr ctxt;
830
831 /* if (repeat) */
832 size = 4096;
833 res = fread(chars, 1, 4, f);
834 if (res > 0) {
835 ctxt = htmlCreatePushParserCtxt(NULL, NULL,
William M. Brack1d75c8a2003-10-27 13:48:16 +0000836 chars, res, filename, XML_CHAR_ENCODING_NONE);
William M. Brack78637da2003-07-31 14:47:38 +0000837 while ((res = fread(chars, 1, size, f)) > 0) {
838 htmlParseChunk(ctxt, chars, res, 0);
839 }
840 htmlParseChunk(ctxt, chars, 0, 1);
841 doc = ctxt->myDoc;
842 htmlFreeParserCtxt(ctxt);
843 }
844 fclose(f);
845 }
846 }
Daniel Veillard73b013f2003-09-30 12:36:01 +0000847#endif /* LIBXML_PUSH_ENABLED */
Daniel Veillardd2f3ec72001-04-11 07:50:02 +0000848 else if (html) {
Daniel Veillard9475a352003-09-26 12:47:50 +0000849 doc = htmlReadFile(filename, NULL, options);
Daniel Veillardd2f3ec72001-04-11 07:50:02 +0000850 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000851#endif /* LIBXML_HTML_ENABLED */
Daniel Veillardd2f3ec72001-04-11 07:50:02 +0000852 else {
Daniel Veillard73b013f2003-09-30 12:36:01 +0000853#ifdef LIBXML_PUSH_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000854 /*
855 * build an XML tree from a string;
856 */
857 if (push) {
858 FILE *f;
859
Daniel Veillard4a6845d2001-01-03 13:32:39 +0000860 /* '-' Usually means stdin -<sven@zen.org> */
861 if ((filename[0] == '-') && (filename[1] == 0)) {
862 f = stdin;
863 } else {
864 f = fopen(filename, "r");
865 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000866 if (f != NULL) {
Daniel Veillarde715dd22000-08-29 18:29:38 +0000867 int ret;
Daniel Veillarda880b122003-04-21 21:36:41 +0000868 int res, size = 1024;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000869 char chars[1024];
870 xmlParserCtxtPtr ctxt;
871
Daniel Veillarda880b122003-04-21 21:36:41 +0000872 /* if (repeat) size = 1024; */
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000873 res = fread(chars, 1, 4, f);
874 if (res > 0) {
875 ctxt = xmlCreatePushParserCtxt(NULL, NULL,
876 chars, res, filename);
Daniel Veillard500a1de2004-03-22 15:22:58 +0000877 xmlCtxtUseOptions(ctxt, options);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000878 while ((res = fread(chars, 1, size, f)) > 0) {
879 xmlParseChunk(ctxt, chars, res, 0);
880 }
881 xmlParseChunk(ctxt, chars, 0, 1);
882 doc = ctxt->myDoc;
Daniel Veillarde715dd22000-08-29 18:29:38 +0000883 ret = ctxt->wellFormed;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000884 xmlFreeParserCtxt(ctxt);
Daniel Veillarde715dd22000-08-29 18:29:38 +0000885 if (!ret) {
886 xmlFreeDoc(doc);
887 doc = NULL;
888 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000889 }
890 }
Daniel Veillard73b013f2003-09-30 12:36:01 +0000891 } else
892#endif /* LIBXML_PUSH_ENABLED */
893 if (testIO) {
Daniel Veillard4a6845d2001-01-03 13:32:39 +0000894 if ((filename[0] == '-') && (filename[1] == 0)) {
Daniel Veillard60942de2003-09-25 21:05:58 +0000895 doc = xmlReadFd(0, NULL, NULL, options);
Daniel Veillard4a6845d2001-01-03 13:32:39 +0000896 } else {
Daniel Veillard16fa96c2003-09-23 21:50:54 +0000897 FILE *f;
Daniel Veillard5e873c42000-04-12 13:27:38 +0000898
Daniel Veillard16fa96c2003-09-23 21:50:54 +0000899 f = fopen(filename, "r");
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000900 if (f != NULL) {
901 if (rectxt == NULL)
902 doc = xmlReadIO((xmlInputReadCallback) myRead,
903 (xmlInputCloseCallback) myClose, f,
Daniel Veillard60942de2003-09-25 21:05:58 +0000904 filename, NULL, options);
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000905 else
906 doc = xmlCtxtReadIO(rectxt,
907 (xmlInputReadCallback) myRead,
908 (xmlInputCloseCallback) myClose, f,
Daniel Veillard60942de2003-09-25 21:05:58 +0000909 filename, NULL, options);
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000910 } else
Daniel Veillard5e873c42000-04-12 13:27:38 +0000911 doc = NULL;
Daniel Veillard5e873c42000-04-12 13:27:38 +0000912 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000913 } else if (htmlout) {
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000914 xmlParserCtxtPtr ctxt;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000915
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000916 if (rectxt == NULL)
917 ctxt = xmlNewParserCtxt();
918 else
919 ctxt = rectxt;
Daniel Veillard88a172f2000-08-04 18:23:10 +0000920 if (ctxt == NULL) {
Daniel Veillard16fa96c2003-09-23 21:50:54 +0000921 doc = NULL;
Daniel Veillard88a172f2000-08-04 18:23:10 +0000922 } else {
Daniel Veillard16fa96c2003-09-23 21:50:54 +0000923 ctxt->sax->error = xmlHTMLError;
924 ctxt->sax->warning = xmlHTMLWarning;
925 ctxt->vctxt.error = xmlHTMLValidityError;
926 ctxt->vctxt.warning = xmlHTMLValidityWarning;
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000927
Daniel Veillard16fa96c2003-09-23 21:50:54 +0000928 doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000929
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000930 if (rectxt == NULL)
931 xmlFreeParserCtxt(ctxt);
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000932 }
Daniel Veillard46e370e2000-07-21 20:32:03 +0000933#ifdef HAVE_SYS_MMAN_H
934 } else if (memory) {
935 int fd;
936 struct stat info;
937 const char *base;
938 if (stat(filename, &info) < 0)
939 return;
940 if ((fd = open(filename, O_RDONLY)) < 0)
941 return;
942 base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
Daniel Veillard29579362000-08-14 17:57:48 +0000943 if (base == (void *) MAP_FAILED)
Daniel Veillard46e370e2000-07-21 20:32:03 +0000944 return;
945
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000946 if (rectxt == NULL)
Daniel Veillard60942de2003-09-25 21:05:58 +0000947 doc = xmlReadMemory((char *) base, info.st_size,
948 filename, NULL, options);
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000949 else
Daniel Veillard60942de2003-09-25 21:05:58 +0000950 doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size,
951 filename, NULL, options);
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000952
Daniel Veillard46e370e2000-07-21 20:32:03 +0000953 munmap((char *) base, info.st_size);
954#endif
Daniel Veillard4432df22003-09-28 18:58:27 +0000955#ifdef LIBXML_VALID_ENABLED
Daniel Veillardea7751d2002-12-20 00:16:24 +0000956 } else if (valid) {
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000957 xmlParserCtxtPtr ctxt = NULL;
Daniel Veillardea7751d2002-12-20 00:16:24 +0000958
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000959 if (rectxt == NULL)
960 ctxt = xmlNewParserCtxt();
961 else
962 ctxt = rectxt;
Daniel Veillardea7751d2002-12-20 00:16:24 +0000963 if (ctxt == NULL) {
Daniel Veillard16fa96c2003-09-23 21:50:54 +0000964 doc = NULL;
Daniel Veillardea7751d2002-12-20 00:16:24 +0000965 } else {
Daniel Veillard16fa96c2003-09-23 21:50:54 +0000966 doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
967
968 if (ctxt->valid == 0)
969 progresult = 4;
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000970 if (rectxt == NULL)
971 xmlFreeParserCtxt(ctxt);
Daniel Veillardea7751d2002-12-20 00:16:24 +0000972 }
Daniel Veillard4432df22003-09-28 18:58:27 +0000973#endif /* LIBXML_VALID_ENABLED */
Daniel Veillardea7751d2002-12-20 00:16:24 +0000974 } else {
Daniel Veillarde96a2a42003-09-24 21:23:56 +0000975 if (rectxt != NULL)
976 doc = xmlCtxtReadFile(rectxt, filename, NULL, options);
977 else
978 doc = xmlReadFile(filename, NULL, options);
Daniel Veillardea7751d2002-12-20 00:16:24 +0000979 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000980 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +0000981
Daniel Veillard88a172f2000-08-04 18:23:10 +0000982 /*
983 * If we don't have a document we might as well give up. Do we
984 * want an error message here? <sven@zen.org> */
Daniel Veillard9e8bfae2000-11-06 16:43:11 +0000985 if (doc == NULL) {
Daniel Veillardf7cd4812001-02-23 18:44:52 +0000986 progresult = 1;
Daniel Veillard88a172f2000-08-04 18:23:10 +0000987 return;
Daniel Veillard9e8bfae2000-11-06 16:43:11 +0000988 }
989
Daniel Veillard48b2f892001-02-25 16:11:03 +0000990 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +0000991 endTimer("Parsing");
Daniel Veillard48b2f892001-02-25 16:11:03 +0000992 }
993
Daniel Veillard29e43992001-12-13 22:21:58 +0000994 /*
995 * Remove DOCTYPE nodes
996 */
997 if (dropdtd) {
998 xmlDtdPtr dtd;
999
1000 dtd = xmlGetIntSubset(doc);
1001 if (dtd != NULL) {
1002 xmlUnlinkNode((xmlNodePtr)dtd);
1003 xmlFreeDtd(dtd);
1004 }
1005 }
1006
Daniel Veillard9e8bfae2000-11-06 16:43:11 +00001007#ifdef LIBXML_XINCLUDE_ENABLED
Daniel Veillard48b2f892001-02-25 16:11:03 +00001008 if (xinclude) {
1009 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001010 startTimer();
Daniel Veillard48b2f892001-02-25 16:11:03 +00001011 }
Daniel Veillarde74d2e12003-12-09 11:35:37 +00001012 xmlXIncludeProcessFlags(doc, options);
Daniel Veillard48b2f892001-02-25 16:11:03 +00001013 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001014 endTimer("Xinclude processing");
Daniel Veillard48b2f892001-02-25 16:11:03 +00001015 }
1016 }
Daniel Veillard9e8bfae2000-11-06 16:43:11 +00001017#endif
Daniel Veillard88a172f2000-08-04 18:23:10 +00001018
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001019#ifdef LIBXML_DEBUG_ENABLED
1020 /*
Daniel Veillardcbaf3992001-12-31 16:16:02 +00001021 * shell interaction
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001022 */
1023 if (shell)
1024 xmlShell(doc, filename, xmlShellReadline, stdout);
1025#endif
1026
Daniel Veillard652327a2003-09-29 18:02:38 +00001027#ifdef LIBXML_TREE_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001028 /*
1029 * test intermediate copy if needed.
1030 */
1031 if (copy) {
1032 tmp = doc;
1033 doc = xmlCopyDoc(doc, 1);
1034 xmlFreeDoc(tmp);
1035 }
Daniel Veillard652327a2003-09-29 18:02:38 +00001036#endif /* LIBXML_TREE_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001037
Daniel Veillard4432df22003-09-28 18:58:27 +00001038#ifdef LIBXML_VALID_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001039 if ((insert) && (!html)) {
1040 const xmlChar* list[256];
1041 int nb, i;
1042 xmlNodePtr node;
1043
1044 if (doc->children != NULL) {
1045 node = doc->children;
1046 while ((node != NULL) && (node->last == NULL)) node = node->next;
1047 if (node != NULL) {
1048 nb = xmlValidGetValidElements(node->last, NULL, list, 256);
1049 if (nb < 0) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001050 fprintf(stderr, "could not get valid list of elements\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001051 } else if (nb == 0) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001052 fprintf(stderr, "No element can be inserted under root\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001053 } else {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001054 fprintf(stderr, "%d element types can be inserted under root:\n",
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001055 nb);
1056 for (i = 0;i < nb;i++) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001057 fprintf(stderr, "%s\n", (char *) list[i]);
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001058 }
1059 }
1060 }
1061 }
Daniel Veillard4432df22003-09-28 18:58:27 +00001062 }else
1063#endif /* LIBXML_VALID_ENABLED */
Daniel Veillard7899c5c2003-11-03 12:31:38 +00001064#ifdef LIBXML_READER_ENABLED
1065 if (walker) {
1066 walkDoc(doc);
1067 }
1068#endif /* LIBXML_READER_ENABLED */
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001069#ifdef LIBXML_OUTPUT_ENABLED
Daniel Veillard4432df22003-09-28 18:58:27 +00001070 if (noout == 0) {
Daniel Veillard3df01182003-12-10 10:17:51 +00001071 int ret;
1072
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001073 /*
1074 * print it.
1075 */
1076#ifdef LIBXML_DEBUG_ENABLED
1077 if (!debug) {
1078#endif
Daniel Veillard48b2f892001-02-25 16:11:03 +00001079 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001080 startTimer();
Daniel Veillard48b2f892001-02-25 16:11:03 +00001081 }
Daniel Veillard42fd4122003-11-04 08:47:48 +00001082#ifdef LIBXML_VALID_ENABLED
1083 if ((html) && (!xmlout)) {
1084 if (compress) {
1085 htmlSaveFile(output ? output : "-", doc);
1086 }
1087 else if (encoding != NULL) {
1088 if ( format ) {
1089 htmlSaveFileFormat(output ? output : "-", doc, encoding, 1);
1090 }
1091 else {
1092 htmlSaveFileFormat(output ? output : "-", doc, encoding, 0);
1093 }
1094 }
1095 else if (format) {
1096 htmlSaveFileFormat(output ? output : "-", doc, NULL, 1);
1097 }
1098 else {
1099 FILE *out;
1100 if (output == NULL)
1101 out = stdout;
1102 else {
1103 out = fopen(output,"wb");
1104 }
1105 if (out != NULL) {
1106 if (htmlDocDump(out, doc) < 0)
1107 progresult = 6;
1108
1109 if (output != NULL)
1110 fclose(out);
1111 } else {
1112 fprintf(stderr, "failed to open %s\n", output);
1113 progresult = 6;
1114 }
1115 }
1116 if ((timing) && (!repeat)) {
1117 endTimer("Saving");
1118 }
1119 } else
1120#endif
Daniel Veillard3b2c2612001-04-04 00:09:00 +00001121#ifdef HAVE_SYS_MMAN_H
Daniel Veillarda6d8eb62000-12-27 10:46:47 +00001122 if (memory) {
1123 xmlChar *result;
1124 int len;
1125
1126 if (encoding != NULL) {
Daniel Veillardd536f702001-11-08 17:32:47 +00001127 if ( format ) {
1128 xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1);
1129 } else {
1130 xmlDocDumpMemoryEnc(doc, &result, &len, encoding);
1131 }
Daniel Veillarda6d8eb62000-12-27 10:46:47 +00001132 } else {
Daniel Veillard90493a92001-08-14 14:12:47 +00001133 if (format)
1134 xmlDocDumpFormatMemory(doc, &result, &len, 1);
1135 else
1136 xmlDocDumpMemory(doc, &result, &len);
Daniel Veillarda6d8eb62000-12-27 10:46:47 +00001137 }
1138 if (result == NULL) {
1139 fprintf(stderr, "Failed to save\n");
1140 } else {
1141 write(1, result, len);
1142 xmlFree(result);
1143 }
Daniel Veillard3b2c2612001-04-04 00:09:00 +00001144 } else
1145#endif /* HAVE_SYS_MMAN_H */
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001146 if (compress) {
1147 xmlSaveFile(output ? output : "-", doc);
1148 }
Daniel Veillardd536f702001-11-08 17:32:47 +00001149 else if (encoding != NULL) {
1150 if ( format ) {
Daniel Veillard3df01182003-12-10 10:17:51 +00001151 ret = xmlSaveFormatFileEnc(output ? output : "-", doc,
1152 encoding, 1);
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001153 }
Daniel Veillardd536f702001-11-08 17:32:47 +00001154 else {
Daniel Veillard3df01182003-12-10 10:17:51 +00001155 ret = xmlSaveFileEnc(output ? output : "-", doc, encoding);
1156 }
1157 if (ret < 0) {
1158 fprintf(stderr, "failed save to %s\n",
1159 output ? output : "-");
1160 progresult = 6;
Daniel Veillardd536f702001-11-08 17:32:47 +00001161 }
1162 }
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001163 else if (format) {
Daniel Veillard3df01182003-12-10 10:17:51 +00001164 ret = xmlSaveFormatFile(output ? output : "-", doc, 1);
1165 if (ret < 0) {
1166 fprintf(stderr, "failed save to %s\n",
1167 output ? output : "-");
1168 progresult = 6;
1169 }
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001170 }
1171 else {
1172 FILE *out;
1173 if (output == NULL)
1174 out = stdout;
1175 else {
1176 out = fopen(output,"wb");
1177 }
Daniel Veillard05d987b2003-10-08 11:54:57 +00001178 if (out != NULL) {
Daniel Veillard828ce832003-10-08 19:19:10 +00001179 if (xmlDocDump(out, doc) < 0)
1180 progresult = 6;
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001181
Daniel Veillard05d987b2003-10-08 11:54:57 +00001182 if (output != NULL)
1183 fclose(out);
1184 } else {
1185 fprintf(stderr, "failed to open %s\n", output);
1186 progresult = 6;
1187 }
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001188 }
Daniel Veillard48b2f892001-02-25 16:11:03 +00001189 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001190 endTimer("Saving");
Daniel Veillard48b2f892001-02-25 16:11:03 +00001191 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001192#ifdef LIBXML_DEBUG_ENABLED
Daniel Veillarda6d8eb62000-12-27 10:46:47 +00001193 } else {
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001194 FILE *out;
1195 if (output == NULL)
1196 out = stdout;
1197 else {
1198 out = fopen(output,"wb");
1199 }
Daniel Veillard05d987b2003-10-08 11:54:57 +00001200 if (out != NULL) {
1201 xmlDebugDumpDocument(out, doc);
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001202
Daniel Veillard05d987b2003-10-08 11:54:57 +00001203 if (output != NULL)
1204 fclose(out);
1205 } else {
1206 fprintf(stderr, "failed to open %s\n", output);
1207 progresult = 6;
1208 }
Daniel Veillarda6d8eb62000-12-27 10:46:47 +00001209 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001210#endif
1211 }
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001212#endif /* LIBXML_OUTPUT_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001213
Daniel Veillard4432df22003-09-28 18:58:27 +00001214#ifdef LIBXML_VALID_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001215 /*
1216 * A posteriori validation test
1217 */
Daniel Veillard66f68e72003-08-18 16:39:51 +00001218 if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) {
Daniel Veillardcd429612000-10-11 15:57:05 +00001219 xmlDtdPtr dtd;
1220
Daniel Veillard48b2f892001-02-25 16:11:03 +00001221 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001222 startTimer();
Daniel Veillard48b2f892001-02-25 16:11:03 +00001223 }
Daniel Veillard66f68e72003-08-18 16:39:51 +00001224 if (dtdvalid != NULL)
1225 dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid);
1226 else
1227 dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL);
Daniel Veillard48b2f892001-02-25 16:11:03 +00001228 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001229 endTimer("Parsing DTD");
Daniel Veillard48b2f892001-02-25 16:11:03 +00001230 }
Daniel Veillardcd429612000-10-11 15:57:05 +00001231 if (dtd == NULL) {
Daniel Veillard66f68e72003-08-18 16:39:51 +00001232 if (dtdvalid != NULL)
1233 xmlGenericError(xmlGenericErrorContext,
1234 "Could not parse DTD %s\n", dtdvalid);
1235 else
1236 xmlGenericError(xmlGenericErrorContext,
1237 "Could not parse DTD %s\n", dtdvalidfpi);
Daniel Veillardf7cd4812001-02-23 18:44:52 +00001238 progresult = 2;
Daniel Veillardcd429612000-10-11 15:57:05 +00001239 } else {
Daniel Veillarda37aab82003-06-09 09:10:36 +00001240 xmlValidCtxtPtr cvp;
1241
1242 if ((cvp = xmlNewValidCtxt()) == NULL) {
1243 xmlGenericError(xmlGenericErrorContext,
1244 "Couldn't allocate validation context\n");
1245 exit(-1);
1246 }
1247 cvp->userData = (void *) stderr;
1248 cvp->error = (xmlValidityErrorFunc) fprintf;
1249 cvp->warning = (xmlValidityWarningFunc) fprintf;
1250
Daniel Veillard48b2f892001-02-25 16:11:03 +00001251 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001252 startTimer();
Daniel Veillard48b2f892001-02-25 16:11:03 +00001253 }
Daniel Veillarda37aab82003-06-09 09:10:36 +00001254 if (!xmlValidateDtd(cvp, doc, dtd)) {
Daniel Veillard66f68e72003-08-18 16:39:51 +00001255 if (dtdvalid != NULL)
1256 xmlGenericError(xmlGenericErrorContext,
1257 "Document %s does not validate against %s\n",
1258 filename, dtdvalid);
1259 else
1260 xmlGenericError(xmlGenericErrorContext,
1261 "Document %s does not validate against %s\n",
1262 filename, dtdvalidfpi);
Daniel Veillardf7cd4812001-02-23 18:44:52 +00001263 progresult = 3;
Daniel Veillardcd429612000-10-11 15:57:05 +00001264 }
Daniel Veillard48b2f892001-02-25 16:11:03 +00001265 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001266 endTimer("Validating against DTD");
Daniel Veillard48b2f892001-02-25 16:11:03 +00001267 }
Daniel Veillarda37aab82003-06-09 09:10:36 +00001268 xmlFreeValidCtxt(cvp);
Daniel Veillardcd429612000-10-11 15:57:05 +00001269 xmlFreeDtd(dtd);
1270 }
1271 } else if (postvalid) {
Daniel Veillarda37aab82003-06-09 09:10:36 +00001272 xmlValidCtxtPtr cvp;
1273
1274 if ((cvp = xmlNewValidCtxt()) == NULL) {
1275 xmlGenericError(xmlGenericErrorContext,
1276 "Couldn't allocate validation context\n");
1277 exit(-1);
1278 }
1279
Daniel Veillard48b2f892001-02-25 16:11:03 +00001280 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001281 startTimer();
Daniel Veillard48b2f892001-02-25 16:11:03 +00001282 }
Daniel Veillarda37aab82003-06-09 09:10:36 +00001283 cvp->userData = (void *) stderr;
1284 cvp->error = (xmlValidityErrorFunc) fprintf;
1285 cvp->warning = (xmlValidityWarningFunc) fprintf;
1286 if (!xmlValidateDocument(cvp, doc)) {
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +00001287 xmlGenericError(xmlGenericErrorContext,
1288 "Document %s does not validate\n", filename);
Daniel Veillardf7cd4812001-02-23 18:44:52 +00001289 progresult = 3;
Daniel Veillardcd429612000-10-11 15:57:05 +00001290 }
Daniel Veillard48b2f892001-02-25 16:11:03 +00001291 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001292 endTimer("Validating");
Daniel Veillard48b2f892001-02-25 16:11:03 +00001293 }
Daniel Veillarda37aab82003-06-09 09:10:36 +00001294 xmlFreeValidCtxt(cvp);
Daniel Veillard4432df22003-09-28 18:58:27 +00001295 }
1296#endif /* LIBXML_VALID_ENABLED */
Daniel Veillard71531f32003-02-05 13:19:53 +00001297#ifdef LIBXML_SCHEMAS_ENABLED
Daniel Veillard4432df22003-09-28 18:58:27 +00001298 if (relaxngschemas != NULL) {
Daniel Veillard71531f32003-02-05 13:19:53 +00001299 xmlRelaxNGValidCtxtPtr ctxt;
1300 int ret;
1301
Daniel Veillard42f12e92003-03-07 18:32:59 +00001302 if ((timing) && (!repeat)) {
1303 startTimer();
1304 }
1305
Daniel Veillard71531f32003-02-05 13:19:53 +00001306 ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
1307 xmlRelaxNGSetValidErrors(ctxt,
1308 (xmlRelaxNGValidityErrorFunc) fprintf,
1309 (xmlRelaxNGValidityWarningFunc) fprintf,
1310 stderr);
1311 ret = xmlRelaxNGValidateDoc(ctxt, doc);
1312 if (ret == 0) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001313 fprintf(stderr, "%s validates\n", filename);
Daniel Veillard71531f32003-02-05 13:19:53 +00001314 } else if (ret > 0) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001315 fprintf(stderr, "%s fails to validate\n", filename);
Daniel Veillard71531f32003-02-05 13:19:53 +00001316 } else {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001317 fprintf(stderr, "%s validation generated an internal error\n",
Daniel Veillard71531f32003-02-05 13:19:53 +00001318 filename);
1319 }
1320 xmlRelaxNGFreeValidCtxt(ctxt);
Daniel Veillard42f12e92003-03-07 18:32:59 +00001321 if ((timing) && (!repeat)) {
1322 endTimer("Validating");
1323 }
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00001324 } else if (wxschemas != NULL) {
1325 xmlSchemaValidCtxtPtr ctxt;
1326 int ret;
1327
1328 if ((timing) && (!repeat)) {
1329 startTimer();
1330 }
1331
1332 ctxt = xmlSchemaNewValidCtxt(wxschemas);
1333 xmlSchemaSetValidErrors(ctxt,
1334 (xmlSchemaValidityErrorFunc) fprintf,
1335 (xmlSchemaValidityWarningFunc) fprintf,
1336 stderr);
1337 ret = xmlSchemaValidateDoc(ctxt, doc);
1338 if (ret == 0) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001339 fprintf(stderr, "%s validates\n", filename);
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00001340 } else if (ret > 0) {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001341 fprintf(stderr, "%s fails to validate\n", filename);
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00001342 } else {
Daniel Veillardd21f61b2003-12-29 10:31:21 +00001343 fprintf(stderr, "%s validation generated an internal error\n",
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00001344 filename);
1345 }
1346 xmlSchemaFreeValidCtxt(ctxt);
1347 if ((timing) && (!repeat)) {
1348 endTimer("Validating");
1349 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001350 }
Daniel Veillard4432df22003-09-28 18:58:27 +00001351#endif
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001352
1353#ifdef LIBXML_DEBUG_ENABLED
1354 if ((debugent) && (!html))
Daniel Veillardf0cc7cc2000-08-26 21:40:43 +00001355 xmlDebugDumpEntities(stderr, doc);
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001356#endif
1357
1358 /*
1359 * free it.
1360 */
Daniel Veillard48b2f892001-02-25 16:11:03 +00001361 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001362 startTimer();
Daniel Veillard48b2f892001-02-25 16:11:03 +00001363 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001364 xmlFreeDoc(doc);
Daniel Veillard48b2f892001-02-25 16:11:03 +00001365 if ((timing) && (!repeat)) {
Daniel Veillard01db67c2001-12-18 07:09:59 +00001366 endTimer("Freeing");
Daniel Veillard48b2f892001-02-25 16:11:03 +00001367 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001368}
1369
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001370/************************************************************************
1371 * *
1372 * Usage and Main *
1373 * *
1374 ************************************************************************/
1375
Daniel Veillard0f04f8e2002-09-17 23:04:40 +00001376static void showVersion(const char *name) {
1377 fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion);
1378 fprintf(stderr, " compiled with: ");
Daniel Veillard4432df22003-09-28 18:58:27 +00001379#ifdef LIBXML_VALID_ENABLED
1380 fprintf(stderr, "DTDValid ");
1381#endif
Daniel Veillard0f04f8e2002-09-17 23:04:40 +00001382#ifdef LIBXML_FTP_ENABLED
1383 fprintf(stderr, "FTP ");
1384#endif
1385#ifdef LIBXML_HTTP_ENABLED
1386 fprintf(stderr, "HTTP ");
1387#endif
1388#ifdef LIBXML_HTML_ENABLED
1389 fprintf(stderr, "HTML ");
1390#endif
1391#ifdef LIBXML_C14N_ENABLED
1392 fprintf(stderr, "C14N ");
1393#endif
1394#ifdef LIBXML_CATALOG_ENABLED
1395 fprintf(stderr, "Catalog ");
1396#endif
Daniel Veillard0f04f8e2002-09-17 23:04:40 +00001397#ifdef LIBXML_XPATH_ENABLED
1398 fprintf(stderr, "XPath ");
1399#endif
1400#ifdef LIBXML_XPTR_ENABLED
1401 fprintf(stderr, "XPointer ");
1402#endif
1403#ifdef LIBXML_XINCLUDE_ENABLED
1404 fprintf(stderr, "XInclude ");
1405#endif
1406#ifdef LIBXML_ICONV_ENABLED
1407 fprintf(stderr, "Iconv ");
1408#endif
1409#ifdef DEBUG_MEMORY_LOCATION
1410 fprintf(stderr, "MemDebug ");
1411#endif
1412#ifdef LIBXML_UNICODE_ENABLED
1413 fprintf(stderr, "Unicode ");
1414#endif
1415#ifdef LIBXML_REGEXP_ENABLED
1416 fprintf(stderr, "Regexps ");
1417#endif
1418#ifdef LIBXML_AUTOMATA_ENABLED
1419 fprintf(stderr, "Automata ");
1420#endif
1421#ifdef LIBXML_SCHEMAS_ENABLED
1422 fprintf(stderr, "Schemas ");
1423#endif
1424 fprintf(stderr, "\n");
1425}
1426
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001427static void usage(const char *name) {
1428 printf("Usage : %s [options] XMLfiles ...\n", name);
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001429#ifdef LIBXML_OUTPUT_ENABLED
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001430 printf("\tParse the XML files and output the result of the parsing\n");
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001431#else
1432 printf("\tParse the XML files\n");
1433#endif /* LIBXML_OUTPUT_ENABLED */
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001434 printf("\t--version : display the version of the XML library used\n");
1435#ifdef LIBXML_DEBUG_ENABLED
1436 printf("\t--debug : dump a debug tree of the in-memory document\n");
1437 printf("\t--shell : run a navigating shell\n");
1438 printf("\t--debugent : debug the entities defined in the document\n");
Daniel Veillard8326e732003-01-07 00:19:07 +00001439#else
Daniel Veillard81273902003-09-30 00:43:48 +00001440#ifdef LIBXML_READER_ENABLED
Daniel Veillard8326e732003-01-07 00:19:07 +00001441 printf("\t--debug : dump the nodes content when using --stream\n");
Daniel Veillard81273902003-09-30 00:43:48 +00001442#endif /* LIBXML_READER_ENABLED */
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001443#endif
Daniel Veillard652327a2003-09-29 18:02:38 +00001444#ifdef LIBXML_TREE_ENABLED
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001445 printf("\t--copy : used to test the internal copy implementation\n");
Daniel Veillard652327a2003-09-29 18:02:38 +00001446#endif /* LIBXML_TREE_ENABLED */
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001447 printf("\t--recover : output what was parsable on broken XML documents\n");
1448 printf("\t--noent : substitute entity references by their value\n");
1449 printf("\t--noout : don't output the result tree\n");
Daniel Veillarde8b09e42003-05-13 22:14:13 +00001450 printf("\t--nonet : refuse to fetch DTDs or entities over network\n");
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001451 printf("\t--htmlout : output results as HTML\n");
Daniel Veillard05c13a22001-09-09 08:38:09 +00001452 printf("\t--nowrap : do not put HTML doc wrapper\n");
Daniel Veillard4432df22003-09-28 18:58:27 +00001453#ifdef LIBXML_VALID_ENABLED
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001454 printf("\t--valid : validate the document in addition to std well-formed check\n");
1455 printf("\t--postvalid : do a posteriori validation, i.e after parsing\n");
1456 printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n");
Daniel Veillard66f68e72003-08-18 16:39:51 +00001457 printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n");
Daniel Veillard4432df22003-09-28 18:58:27 +00001458#endif /* LIBXML_VALID_ENABLED */
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001459 printf("\t--timing : print some timings\n");
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001460 printf("\t--output file or -o file: save to a given file\n");
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001461 printf("\t--repeat : repeat 100 times, for timing or profiling\n");
1462 printf("\t--insert : ad-hoc test for valid insertions\n");
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001463#ifdef LIBXML_OUTPUT_ENABLED
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001464#ifdef HAVE_ZLIB_H
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001465 printf("\t--compress : turn on gzip compression of output\n");
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001466#endif
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001467#endif /* LIBXML_OUTPUT_ENABLED */
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001468#ifdef LIBXML_HTML_ENABLED
1469 printf("\t--html : use the HTML parser\n");
Daniel Veillard42fd4122003-11-04 08:47:48 +00001470 printf("\t--xmlout : force to use the XML serializer when using --html\n");
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001471#endif
Daniel Veillard73b013f2003-09-30 12:36:01 +00001472#ifdef LIBXML_PUSH_ENABLED
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001473 printf("\t--push : use the push mode of the parser\n");
Daniel Veillard73b013f2003-09-30 12:36:01 +00001474#endif /* LIBXML_PUSH_ENABLED */
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001475#ifdef HAVE_SYS_MMAN_H
1476 printf("\t--memory : parse from memory\n");
1477#endif
1478 printf("\t--nowarning : do not emit warnings from parser/validator\n");
1479 printf("\t--noblanks : drop (ignorable?) blanks spaces\n");
Daniel Veillarddca8cc72003-09-26 13:53:14 +00001480 printf("\t--nocdata : replace cdata section with text nodes\n");
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001481#ifdef LIBXML_OUTPUT_ENABLED
Daniel Veillard90493a92001-08-14 14:12:47 +00001482 printf("\t--format : reformat/reindent the input\n");
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001483 printf("\t--encode encoding : output in the given encoding\n");
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001484 printf("\t--dropdtd : remove the DOCTYPE of the input docs\n");
1485#endif /* LIBXML_OUTPUT_ENABLED */
1486 printf("\t--nsclean : remove redundant namespace declarations\n");
1487 printf("\t--testIO : test user I/O support\n");
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001488#ifdef LIBXML_CATALOG_ENABLED
Daniel Veillardbd9b0e82001-11-26 10:32:08 +00001489 printf("\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n");
1490 printf("\t otherwise XML Catalogs starting from \n");
Daniel Veillardb3de70c2003-12-02 22:32:15 +00001491 printf("\t %s are activated by default\n", XML_XML_DEFAULT_CATALOG);
Daniel Veillard05c13a22001-09-09 08:38:09 +00001492 printf("\t--nocatalogs: deactivate all catalogs\n");
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001493#endif
1494 printf("\t--auto : generate a small doc on the fly\n");
1495#ifdef LIBXML_XINCLUDE_ENABLED
1496 printf("\t--xinclude : do XInclude processing\n");
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001497#endif
Daniel Veillardcbaf3992001-12-31 16:16:02 +00001498 printf("\t--loaddtd : fetch external DTD\n");
Daniel Veillard48da9102001-08-07 01:10:10 +00001499 printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n");
Daniel Veillard81273902003-09-30 00:43:48 +00001500#ifdef LIBXML_READER_ENABLED
Daniel Veillard7704fb12003-01-03 16:19:51 +00001501 printf("\t--stream : use the streaming interface to process very large files\n");
Daniel Veillard7899c5c2003-11-03 12:31:38 +00001502 printf("\t--walker : create a reader and walk though the resulting doc\n");
Daniel Veillard81273902003-09-30 00:43:48 +00001503#endif /* LIBXML_READER_ENABLED */
Daniel Veillardb3de70c2003-12-02 22:32:15 +00001504#ifdef LIBXML_PATTERN_ENABLED
1505 printf("\t--pattern pattern_value : test the pattern support\n");
1506#endif
Daniel Veillard8a1b1852003-01-05 22:37:17 +00001507 printf("\t--chkregister : verify the node registration code\n");
Daniel Veillardef4d3bc2003-02-07 12:38:22 +00001508#ifdef LIBXML_SCHEMAS_ENABLED
Daniel Veillard71531f32003-02-05 13:19:53 +00001509 printf("\t--relaxng schema : do RelaxNG validation against the schema\n");
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00001510 printf("\t--schema schema : do validation against the WXS schema\n");
Daniel Veillard71531f32003-02-05 13:19:53 +00001511#endif
Daniel Veillarda42f25f2002-01-25 14:15:40 +00001512 printf("\nLibxml project home page: http://xmlsoft.org/\n");
1513 printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n");
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001514}
Daniel Veillard8a1b1852003-01-05 22:37:17 +00001515
1516static void registerNode(xmlNodePtr node)
1517{
1518 node->_private = malloc(sizeof(long));
1519 *(long*)node->_private = (long) 0x81726354;
1520}
1521
1522static void deregisterNode(xmlNodePtr node)
1523{
1524 assert(node->_private != NULL);
1525 assert(*(long*)node->_private == (long) 0x81726354);
1526 free(node->_private);
1527}
1528
Daniel Veillard4a6845d2001-01-03 13:32:39 +00001529int
1530main(int argc, char **argv) {
Daniel Veillard7704fb12003-01-03 16:19:51 +00001531 int i, acount;
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001532 int files = 0;
Daniel Veillard845cce42002-01-09 11:51:37 +00001533 int version = 0;
Aleksey Sanin693c9bc2003-03-09 22:36:52 +00001534 const char* indent;
1535
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001536 if (argc <= 1) {
1537 usage(argv[0]);
1538 return(1);
1539 }
Daniel Veillardbe803962000-06-28 23:40:59 +00001540 LIBXML_TEST_VERSION
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001541 for (i = 1; i < argc ; i++) {
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001542 if (!strcmp(argv[i], "-"))
1543 break;
1544
1545 if (argv[i][0] != '-')
1546 continue;
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001547 if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
1548 debug++;
Daniel Veillard56ada1d2003-01-07 11:17:25 +00001549 else
1550#ifdef LIBXML_DEBUG_ENABLED
1551 if ((!strcmp(argv[i], "-shell")) ||
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001552 (!strcmp(argv[i], "--shell"))) {
1553 shell++;
1554 noout = 1;
1555 } else
1556#endif
Daniel Veillard652327a2003-09-29 18:02:38 +00001557#ifdef LIBXML_TREE_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001558 if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
1559 copy++;
Daniel Veillard652327a2003-09-29 18:02:38 +00001560 else
1561#endif /* LIBXML_TREE_ENABLED */
1562 if ((!strcmp(argv[i], "-recover")) ||
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001563 (!strcmp(argv[i], "--recover"))) {
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001564 recovery++;
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001565 options |= XML_PARSE_RECOVER;
1566 } else if ((!strcmp(argv[i], "-noent")) ||
1567 (!strcmp(argv[i], "--noent"))) {
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001568 noent++;
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001569 options |= XML_PARSE_NOENT;
Daniel Veillarddca8cc72003-09-26 13:53:14 +00001570 } else if ((!strcmp(argv[i], "-nsclean")) ||
1571 (!strcmp(argv[i], "--nsclean"))) {
1572 options |= XML_PARSE_NSCLEAN;
1573 } else if ((!strcmp(argv[i], "-nocdata")) ||
1574 (!strcmp(argv[i], "--nocdata"))) {
1575 options |= XML_PARSE_NOCDATA;
Daniel Veillarde96a2a42003-09-24 21:23:56 +00001576 } else if ((!strcmp(argv[i], "-nodict")) ||
1577 (!strcmp(argv[i], "--nodict"))) {
1578 options |= XML_PARSE_NODICT;
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001579 } else if ((!strcmp(argv[i], "-version")) ||
Daniel Veillard845cce42002-01-09 11:51:37 +00001580 (!strcmp(argv[i], "--version"))) {
Daniel Veillard0f04f8e2002-09-17 23:04:40 +00001581 showVersion(argv[0]);
Daniel Veillard845cce42002-01-09 11:51:37 +00001582 version = 1;
1583 } else if ((!strcmp(argv[i], "-noout")) ||
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001584 (!strcmp(argv[i], "--noout")))
1585 noout++;
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001586#ifdef LIBXML_OUTPUT_ENABLED
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001587 else if ((!strcmp(argv[i], "-o")) ||
1588 (!strcmp(argv[i], "-output")) ||
1589 (!strcmp(argv[i], "--output"))) {
1590 i++;
Daniel Veillard6e4f1c02002-04-09 09:55:20 +00001591 output = argv[i];
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001592 }
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001593#endif /* LIBXML_OUTPUT_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001594 else if ((!strcmp(argv[i], "-htmlout")) ||
1595 (!strcmp(argv[i], "--htmlout")))
1596 htmlout++;
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001597 else if ((!strcmp(argv[i], "-nowrap")) ||
1598 (!strcmp(argv[i], "--nowrap")))
1599 nowrap++;
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001600#ifdef LIBXML_HTML_ENABLED
1601 else if ((!strcmp(argv[i], "-html")) ||
1602 (!strcmp(argv[i], "--html"))) {
1603 html++;
1604 }
Daniel Veillard42fd4122003-11-04 08:47:48 +00001605 else if ((!strcmp(argv[i], "-xmlout")) ||
1606 (!strcmp(argv[i], "--xmlout"))) {
1607 xmlout++;
1608 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001609#endif /* LIBXML_HTML_ENABLED */
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001610 else if ((!strcmp(argv[i], "-loaddtd")) ||
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001611 (!strcmp(argv[i], "--loaddtd"))) {
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001612 loaddtd++;
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001613 options |= XML_PARSE_DTDLOAD;
1614 } else if ((!strcmp(argv[i], "-dtdattr")) ||
Daniel Veillard48da9102001-08-07 01:10:10 +00001615 (!strcmp(argv[i], "--dtdattr"))) {
1616 loaddtd++;
1617 dtdattrs++;
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001618 options |= XML_PARSE_DTDATTR;
Daniel Veillard4432df22003-09-28 18:58:27 +00001619 }
1620#ifdef LIBXML_VALID_ENABLED
1621 else if ((!strcmp(argv[i], "-valid")) ||
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001622 (!strcmp(argv[i], "--valid"))) {
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001623 valid++;
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001624 options |= XML_PARSE_DTDVALID;
1625 } else if ((!strcmp(argv[i], "-postvalid")) ||
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001626 (!strcmp(argv[i], "--postvalid"))) {
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001627 postvalid++;
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001628 loaddtd++;
Daniel Veillard5a30b2d2003-12-09 13:54:39 +00001629 options |= XML_PARSE_DTDLOAD;
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001630 } else if ((!strcmp(argv[i], "-dtdvalid")) ||
Daniel Veillardcd429612000-10-11 15:57:05 +00001631 (!strcmp(argv[i], "--dtdvalid"))) {
1632 i++;
1633 dtdvalid = argv[i];
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001634 loaddtd++;
Daniel Veillard5a30b2d2003-12-09 13:54:39 +00001635 options |= XML_PARSE_DTDLOAD;
Daniel Veillard66f68e72003-08-18 16:39:51 +00001636 } else if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
1637 (!strcmp(argv[i], "--dtdvalidfpi"))) {
1638 i++;
1639 dtdvalidfpi = argv[i];
1640 loaddtd++;
Daniel Veillard5a30b2d2003-12-09 13:54:39 +00001641 options |= XML_PARSE_DTDLOAD;
Daniel Veillardcd429612000-10-11 15:57:05 +00001642 }
Daniel Veillard4432df22003-09-28 18:58:27 +00001643#endif /* LIBXML_VALID_ENABLED */
Daniel Veillard29e43992001-12-13 22:21:58 +00001644 else if ((!strcmp(argv[i], "-dropdtd")) ||
1645 (!strcmp(argv[i], "--dropdtd")))
1646 dropdtd++;
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001647 else if ((!strcmp(argv[i], "-insert")) ||
1648 (!strcmp(argv[i], "--insert")))
1649 insert++;
Daniel Veillard48b2f892001-02-25 16:11:03 +00001650 else if ((!strcmp(argv[i], "-timing")) ||
1651 (!strcmp(argv[i], "--timing")))
1652 timing++;
Daniel Veillardd2f3ec72001-04-11 07:50:02 +00001653 else if ((!strcmp(argv[i], "-auto")) ||
1654 (!strcmp(argv[i], "--auto")))
1655 generate++;
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001656 else if ((!strcmp(argv[i], "-repeat")) ||
Daniel Veillard8d8bf2c2003-09-17 19:36:25 +00001657 (!strcmp(argv[i], "--repeat"))) {
1658 if (repeat)
1659 repeat *= 10;
1660 else
1661 repeat = 100;
Daniel Veillard73b013f2003-09-30 12:36:01 +00001662 }
1663#ifdef LIBXML_PUSH_ENABLED
1664 else if ((!strcmp(argv[i], "-push")) ||
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001665 (!strcmp(argv[i], "--push")))
1666 push++;
Daniel Veillard73b013f2003-09-30 12:36:01 +00001667#endif /* LIBXML_PUSH_ENABLED */
Daniel Veillard46e370e2000-07-21 20:32:03 +00001668#ifdef HAVE_SYS_MMAN_H
1669 else if ((!strcmp(argv[i], "-memory")) ||
1670 (!strcmp(argv[i], "--memory")))
1671 memory++;
1672#endif
Daniel Veillard5e873c42000-04-12 13:27:38 +00001673 else if ((!strcmp(argv[i], "-testIO")) ||
1674 (!strcmp(argv[i], "--testIO")))
1675 testIO++;
Daniel Veillard9e8bfae2000-11-06 16:43:11 +00001676#ifdef LIBXML_XINCLUDE_ENABLED
1677 else if ((!strcmp(argv[i], "-xinclude")) ||
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001678 (!strcmp(argv[i], "--xinclude"))) {
Daniel Veillard9e8bfae2000-11-06 16:43:11 +00001679 xinclude++;
Daniel Veillard7899c5c2003-11-03 12:31:38 +00001680 options |= XML_PARSE_XINCLUDE;
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001681 }
Daniel Veillard9e8bfae2000-11-06 16:43:11 +00001682#endif
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001683#ifdef LIBXML_OUTPUT_ENABLED
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001684#ifdef HAVE_ZLIB_H
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001685 else if ((!strcmp(argv[i], "-compress")) ||
1686 (!strcmp(argv[i], "--compress"))) {
1687 compress++;
1688 xmlSetCompressMode(9);
1689 }
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001690#endif
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001691#endif /* LIBXML_OUTPUT_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001692 else if ((!strcmp(argv[i], "-nowarning")) ||
1693 (!strcmp(argv[i], "--nowarning"))) {
1694 xmlGetWarningsDefaultValue = 0;
Daniel Veillardf0cc7cc2000-08-26 21:40:43 +00001695 xmlPedanticParserDefault(0);
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001696 options |= XML_PARSE_NOWARNING;
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001697 }
Daniel Veillardf0cc7cc2000-08-26 21:40:43 +00001698 else if ((!strcmp(argv[i], "-pedantic")) ||
1699 (!strcmp(argv[i], "--pedantic"))) {
1700 xmlGetWarningsDefaultValue = 1;
1701 xmlPedanticParserDefault(1);
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001702 options |= XML_PARSE_PEDANTIC;
Daniel Veillardf0cc7cc2000-08-26 21:40:43 +00001703 }
Daniel Veillard64c20ed2000-09-22 16:07:02 +00001704#ifdef LIBXML_DEBUG_ENABLED
Daniel Veillardf0cc7cc2000-08-26 21:40:43 +00001705 else if ((!strcmp(argv[i], "-debugent")) ||
1706 (!strcmp(argv[i], "--debugent"))) {
1707 debugent++;
1708 xmlParserDebugEntities = 1;
1709 }
Daniel Veillard64c20ed2000-09-22 16:07:02 +00001710#endif
Daniel Veillard81418e32001-05-22 15:08:55 +00001711#ifdef LIBXML_CATALOG_ENABLED
1712 else if ((!strcmp(argv[i], "-catalogs")) ||
1713 (!strcmp(argv[i], "--catalogs"))) {
Daniel Veillarde2940dd2001-08-22 00:06:49 +00001714 catalogs++;
1715 } else if ((!strcmp(argv[i], "-nocatalogs")) ||
1716 (!strcmp(argv[i], "--nocatalogs"))) {
1717 nocatalogs++;
Daniel Veillard81418e32001-05-22 15:08:55 +00001718 }
1719#endif
Daniel Veillardbe803962000-06-28 23:40:59 +00001720 else if ((!strcmp(argv[i], "-encode")) ||
1721 (!strcmp(argv[i], "--encode"))) {
1722 i++;
1723 encoding = argv[i];
Daniel Veillardf0cc7cc2000-08-26 21:40:43 +00001724 /*
1725 * OK it's for testing purposes
1726 */
1727 xmlAddEncodingAlias("UTF-8", "DVEnc");
Daniel Veillardbe803962000-06-28 23:40:59 +00001728 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001729 else if ((!strcmp(argv[i], "-noblanks")) ||
1730 (!strcmp(argv[i], "--noblanks"))) {
1731 noblanks++;
1732 xmlKeepBlanksDefault(0);
Daniel Veillard90493a92001-08-14 14:12:47 +00001733 }
1734 else if ((!strcmp(argv[i], "-format")) ||
1735 (!strcmp(argv[i], "--format"))) {
1736 noblanks++;
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001737#ifdef LIBXML_OUTPUT_ENABLED
Daniel Veillard90493a92001-08-14 14:12:47 +00001738 format++;
Daniel Veillarda9cce9c2003-09-29 13:20:24 +00001739#endif /* LIBXML_OUTPUT_ENABLED */
Daniel Veillard90493a92001-08-14 14:12:47 +00001740 xmlKeepBlanksDefault(0);
Daniel Veillard7704fb12003-01-03 16:19:51 +00001741 }
Daniel Veillard81273902003-09-30 00:43:48 +00001742#ifdef LIBXML_READER_ENABLED
Daniel Veillard7704fb12003-01-03 16:19:51 +00001743 else if ((!strcmp(argv[i], "-stream")) ||
1744 (!strcmp(argv[i], "--stream"))) {
1745 stream++;
Daniel Veillard8a1b1852003-01-05 22:37:17 +00001746 }
Daniel Veillard7899c5c2003-11-03 12:31:38 +00001747 else if ((!strcmp(argv[i], "-walker")) ||
1748 (!strcmp(argv[i], "--walker"))) {
1749 walker++;
1750 noout++;
1751 }
Daniel Veillard81273902003-09-30 00:43:48 +00001752#endif /* LIBXML_READER_ENABLED */
1753#ifdef LIBXML_SAX1_ENABLED
Daniel Veillard07cb8222003-09-10 10:51:05 +00001754 else if ((!strcmp(argv[i], "-sax1")) ||
1755 (!strcmp(argv[i], "--sax1"))) {
1756 sax1++;
1757 }
Daniel Veillard81273902003-09-30 00:43:48 +00001758#endif /* LIBXML_SAX1_ENABLED */
Daniel Veillard8a1b1852003-01-05 22:37:17 +00001759 else if ((!strcmp(argv[i], "-chkregister")) ||
1760 (!strcmp(argv[i], "--chkregister"))) {
1761 chkregister++;
Daniel Veillard71531f32003-02-05 13:19:53 +00001762#ifdef LIBXML_SCHEMAS_ENABLED
1763 } else if ((!strcmp(argv[i], "-relaxng")) ||
1764 (!strcmp(argv[i], "--relaxng"))) {
1765 i++;
1766 relaxng = argv[i];
1767 noent++;
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001768 options |= XML_PARSE_NOENT;
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00001769 } else if ((!strcmp(argv[i], "-schema")) ||
1770 (!strcmp(argv[i], "--schema"))) {
1771 i++;
1772 schema = argv[i];
1773 noent++;
Daniel Veillard71531f32003-02-05 13:19:53 +00001774#endif
Daniel Veillarde8b09e42003-05-13 22:14:13 +00001775 } else if ((!strcmp(argv[i], "-nonet")) ||
1776 (!strcmp(argv[i], "--nonet"))) {
Daniel Veillard61b93382003-11-03 14:28:31 +00001777 options |= XML_PARSE_NONET;
Daniel Veillardb3de70c2003-12-02 22:32:15 +00001778#ifdef LIBXML_PATTERN_ENABLED
1779 } else if ((!strcmp(argv[i], "-pattern")) ||
1780 (!strcmp(argv[i], "--pattern"))) {
1781 i++;
1782 pattern = argv[i];
1783#endif
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001784 } else {
1785 fprintf(stderr, "Unknown option %s\n", argv[i]);
1786 usage(argv[0]);
1787 return(1);
1788 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001789 }
Daniel Veillarde2940dd2001-08-22 00:06:49 +00001790
1791#ifdef LIBXML_CATALOG_ENABLED
1792 if (nocatalogs == 0) {
1793 if (catalogs) {
1794 const char *catal;
1795
1796 catal = getenv("SGML_CATALOG_FILES");
Daniel Veillard6c5f9d12001-08-25 13:33:14 +00001797 if (catal != NULL) {
1798 xmlLoadCatalogs(catal);
1799 } else {
1800 fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n");
1801 }
Daniel Veillarde2940dd2001-08-22 00:06:49 +00001802 }
1803 }
1804#endif
Daniel Veillard8a1b1852003-01-05 22:37:17 +00001805
Daniel Veillard81273902003-09-30 00:43:48 +00001806#ifdef LIBXML_SAX1_ENABLED
Daniel Veillard07cb8222003-09-10 10:51:05 +00001807 if (sax1)
1808 xmlSAXDefaultVersion(1);
1809 else
1810 xmlSAXDefaultVersion(2);
Daniel Veillard81273902003-09-30 00:43:48 +00001811#endif /* LIBXML_SAX1_ENABLED */
Daniel Veillard07cb8222003-09-10 10:51:05 +00001812
Daniel Veillard8a1b1852003-01-05 22:37:17 +00001813 if (chkregister) {
1814 xmlRegisterNodeDefault(registerNode);
1815 xmlDeregisterNodeDefault(deregisterNode);
1816 }
Aleksey Sanin693c9bc2003-03-09 22:36:52 +00001817
1818 indent = getenv("XMLLINT_INDENT");
1819 if(indent != NULL) {
1820 xmlTreeIndentString = indent;
1821 }
1822
Daniel Veillard8a1b1852003-01-05 22:37:17 +00001823
Daniel Veillardd9bad132001-07-23 19:39:43 +00001824 xmlLineNumbersDefault(1);
Daniel Veillard48da9102001-08-07 01:10:10 +00001825 if (loaddtd != 0)
1826 xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
1827 if (dtdattrs)
1828 xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001829 if (noent != 0) xmlSubstituteEntitiesDefault(1);
Daniel Veillard4432df22003-09-28 18:58:27 +00001830#ifdef LIBXML_VALID_ENABLED
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001831 if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
Daniel Veillard4432df22003-09-28 18:58:27 +00001832#endif /* LIBXML_VALID_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001833 if ((htmlout) && (!nowrap)) {
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +00001834 xmlGenericError(xmlGenericErrorContext,
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001835 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n");
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +00001836 xmlGenericError(xmlGenericErrorContext,
1837 "\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n");
1838 xmlGenericError(xmlGenericErrorContext,
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001839 "<html><head><title>%s output</title></head>\n",
1840 argv[0]);
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +00001841 xmlGenericError(xmlGenericErrorContext,
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001842 "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n",
1843 argv[0]);
1844 }
Daniel Veillard71531f32003-02-05 13:19:53 +00001845
1846#ifdef LIBXML_SCHEMAS_ENABLED
Daniel Veillard81273902003-09-30 00:43:48 +00001847 if ((relaxng != NULL)
1848#ifdef LIBXML_READER_ENABLED
1849 && (stream == 0)
1850#endif /* LIBXML_READER_ENABLED */
1851 ) {
Daniel Veillard71531f32003-02-05 13:19:53 +00001852 xmlRelaxNGParserCtxtPtr ctxt;
1853
Daniel Veillardce192eb2003-04-16 15:58:05 +00001854 /* forces loading the DTDs */
1855 xmlLoadExtDtdDefaultValue |= 1;
Daniel Veillard16fa96c2003-09-23 21:50:54 +00001856 options |= XML_PARSE_DTDLOAD;
Daniel Veillard42f12e92003-03-07 18:32:59 +00001857 if (timing) {
1858 startTimer();
1859 }
Daniel Veillard71531f32003-02-05 13:19:53 +00001860 ctxt = xmlRelaxNGNewParserCtxt(relaxng);
1861 xmlRelaxNGSetParserErrors(ctxt,
1862 (xmlRelaxNGValidityErrorFunc) fprintf,
1863 (xmlRelaxNGValidityWarningFunc) fprintf,
1864 stderr);
1865 relaxngschemas = xmlRelaxNGParse(ctxt);
Daniel Veillardce192eb2003-04-16 15:58:05 +00001866 if (relaxngschemas == NULL) {
1867 xmlGenericError(xmlGenericErrorContext,
1868 "Relax-NG schema %s failed to compile\n", relaxng);
Daniel Veillard05d987b2003-10-08 11:54:57 +00001869 progresult = 5;
Daniel Veillardce192eb2003-04-16 15:58:05 +00001870 relaxng = NULL;
1871 }
Daniel Veillard71531f32003-02-05 13:19:53 +00001872 xmlRelaxNGFreeParserCtxt(ctxt);
Daniel Veillard42f12e92003-03-07 18:32:59 +00001873 if (timing) {
1874 endTimer("Compiling the schemas");
1875 }
Daniel Veillardebe25d42004-03-25 09:35:49 +00001876 } else if ((schema != NULL)
1877#ifdef LIBXML_READER_ENABLED
1878 && (stream == 0)
1879#endif
1880 ) {
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00001881 xmlSchemaParserCtxtPtr ctxt;
1882
1883 if (timing) {
1884 startTimer();
1885 }
1886 ctxt = xmlSchemaNewParserCtxt(schema);
1887 xmlSchemaSetParserErrors(ctxt,
1888 (xmlSchemaValidityErrorFunc) fprintf,
1889 (xmlSchemaValidityWarningFunc) fprintf,
1890 stderr);
1891 wxschemas = xmlSchemaParse(ctxt);
1892 if (wxschemas == NULL) {
1893 xmlGenericError(xmlGenericErrorContext,
1894 "WXS schema %s failed to compile\n", schema);
Daniel Veillard05d987b2003-10-08 11:54:57 +00001895 progresult = 5;
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00001896 schema = NULL;
1897 }
1898 xmlSchemaFreeParserCtxt(ctxt);
1899 if (timing) {
1900 endTimer("Compiling the schemas");
1901 }
Daniel Veillard71531f32003-02-05 13:19:53 +00001902 }
Daniel Veillardb3de70c2003-12-02 22:32:15 +00001903#endif /* LIBXML_SCHEMAS_ENABLED */
1904#ifdef LIBXML_PATTERN_ENABLED
1905 if (pattern != NULL) {
Daniel Veillardffa7b7e2003-12-05 16:10:21 +00001906 patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
Daniel Veillardb3de70c2003-12-02 22:32:15 +00001907 if (patternc == NULL) {
1908 xmlGenericError(xmlGenericErrorContext,
1909 "Pattern %s failed to compile\n", pattern);
1910 progresult = 7;
1911 pattern = NULL;
1912 }
1913 }
1914#endif /* LIBXML_PATTERN_ENABLED */
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001915 for (i = 1; i < argc ; i++) {
Daniel Veillardbe803962000-06-28 23:40:59 +00001916 if ((!strcmp(argv[i], "-encode")) ||
1917 (!strcmp(argv[i], "--encode"))) {
1918 i++;
1919 continue;
Daniel Veillard1df3dfc2001-12-18 11:14:16 +00001920 } else if ((!strcmp(argv[i], "-o")) ||
1921 (!strcmp(argv[i], "-output")) ||
1922 (!strcmp(argv[i], "--output"))) {
1923 i++;
1924 continue;
Daniel Veillardbe803962000-06-28 23:40:59 +00001925 }
Daniel Veillard4432df22003-09-28 18:58:27 +00001926#ifdef LIBXML_VALID_ENABLED
Daniel Veillardcd429612000-10-11 15:57:05 +00001927 if ((!strcmp(argv[i], "-dtdvalid")) ||
1928 (!strcmp(argv[i], "--dtdvalid"))) {
1929 i++;
1930 continue;
1931 }
Daniel Veillard66f68e72003-08-18 16:39:51 +00001932 if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
1933 (!strcmp(argv[i], "--dtdvalidfpi"))) {
1934 i++;
1935 continue;
1936 }
Daniel Veillard4432df22003-09-28 18:58:27 +00001937#endif /* LIBXML_VALID_ENABLED */
Daniel Veillard71531f32003-02-05 13:19:53 +00001938 if ((!strcmp(argv[i], "-relaxng")) ||
1939 (!strcmp(argv[i], "--relaxng"))) {
1940 i++;
1941 continue;
1942 }
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00001943 if ((!strcmp(argv[i], "-schema")) ||
1944 (!strcmp(argv[i], "--schema"))) {
1945 i++;
1946 continue;
1947 }
Daniel Veillardb3de70c2003-12-02 22:32:15 +00001948#ifdef LIBXML_PATTERN_ENABLED
1949 if ((!strcmp(argv[i], "-pattern")) ||
1950 (!strcmp(argv[i], "--pattern"))) {
1951 i++;
1952 continue;
1953 }
1954#endif
Daniel Veillard48b2f892001-02-25 16:11:03 +00001955 if ((timing) && (repeat))
Daniel Veillard01db67c2001-12-18 07:09:59 +00001956 startTimer();
Daniel Veillardcbaf3992001-12-31 16:16:02 +00001957 /* Remember file names. "-" means stdin. <sven@zen.org> */
Daniel Veillard4a6845d2001-01-03 13:32:39 +00001958 if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0)) {
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001959 if (repeat) {
Daniel Veillarde96a2a42003-09-24 21:23:56 +00001960 xmlParserCtxtPtr ctxt = NULL;
1961
1962 for (acount = 0;acount < repeat;acount++) {
Daniel Veillard81273902003-09-30 00:43:48 +00001963#ifdef LIBXML_READER_ENABLED
Daniel Veillard198c1bf2003-10-20 17:07:41 +00001964 if (stream != 0) {
Daniel Veillard7704fb12003-01-03 16:19:51 +00001965 streamFile(argv[i]);
Daniel Veillard198c1bf2003-10-20 17:07:41 +00001966 } else {
Daniel Veillard81273902003-09-30 00:43:48 +00001967#endif /* LIBXML_READER_ENABLED */
Daniel Veillarde96a2a42003-09-24 21:23:56 +00001968 if (ctxt == NULL)
1969 ctxt = xmlNewParserCtxt();
1970 parseAndPrintFile(argv[i], ctxt);
Daniel Veillard81273902003-09-30 00:43:48 +00001971#ifdef LIBXML_READER_ENABLED
Daniel Veillarde96a2a42003-09-24 21:23:56 +00001972 }
Daniel Veillard81273902003-09-30 00:43:48 +00001973#endif /* LIBXML_READER_ENABLED */
Daniel Veillarde96a2a42003-09-24 21:23:56 +00001974 }
1975 if (ctxt != NULL)
1976 xmlFreeParserCtxt(ctxt);
Daniel Veillard7704fb12003-01-03 16:19:51 +00001977 } else {
Daniel Veillard81273902003-09-30 00:43:48 +00001978#ifdef LIBXML_READER_ENABLED
Daniel Veillard7704fb12003-01-03 16:19:51 +00001979 if (stream != 0)
1980 streamFile(argv[i]);
1981 else
Daniel Veillard81273902003-09-30 00:43:48 +00001982#endif /* LIBXML_READER_ENABLED */
Daniel Veillarde96a2a42003-09-24 21:23:56 +00001983 parseAndPrintFile(argv[i], NULL);
Daniel Veillard7704fb12003-01-03 16:19:51 +00001984 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001985 files ++;
Daniel Veillarda7866932001-12-04 13:14:44 +00001986 if ((timing) && (repeat)) {
Daniel Veillard8d8bf2c2003-09-17 19:36:25 +00001987 endTimer("%d iterations", repeat);
Daniel Veillarda7866932001-12-04 13:14:44 +00001988 }
Daniel Veillard48b2f892001-02-25 16:11:03 +00001989 }
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001990 }
Daniel Veillardd2f3ec72001-04-11 07:50:02 +00001991 if (generate)
Daniel Veillarde96a2a42003-09-24 21:23:56 +00001992 parseAndPrintFile(NULL, NULL);
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001993 if ((htmlout) && (!nowrap)) {
Daniel Veillardd6d7f7b2000-10-25 19:56:55 +00001994 xmlGenericError(xmlGenericErrorContext, "</body></html>\n");
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001995 }
Daniel Veillard845cce42002-01-09 11:51:37 +00001996 if ((files == 0) && (!generate) && (version == 0)) {
Daniel Veillard10ea86c2001-06-20 13:55:33 +00001997 usage(argv[0]);
Daniel Veillardce8b83b2000-04-05 18:38:42 +00001998 }
Daniel Veillard71531f32003-02-05 13:19:53 +00001999#ifdef LIBXML_SCHEMAS_ENABLED
2000 if (relaxngschemas != NULL)
2001 xmlRelaxNGFree(relaxngschemas);
Daniel Veillard75bb3bb2003-05-12 15:25:56 +00002002 if (wxschemas != NULL)
2003 xmlSchemaFree(wxschemas);
Daniel Veillard71531f32003-02-05 13:19:53 +00002004 xmlRelaxNGCleanupTypes();
2005#endif
Daniel Veillardb3de70c2003-12-02 22:32:15 +00002006#ifdef LIBXML_PATTERN_ENABLED
2007 if (patternc != NULL)
2008 xmlFreePattern(patternc);
2009#endif
Daniel Veillardce8b83b2000-04-05 18:38:42 +00002010 xmlCleanupParser();
2011 xmlMemoryDump();
2012
Daniel Veillardf7cd4812001-02-23 18:44:52 +00002013 return(progresult);
Daniel Veillardce8b83b2000-04-05 18:38:42 +00002014}
Daniel Veillard88a172f2000-08-04 18:23:10 +00002015