1999-04-21 20:12:07 +00:00
|
|
|
/*
|
2001-12-31 16:16:02 +00:00
|
|
|
* testSAX.c : a small tester program for parsing using the SAX API.
|
1999-04-21 20:12:07 +00:00
|
|
|
*
|
|
|
|
* See Copyright for the status of this software.
|
|
|
|
*
|
2001-06-24 12:13:24 +00:00
|
|
|
* daniel@veillard.com
|
1999-04-21 20:12:07 +00:00
|
|
|
*/
|
|
|
|
|
2001-04-21 16:57:29 +00:00
|
|
|
#include "libxml.h"
|
|
|
|
|
2004-02-22 22:13:27 +00:00
|
|
|
#ifdef HAVE_SYS_TIME_H
|
|
|
|
#include <sys/time.h>
|
|
|
|
#endif
|
2004-03-01 13:21:26 +00:00
|
|
|
#ifdef HAVE_SYS_TIMEB_H
|
|
|
|
#include <sys/timeb.h>
|
|
|
|
#endif
|
2004-02-22 22:13:27 +00:00
|
|
|
#ifdef HAVE_TIME_H
|
|
|
|
#include <time.h>
|
|
|
|
#endif
|
|
|
|
|
2003-09-30 00:43:48 +00:00
|
|
|
#ifdef LIBXML_SAX1_ENABLED
|
1999-09-22 09:46:25 +00:00
|
|
|
#include <string.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
|
|
|
#ifdef HAVE_SYS_TYPES_H
|
1999-04-21 20:12:07 +00:00
|
|
|
#include <sys/types.h>
|
1999-09-22 09:46:25 +00:00
|
|
|
#endif
|
1999-04-21 20:12:07 +00:00
|
|
|
#ifdef HAVE_SYS_STAT_H
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_FCNTL_H
|
|
|
|
#include <fcntl.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
|
|
#include <unistd.h>
|
|
|
|
#endif
|
1999-09-22 09:46:25 +00:00
|
|
|
#ifdef HAVE_STDLIB_H
|
1999-04-21 20:12:07 +00:00
|
|
|
#include <stdlib.h>
|
1999-09-22 09:46:25 +00:00
|
|
|
#endif
|
1999-09-26 11:31:02 +00:00
|
|
|
#ifdef HAVE_STRING_H
|
|
|
|
#include <string.h>
|
|
|
|
#endif
|
1999-09-22 09:46:25 +00:00
|
|
|
|
1999-04-21 20:12:07 +00:00
|
|
|
|
2001-10-13 09:15:48 +00:00
|
|
|
#include <libxml/globals.h>
|
2000-10-09 12:30:39 +00:00
|
|
|
#include <libxml/xmlerror.h>
|
2000-04-03 19:48:13 +00:00
|
|
|
#include <libxml/parser.h>
|
|
|
|
#include <libxml/parserInternals.h> /* only for xmlNewInputFromFile() */
|
|
|
|
#include <libxml/tree.h>
|
|
|
|
#include <libxml/debugXML.h>
|
|
|
|
#include <libxml/xmlmemory.h>
|
1999-04-21 20:12:07 +00:00
|
|
|
|
|
|
|
static int debug = 0;
|
|
|
|
static int copy = 0;
|
|
|
|
static int recovery = 0;
|
1999-12-28 16:35:14 +00:00
|
|
|
static int push = 0;
|
2000-04-12 13:27:38 +00:00
|
|
|
static int speed = 0;
|
2002-03-18 18:36:20 +00:00
|
|
|
static int noent = 0;
|
2002-03-20 19:24:21 +00:00
|
|
|
static int quiet = 0;
|
2003-09-07 09:14:37 +00:00
|
|
|
static int nonull = 0;
|
|
|
|
static int sax2 = 0;
|
2004-01-23 13:15:13 +00:00
|
|
|
static int repeat = 0;
|
2002-03-20 19:24:21 +00:00
|
|
|
static int callbacks = 0;
|
2004-02-22 22:13:27 +00:00
|
|
|
static int timing = 0;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Timing routines.
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
* Internal timing routines to remove the necessity to have unix-specific
|
|
|
|
* function calls
|
|
|
|
*/
|
|
|
|
|
2012-09-11 05:26:36 +00:00
|
|
|
#ifndef HAVE_GETTIMEOFDAY
|
2004-02-22 22:13:27 +00:00
|
|
|
#ifdef HAVE_SYS_TIMEB_H
|
|
|
|
#ifdef HAVE_SYS_TIME_H
|
|
|
|
#ifdef HAVE_FTIME
|
|
|
|
|
|
|
|
static int
|
|
|
|
my_gettimeofday(struct timeval *tvp, void *tzp)
|
|
|
|
{
|
|
|
|
struct timeb timebuffer;
|
|
|
|
|
|
|
|
ftime(&timebuffer);
|
|
|
|
if (tvp) {
|
|
|
|
tvp->tv_sec = timebuffer.time;
|
|
|
|
tvp->tv_usec = timebuffer.millitm * 1000L;
|
|
|
|
}
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
#define HAVE_GETTIMEOFDAY 1
|
|
|
|
#define gettimeofday my_gettimeofday
|
|
|
|
|
|
|
|
#endif /* HAVE_FTIME */
|
|
|
|
#endif /* HAVE_SYS_TIME_H */
|
|
|
|
#endif /* HAVE_SYS_TIMEB_H */
|
|
|
|
#endif /* !HAVE_GETTIMEOFDAY */
|
|
|
|
|
|
|
|
#if defined(HAVE_GETTIMEOFDAY)
|
|
|
|
static struct timeval begin, end;
|
1999-04-21 20:12:07 +00:00
|
|
|
|
2004-02-22 22:13:27 +00:00
|
|
|
/*
|
|
|
|
* startTimer: call where you want to start timing
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
startTimer(void)
|
|
|
|
{
|
|
|
|
gettimeofday(&begin, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* endTimer: call where you want to stop timing and to print out a
|
|
|
|
* message about the timing performed; format is a printf
|
|
|
|
* type argument
|
|
|
|
*/
|
2005-07-21 13:24:09 +00:00
|
|
|
static void XMLCDECL
|
2004-02-22 22:13:27 +00:00
|
|
|
endTimer(const char *fmt, ...)
|
|
|
|
{
|
|
|
|
long msec;
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
gettimeofday(&end, NULL);
|
|
|
|
msec = end.tv_sec - begin.tv_sec;
|
|
|
|
msec *= 1000;
|
|
|
|
msec += (end.tv_usec - begin.tv_usec) / 1000;
|
|
|
|
|
|
|
|
#ifndef HAVE_STDARG_H
|
|
|
|
#error "endTimer required stdarg functions"
|
|
|
|
#endif
|
|
|
|
va_start(ap, fmt);
|
|
|
|
vfprintf(stderr, fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
fprintf(stderr, " took %ld ms\n", msec);
|
|
|
|
}
|
|
|
|
#elif defined(HAVE_TIME_H)
|
|
|
|
/*
|
|
|
|
* No gettimeofday function, so we have to make do with calling clock.
|
|
|
|
* This is obviously less accurate, but there's little we can do about
|
|
|
|
* that.
|
|
|
|
*/
|
|
|
|
#ifndef CLOCKS_PER_SEC
|
|
|
|
#define CLOCKS_PER_SEC 100
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static clock_t begin, end;
|
|
|
|
static void
|
|
|
|
startTimer(void)
|
|
|
|
{
|
|
|
|
begin = clock();
|
|
|
|
}
|
2005-07-21 13:24:09 +00:00
|
|
|
static void XMLCDECL
|
2004-02-22 22:13:27 +00:00
|
|
|
endTimer(const char *fmt, ...)
|
|
|
|
{
|
|
|
|
long msec;
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
end = clock();
|
|
|
|
msec = ((end - begin) * 1000) / CLOCKS_PER_SEC;
|
|
|
|
|
|
|
|
#ifndef HAVE_STDARG_H
|
|
|
|
#error "endTimer required stdarg functions"
|
|
|
|
#endif
|
|
|
|
va_start(ap, fmt);
|
|
|
|
vfprintf(stderr, fmt, ap);
|
|
|
|
va_end(ap);
|
|
|
|
fprintf(stderr, " took %ld ms\n", msec);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We don't have a gettimeofday or time.h, so we just don't do timing
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
startTimer(void)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Do nothing
|
|
|
|
*/
|
|
|
|
}
|
2005-07-21 13:24:09 +00:00
|
|
|
static void XMLCDECL
|
2004-02-22 22:13:27 +00:00
|
|
|
endTimer(char *format, ...)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* We cannot do anything because we don't have a timing function
|
|
|
|
*/
|
|
|
|
#ifdef HAVE_STDARG_H
|
|
|
|
va_start(ap, format);
|
|
|
|
vfprintf(stderr, format, ap);
|
|
|
|
va_end(ap);
|
|
|
|
fprintf(stderr, " was not timed\n", msec);
|
|
|
|
#else
|
|
|
|
/* We don't have gettimeofday, time or stdarg.h, what crazy world is
|
|
|
|
* this ?!
|
|
|
|
*/
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* empty SAX block
|
|
|
|
*/
|
2005-07-28 23:49:35 +00:00
|
|
|
static xmlSAXHandler emptySAXHandlerStruct = {
|
1999-04-21 20:12:07 +00:00
|
|
|
NULL, /* internalSubset */
|
|
|
|
NULL, /* isStandalone */
|
|
|
|
NULL, /* hasInternalSubset */
|
|
|
|
NULL, /* hasExternalSubset */
|
|
|
|
NULL, /* resolveEntity */
|
|
|
|
NULL, /* getEntity */
|
|
|
|
NULL, /* entityDecl */
|
|
|
|
NULL, /* notationDecl */
|
|
|
|
NULL, /* attributeDecl */
|
|
|
|
NULL, /* elementDecl */
|
|
|
|
NULL, /* unparsedEntityDecl */
|
|
|
|
NULL, /* setDocumentLocator */
|
|
|
|
NULL, /* startDocument */
|
|
|
|
NULL, /* endDocument */
|
|
|
|
NULL, /* startElement */
|
|
|
|
NULL, /* endElement */
|
|
|
|
NULL, /* reference */
|
|
|
|
NULL, /* characters */
|
|
|
|
NULL, /* ignorableWhitespace */
|
|
|
|
NULL, /* processingInstruction */
|
|
|
|
NULL, /* comment */
|
|
|
|
NULL, /* xmlParserWarning */
|
|
|
|
NULL, /* xmlParserError */
|
|
|
|
NULL, /* xmlParserError */
|
1999-08-10 19:04:08 +00:00
|
|
|
NULL, /* getParameterEntity */
|
2000-03-14 18:30:20 +00:00
|
|
|
NULL, /* cdataBlock; */
|
2003-09-07 09:14:37 +00:00
|
|
|
NULL, /* externalSubset; */
|
|
|
|
1,
|
|
|
|
NULL,
|
|
|
|
NULL, /* startElementNs */
|
2003-10-18 04:53:14 +00:00
|
|
|
NULL, /* endElementNs */
|
|
|
|
NULL /* xmlStructuredErrorFunc */
|
1999-04-21 20:12:07 +00:00
|
|
|
};
|
|
|
|
|
2005-07-28 23:49:35 +00:00
|
|
|
static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
|
1999-06-02 17:44:04 +00:00
|
|
|
extern xmlSAXHandlerPtr debugSAXHandler;
|
1999-04-21 20:12:07 +00:00
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
* *
|
|
|
|
* Debug Handlers *
|
|
|
|
* *
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* isStandaloneDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
*
|
|
|
|
* Is this document tagged standalone ?
|
|
|
|
*
|
|
|
|
* Returns 1 if true
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static int
|
2001-03-26 16:28:29 +00:00
|
|
|
isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return(0);
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.isStandalone()\n");
|
1999-04-21 20:12:07 +00:00
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* hasInternalSubsetDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
*
|
|
|
|
* Does this document has an internal subset
|
|
|
|
*
|
|
|
|
* Returns 1 if true
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static int
|
2001-03-26 16:28:29 +00:00
|
|
|
hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return(0);
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.hasInternalSubset()\n");
|
1999-04-21 20:12:07 +00:00
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* hasExternalSubsetDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
*
|
|
|
|
* Does this document has an external subset
|
|
|
|
*
|
|
|
|
* Returns 1 if true
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static int
|
2001-03-26 16:28:29 +00:00
|
|
|
hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return(0);
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.hasExternalSubset()\n");
|
1999-04-21 20:12:07 +00:00
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2000-04-24 11:33:38 +00:00
|
|
|
* internalSubsetDebug:
|
1999-04-21 20:12:07 +00:00
|
|
|
* @ctxt: An XML parser context
|
|
|
|
*
|
|
|
|
* Does this document has an internal subset
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
|
1999-09-23 22:19:22 +00:00
|
|
|
const xmlChar *ExternalID, const xmlChar *SystemID)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
2000-08-17 13:50:51 +00:00
|
|
|
fprintf(stdout, "SAX.internalSubset(%s,", name);
|
|
|
|
if (ExternalID == NULL)
|
|
|
|
fprintf(stdout, " ,");
|
|
|
|
else
|
|
|
|
fprintf(stdout, " %s,", ExternalID);
|
|
|
|
if (SystemID == NULL)
|
|
|
|
fprintf(stdout, " )\n");
|
|
|
|
else
|
|
|
|
fprintf(stdout, " %s)\n", SystemID);
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
2001-03-24 17:00:36 +00:00
|
|
|
/**
|
|
|
|
* externalSubsetDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
*
|
|
|
|
* Does this document has an external subset
|
|
|
|
*/
|
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
|
2001-03-24 17:00:36 +00:00
|
|
|
const xmlChar *ExternalID, const xmlChar *SystemID)
|
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
2001-03-24 17:00:36 +00:00
|
|
|
fprintf(stdout, "SAX.externalSubset(%s,", name);
|
|
|
|
if (ExternalID == NULL)
|
|
|
|
fprintf(stdout, " ,");
|
|
|
|
else
|
|
|
|
fprintf(stdout, " %s,", ExternalID);
|
|
|
|
if (SystemID == NULL)
|
|
|
|
fprintf(stdout, " )\n");
|
|
|
|
else
|
|
|
|
fprintf(stdout, " %s)\n", SystemID);
|
|
|
|
}
|
|
|
|
|
1999-04-21 20:12:07 +00:00
|
|
|
/**
|
|
|
|
* resolveEntityDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @publicId: The public ID of the entity
|
|
|
|
* @systemId: The system ID of the entity
|
|
|
|
*
|
|
|
|
* Special entity resolver, better left to the parser, it has
|
|
|
|
* more context than the application layer.
|
|
|
|
* The default behaviour is to NOT resolve the entities, in that case
|
|
|
|
* the ENTITY_REF nodes are built in the structure (and the parameter
|
|
|
|
* values).
|
|
|
|
*
|
|
|
|
* Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static xmlParserInputPtr
|
2001-03-26 16:28:29 +00:00
|
|
|
resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return(NULL);
|
1999-09-26 11:31:02 +00:00
|
|
|
/* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
|
1999-08-29 21:02:19 +00:00
|
|
|
|
2012-09-11 05:26:36 +00:00
|
|
|
|
1999-06-22 21:49:07 +00:00
|
|
|
fprintf(stdout, "SAX.resolveEntity(");
|
|
|
|
if (publicId != NULL)
|
|
|
|
fprintf(stdout, "%s", (char *)publicId);
|
|
|
|
else
|
|
|
|
fprintf(stdout, " ");
|
|
|
|
if (systemId != NULL)
|
|
|
|
fprintf(stdout, ", %s)\n", (char *)systemId);
|
|
|
|
else
|
|
|
|
fprintf(stdout, ", )\n");
|
1999-09-26 11:31:02 +00:00
|
|
|
/*********
|
1999-06-02 17:44:04 +00:00
|
|
|
if (systemId != NULL) {
|
1999-08-29 21:02:19 +00:00
|
|
|
return(xmlNewInputFromFile(ctxt, (char *) systemId));
|
1999-06-02 17:44:04 +00:00
|
|
|
}
|
1999-09-26 11:31:02 +00:00
|
|
|
*********/
|
1999-04-21 20:12:07 +00:00
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* getEntityDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @name: The entity name
|
|
|
|
*
|
|
|
|
* Get an entity by name
|
|
|
|
*
|
|
|
|
* Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static xmlEntityPtr
|
2001-03-26 16:28:29 +00:00
|
|
|
getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return(NULL);
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.getEntity(%s)\n", name);
|
1999-04-21 20:12:07 +00:00
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
|
1999-08-10 19:04:08 +00:00
|
|
|
/**
|
|
|
|
* getParameterEntityDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @name: The entity name
|
|
|
|
*
|
|
|
|
* Get a parameter entity by name
|
|
|
|
*
|
|
|
|
* Returns the xmlParserInputPtr
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static xmlEntityPtr
|
2001-03-26 16:28:29 +00:00
|
|
|
getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
1999-08-10 19:04:08 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return(NULL);
|
1999-08-10 19:04:08 +00:00
|
|
|
fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
|
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
|
1999-04-21 20:12:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* entityDeclDebug:
|
|
|
|
* @ctxt: An XML parser context
|
2012-09-11 05:26:36 +00:00
|
|
|
* @name: the entity name
|
|
|
|
* @type: the entity type
|
1999-04-21 20:12:07 +00:00
|
|
|
* @publicId: The public ID of the entity
|
|
|
|
* @systemId: The system ID of the entity
|
|
|
|
* @content: the entity value (without processing).
|
|
|
|
*
|
|
|
|
* An entity definition has been parsed
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
|
1999-09-23 22:19:22 +00:00
|
|
|
const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2004-02-28 14:47:18 +00:00
|
|
|
const xmlChar *nullstr = BAD_CAST "(null)";
|
|
|
|
/* not all libraries handle printing null pointers nicely */
|
|
|
|
if (publicId == NULL)
|
|
|
|
publicId = nullstr;
|
|
|
|
if (systemId == NULL)
|
|
|
|
systemId = nullstr;
|
|
|
|
if (content == NULL)
|
|
|
|
content = (xmlChar *)nullstr;
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
|
1999-04-21 20:12:07 +00:00
|
|
|
name, type, publicId, systemId, content);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* attributeDeclDebug:
|
|
|
|
* @ctxt: An XML parser context
|
2012-09-11 05:26:36 +00:00
|
|
|
* @name: the attribute name
|
|
|
|
* @type: the attribute type
|
1999-04-21 20:12:07 +00:00
|
|
|
*
|
|
|
|
* An attribute definition has been parsed
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2003-09-10 10:51:05 +00:00
|
|
|
attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
|
|
|
|
const xmlChar * name, int type, int def,
|
|
|
|
const xmlChar * defaultValue, xmlEnumerationPtr tree)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
2003-09-10 10:51:05 +00:00
|
|
|
return;
|
2000-10-06 12:59:53 +00:00
|
|
|
if (defaultValue == NULL)
|
2003-09-10 10:51:05 +00:00
|
|
|
fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
|
|
|
|
elem, name, type, def);
|
2000-10-06 12:59:53 +00:00
|
|
|
else
|
2003-09-10 10:51:05 +00:00
|
|
|
fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
|
|
|
|
elem, name, type, def, defaultValue);
|
|
|
|
xmlFreeEnumeration(tree);
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* elementDeclDebug:
|
|
|
|
* @ctxt: An XML parser context
|
2012-09-11 05:26:36 +00:00
|
|
|
* @name: the element name
|
|
|
|
* @type: the element type
|
1999-04-21 20:12:07 +00:00
|
|
|
* @content: the element value (without processing).
|
|
|
|
*
|
|
|
|
* An element definition has been parsed
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
|
|
|
|
xmlElementContentPtr content ATTRIBUTE_UNUSED)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
|
1999-04-21 20:12:07 +00:00
|
|
|
name, type);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* notationDeclDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @name: The name of the notation
|
|
|
|
* @publicId: The public ID of the entity
|
|
|
|
* @systemId: The system ID of the entity
|
|
|
|
*
|
|
|
|
* What to do when a notation declaration has been parsed.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
|
1999-09-23 22:19:22 +00:00
|
|
|
const xmlChar *publicId, const xmlChar *systemId)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
|
1999-04-21 20:12:07 +00:00
|
|
|
(char *) name, (char *) publicId, (char *) systemId);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* unparsedEntityDeclDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @name: The name of the entity
|
|
|
|
* @publicId: The public ID of the entity
|
|
|
|
* @systemId: The system ID of the entity
|
|
|
|
* @notationName: the name of the notation
|
|
|
|
*
|
|
|
|
* What to do when an unparsed entity declaration is parsed
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
|
1999-09-23 22:19:22 +00:00
|
|
|
const xmlChar *publicId, const xmlChar *systemId,
|
|
|
|
const xmlChar *notationName)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2004-02-28 14:47:18 +00:00
|
|
|
const xmlChar *nullstr = BAD_CAST "(null)";
|
|
|
|
|
|
|
|
if (publicId == NULL)
|
|
|
|
publicId = nullstr;
|
|
|
|
if (systemId == NULL)
|
|
|
|
systemId = nullstr;
|
|
|
|
if (notationName == NULL)
|
|
|
|
notationName = nullstr;
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
|
1999-04-21 20:12:07 +00:00
|
|
|
(char *) name, (char *) publicId, (char *) systemId,
|
|
|
|
(char *) notationName);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* setDocumentLocatorDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @loc: A SAX Locator
|
|
|
|
*
|
|
|
|
* Receive the document locator at startup, actually xmlDefaultSAXLocator
|
|
|
|
* Everything is available on the context, so this is useless in our case.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.setDocumentLocator()\n");
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* startDocumentDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
*
|
|
|
|
* called when the document start being processed.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.startDocument()\n");
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* endDocumentDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
*
|
|
|
|
* called when the document end has been detected.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.endDocument()\n");
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* startElementDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @name: The element name
|
|
|
|
*
|
|
|
|
* called when an opening tag has been processed.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.startElement(%s", (char *) name);
|
1999-04-21 20:12:07 +00:00
|
|
|
if (atts != NULL) {
|
|
|
|
for (i = 0;(atts[i] != NULL);i++) {
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, ", %s='", atts[i++]);
|
2000-08-17 13:50:51 +00:00
|
|
|
if (atts[i] != NULL)
|
|
|
|
fprintf(stdout, "%s'", atts[i]);
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
}
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, ")\n");
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* endElementDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @name: The element name
|
|
|
|
*
|
|
|
|
* called when the end of an element has been detected.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* charactersDebug:
|
|
|
|
* @ctxt: An XML parser context
|
1999-09-23 22:19:22 +00:00
|
|
|
* @ch: a xmlChar string
|
|
|
|
* @len: the number of xmlChar
|
1999-04-21 20:12:07 +00:00
|
|
|
*
|
|
|
|
* receiving some chars from the parser.
|
|
|
|
* Question: how much at a time ???
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2000-08-12 21:12:04 +00:00
|
|
|
char output[40];
|
1999-07-27 19:52:06 +00:00
|
|
|
int i;
|
|
|
|
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
2000-08-12 21:12:04 +00:00
|
|
|
for (i = 0;(i<len) && (i < 30);i++)
|
|
|
|
output[i] = ch[i];
|
|
|
|
output[i] = 0;
|
|
|
|
|
|
|
|
fprintf(stdout, "SAX.characters(%s, %d)\n", output, len);
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* referenceDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @name: The entity name
|
|
|
|
*
|
2012-09-11 05:26:36 +00:00
|
|
|
* called when an entity reference is detected.
|
1999-04-21 20:12:07 +00:00
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.reference(%s)\n", name);
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ignorableWhitespaceDebug:
|
|
|
|
* @ctxt: An XML parser context
|
1999-09-23 22:19:22 +00:00
|
|
|
* @ch: a xmlChar string
|
1999-04-21 20:12:07 +00:00
|
|
|
* @start: the first char in the string
|
1999-09-23 22:19:22 +00:00
|
|
|
* @len: the number of xmlChar
|
1999-04-21 20:12:07 +00:00
|
|
|
*
|
|
|
|
* receiving some ignorable whitespaces from the parser.
|
|
|
|
* Question: how much at a time ???
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2000-08-12 21:12:04 +00:00
|
|
|
char output[40];
|
|
|
|
int i;
|
|
|
|
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
2000-08-12 21:12:04 +00:00
|
|
|
for (i = 0;(i<len) && (i < 30);i++)
|
|
|
|
output[i] = ch[i];
|
|
|
|
output[i] = 0;
|
|
|
|
fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", output, len);
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* processingInstructionDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @target: the target name
|
|
|
|
* @data: the PI data's
|
1999-09-23 22:19:22 +00:00
|
|
|
* @len: the number of xmlChar
|
1999-04-21 20:12:07 +00:00
|
|
|
*
|
|
|
|
* A processing instruction has been parsed.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
|
1999-09-23 22:19:22 +00:00
|
|
|
const xmlChar *data)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
2003-10-27 16:23:43 +00:00
|
|
|
if (data != NULL)
|
|
|
|
fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
|
|
|
|
(char *) target, (char *) data);
|
|
|
|
else
|
|
|
|
fprintf(stdout, "SAX.processingInstruction(%s, NULL)\n",
|
|
|
|
(char *) target);
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
2000-03-14 18:30:20 +00:00
|
|
|
/**
|
|
|
|
* cdataBlockDebug:
|
|
|
|
* @ctx: the user data (XML parser context)
|
|
|
|
* @value: The pcdata content
|
|
|
|
* @len: the block length
|
|
|
|
*
|
|
|
|
* called when a pcdata block has been parsed
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len)
|
2000-03-14 18:30:20 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
2000-10-15 10:06:55 +00:00
|
|
|
fprintf(stdout, "SAX.pcdata(%.20s, %d)\n",
|
2000-03-14 18:30:20 +00:00
|
|
|
(char *) value, len);
|
|
|
|
}
|
|
|
|
|
1999-04-21 20:12:07 +00:00
|
|
|
/**
|
|
|
|
* commentDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @value: the comment content
|
|
|
|
*
|
|
|
|
* A comment has been parsed.
|
|
|
|
*/
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
2001-03-26 16:28:29 +00:00
|
|
|
commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.comment(%s)\n", value);
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* warningDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @msg: the message to display/transmit
|
|
|
|
* @...: extra parameters for the message display
|
|
|
|
*
|
|
|
|
* Display and format a warning messages, gives file, line, position and
|
|
|
|
* extra parameters.
|
|
|
|
*/
|
2005-07-21 13:24:09 +00:00
|
|
|
static void XMLCDECL
|
2001-03-26 16:28:29 +00:00
|
|
|
warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-04-21 20:12:07 +00:00
|
|
|
va_start(args, msg);
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.warning: ");
|
|
|
|
vfprintf(stdout, msg, args);
|
1999-04-21 20:12:07 +00:00
|
|
|
va_end(args);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* errorDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @msg: the message to display/transmit
|
|
|
|
* @...: extra parameters for the message display
|
|
|
|
*
|
|
|
|
* Display and format a error messages, gives file, line, position and
|
|
|
|
* extra parameters.
|
|
|
|
*/
|
2005-07-21 13:24:09 +00:00
|
|
|
static void XMLCDECL
|
2001-03-26 16:28:29 +00:00
|
|
|
errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-04-21 20:12:07 +00:00
|
|
|
va_start(args, msg);
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.error: ");
|
|
|
|
vfprintf(stdout, msg, args);
|
1999-04-21 20:12:07 +00:00
|
|
|
va_end(args);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* fatalErrorDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @msg: the message to display/transmit
|
|
|
|
* @...: extra parameters for the message display
|
|
|
|
*
|
|
|
|
* Display and format a fatalError messages, gives file, line, position and
|
|
|
|
* extra parameters.
|
|
|
|
*/
|
2005-07-21 13:24:09 +00:00
|
|
|
static void XMLCDECL
|
2001-03-26 16:28:29 +00:00
|
|
|
fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
|
1999-04-21 20:12:07 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
1999-04-21 20:12:07 +00:00
|
|
|
va_start(args, msg);
|
1999-05-29 11:51:49 +00:00
|
|
|
fprintf(stdout, "SAX.fatalError: ");
|
|
|
|
vfprintf(stdout, msg, args);
|
1999-04-21 20:12:07 +00:00
|
|
|
va_end(args);
|
|
|
|
}
|
|
|
|
|
2005-07-28 23:49:35 +00:00
|
|
|
static xmlSAXHandler debugSAXHandlerStruct = {
|
1999-04-21 20:12:07 +00:00
|
|
|
internalSubsetDebug,
|
|
|
|
isStandaloneDebug,
|
|
|
|
hasInternalSubsetDebug,
|
|
|
|
hasExternalSubsetDebug,
|
|
|
|
resolveEntityDebug,
|
|
|
|
getEntityDebug,
|
|
|
|
entityDeclDebug,
|
|
|
|
notationDeclDebug,
|
|
|
|
attributeDeclDebug,
|
|
|
|
elementDeclDebug,
|
|
|
|
unparsedEntityDeclDebug,
|
|
|
|
setDocumentLocatorDebug,
|
|
|
|
startDocumentDebug,
|
|
|
|
endDocumentDebug,
|
|
|
|
startElementDebug,
|
|
|
|
endElementDebug,
|
|
|
|
referenceDebug,
|
|
|
|
charactersDebug,
|
|
|
|
ignorableWhitespaceDebug,
|
|
|
|
processingInstructionDebug,
|
|
|
|
commentDebug,
|
|
|
|
warningDebug,
|
|
|
|
errorDebug,
|
|
|
|
fatalErrorDebug,
|
1999-08-10 19:04:08 +00:00
|
|
|
getParameterEntityDebug,
|
2001-03-24 17:00:36 +00:00
|
|
|
cdataBlockDebug,
|
2001-10-13 09:15:48 +00:00
|
|
|
externalSubsetDebug,
|
2003-09-07 09:14:37 +00:00
|
|
|
1,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2003-10-18 04:53:14 +00:00
|
|
|
NULL,
|
2003-09-07 09:14:37 +00:00
|
|
|
NULL
|
1999-04-21 20:12:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
|
|
|
|
|
2003-09-07 09:14:37 +00:00
|
|
|
/*
|
|
|
|
* SAX2 specific callbacks
|
|
|
|
*/
|
|
|
|
/**
|
2003-09-10 10:51:05 +00:00
|
|
|
* startElementNsDebug:
|
2003-09-07 09:14:37 +00:00
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @name: The element name
|
|
|
|
*
|
|
|
|
* called when an opening tag has been processed.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
|
|
|
|
const xmlChar *localname,
|
|
|
|
const xmlChar *prefix,
|
|
|
|
const xmlChar *URI,
|
|
|
|
int nb_namespaces,
|
|
|
|
const xmlChar **namespaces,
|
2003-09-10 10:51:05 +00:00
|
|
|
int nb_attributes,
|
|
|
|
int nb_defaulted,
|
|
|
|
const xmlChar **attributes)
|
2003-09-07 09:14:37 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
|
|
|
fprintf(stdout, "SAX.startElementNs(%s", (char *) localname);
|
|
|
|
if (prefix == NULL)
|
|
|
|
fprintf(stdout, ", NULL");
|
|
|
|
else
|
|
|
|
fprintf(stdout, ", %s", (char *) prefix);
|
|
|
|
if (URI == NULL)
|
|
|
|
fprintf(stdout, ", NULL");
|
|
|
|
else
|
|
|
|
fprintf(stdout, ", '%s'", (char *) URI);
|
|
|
|
fprintf(stdout, ", %d", nb_namespaces);
|
2012-09-11 05:26:36 +00:00
|
|
|
|
2003-09-07 09:14:37 +00:00
|
|
|
if (namespaces != NULL) {
|
|
|
|
for (i = 0;i < nb_namespaces * 2;i++) {
|
|
|
|
fprintf(stdout, ", xmlns");
|
|
|
|
if (namespaces[i] != NULL)
|
|
|
|
fprintf(stdout, ":%s", namespaces[i]);
|
|
|
|
i++;
|
|
|
|
fprintf(stdout, "='%s'", namespaces[i]);
|
|
|
|
}
|
|
|
|
}
|
2003-09-10 10:51:05 +00:00
|
|
|
fprintf(stdout, ", %d, %d", nb_attributes, nb_defaulted);
|
|
|
|
if (attributes != NULL) {
|
2004-06-02 03:41:21 +00:00
|
|
|
for (i = 0;i < nb_attributes * 5;i += 5) {
|
2003-09-10 10:51:05 +00:00
|
|
|
if (attributes[i + 1] != NULL)
|
|
|
|
fprintf(stdout, ", %s:%s='", attributes[i + 1], attributes[i]);
|
|
|
|
else
|
|
|
|
fprintf(stdout, ", %s='", attributes[i]);
|
|
|
|
fprintf(stdout, "%.4s...', %d", attributes[i + 3],
|
2003-10-18 16:20:14 +00:00
|
|
|
(int)(attributes[i + 4] - attributes[i + 3]));
|
2003-09-10 10:51:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf(stdout, ")\n");
|
2003-09-07 09:14:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* endElementDebug:
|
|
|
|
* @ctxt: An XML parser context
|
|
|
|
* @name: The element name
|
|
|
|
*
|
|
|
|
* called when the end of an element has been detected.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
endElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
|
|
|
|
const xmlChar *localname,
|
|
|
|
const xmlChar *prefix,
|
|
|
|
const xmlChar *URI)
|
|
|
|
{
|
|
|
|
callbacks++;
|
|
|
|
if (quiet)
|
|
|
|
return;
|
|
|
|
fprintf(stdout, "SAX.endElementNs(%s", (char *) localname);
|
|
|
|
if (prefix == NULL)
|
|
|
|
fprintf(stdout, ", NULL");
|
|
|
|
else
|
|
|
|
fprintf(stdout, ", %s", (char *) prefix);
|
|
|
|
if (URI == NULL)
|
|
|
|
fprintf(stdout, ", NULL)\n");
|
|
|
|
else
|
|
|
|
fprintf(stdout, ", '%s')\n", (char *) URI);
|
|
|
|
}
|
|
|
|
|
2005-07-28 23:49:35 +00:00
|
|
|
static xmlSAXHandler debugSAX2HandlerStruct = {
|
2003-09-07 09:14:37 +00:00
|
|
|
internalSubsetDebug,
|
|
|
|
isStandaloneDebug,
|
|
|
|
hasInternalSubsetDebug,
|
|
|
|
hasExternalSubsetDebug,
|
|
|
|
resolveEntityDebug,
|
|
|
|
getEntityDebug,
|
|
|
|
entityDeclDebug,
|
|
|
|
notationDeclDebug,
|
|
|
|
attributeDeclDebug,
|
|
|
|
elementDeclDebug,
|
|
|
|
unparsedEntityDeclDebug,
|
|
|
|
setDocumentLocatorDebug,
|
|
|
|
startDocumentDebug,
|
|
|
|
endDocumentDebug,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
referenceDebug,
|
|
|
|
charactersDebug,
|
|
|
|
ignorableWhitespaceDebug,
|
|
|
|
processingInstructionDebug,
|
|
|
|
commentDebug,
|
|
|
|
warningDebug,
|
|
|
|
errorDebug,
|
|
|
|
fatalErrorDebug,
|
|
|
|
getParameterEntityDebug,
|
|
|
|
cdataBlockDebug,
|
|
|
|
externalSubsetDebug,
|
2003-09-10 10:51:05 +00:00
|
|
|
XML_SAX2_MAGIC,
|
2003-09-07 09:14:37 +00:00
|
|
|
NULL,
|
|
|
|
startElementNsDebug,
|
2003-10-18 04:53:14 +00:00
|
|
|
endElementNsDebug,
|
|
|
|
NULL
|
2003-09-07 09:14:37 +00:00
|
|
|
};
|
|
|
|
|
2005-07-28 23:49:35 +00:00
|
|
|
static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct;
|
2003-09-07 09:14:37 +00:00
|
|
|
|
1999-04-21 20:12:07 +00:00
|
|
|
/************************************************************************
|
|
|
|
* *
|
|
|
|
* Debug *
|
|
|
|
* *
|
|
|
|
************************************************************************/
|
|
|
|
|
2001-03-24 17:00:36 +00:00
|
|
|
static void
|
|
|
|
parseAndPrintFile(char *filename) {
|
1999-09-26 11:31:02 +00:00
|
|
|
int res;
|
1999-04-21 20:12:07 +00:00
|
|
|
|
Re-examined the problems of configuring a "minimal" library.
Synchronized the header files with the library code in order
to assure that all the various conditionals (LIBXML_xxxx_ENABLED)
were the same in both. Modified the API database content to more
accurately reflect the conditionals. Enhanced the generation
of that database. Although there was no substantial change to
any of the library code's logic, a large number of files were
modified to achieve the above, and the configuration script
was enhanced to do some automatic enabling of features (e.g.
--with-xinclude forces --with-xpath). Additionally, all the format
errors discovered by apibuild.py were corrected.
* configure.in: enhanced cross-checking of options
* doc/apibuild.py, doc/elfgcchack.xsl, doc/libxml2-refs.xml,
doc/libxml2-api.xml, gentest.py: changed the usage of the
<cond> element in module descriptions
* elfgcchack.h, testapi.c: regenerated with proper conditionals
* HTMLparser.c, SAX.c, globals.c, tree.c, xmlschemas.c, xpath.c,
testSAX.c: cleaned up conditionals
* include/libxml/[SAX.h, SAX2.h, debugXML.h, encoding.h, entities.h,
hash.h, parser.h, parserInternals.h, schemasInternals.h, tree.h,
valid.h, xlink.h, xmlIO.h, xmlautomata.h, xmlreader.h, xpath.h]:
synchronized the conditionals with the corresponding module code
* doc/examples/tree2.c, doc/examples/xpath1.c, doc/examples/xpath2.c:
added additional conditions required for compilation
* doc/*.html, doc/html/*.html: rebuilt the docs
2005-01-02 09:53:13 +00:00
|
|
|
#ifdef LIBXML_PUSH_ENABLED
|
1999-12-28 16:35:14 +00:00
|
|
|
if (push) {
|
|
|
|
FILE *f;
|
|
|
|
|
2003-09-07 09:14:37 +00:00
|
|
|
if ((!quiet) && (!nonull)) {
|
|
|
|
/*
|
|
|
|
* Empty callbacks for checking
|
|
|
|
*/
|
2004-06-27 02:07:51 +00:00
|
|
|
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
|
|
|
|
f = fopen(filename, "rb");
|
|
|
|
#else
|
2003-09-07 09:14:37 +00:00
|
|
|
f = fopen(filename, "r");
|
2004-06-27 02:07:51 +00:00
|
|
|
#endif
|
2003-09-07 09:14:37 +00:00
|
|
|
if (f != NULL) {
|
|
|
|
int ret;
|
|
|
|
char chars[10];
|
|
|
|
xmlParserCtxtPtr ctxt;
|
|
|
|
|
|
|
|
ret = fread(chars, 1, 4, f);
|
|
|
|
if (ret > 0) {
|
|
|
|
ctxt = xmlCreatePushParserCtxt(emptySAXHandler, NULL,
|
|
|
|
chars, ret, filename);
|
|
|
|
while ((ret = fread(chars, 1, 3, f)) > 0) {
|
|
|
|
xmlParseChunk(ctxt, chars, ret, 0);
|
|
|
|
}
|
|
|
|
xmlParseChunk(ctxt, chars, 0, 1);
|
|
|
|
xmlFreeParserCtxt(ctxt);
|
1999-12-28 16:35:14 +00:00
|
|
|
}
|
2003-09-07 09:14:37 +00:00
|
|
|
fclose(f);
|
|
|
|
} else {
|
|
|
|
xmlGenericError(xmlGenericErrorContext,
|
|
|
|
"Cannot read file %s\n", filename);
|
1999-12-28 16:35:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Debug callback
|
|
|
|
*/
|
2004-06-27 02:07:51 +00:00
|
|
|
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
|
|
|
|
f = fopen(filename, "rb");
|
|
|
|
#else
|
1999-12-28 16:35:14 +00:00
|
|
|
f = fopen(filename, "r");
|
2004-06-27 02:07:51 +00:00
|
|
|
#endif
|
1999-12-28 16:35:14 +00:00
|
|
|
if (f != NULL) {
|
2001-03-24 17:00:36 +00:00
|
|
|
int ret;
|
1999-12-28 16:35:14 +00:00
|
|
|
char chars[10];
|
|
|
|
xmlParserCtxtPtr ctxt;
|
|
|
|
|
2001-03-24 17:00:36 +00:00
|
|
|
ret = fread(chars, 1, 4, f);
|
|
|
|
if (ret > 0) {
|
2003-09-07 09:14:37 +00:00
|
|
|
if (sax2)
|
|
|
|
ctxt = xmlCreatePushParserCtxt(debugSAX2Handler, NULL,
|
|
|
|
chars, ret, filename);
|
|
|
|
else
|
|
|
|
ctxt = xmlCreatePushParserCtxt(debugSAXHandler, NULL,
|
|
|
|
chars, ret, filename);
|
2001-03-24 17:00:36 +00:00
|
|
|
while ((ret = fread(chars, 1, 3, f)) > 0) {
|
|
|
|
xmlParseChunk(ctxt, chars, ret, 0);
|
1999-12-28 16:35:14 +00:00
|
|
|
}
|
2001-03-24 17:00:36 +00:00
|
|
|
ret = xmlParseChunk(ctxt, chars, 0, 1);
|
1999-12-28 16:35:14 +00:00
|
|
|
xmlFreeParserCtxt(ctxt);
|
2001-03-24 17:00:36 +00:00
|
|
|
if (ret != 0) {
|
1999-12-28 16:35:14 +00:00
|
|
|
fprintf(stdout,
|
2001-03-24 17:00:36 +00:00
|
|
|
"xmlSAXUserParseFile returned error %d\n", ret);
|
1999-12-28 16:35:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
fclose(f);
|
|
|
|
}
|
|
|
|
} else {
|
Re-examined the problems of configuring a "minimal" library.
Synchronized the header files with the library code in order
to assure that all the various conditionals (LIBXML_xxxx_ENABLED)
were the same in both. Modified the API database content to more
accurately reflect the conditionals. Enhanced the generation
of that database. Although there was no substantial change to
any of the library code's logic, a large number of files were
modified to achieve the above, and the configuration script
was enhanced to do some automatic enabling of features (e.g.
--with-xinclude forces --with-xpath). Additionally, all the format
errors discovered by apibuild.py were corrected.
* configure.in: enhanced cross-checking of options
* doc/apibuild.py, doc/elfgcchack.xsl, doc/libxml2-refs.xml,
doc/libxml2-api.xml, gentest.py: changed the usage of the
<cond> element in module descriptions
* elfgcchack.h, testapi.c: regenerated with proper conditionals
* HTMLparser.c, SAX.c, globals.c, tree.c, xmlschemas.c, xpath.c,
testSAX.c: cleaned up conditionals
* include/libxml/[SAX.h, SAX2.h, debugXML.h, encoding.h, entities.h,
hash.h, parser.h, parserInternals.h, schemasInternals.h, tree.h,
valid.h, xlink.h, xmlIO.h, xmlautomata.h, xmlreader.h, xpath.h]:
synchronized the conditionals with the corresponding module code
* doc/examples/tree2.c, doc/examples/xpath1.c, doc/examples/xpath2.c:
added additional conditions required for compilation
* doc/*.html, doc/html/*.html: rebuilt the docs
2005-01-02 09:53:13 +00:00
|
|
|
#endif /* LIBXML_PUSH_ENABLED */
|
2000-04-12 13:27:38 +00:00
|
|
|
if (!speed) {
|
|
|
|
/*
|
|
|
|
* Empty callbacks for checking
|
|
|
|
*/
|
2003-09-07 09:14:37 +00:00
|
|
|
if ((!quiet) && (!nonull)) {
|
2002-03-20 19:24:21 +00:00
|
|
|
res = xmlSAXUserParseFile(emptySAXHandler, NULL, filename);
|
|
|
|
if (res != 0) {
|
|
|
|
fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
|
|
|
|
}
|
2000-04-12 13:27:38 +00:00
|
|
|
}
|
1999-04-21 20:12:07 +00:00
|
|
|
|
2000-04-12 13:27:38 +00:00
|
|
|
/*
|
|
|
|
* Debug callback
|
|
|
|
*/
|
2002-03-20 19:24:21 +00:00
|
|
|
callbacks = 0;
|
2004-01-23 13:15:13 +00:00
|
|
|
if (repeat) {
|
|
|
|
int i;
|
|
|
|
for (i = 0;i < 99;i++) {
|
|
|
|
if (sax2)
|
|
|
|
res = xmlSAXUserParseFile(debugSAX2Handler, NULL,
|
|
|
|
filename);
|
|
|
|
else
|
|
|
|
res = xmlSAXUserParseFile(debugSAXHandler, NULL,
|
|
|
|
filename);
|
|
|
|
}
|
|
|
|
}
|
2003-09-07 09:14:37 +00:00
|
|
|
if (sax2)
|
|
|
|
res = xmlSAXUserParseFile(debugSAX2Handler, NULL, filename);
|
|
|
|
else
|
|
|
|
res = xmlSAXUserParseFile(debugSAXHandler, NULL, filename);
|
2000-04-12 13:27:38 +00:00
|
|
|
if (res != 0) {
|
|
|
|
fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
|
|
|
|
}
|
2002-03-20 19:24:21 +00:00
|
|
|
if (quiet)
|
|
|
|
fprintf(stdout, "%d callbacks generated\n", callbacks);
|
2000-04-12 13:27:38 +00:00
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* test 100x the SAX parse
|
|
|
|
*/
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i<100;i++)
|
|
|
|
res = xmlSAXUserParseFile(emptySAXHandler, NULL, filename);
|
|
|
|
if (res != 0) {
|
|
|
|
fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
|
|
|
|
}
|
1999-12-28 16:35:14 +00:00
|
|
|
}
|
Re-examined the problems of configuring a "minimal" library.
Synchronized the header files with the library code in order
to assure that all the various conditionals (LIBXML_xxxx_ENABLED)
were the same in both. Modified the API database content to more
accurately reflect the conditionals. Enhanced the generation
of that database. Although there was no substantial change to
any of the library code's logic, a large number of files were
modified to achieve the above, and the configuration script
was enhanced to do some automatic enabling of features (e.g.
--with-xinclude forces --with-xpath). Additionally, all the format
errors discovered by apibuild.py were corrected.
* configure.in: enhanced cross-checking of options
* doc/apibuild.py, doc/elfgcchack.xsl, doc/libxml2-refs.xml,
doc/libxml2-api.xml, gentest.py: changed the usage of the
<cond> element in module descriptions
* elfgcchack.h, testapi.c: regenerated with proper conditionals
* HTMLparser.c, SAX.c, globals.c, tree.c, xmlschemas.c, xpath.c,
testSAX.c: cleaned up conditionals
* include/libxml/[SAX.h, SAX2.h, debugXML.h, encoding.h, entities.h,
hash.h, parser.h, parserInternals.h, schemasInternals.h, tree.h,
valid.h, xlink.h, xmlIO.h, xmlautomata.h, xmlreader.h, xpath.h]:
synchronized the conditionals with the corresponding module code
* doc/examples/tree2.c, doc/examples/xpath1.c, doc/examples/xpath2.c:
added additional conditions required for compilation
* doc/*.html, doc/html/*.html: rebuilt the docs
2005-01-02 09:53:13 +00:00
|
|
|
#ifdef LIBXML_PUSH_ENABLED
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
Re-examined the problems of configuring a "minimal" library.
Synchronized the header files with the library code in order
to assure that all the various conditionals (LIBXML_xxxx_ENABLED)
were the same in both. Modified the API database content to more
accurately reflect the conditionals. Enhanced the generation
of that database. Although there was no substantial change to
any of the library code's logic, a large number of files were
modified to achieve the above, and the configuration script
was enhanced to do some automatic enabling of features (e.g.
--with-xinclude forces --with-xpath). Additionally, all the format
errors discovered by apibuild.py were corrected.
* configure.in: enhanced cross-checking of options
* doc/apibuild.py, doc/elfgcchack.xsl, doc/libxml2-refs.xml,
doc/libxml2-api.xml, gentest.py: changed the usage of the
<cond> element in module descriptions
* elfgcchack.h, testapi.c: regenerated with proper conditionals
* HTMLparser.c, SAX.c, globals.c, tree.c, xmlschemas.c, xpath.c,
testSAX.c: cleaned up conditionals
* include/libxml/[SAX.h, SAX2.h, debugXML.h, encoding.h, entities.h,
hash.h, parser.h, parserInternals.h, schemasInternals.h, tree.h,
valid.h, xlink.h, xmlIO.h, xmlautomata.h, xmlreader.h, xpath.h]:
synchronized the conditionals with the corresponding module code
* doc/examples/tree2.c, doc/examples/xpath1.c, doc/examples/xpath2.c:
added additional conditions required for compilation
* doc/*.html, doc/html/*.html: rebuilt the docs
2005-01-02 09:53:13 +00:00
|
|
|
#endif
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
int i;
|
|
|
|
int files = 0;
|
|
|
|
|
2004-06-02 03:41:21 +00:00
|
|
|
LIBXML_TEST_VERSION /* be safe, plus calls xmlInitParser */
|
2012-09-11 05:26:36 +00:00
|
|
|
|
1999-04-21 20:12:07 +00:00
|
|
|
for (i = 1; i < argc ; i++) {
|
|
|
|
if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
|
|
|
|
debug++;
|
|
|
|
else if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
|
|
|
|
copy++;
|
|
|
|
else if ((!strcmp(argv[i], "-recover")) ||
|
|
|
|
(!strcmp(argv[i], "--recover")))
|
|
|
|
recovery++;
|
1999-12-28 16:35:14 +00:00
|
|
|
else if ((!strcmp(argv[i], "-push")) ||
|
|
|
|
(!strcmp(argv[i], "--push")))
|
Re-examined the problems of configuring a "minimal" library.
Synchronized the header files with the library code in order
to assure that all the various conditionals (LIBXML_xxxx_ENABLED)
were the same in both. Modified the API database content to more
accurately reflect the conditionals. Enhanced the generation
of that database. Although there was no substantial change to
any of the library code's logic, a large number of files were
modified to achieve the above, and the configuration script
was enhanced to do some automatic enabling of features (e.g.
--with-xinclude forces --with-xpath). Additionally, all the format
errors discovered by apibuild.py were corrected.
* configure.in: enhanced cross-checking of options
* doc/apibuild.py, doc/elfgcchack.xsl, doc/libxml2-refs.xml,
doc/libxml2-api.xml, gentest.py: changed the usage of the
<cond> element in module descriptions
* elfgcchack.h, testapi.c: regenerated with proper conditionals
* HTMLparser.c, SAX.c, globals.c, tree.c, xmlschemas.c, xpath.c,
testSAX.c: cleaned up conditionals
* include/libxml/[SAX.h, SAX2.h, debugXML.h, encoding.h, entities.h,
hash.h, parser.h, parserInternals.h, schemasInternals.h, tree.h,
valid.h, xlink.h, xmlIO.h, xmlautomata.h, xmlreader.h, xpath.h]:
synchronized the conditionals with the corresponding module code
* doc/examples/tree2.c, doc/examples/xpath1.c, doc/examples/xpath2.c:
added additional conditions required for compilation
* doc/*.html, doc/html/*.html: rebuilt the docs
2005-01-02 09:53:13 +00:00
|
|
|
#ifdef LIBXML_PUSH_ENABLED
|
1999-12-28 16:35:14 +00:00
|
|
|
push++;
|
Re-examined the problems of configuring a "minimal" library.
Synchronized the header files with the library code in order
to assure that all the various conditionals (LIBXML_xxxx_ENABLED)
were the same in both. Modified the API database content to more
accurately reflect the conditionals. Enhanced the generation
of that database. Although there was no substantial change to
any of the library code's logic, a large number of files were
modified to achieve the above, and the configuration script
was enhanced to do some automatic enabling of features (e.g.
--with-xinclude forces --with-xpath). Additionally, all the format
errors discovered by apibuild.py were corrected.
* configure.in: enhanced cross-checking of options
* doc/apibuild.py, doc/elfgcchack.xsl, doc/libxml2-refs.xml,
doc/libxml2-api.xml, gentest.py: changed the usage of the
<cond> element in module descriptions
* elfgcchack.h, testapi.c: regenerated with proper conditionals
* HTMLparser.c, SAX.c, globals.c, tree.c, xmlschemas.c, xpath.c,
testSAX.c: cleaned up conditionals
* include/libxml/[SAX.h, SAX2.h, debugXML.h, encoding.h, entities.h,
hash.h, parser.h, parserInternals.h, schemasInternals.h, tree.h,
valid.h, xlink.h, xmlIO.h, xmlautomata.h, xmlreader.h, xpath.h]:
synchronized the conditionals with the corresponding module code
* doc/examples/tree2.c, doc/examples/xpath1.c, doc/examples/xpath2.c:
added additional conditions required for compilation
* doc/*.html, doc/html/*.html: rebuilt the docs
2005-01-02 09:53:13 +00:00
|
|
|
#else
|
|
|
|
fprintf(stderr,"'push' not enabled in library - ignoring\n");
|
|
|
|
#endif /* LIBXML_PUSH_ENABLED */
|
2000-04-12 13:27:38 +00:00
|
|
|
else if ((!strcmp(argv[i], "-speed")) ||
|
|
|
|
(!strcmp(argv[i], "--speed")))
|
|
|
|
speed++;
|
2004-02-22 22:13:27 +00:00
|
|
|
else if ((!strcmp(argv[i], "-timing")) ||
|
|
|
|
(!strcmp(argv[i], "--timing"))) {
|
|
|
|
nonull++;
|
|
|
|
timing++;
|
|
|
|
quiet++;
|
|
|
|
} else if ((!strcmp(argv[i], "-repeat")) ||
|
2004-01-23 13:15:13 +00:00
|
|
|
(!strcmp(argv[i], "--repeat"))) {
|
|
|
|
repeat++;
|
|
|
|
quiet++;
|
|
|
|
} else if ((!strcmp(argv[i], "-noent")) ||
|
2002-03-18 18:36:20 +00:00
|
|
|
(!strcmp(argv[i], "--noent")))
|
|
|
|
noent++;
|
2002-03-20 19:24:21 +00:00
|
|
|
else if ((!strcmp(argv[i], "-quiet")) ||
|
|
|
|
(!strcmp(argv[i], "--quiet")))
|
|
|
|
quiet++;
|
2003-09-07 09:14:37 +00:00
|
|
|
else if ((!strcmp(argv[i], "-sax2")) ||
|
|
|
|
(!strcmp(argv[i], "--sax2")))
|
|
|
|
sax2++;
|
|
|
|
else if ((!strcmp(argv[i], "-nonull")) ||
|
|
|
|
(!strcmp(argv[i], "--nonull")))
|
|
|
|
nonull++;
|
1999-04-21 20:12:07 +00:00
|
|
|
}
|
2002-03-18 18:36:20 +00:00
|
|
|
if (noent != 0) xmlSubstituteEntitiesDefault(1);
|
1999-04-21 20:12:07 +00:00
|
|
|
for (i = 1; i < argc ; i++) {
|
|
|
|
if (argv[i][0] != '-') {
|
2004-02-22 22:13:27 +00:00
|
|
|
if (timing) {
|
|
|
|
startTimer();
|
|
|
|
}
|
1999-04-21 20:12:07 +00:00
|
|
|
parseAndPrintFile(argv[i]);
|
2004-02-22 22:13:27 +00:00
|
|
|
if (timing) {
|
|
|
|
endTimer("Parsing");
|
|
|
|
}
|
1999-04-21 20:12:07 +00:00
|
|
|
files ++;
|
|
|
|
}
|
|
|
|
}
|
1999-12-01 09:51:45 +00:00
|
|
|
xmlCleanupParser();
|
|
|
|
xmlMemoryDump();
|
1999-04-21 20:12:07 +00:00
|
|
|
|
|
|
|
return(0);
|
|
|
|
}
|
2003-09-30 00:43:48 +00:00
|
|
|
#else
|
|
|
|
int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
|
|
|
|
printf("%s : SAX1 parsing support not compiled in\n", argv[0]);
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
#endif /* LIBXML_SAX1_ENABLED */
|