|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* testSAX.c : a small tester program for parsing using the SAX API.
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* See Copyright for the status of this software.
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* daniel@veillard.com
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#include "libxml.h"
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#ifdef HAVE_SYS_TIME_H
|
|
Packit |
423ecb |
#include <sys/time.h>
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
#ifdef HAVE_SYS_TIMEB_H
|
|
Packit |
423ecb |
#include <sys/timeb.h>
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
#ifdef HAVE_TIME_H
|
|
Packit |
423ecb |
#include <time.h>
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#ifdef LIBXML_SAX1_ENABLED
|
|
Packit |
423ecb |
#include <string.h>
|
|
Packit |
423ecb |
#include <stdarg.h>
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#ifdef HAVE_SYS_TYPES_H
|
|
Packit |
423ecb |
#include <sys/types.h>
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
#ifdef HAVE_SYS_STAT_H
|
|
Packit |
423ecb |
#include <sys/stat.h>
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
#ifdef HAVE_FCNTL_H
|
|
Packit |
423ecb |
#include <fcntl.h>
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
#ifdef HAVE_UNISTD_H
|
|
Packit |
423ecb |
#include <unistd.h>
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
#ifdef HAVE_STDLIB_H
|
|
Packit |
423ecb |
#include <stdlib.h>
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
#ifdef HAVE_STRING_H
|
|
Packit |
423ecb |
#include <string.h>
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#include <libxml/globals.h>
|
|
Packit |
423ecb |
#include <libxml/xmlerror.h>
|
|
Packit |
423ecb |
#include <libxml/parser.h>
|
|
Packit |
423ecb |
#include <libxml/parserInternals.h> /* only for xmlNewInputFromFile() */
|
|
Packit |
423ecb |
#include <libxml/tree.h>
|
|
Packit |
423ecb |
#include <libxml/debugXML.h>
|
|
Packit |
423ecb |
#include <libxml/xmlmemory.h>
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
static int debug = 0;
|
|
Packit |
423ecb |
static int copy = 0;
|
|
Packit |
423ecb |
static int recovery = 0;
|
|
Packit |
423ecb |
static int push = 0;
|
|
Packit |
423ecb |
static int speed = 0;
|
|
Packit |
423ecb |
static int noent = 0;
|
|
Packit |
423ecb |
static int quiet = 0;
|
|
Packit |
423ecb |
static int nonull = 0;
|
|
Packit |
423ecb |
static int sax2 = 0;
|
|
Packit |
423ecb |
static int repeat = 0;
|
|
Packit |
423ecb |
static int callbacks = 0;
|
|
Packit |
423ecb |
static int timing = 0;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* Timing routines.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* Internal timing routines to remove the necessity to have unix-specific
|
|
Packit |
423ecb |
* function calls
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#ifndef HAVE_GETTIMEOFDAY
|
|
Packit |
423ecb |
#ifdef HAVE_SYS_TIMEB_H
|
|
Packit |
423ecb |
#ifdef HAVE_SYS_TIME_H
|
|
Packit |
423ecb |
#ifdef HAVE_FTIME
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
static int
|
|
Packit |
423ecb |
my_gettimeofday(struct timeval *tvp, void *tzp)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
struct timeb timebuffer;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
ftime(&timebuffer);
|
|
Packit |
423ecb |
if (tvp) {
|
|
Packit |
423ecb |
tvp->tv_sec = timebuffer.time;
|
|
Packit |
423ecb |
tvp->tv_usec = timebuffer.millitm * 1000L;
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
return (0);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
#define HAVE_GETTIMEOFDAY 1
|
|
Packit |
423ecb |
#define gettimeofday my_gettimeofday
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#endif /* HAVE_FTIME */
|
|
Packit |
423ecb |
#endif /* HAVE_SYS_TIME_H */
|
|
Packit |
423ecb |
#endif /* HAVE_SYS_TIMEB_H */
|
|
Packit |
423ecb |
#endif /* !HAVE_GETTIMEOFDAY */
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#if defined(HAVE_GETTIMEOFDAY)
|
|
Packit |
423ecb |
static struct timeval begin, end;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* startTimer: call where you want to start timing
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
startTimer(void)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
gettimeofday(&begin, NULL);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* endTimer: call where you want to stop timing and to print out a
|
|
Packit |
423ecb |
* message about the timing performed; format is a printf
|
|
Packit |
423ecb |
* type argument
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void XMLCDECL
|
|
Packit |
423ecb |
endTimer(const char *fmt, ...)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
long msec;
|
|
Packit |
423ecb |
va_list ap;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
gettimeofday(&end, NULL);
|
|
Packit |
423ecb |
msec = end.tv_sec - begin.tv_sec;
|
|
Packit |
423ecb |
msec *= 1000;
|
|
Packit |
423ecb |
msec += (end.tv_usec - begin.tv_usec) / 1000;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#ifndef HAVE_STDARG_H
|
|
Packit |
423ecb |
#error "endTimer required stdarg functions"
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
va_start(ap, fmt);
|
|
Packit |
423ecb |
vfprintf(stderr, fmt, ap);
|
|
Packit |
423ecb |
va_end(ap);
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
fprintf(stderr, " took %ld ms\n", msec);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
#elif defined(HAVE_TIME_H)
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* No gettimeofday function, so we have to make do with calling clock.
|
|
Packit |
423ecb |
* This is obviously less accurate, but there's little we can do about
|
|
Packit |
423ecb |
* that.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
#ifndef CLOCKS_PER_SEC
|
|
Packit |
423ecb |
#define CLOCKS_PER_SEC 100
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
static clock_t begin, end;
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
startTimer(void)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
begin = clock();
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
static void XMLCDECL
|
|
Packit |
423ecb |
endTimer(const char *fmt, ...)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
long msec;
|
|
Packit |
423ecb |
va_list ap;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
end = clock();
|
|
Packit |
423ecb |
msec = ((end - begin) * 1000) / CLOCKS_PER_SEC;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#ifndef HAVE_STDARG_H
|
|
Packit |
423ecb |
#error "endTimer required stdarg functions"
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
va_start(ap, fmt);
|
|
Packit |
423ecb |
vfprintf(stderr, fmt, ap);
|
|
Packit |
423ecb |
va_end(ap);
|
|
Packit |
423ecb |
fprintf(stderr, " took %ld ms\n", msec);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
#else
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* We don't have a gettimeofday or time.h, so we just don't do timing
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
startTimer(void)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* Do nothing
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
static void XMLCDECL
|
|
Packit |
423ecb |
endTimer(char *format, ...)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* We cannot do anything because we don't have a timing function
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
#ifdef HAVE_STDARG_H
|
|
Packit |
423ecb |
va_start(ap, format);
|
|
Packit |
423ecb |
vfprintf(stderr, format, ap);
|
|
Packit |
423ecb |
va_end(ap);
|
|
Packit |
423ecb |
fprintf(stderr, " was not timed\n", msec);
|
|
Packit |
423ecb |
#else
|
|
Packit |
423ecb |
/* We don't have gettimeofday, time or stdarg.h, what crazy world is
|
|
Packit |
423ecb |
* this ?!
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* empty SAX block
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static xmlSAXHandler emptySAXHandlerStruct = {
|
|
Packit |
423ecb |
NULL, /* internalSubset */
|
|
Packit |
423ecb |
NULL, /* isStandalone */
|
|
Packit |
423ecb |
NULL, /* hasInternalSubset */
|
|
Packit |
423ecb |
NULL, /* hasExternalSubset */
|
|
Packit |
423ecb |
NULL, /* resolveEntity */
|
|
Packit |
423ecb |
NULL, /* getEntity */
|
|
Packit |
423ecb |
NULL, /* entityDecl */
|
|
Packit |
423ecb |
NULL, /* notationDecl */
|
|
Packit |
423ecb |
NULL, /* attributeDecl */
|
|
Packit |
423ecb |
NULL, /* elementDecl */
|
|
Packit |
423ecb |
NULL, /* unparsedEntityDecl */
|
|
Packit |
423ecb |
NULL, /* setDocumentLocator */
|
|
Packit |
423ecb |
NULL, /* startDocument */
|
|
Packit |
423ecb |
NULL, /* endDocument */
|
|
Packit |
423ecb |
NULL, /* startElement */
|
|
Packit |
423ecb |
NULL, /* endElement */
|
|
Packit |
423ecb |
NULL, /* reference */
|
|
Packit |
423ecb |
NULL, /* characters */
|
|
Packit |
423ecb |
NULL, /* ignorableWhitespace */
|
|
Packit |
423ecb |
NULL, /* processingInstruction */
|
|
Packit |
423ecb |
NULL, /* comment */
|
|
Packit |
423ecb |
NULL, /* xmlParserWarning */
|
|
Packit |
423ecb |
NULL, /* xmlParserError */
|
|
Packit |
423ecb |
NULL, /* xmlParserError */
|
|
Packit |
423ecb |
NULL, /* getParameterEntity */
|
|
Packit |
423ecb |
NULL, /* cdataBlock; */
|
|
Packit |
423ecb |
NULL, /* externalSubset; */
|
|
Packit |
423ecb |
1,
|
|
Packit |
423ecb |
NULL,
|
|
Packit |
423ecb |
NULL, /* startElementNs */
|
|
Packit |
423ecb |
NULL, /* endElementNs */
|
|
Packit |
423ecb |
NULL /* xmlStructuredErrorFunc */
|
|
Packit |
423ecb |
};
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
|
|
Packit |
423ecb |
extern xmlSAXHandlerPtr debugSAXHandler;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/************************************************************************
|
|
Packit |
423ecb |
* *
|
|
Packit |
423ecb |
* Debug Handlers *
|
|
Packit |
423ecb |
* *
|
|
Packit |
423ecb |
************************************************************************/
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* isStandaloneDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Is this document tagged standalone ?
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Returns 1 if true
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static int
|
|
Packit |
423ecb |
isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return(0);
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.isStandalone()\n");
|
|
Packit |
423ecb |
return(0);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* hasInternalSubsetDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Does this document has an internal subset
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Returns 1 if true
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static int
|
|
Packit |
423ecb |
hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return(0);
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.hasInternalSubset()\n");
|
|
Packit |
423ecb |
return(0);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* hasExternalSubsetDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Does this document has an external subset
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Returns 1 if true
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static int
|
|
Packit |
423ecb |
hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return(0);
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.hasExternalSubset()\n");
|
|
Packit |
423ecb |
return(0);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* internalSubsetDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Does this document has an internal subset
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
|
|
Packit |
423ecb |
const xmlChar *ExternalID, const xmlChar *SystemID)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.internalSubset(%s,", name);
|
|
Packit |
423ecb |
if (ExternalID == NULL)
|
|
Packit |
423ecb |
fprintf(stdout, " ,");
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, " %s,", ExternalID);
|
|
Packit |
423ecb |
if (SystemID == NULL)
|
|
Packit |
423ecb |
fprintf(stdout, " )\n");
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, " %s)\n", SystemID);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* externalSubsetDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Does this document has an external subset
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
|
|
Packit |
423ecb |
const xmlChar *ExternalID, const xmlChar *SystemID)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.externalSubset(%s,", name);
|
|
Packit |
423ecb |
if (ExternalID == NULL)
|
|
Packit |
423ecb |
fprintf(stdout, " ,");
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, " %s,", ExternalID);
|
|
Packit |
423ecb |
if (SystemID == NULL)
|
|
Packit |
423ecb |
fprintf(stdout, " )\n");
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, " %s)\n", SystemID);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* resolveEntityDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @publicId: The public ID of the entity
|
|
Packit |
423ecb |
* @systemId: The system ID of the entity
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Special entity resolver, better left to the parser, it has
|
|
Packit |
423ecb |
* more context than the application layer.
|
|
Packit |
423ecb |
* The default behaviour is to NOT resolve the entities, in that case
|
|
Packit |
423ecb |
* the ENTITY_REF nodes are built in the structure (and the parameter
|
|
Packit |
423ecb |
* values).
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static xmlParserInputPtr
|
|
Packit |
423ecb |
resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return(NULL);
|
|
Packit |
423ecb |
/* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.resolveEntity(");
|
|
Packit |
423ecb |
if (publicId != NULL)
|
|
Packit |
423ecb |
fprintf(stdout, "%s", (char *)publicId);
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, " ");
|
|
Packit |
423ecb |
if (systemId != NULL)
|
|
Packit |
423ecb |
fprintf(stdout, ", %s)\n", (char *)systemId);
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, ", )\n");
|
|
Packit |
423ecb |
/*********
|
|
Packit |
423ecb |
if (systemId != NULL) {
|
|
Packit |
423ecb |
return(xmlNewInputFromFile(ctxt, (char *) systemId));
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
*********/
|
|
Packit |
423ecb |
return(NULL);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* getEntityDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: The entity name
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Get an entity by name
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static xmlEntityPtr
|
|
Packit |
423ecb |
getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return(NULL);
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.getEntity(%s)\n", name);
|
|
Packit |
423ecb |
return(NULL);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* getParameterEntityDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: The entity name
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Get a parameter entity by name
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Returns the xmlParserInputPtr
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static xmlEntityPtr
|
|
Packit |
423ecb |
getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return(NULL);
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
|
|
Packit |
423ecb |
return(NULL);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* entityDeclDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: the entity name
|
|
Packit |
423ecb |
* @type: the entity type
|
|
Packit |
423ecb |
* @publicId: The public ID of the entity
|
|
Packit |
423ecb |
* @systemId: The system ID of the entity
|
|
Packit |
423ecb |
* @content: the entity value (without processing).
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* An entity definition has been parsed
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
|
|
Packit |
423ecb |
const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
const xmlChar *nullstr = BAD_CAST "(null)";
|
|
Packit |
423ecb |
/* not all libraries handle printing null pointers nicely */
|
|
Packit |
423ecb |
if (publicId == NULL)
|
|
Packit |
423ecb |
publicId = nullstr;
|
|
Packit |
423ecb |
if (systemId == NULL)
|
|
Packit |
423ecb |
systemId = nullstr;
|
|
Packit |
423ecb |
if (content == NULL)
|
|
Packit |
423ecb |
content = (xmlChar *)nullstr;
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
|
|
Packit |
423ecb |
name, type, publicId, systemId, content);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* attributeDeclDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: the attribute name
|
|
Packit |
423ecb |
* @type: the attribute type
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* An attribute definition has been parsed
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
|
|
Packit |
423ecb |
const xmlChar * name, int type, int def,
|
|
Packit |
423ecb |
const xmlChar * defaultValue, xmlEnumerationPtr tree)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
if (defaultValue == NULL)
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
|
|
Packit |
423ecb |
elem, name, type, def);
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
|
|
Packit |
423ecb |
elem, name, type, def, defaultValue);
|
|
Packit |
423ecb |
xmlFreeEnumeration(tree);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* elementDeclDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: the element name
|
|
Packit |
423ecb |
* @type: the element type
|
|
Packit |
423ecb |
* @content: the element value (without processing).
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* An element definition has been parsed
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
|
|
Packit |
423ecb |
xmlElementContentPtr content ATTRIBUTE_UNUSED)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
|
|
Packit |
423ecb |
name, type);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* notationDeclDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: The name of the notation
|
|
Packit |
423ecb |
* @publicId: The public ID of the entity
|
|
Packit |
423ecb |
* @systemId: The system ID of the entity
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* What to do when a notation declaration has been parsed.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
|
|
Packit |
423ecb |
const xmlChar *publicId, const xmlChar *systemId)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
|
|
Packit |
423ecb |
(char *) name, (char *) publicId, (char *) systemId);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* unparsedEntityDeclDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: The name of the entity
|
|
Packit |
423ecb |
* @publicId: The public ID of the entity
|
|
Packit |
423ecb |
* @systemId: The system ID of the entity
|
|
Packit |
423ecb |
* @notationName: the name of the notation
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* What to do when an unparsed entity declaration is parsed
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
|
|
Packit |
423ecb |
const xmlChar *publicId, const xmlChar *systemId,
|
|
Packit |
423ecb |
const xmlChar *notationName)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
const xmlChar *nullstr = BAD_CAST "(null)";
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
if (publicId == NULL)
|
|
Packit |
423ecb |
publicId = nullstr;
|
|
Packit |
423ecb |
if (systemId == NULL)
|
|
Packit |
423ecb |
systemId = nullstr;
|
|
Packit |
423ecb |
if (notationName == NULL)
|
|
Packit |
423ecb |
notationName = nullstr;
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
|
|
Packit |
423ecb |
(char *) name, (char *) publicId, (char *) systemId,
|
|
Packit |
423ecb |
(char *) notationName);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* setDocumentLocatorDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @loc: A SAX Locator
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Receive the document locator at startup, actually xmlDefaultSAXLocator
|
|
Packit |
423ecb |
* Everything is available on the context, so this is useless in our case.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.setDocumentLocator()\n");
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* startDocumentDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* called when the document start being processed.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.startDocument()\n");
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* endDocumentDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* called when the document end has been detected.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.endDocument()\n");
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* startElementDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: The element name
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* called when an opening tag has been processed.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
int i;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.startElement(%s", (char *) name);
|
|
Packit |
423ecb |
if (atts != NULL) {
|
|
Packit |
423ecb |
for (i = 0;(atts[i] != NULL);i++) {
|
|
Packit |
423ecb |
fprintf(stdout, ", %s='", atts[i++]);
|
|
Packit |
423ecb |
if (atts[i] != NULL)
|
|
Packit |
423ecb |
fprintf(stdout, "%s'", atts[i]);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
fprintf(stdout, ")\n");
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* endElementDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: The element name
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* called when the end of an element has been detected.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* charactersDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @ch: a xmlChar string
|
|
Packit |
423ecb |
* @len: the number of xmlChar
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* receiving some chars from the parser.
|
|
Packit |
423ecb |
* Question: how much at a time ???
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
char output[40];
|
|
Packit |
423ecb |
int i;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
for (i = 0;(i
|
|
Packit |
423ecb |
output[i] = ch[i];
|
|
Packit |
423ecb |
output[i] = 0;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.characters(%s, %d)\n", output, len);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* referenceDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: The entity name
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* called when an entity reference is detected.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.reference(%s)\n", name);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* ignorableWhitespaceDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @ch: a xmlChar string
|
|
Packit |
423ecb |
* @start: the first char in the string
|
|
Packit |
423ecb |
* @len: the number of xmlChar
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* receiving some ignorable whitespaces from the parser.
|
|
Packit |
423ecb |
* Question: how much at a time ???
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
char output[40];
|
|
Packit |
423ecb |
int i;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
for (i = 0;(i
|
|
Packit |
423ecb |
output[i] = ch[i];
|
|
Packit |
423ecb |
output[i] = 0;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", output, len);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* processingInstructionDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @target: the target name
|
|
Packit |
423ecb |
* @data: the PI data's
|
|
Packit |
423ecb |
* @len: the number of xmlChar
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* A processing instruction has been parsed.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
|
|
Packit |
423ecb |
const xmlChar *data)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
if (data != NULL)
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
|
|
Packit |
423ecb |
(char *) target, (char *) data);
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.processingInstruction(%s, NULL)\n",
|
|
Packit |
423ecb |
(char *) target);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* cdataBlockDebug:
|
|
Packit |
423ecb |
* @ctx: the user data (XML parser context)
|
|
Packit |
423ecb |
* @value: The pcdata content
|
|
Packit |
423ecb |
* @len: the block length
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* called when a pcdata block has been parsed
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.pcdata(%.20s, %d)\n",
|
|
Packit |
423ecb |
(char *) value, len);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* commentDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @value: the comment content
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* A comment has been parsed.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.comment(%s)\n", value);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* warningDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @msg: the message to display/transmit
|
|
Packit |
423ecb |
* @...: extra parameters for the message display
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Display and format a warning messages, gives file, line, position and
|
|
Packit |
423ecb |
* extra parameters.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void XMLCDECL
|
|
Packit |
423ecb |
warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
va_list args;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
va_start(args, msg);
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.warning: ");
|
|
Packit |
423ecb |
vfprintf(stdout, msg, args);
|
|
Packit |
423ecb |
va_end(args);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* errorDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @msg: the message to display/transmit
|
|
Packit |
423ecb |
* @...: extra parameters for the message display
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Display and format a error messages, gives file, line, position and
|
|
Packit |
423ecb |
* extra parameters.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void XMLCDECL
|
|
Packit |
423ecb |
errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
va_list args;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
va_start(args, msg);
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.error: ");
|
|
Packit |
423ecb |
vfprintf(stdout, msg, args);
|
|
Packit |
423ecb |
va_end(args);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* fatalErrorDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @msg: the message to display/transmit
|
|
Packit |
423ecb |
* @...: extra parameters for the message display
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* Display and format a fatalError messages, gives file, line, position and
|
|
Packit |
423ecb |
* extra parameters.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void XMLCDECL
|
|
Packit |
423ecb |
fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
va_list args;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
va_start(args, msg);
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.fatalError: ");
|
|
Packit |
423ecb |
vfprintf(stdout, msg, args);
|
|
Packit |
423ecb |
va_end(args);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
static xmlSAXHandler debugSAXHandlerStruct = {
|
|
Packit |
423ecb |
internalSubsetDebug,
|
|
Packit |
423ecb |
isStandaloneDebug,
|
|
Packit |
423ecb |
hasInternalSubsetDebug,
|
|
Packit |
423ecb |
hasExternalSubsetDebug,
|
|
Packit |
423ecb |
resolveEntityDebug,
|
|
Packit |
423ecb |
getEntityDebug,
|
|
Packit |
423ecb |
entityDeclDebug,
|
|
Packit |
423ecb |
notationDeclDebug,
|
|
Packit |
423ecb |
attributeDeclDebug,
|
|
Packit |
423ecb |
elementDeclDebug,
|
|
Packit |
423ecb |
unparsedEntityDeclDebug,
|
|
Packit |
423ecb |
setDocumentLocatorDebug,
|
|
Packit |
423ecb |
startDocumentDebug,
|
|
Packit |
423ecb |
endDocumentDebug,
|
|
Packit |
423ecb |
startElementDebug,
|
|
Packit |
423ecb |
endElementDebug,
|
|
Packit |
423ecb |
referenceDebug,
|
|
Packit |
423ecb |
charactersDebug,
|
|
Packit |
423ecb |
ignorableWhitespaceDebug,
|
|
Packit |
423ecb |
processingInstructionDebug,
|
|
Packit |
423ecb |
commentDebug,
|
|
Packit |
423ecb |
warningDebug,
|
|
Packit |
423ecb |
errorDebug,
|
|
Packit |
423ecb |
fatalErrorDebug,
|
|
Packit |
423ecb |
getParameterEntityDebug,
|
|
Packit |
423ecb |
cdataBlockDebug,
|
|
Packit |
423ecb |
externalSubsetDebug,
|
|
Packit |
423ecb |
1,
|
|
Packit |
423ecb |
NULL,
|
|
Packit |
423ecb |
NULL,
|
|
Packit |
423ecb |
NULL,
|
|
Packit |
423ecb |
NULL
|
|
Packit |
423ecb |
};
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* SAX2 specific callbacks
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* startElementNsDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: The element name
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* called when an opening tag has been processed.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
|
|
Packit |
423ecb |
const xmlChar *localname,
|
|
Packit |
423ecb |
const xmlChar *prefix,
|
|
Packit |
423ecb |
const xmlChar *URI,
|
|
Packit |
423ecb |
int nb_namespaces,
|
|
Packit |
423ecb |
const xmlChar **namespaces,
|
|
Packit |
423ecb |
int nb_attributes,
|
|
Packit |
423ecb |
int nb_defaulted,
|
|
Packit |
423ecb |
const xmlChar **attributes)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
int i;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.startElementNs(%s", (char *) localname);
|
|
Packit |
423ecb |
if (prefix == NULL)
|
|
Packit |
423ecb |
fprintf(stdout, ", NULL");
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, ", %s", (char *) prefix);
|
|
Packit |
423ecb |
if (URI == NULL)
|
|
Packit |
423ecb |
fprintf(stdout, ", NULL");
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, ", '%s'", (char *) URI);
|
|
Packit |
423ecb |
fprintf(stdout, ", %d", nb_namespaces);
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
if (namespaces != NULL) {
|
|
Packit |
423ecb |
for (i = 0;i < nb_namespaces * 2;i++) {
|
|
Packit |
423ecb |
fprintf(stdout, ", xmlns");
|
|
Packit |
423ecb |
if (namespaces[i] != NULL)
|
|
Packit |
423ecb |
fprintf(stdout, ":%s", namespaces[i]);
|
|
Packit |
423ecb |
i++;
|
|
Packit |
423ecb |
fprintf(stdout, "='%s'", namespaces[i]);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
fprintf(stdout, ", %d, %d", nb_attributes, nb_defaulted);
|
|
Packit |
423ecb |
if (attributes != NULL) {
|
|
Packit |
423ecb |
for (i = 0;i < nb_attributes * 5;i += 5) {
|
|
Packit |
423ecb |
if (attributes[i + 1] != NULL)
|
|
Packit |
423ecb |
fprintf(stdout, ", %s:%s='", attributes[i + 1], attributes[i]);
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, ", %s='", attributes[i]);
|
|
Packit |
423ecb |
fprintf(stdout, "%.4s...', %d", attributes[i + 3],
|
|
Packit |
423ecb |
(int)(attributes[i + 4] - attributes[i + 3]));
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
fprintf(stdout, ")\n");
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/**
|
|
Packit |
423ecb |
* endElementDebug:
|
|
Packit |
423ecb |
* @ctxt: An XML parser context
|
|
Packit |
423ecb |
* @name: The element name
|
|
Packit |
423ecb |
*
|
|
Packit |
423ecb |
* called when the end of an element has been detected.
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
endElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
|
|
Packit |
423ecb |
const xmlChar *localname,
|
|
Packit |
423ecb |
const xmlChar *prefix,
|
|
Packit |
423ecb |
const xmlChar *URI)
|
|
Packit |
423ecb |
{
|
|
Packit |
423ecb |
callbacks++;
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
return;
|
|
Packit |
423ecb |
fprintf(stdout, "SAX.endElementNs(%s", (char *) localname);
|
|
Packit |
423ecb |
if (prefix == NULL)
|
|
Packit |
423ecb |
fprintf(stdout, ", NULL");
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, ", %s", (char *) prefix);
|
|
Packit |
423ecb |
if (URI == NULL)
|
|
Packit |
423ecb |
fprintf(stdout, ", NULL)\n");
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
fprintf(stdout, ", '%s')\n", (char *) URI);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
static xmlSAXHandler debugSAX2HandlerStruct = {
|
|
Packit |
423ecb |
internalSubsetDebug,
|
|
Packit |
423ecb |
isStandaloneDebug,
|
|
Packit |
423ecb |
hasInternalSubsetDebug,
|
|
Packit |
423ecb |
hasExternalSubsetDebug,
|
|
Packit |
423ecb |
resolveEntityDebug,
|
|
Packit |
423ecb |
getEntityDebug,
|
|
Packit |
423ecb |
entityDeclDebug,
|
|
Packit |
423ecb |
notationDeclDebug,
|
|
Packit |
423ecb |
attributeDeclDebug,
|
|
Packit |
423ecb |
elementDeclDebug,
|
|
Packit |
423ecb |
unparsedEntityDeclDebug,
|
|
Packit |
423ecb |
setDocumentLocatorDebug,
|
|
Packit |
423ecb |
startDocumentDebug,
|
|
Packit |
423ecb |
endDocumentDebug,
|
|
Packit |
423ecb |
NULL,
|
|
Packit |
423ecb |
NULL,
|
|
Packit |
423ecb |
referenceDebug,
|
|
Packit |
423ecb |
charactersDebug,
|
|
Packit |
423ecb |
ignorableWhitespaceDebug,
|
|
Packit |
423ecb |
processingInstructionDebug,
|
|
Packit |
423ecb |
commentDebug,
|
|
Packit |
423ecb |
warningDebug,
|
|
Packit |
423ecb |
errorDebug,
|
|
Packit |
423ecb |
fatalErrorDebug,
|
|
Packit |
423ecb |
getParameterEntityDebug,
|
|
Packit |
423ecb |
cdataBlockDebug,
|
|
Packit |
423ecb |
externalSubsetDebug,
|
|
Packit |
423ecb |
XML_SAX2_MAGIC,
|
|
Packit |
423ecb |
NULL,
|
|
Packit |
423ecb |
startElementNsDebug,
|
|
Packit |
423ecb |
endElementNsDebug,
|
|
Packit |
423ecb |
NULL
|
|
Packit |
423ecb |
};
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/************************************************************************
|
|
Packit |
423ecb |
* *
|
|
Packit |
423ecb |
* Debug *
|
|
Packit |
423ecb |
* *
|
|
Packit |
423ecb |
************************************************************************/
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
static void
|
|
Packit |
423ecb |
parseAndPrintFile(char *filename) {
|
|
Packit |
423ecb |
int res;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
#ifdef LIBXML_PUSH_ENABLED
|
|
Packit |
423ecb |
if (push) {
|
|
Packit |
423ecb |
FILE *f;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
if ((!quiet) && (!nonull)) {
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* Empty callbacks for checking
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
|
|
Packit |
423ecb |
f = fopen(filename, "rb");
|
|
Packit |
423ecb |
#else
|
|
Packit |
423ecb |
f = fopen(filename, "r");
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
if (f != NULL) {
|
|
Packit |
423ecb |
int ret;
|
|
Packit |
423ecb |
char chars[10];
|
|
Packit |
423ecb |
xmlParserCtxtPtr ctxt;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
ret = fread(chars, 1, 4, f);
|
|
Packit |
423ecb |
if (ret > 0) {
|
|
Packit |
423ecb |
ctxt = xmlCreatePushParserCtxt(emptySAXHandler, NULL,
|
|
Packit |
423ecb |
chars, ret, filename);
|
|
Packit |
423ecb |
while ((ret = fread(chars, 1, 3, f)) > 0) {
|
|
Packit |
423ecb |
xmlParseChunk(ctxt, chars, ret, 0);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
xmlParseChunk(ctxt, chars, 0, 1);
|
|
Packit |
423ecb |
xmlFreeParserCtxt(ctxt);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
fclose(f);
|
|
Packit |
423ecb |
} else {
|
|
Packit |
423ecb |
xmlGenericError(xmlGenericErrorContext,
|
|
Packit |
423ecb |
"Cannot read file %s\n", filename);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* Debug callback
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
|
|
Packit |
423ecb |
f = fopen(filename, "rb");
|
|
Packit |
423ecb |
#else
|
|
Packit |
423ecb |
f = fopen(filename, "r");
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
if (f != NULL) {
|
|
Packit |
423ecb |
int ret;
|
|
Packit |
423ecb |
char chars[10];
|
|
Packit |
423ecb |
xmlParserCtxtPtr ctxt;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
ret = fread(chars, 1, 4, f);
|
|
Packit |
423ecb |
if (ret > 0) {
|
|
Packit |
423ecb |
if (sax2)
|
|
Packit |
423ecb |
ctxt = xmlCreatePushParserCtxt(debugSAX2Handler, NULL,
|
|
Packit |
423ecb |
chars, ret, filename);
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
ctxt = xmlCreatePushParserCtxt(debugSAXHandler, NULL,
|
|
Packit |
423ecb |
chars, ret, filename);
|
|
Packit |
423ecb |
while ((ret = fread(chars, 1, 3, f)) > 0) {
|
|
Packit |
423ecb |
xmlParseChunk(ctxt, chars, ret, 0);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
ret = xmlParseChunk(ctxt, chars, 0, 1);
|
|
Packit |
423ecb |
xmlFreeParserCtxt(ctxt);
|
|
Packit |
423ecb |
if (ret != 0) {
|
|
Packit |
423ecb |
fprintf(stdout,
|
|
Packit |
423ecb |
"xmlSAXUserParseFile returned error %d\n", ret);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
fclose(f);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
} else {
|
|
Packit |
423ecb |
#endif /* LIBXML_PUSH_ENABLED */
|
|
Packit |
423ecb |
if (!speed) {
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* Empty callbacks for checking
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
if ((!quiet) && (!nonull)) {
|
|
Packit |
423ecb |
res = xmlSAXUserParseFile(emptySAXHandler, NULL, filename);
|
|
Packit |
423ecb |
if (res != 0) {
|
|
Packit |
423ecb |
fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* Debug callback
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
callbacks = 0;
|
|
Packit |
423ecb |
if (repeat) {
|
|
Packit |
423ecb |
int i;
|
|
Packit |
423ecb |
for (i = 0;i < 99;i++) {
|
|
Packit |
423ecb |
if (sax2)
|
|
Packit |
423ecb |
res = xmlSAXUserParseFile(debugSAX2Handler, NULL,
|
|
Packit |
423ecb |
filename);
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
res = xmlSAXUserParseFile(debugSAXHandler, NULL,
|
|
Packit |
423ecb |
filename);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
if (sax2)
|
|
Packit |
423ecb |
res = xmlSAXUserParseFile(debugSAX2Handler, NULL, filename);
|
|
Packit |
423ecb |
else
|
|
Packit |
423ecb |
res = xmlSAXUserParseFile(debugSAXHandler, NULL, filename);
|
|
Packit |
423ecb |
if (res != 0) {
|
|
Packit |
423ecb |
fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
if (quiet)
|
|
Packit |
423ecb |
fprintf(stdout, "%d callbacks generated\n", callbacks);
|
|
Packit |
423ecb |
} else {
|
|
Packit |
423ecb |
/*
|
|
Packit |
423ecb |
* test 100x the SAX parse
|
|
Packit |
423ecb |
*/
|
|
Packit |
423ecb |
int i;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
for (i = 0; i<100;i++)
|
|
Packit |
423ecb |
res = xmlSAXUserParseFile(emptySAXHandler, NULL, filename);
|
|
Packit |
423ecb |
if (res != 0) {
|
|
Packit |
423ecb |
fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
#ifdef LIBXML_PUSH_ENABLED
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
#endif
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
int main(int argc, char **argv) {
|
|
Packit |
423ecb |
int i;
|
|
Packit |
423ecb |
int files = 0;
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
LIBXML_TEST_VERSION /* be safe, plus calls xmlInitParser */
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
for (i = 1; i < argc ; i++) {
|
|
Packit |
423ecb |
if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
|
|
Packit |
423ecb |
debug++;
|
|
Packit |
423ecb |
else if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
|
|
Packit |
423ecb |
copy++;
|
|
Packit |
423ecb |
else if ((!strcmp(argv[i], "-recover")) ||
|
|
Packit |
423ecb |
(!strcmp(argv[i], "--recover")))
|
|
Packit |
423ecb |
recovery++;
|
|
Packit |
423ecb |
else if ((!strcmp(argv[i], "-push")) ||
|
|
Packit |
423ecb |
(!strcmp(argv[i], "--push")))
|
|
Packit |
423ecb |
#ifdef LIBXML_PUSH_ENABLED
|
|
Packit |
423ecb |
push++;
|
|
Packit |
423ecb |
#else
|
|
Packit |
423ecb |
fprintf(stderr,"'push' not enabled in library - ignoring\n");
|
|
Packit |
423ecb |
#endif /* LIBXML_PUSH_ENABLED */
|
|
Packit |
423ecb |
else if ((!strcmp(argv[i], "-speed")) ||
|
|
Packit |
423ecb |
(!strcmp(argv[i], "--speed")))
|
|
Packit |
423ecb |
speed++;
|
|
Packit |
423ecb |
else if ((!strcmp(argv[i], "-timing")) ||
|
|
Packit |
423ecb |
(!strcmp(argv[i], "--timing"))) {
|
|
Packit |
423ecb |
nonull++;
|
|
Packit |
423ecb |
timing++;
|
|
Packit |
423ecb |
quiet++;
|
|
Packit |
423ecb |
} else if ((!strcmp(argv[i], "-repeat")) ||
|
|
Packit |
423ecb |
(!strcmp(argv[i], "--repeat"))) {
|
|
Packit |
423ecb |
repeat++;
|
|
Packit |
423ecb |
quiet++;
|
|
Packit |
423ecb |
} else if ((!strcmp(argv[i], "-noent")) ||
|
|
Packit |
423ecb |
(!strcmp(argv[i], "--noent")))
|
|
Packit |
423ecb |
noent++;
|
|
Packit |
423ecb |
else if ((!strcmp(argv[i], "-quiet")) ||
|
|
Packit |
423ecb |
(!strcmp(argv[i], "--quiet")))
|
|
Packit |
423ecb |
quiet++;
|
|
Packit |
423ecb |
else if ((!strcmp(argv[i], "-sax2")) ||
|
|
Packit |
423ecb |
(!strcmp(argv[i], "--sax2")))
|
|
Packit |
423ecb |
sax2++;
|
|
Packit |
423ecb |
else if ((!strcmp(argv[i], "-nonull")) ||
|
|
Packit |
423ecb |
(!strcmp(argv[i], "--nonull")))
|
|
Packit |
423ecb |
nonull++;
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
if (noent != 0) xmlSubstituteEntitiesDefault(1);
|
|
Packit |
423ecb |
for (i = 1; i < argc ; i++) {
|
|
Packit |
423ecb |
if (argv[i][0] != '-') {
|
|
Packit |
423ecb |
if (timing) {
|
|
Packit |
423ecb |
startTimer();
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
parseAndPrintFile(argv[i]);
|
|
Packit |
423ecb |
if (timing) {
|
|
Packit |
423ecb |
endTimer("Parsing");
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
files ++;
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
xmlCleanupParser();
|
|
Packit |
423ecb |
xmlMemoryDump();
|
|
Packit |
423ecb |
|
|
Packit |
423ecb |
return(0);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
#else
|
|
Packit |
423ecb |
int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
|
|
Packit |
423ecb |
printf("%s : SAX1 parsing support not compiled in\n", argv[0]);
|
|
Packit |
423ecb |
return(0);
|
|
Packit |
423ecb |
}
|
|
Packit |
423ecb |
#endif /* LIBXML_SAX1_ENABLED */
|