Blame testHTML.c

Packit Service a31ea6
/*
Packit Service a31ea6
 * testHTML.c : a small tester program for HTML input.
Packit Service a31ea6
 *
Packit Service a31ea6
 * See Copyright for the status of this software.
Packit Service a31ea6
 *
Packit Service a31ea6
 * daniel@veillard.com
Packit Service a31ea6
 */
Packit Service a31ea6
Packit Service a31ea6
#include "libxml.h"
Packit Service a31ea6
Packit Service a31ea6
#ifdef LIBXML_HTML_ENABLED
Packit Service a31ea6
Packit Service a31ea6
#include <string.h>
Packit Service a31ea6
#include <stdarg.h>
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
#ifdef HAVE_SYS_TYPES_H
Packit Service a31ea6
#include <sys/types.h>
Packit Service a31ea6
#endif
Packit Service a31ea6
#ifdef HAVE_SYS_STAT_H
Packit Service a31ea6
#include <sys/stat.h>
Packit Service a31ea6
#endif
Packit Service a31ea6
#ifdef HAVE_FCNTL_H
Packit Service a31ea6
#include <fcntl.h>
Packit Service a31ea6
#endif
Packit Service a31ea6
#ifdef HAVE_UNISTD_H
Packit Service a31ea6
#include <unistd.h>
Packit Service a31ea6
#endif
Packit Service a31ea6
#ifdef HAVE_STDLIB_H
Packit Service a31ea6
#include <stdlib.h>
Packit Service a31ea6
#endif
Packit Service a31ea6
Packit Service a31ea6
#include <libxml/xmlmemory.h>
Packit Service a31ea6
#include <libxml/HTMLparser.h>
Packit Service a31ea6
#include <libxml/HTMLtree.h>
Packit Service a31ea6
#include <libxml/debugXML.h>
Packit Service a31ea6
#include <libxml/xmlerror.h>
Packit Service a31ea6
#include <libxml/globals.h>
Packit Service a31ea6
Packit Service a31ea6
#ifdef LIBXML_DEBUG_ENABLED
Packit Service a31ea6
static int debug = 0;
Packit Service a31ea6
#endif
Packit Service a31ea6
static int copy = 0;
Packit Service a31ea6
static int sax = 0;
Packit Service a31ea6
static int repeat = 0;
Packit Service a31ea6
static int noout = 0;
Packit Service a31ea6
#ifdef LIBXML_PUSH_ENABLED
Packit Service a31ea6
static int push = 0;
Packit Service a31ea6
#endif /* LIBXML_PUSH_ENABLED */
Packit Service a31ea6
static char *encoding = NULL;
Packit Service a31ea6
static int options = 0;
Packit Service a31ea6
Packit Service a31ea6
static xmlSAXHandler emptySAXHandlerStruct = {
Packit Service a31ea6
    NULL, /* internalSubset */
Packit Service a31ea6
    NULL, /* isStandalone */
Packit Service a31ea6
    NULL, /* hasInternalSubset */
Packit Service a31ea6
    NULL, /* hasExternalSubset */
Packit Service a31ea6
    NULL, /* resolveEntity */
Packit Service a31ea6
    NULL, /* getEntity */
Packit Service a31ea6
    NULL, /* entityDecl */
Packit Service a31ea6
    NULL, /* notationDecl */
Packit Service a31ea6
    NULL, /* attributeDecl */
Packit Service a31ea6
    NULL, /* elementDecl */
Packit Service a31ea6
    NULL, /* unparsedEntityDecl */
Packit Service a31ea6
    NULL, /* setDocumentLocator */
Packit Service a31ea6
    NULL, /* startDocument */
Packit Service a31ea6
    NULL, /* endDocument */
Packit Service a31ea6
    NULL, /* startElement */
Packit Service a31ea6
    NULL, /* endElement */
Packit Service a31ea6
    NULL, /* reference */
Packit Service a31ea6
    NULL, /* characters */
Packit Service a31ea6
    NULL, /* ignorableWhitespace */
Packit Service a31ea6
    NULL, /* processingInstruction */
Packit Service a31ea6
    NULL, /* comment */
Packit Service a31ea6
    NULL, /* xmlParserWarning */
Packit Service a31ea6
    NULL, /* xmlParserError */
Packit Service a31ea6
    NULL, /* xmlParserError */
Packit Service a31ea6
    NULL, /* getParameterEntity */
Packit Service a31ea6
    NULL, /* cdataBlock */
Packit Service a31ea6
    NULL, /* externalSubset */
Packit Service a31ea6
    1,    /* initialized */
Packit Service a31ea6
    NULL, /* private */
Packit Service a31ea6
    NULL, /* startElementNsSAX2Func */
Packit Service a31ea6
    NULL, /* endElementNsSAX2Func */
Packit Service a31ea6
    NULL  /* xmlStructuredErrorFunc */
Packit Service a31ea6
};
Packit Service a31ea6
Packit Service a31ea6
static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
Packit Service a31ea6
extern xmlSAXHandlerPtr debugSAXHandler;
Packit Service a31ea6
Packit Service a31ea6
/************************************************************************
Packit Service a31ea6
 *									*
Packit Service a31ea6
 *				Debug Handlers				*
Packit Service a31ea6
 *									*
Packit Service a31ea6
 ************************************************************************/
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * isStandaloneDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 *
Packit Service a31ea6
 * Is this document tagged standalone ?
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns 1 if true
Packit Service a31ea6
 */
Packit Service a31ea6
static int
Packit Service a31ea6
isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.isStandalone()\n");
Packit Service a31ea6
    return(0);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * hasInternalSubsetDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 *
Packit Service a31ea6
 * Does this document has an internal subset
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns 1 if true
Packit Service a31ea6
 */
Packit Service a31ea6
static int
Packit Service a31ea6
hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.hasInternalSubset()\n");
Packit Service a31ea6
    return(0);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * hasExternalSubsetDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 *
Packit Service a31ea6
 * Does this document has an external subset
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns 1 if true
Packit Service a31ea6
 */
Packit Service a31ea6
static int
Packit Service a31ea6
hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.hasExternalSubset()\n");
Packit Service a31ea6
    return(0);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * hasInternalSubsetDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 *
Packit Service a31ea6
 * Does this document has an internal subset
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
Packit Service a31ea6
	       const xmlChar *ExternalID, const xmlChar *SystemID)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.internalSubset(%s,", name);
Packit Service a31ea6
    if (ExternalID == NULL)
Packit Service a31ea6
	fprintf(stdout, " ,");
Packit Service a31ea6
    else
Packit Service a31ea6
	fprintf(stdout, " %s,", ExternalID);
Packit Service a31ea6
    if (SystemID == NULL)
Packit Service a31ea6
	fprintf(stdout, " )\n");
Packit Service a31ea6
    else
Packit Service a31ea6
	fprintf(stdout, " %s)\n", SystemID);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * resolveEntityDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @publicId: The public ID of the entity
Packit Service a31ea6
 * @systemId: The system ID of the entity
Packit Service a31ea6
 *
Packit Service a31ea6
 * Special entity resolver, better left to the parser, it has
Packit Service a31ea6
 * more context than the application layer.
Packit Service a31ea6
 * The default behaviour is to NOT resolve the entities, in that case
Packit Service a31ea6
 * the ENTITY_REF nodes are built in the structure (and the parameter
Packit Service a31ea6
 * values).
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
Packit Service a31ea6
 */
Packit Service a31ea6
static xmlParserInputPtr
Packit Service a31ea6
resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
Packit Service a31ea6
{
Packit Service a31ea6
    /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
    fprintf(stdout, "SAX.resolveEntity(");
Packit Service a31ea6
    if (publicId != NULL)
Packit Service a31ea6
	fprintf(stdout, "%s", (char *)publicId);
Packit Service a31ea6
    else
Packit Service a31ea6
	fprintf(stdout, " ");
Packit Service a31ea6
    if (systemId != NULL)
Packit Service a31ea6
	fprintf(stdout, ", %s)\n", (char *)systemId);
Packit Service a31ea6
    else
Packit Service a31ea6
	fprintf(stdout, ", )\n");
Packit Service a31ea6
/*********
Packit Service a31ea6
    if (systemId != NULL) {
Packit Service a31ea6
        return(xmlNewInputFromFile(ctxt, (char *) systemId));
Packit Service a31ea6
    }
Packit Service a31ea6
 *********/
Packit Service a31ea6
    return(NULL);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * getEntityDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name: The entity name
Packit Service a31ea6
 *
Packit Service a31ea6
 * Get an entity by name
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
Packit Service a31ea6
 */
Packit Service a31ea6
static xmlEntityPtr
Packit Service a31ea6
getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.getEntity(%s)\n", name);
Packit Service a31ea6
    return(NULL);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * getParameterEntityDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name: The entity name
Packit Service a31ea6
 *
Packit Service a31ea6
 * Get a parameter entity by name
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns the xmlParserInputPtr
Packit Service a31ea6
 */
Packit Service a31ea6
static xmlEntityPtr
Packit Service a31ea6
getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
Packit Service a31ea6
    return(NULL);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * entityDeclDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name:  the entity name
Packit Service a31ea6
 * @type:  the entity type
Packit Service a31ea6
 * @publicId: The public ID of the entity
Packit Service a31ea6
 * @systemId: The system ID of the entity
Packit Service a31ea6
 * @content: the entity value (without processing).
Packit Service a31ea6
 *
Packit Service a31ea6
 * An entity definition has been parsed
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
Packit Service a31ea6
          const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
Packit Service a31ea6
            name, type, publicId, systemId, content);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * attributeDeclDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name:  the attribute name
Packit Service a31ea6
 * @type:  the attribute type
Packit Service a31ea6
 *
Packit Service a31ea6
 * An attribute definition has been parsed
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *elem, const xmlChar *name,
Packit Service a31ea6
              int type, int def, const xmlChar *defaultValue,
Packit Service a31ea6
	      xmlEnumerationPtr tree ATTRIBUTE_UNUSED)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
Packit Service a31ea6
            elem, name, type, def, defaultValue);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * elementDeclDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name:  the element name
Packit Service a31ea6
 * @type:  the element type
Packit Service a31ea6
 * @content: the element value (without processing).
Packit Service a31ea6
 *
Packit Service a31ea6
 * An element definition has been parsed
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
Packit Service a31ea6
	    xmlElementContentPtr content ATTRIBUTE_UNUSED)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
Packit Service a31ea6
            name, type);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * notationDeclDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name: The name of the notation
Packit Service a31ea6
 * @publicId: The public ID of the entity
Packit Service a31ea6
 * @systemId: The system ID of the entity
Packit Service a31ea6
 *
Packit Service a31ea6
 * What to do when a notation declaration has been parsed.
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
Packit Service a31ea6
	     const xmlChar *publicId, const xmlChar *systemId)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
Packit Service a31ea6
            (char *) name, (char *) publicId, (char *) systemId);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * unparsedEntityDeclDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name: The name of the entity
Packit Service a31ea6
 * @publicId: The public ID of the entity
Packit Service a31ea6
 * @systemId: The system ID of the entity
Packit Service a31ea6
 * @notationName: the name of the notation
Packit Service a31ea6
 *
Packit Service a31ea6
 * What to do when an unparsed entity declaration is parsed
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
Packit Service a31ea6
		   const xmlChar *publicId, const xmlChar *systemId,
Packit Service a31ea6
		   const xmlChar *notationName)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
Packit Service a31ea6
            (char *) name, (char *) publicId, (char *) systemId,
Packit Service a31ea6
	    (char *) notationName);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * setDocumentLocatorDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @loc: A SAX Locator
Packit Service a31ea6
 *
Packit Service a31ea6
 * Receive the document locator at startup, actually xmlDefaultSAXLocator
Packit Service a31ea6
 * Everything is available on the context, so this is useless in our case.
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.setDocumentLocator()\n");
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * startDocumentDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 *
Packit Service a31ea6
 * called when the document start being processed.
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.startDocument()\n");
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * endDocumentDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 *
Packit Service a31ea6
 * called when the document end has been detected.
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.endDocument()\n");
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * startElementDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name:  The element name
Packit Service a31ea6
 *
Packit Service a31ea6
 * called when an opening tag has been processed.
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
Packit Service a31ea6
{
Packit Service a31ea6
    int i;
Packit Service a31ea6
Packit Service a31ea6
    fprintf(stdout, "SAX.startElement(%s", (char *) name);
Packit Service a31ea6
    if (atts != NULL) {
Packit Service a31ea6
        for (i = 0;(atts[i] != NULL);i++) {
Packit Service a31ea6
	    fprintf(stdout, ", %s", atts[i++]);
Packit Service a31ea6
	    if (atts[i] != NULL) {
Packit Service a31ea6
		unsigned char output[40];
Packit Service a31ea6
		const unsigned char *att = atts[i];
Packit Service a31ea6
		int outlen, attlen;
Packit Service a31ea6
	        fprintf(stdout, "='");
Packit Service a31ea6
		while ((attlen = strlen((char*)att)) > 0) {
Packit Service a31ea6
		    outlen = sizeof output - 1;
Packit Service a31ea6
		    htmlEncodeEntities(output, &outlen, att, &attlen, '\'');
Packit Service a31ea6
		    output[outlen] = 0;
Packit Service a31ea6
		    fprintf(stdout, "%s", (char *) output);
Packit Service a31ea6
		    att += attlen;
Packit Service a31ea6
		}
Packit Service a31ea6
		fprintf(stdout, "'");
Packit Service a31ea6
	    }
Packit Service a31ea6
	}
Packit Service a31ea6
    }
Packit Service a31ea6
    fprintf(stdout, ")\n");
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * endElementDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name:  The element name
Packit Service a31ea6
 *
Packit Service a31ea6
 * called when the end of an element has been detected.
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * charactersDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @ch:  a xmlChar string
Packit Service a31ea6
 * @len: the number of xmlChar
Packit Service a31ea6
 *
Packit Service a31ea6
 * receiving some chars from the parser.
Packit Service a31ea6
 * Question: how much at a time ???
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
Packit Service a31ea6
{
Packit Service a31ea6
    unsigned char output[40];
Packit Service a31ea6
    int inlen = len, outlen = 30;
Packit Service a31ea6
Packit Service a31ea6
    htmlEncodeEntities(output, &outlen, ch, &inlen, 0);
Packit Service a31ea6
    output[outlen] = 0;
Packit Service a31ea6
Packit Service a31ea6
    fprintf(stdout, "SAX.characters(%s, %d)\n", output, len);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * cdataDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @ch:  a xmlChar string
Packit Service a31ea6
 * @len: the number of xmlChar
Packit Service a31ea6
 *
Packit Service a31ea6
 * receiving some cdata chars from the parser.
Packit Service a31ea6
 * Question: how much at a time ???
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
cdataDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
Packit Service a31ea6
{
Packit Service a31ea6
    unsigned char output[40];
Packit Service a31ea6
    int inlen = len, outlen = 30;
Packit Service a31ea6
Packit Service a31ea6
    htmlEncodeEntities(output, &outlen, ch, &inlen, 0);
Packit Service a31ea6
    output[outlen] = 0;
Packit Service a31ea6
Packit Service a31ea6
    fprintf(stdout, "SAX.cdata(%s, %d)\n", output, len);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * referenceDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @name:  The entity name
Packit Service a31ea6
 *
Packit Service a31ea6
 * called when an entity reference is detected.
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.reference(%s)\n", name);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * ignorableWhitespaceDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @ch:  a xmlChar string
Packit Service a31ea6
 * @start: the first char in the string
Packit Service a31ea6
 * @len: the number of xmlChar
Packit Service a31ea6
 *
Packit Service a31ea6
 * receiving some ignorable whitespaces from the parser.
Packit Service a31ea6
 * Question: how much at a time ???
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
Packit Service a31ea6
{
Packit Service a31ea6
    char output[40];
Packit Service a31ea6
    int i;
Packit Service a31ea6
Packit Service a31ea6
    for (i = 0;(i
Packit Service a31ea6
	output[i] = ch[i];
Packit Service a31ea6
    output[i] = 0;
Packit Service a31ea6
Packit Service a31ea6
    fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", output, len);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * processingInstructionDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @target:  the target name
Packit Service a31ea6
 * @data: the PI data's
Packit Service a31ea6
 * @len: the number of xmlChar
Packit Service a31ea6
 *
Packit Service a31ea6
 * A processing instruction has been parsed.
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
Packit Service a31ea6
                      const xmlChar *data)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
Packit Service a31ea6
            (char *) target, (char *) data);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * commentDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @value:  the comment content
Packit Service a31ea6
 *
Packit Service a31ea6
 * A comment has been parsed.
Packit Service a31ea6
 */
Packit Service a31ea6
static void
Packit Service a31ea6
commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
Packit Service a31ea6
{
Packit Service a31ea6
    fprintf(stdout, "SAX.comment(%s)\n", value);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * warningDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @msg:  the message to display/transmit
Packit Service a31ea6
 * @...:  extra parameters for the message display
Packit Service a31ea6
 *
Packit Service a31ea6
 * Display and format a warning messages, gives file, line, position and
Packit Service a31ea6
 * extra parameters.
Packit Service a31ea6
 */
Packit Service a31ea6
static void XMLCDECL
Packit Service a31ea6
warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
Packit Service a31ea6
{
Packit Service a31ea6
    va_list args;
Packit Service a31ea6
Packit Service a31ea6
    va_start(args, msg);
Packit Service a31ea6
    fprintf(stdout, "SAX.warning: ");
Packit Service a31ea6
    vfprintf(stdout, msg, args);
Packit Service a31ea6
    va_end(args);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * errorDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @msg:  the message to display/transmit
Packit Service a31ea6
 * @...:  extra parameters for the message display
Packit Service a31ea6
 *
Packit Service a31ea6
 * Display and format a error messages, gives file, line, position and
Packit Service a31ea6
 * extra parameters.
Packit Service a31ea6
 */
Packit Service a31ea6
static void XMLCDECL
Packit Service a31ea6
errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
Packit Service a31ea6
{
Packit Service a31ea6
    va_list args;
Packit Service a31ea6
Packit Service a31ea6
    va_start(args, msg);
Packit Service a31ea6
    fprintf(stdout, "SAX.error: ");
Packit Service a31ea6
    vfprintf(stdout, msg, args);
Packit Service a31ea6
    va_end(args);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * fatalErrorDebug:
Packit Service a31ea6
 * @ctxt:  An XML parser context
Packit Service a31ea6
 * @msg:  the message to display/transmit
Packit Service a31ea6
 * @...:  extra parameters for the message display
Packit Service a31ea6
 *
Packit Service a31ea6
 * Display and format a fatalError messages, gives file, line, position and
Packit Service a31ea6
 * extra parameters.
Packit Service a31ea6
 */
Packit Service a31ea6
static void XMLCDECL
Packit Service a31ea6
fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
Packit Service a31ea6
{
Packit Service a31ea6
    va_list args;
Packit Service a31ea6
Packit Service a31ea6
    va_start(args, msg);
Packit Service a31ea6
    fprintf(stdout, "SAX.fatalError: ");
Packit Service a31ea6
    vfprintf(stdout, msg, args);
Packit Service a31ea6
    va_end(args);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
static xmlSAXHandler debugSAXHandlerStruct = {
Packit Service a31ea6
    internalSubsetDebug,
Packit Service a31ea6
    isStandaloneDebug,
Packit Service a31ea6
    hasInternalSubsetDebug,
Packit Service a31ea6
    hasExternalSubsetDebug,
Packit Service a31ea6
    resolveEntityDebug,
Packit Service a31ea6
    getEntityDebug,
Packit Service a31ea6
    entityDeclDebug,
Packit Service a31ea6
    notationDeclDebug,
Packit Service a31ea6
    attributeDeclDebug,
Packit Service a31ea6
    elementDeclDebug,
Packit Service a31ea6
    unparsedEntityDeclDebug,
Packit Service a31ea6
    setDocumentLocatorDebug,
Packit Service a31ea6
    startDocumentDebug,
Packit Service a31ea6
    endDocumentDebug,
Packit Service a31ea6
    startElementDebug,
Packit Service a31ea6
    endElementDebug,
Packit Service a31ea6
    referenceDebug,
Packit Service a31ea6
    charactersDebug,
Packit Service a31ea6
    ignorableWhitespaceDebug,
Packit Service a31ea6
    processingInstructionDebug,
Packit Service a31ea6
    commentDebug,
Packit Service a31ea6
    warningDebug,
Packit Service a31ea6
    errorDebug,
Packit Service a31ea6
    fatalErrorDebug,
Packit Service a31ea6
    getParameterEntityDebug,
Packit Service a31ea6
    cdataDebug,
Packit Service a31ea6
    NULL,
Packit Service a31ea6
    1,
Packit Service a31ea6
    NULL,
Packit Service a31ea6
    NULL,
Packit Service a31ea6
    NULL,
Packit Service a31ea6
    NULL
Packit Service a31ea6
};
Packit Service a31ea6
Packit Service a31ea6
xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
Packit Service a31ea6
/************************************************************************
Packit Service a31ea6
 *									*
Packit Service a31ea6
 *				Debug					*
Packit Service a31ea6
 *									*
Packit Service a31ea6
 ************************************************************************/
Packit Service a31ea6
Packit Service a31ea6
static void
Packit Service a31ea6
parseSAXFile(char *filename) {
Packit Service a31ea6
    htmlDocPtr doc = NULL;
Packit Service a31ea6
Packit Service a31ea6
    /*
Packit Service a31ea6
     * Empty callbacks for checking
Packit Service a31ea6
     */
Packit Service a31ea6
#ifdef LIBXML_PUSH_ENABLED
Packit Service a31ea6
    if (push) {
Packit Service a31ea6
	FILE *f;
Packit Service a31ea6
Packit Service a31ea6
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
Packit Service a31ea6
	f = fopen(filename, "rb");
Packit Service a31ea6
#else
Packit Service a31ea6
	f = fopen(filename, "r");
Packit Service a31ea6
#endif
Packit Service a31ea6
	if (f != NULL) {
Packit Service a31ea6
	    int res, size = 3;
Packit Service a31ea6
	    char chars[4096];
Packit Service a31ea6
	    htmlParserCtxtPtr ctxt;
Packit Service a31ea6
Packit Service a31ea6
	    /* if (repeat) */
Packit Service a31ea6
		size = 4096;
Packit Service a31ea6
	    res = fread(chars, 1, 4, f);
Packit Service a31ea6
	    if (res > 0) {
Packit Service a31ea6
		ctxt = htmlCreatePushParserCtxt(emptySAXHandler, NULL,
Packit Service a31ea6
			    chars, res, filename, XML_CHAR_ENCODING_NONE);
Packit Service a31ea6
		while ((res = fread(chars, 1, size, f)) > 0) {
Packit Service a31ea6
		    htmlParseChunk(ctxt, chars, res, 0);
Packit Service a31ea6
		}
Packit Service a31ea6
		htmlParseChunk(ctxt, chars, 0, 1);
Packit Service a31ea6
		doc = ctxt->myDoc;
Packit Service a31ea6
		htmlFreeParserCtxt(ctxt);
Packit Service a31ea6
	    }
Packit Service a31ea6
	    if (doc != NULL) {
Packit Service a31ea6
		fprintf(stdout, "htmlSAXParseFile returned non-NULL\n");
Packit Service a31ea6
		xmlFreeDoc(doc);
Packit Service a31ea6
	    }
Packit Service a31ea6
	    fclose(f);
Packit Service a31ea6
	}
Packit Service a31ea6
	if (!noout) {
Packit Service a31ea6
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
Packit Service a31ea6
		f = fopen(filename, "rb");
Packit Service a31ea6
#else
Packit Service a31ea6
		f = fopen(filename, "r");
Packit Service a31ea6
#endif
Packit Service a31ea6
	    if (f != NULL) {
Packit Service a31ea6
		int res, size = 3;
Packit Service a31ea6
		char chars[4096];
Packit Service a31ea6
		htmlParserCtxtPtr ctxt;
Packit Service a31ea6
Packit Service a31ea6
		/* if (repeat) */
Packit Service a31ea6
		    size = 4096;
Packit Service a31ea6
		res = fread(chars, 1, 4, f);
Packit Service a31ea6
		if (res > 0) {
Packit Service a31ea6
		    ctxt = htmlCreatePushParserCtxt(debugSAXHandler, NULL,
Packit Service a31ea6
				chars, res, filename, XML_CHAR_ENCODING_NONE);
Packit Service a31ea6
		    while ((res = fread(chars, 1, size, f)) > 0) {
Packit Service a31ea6
			htmlParseChunk(ctxt, chars, res, 0);
Packit Service a31ea6
		    }
Packit Service a31ea6
		    htmlParseChunk(ctxt, chars, 0, 1);
Packit Service a31ea6
		    doc = ctxt->myDoc;
Packit Service a31ea6
		    htmlFreeParserCtxt(ctxt);
Packit Service a31ea6
		}
Packit Service a31ea6
		if (doc != NULL) {
Packit Service a31ea6
		    fprintf(stdout, "htmlSAXParseFile returned non-NULL\n");
Packit Service a31ea6
		    xmlFreeDoc(doc);
Packit Service a31ea6
		}
Packit Service a31ea6
		fclose(f);
Packit Service a31ea6
	    }
Packit Service a31ea6
	}
Packit Service a31ea6
    } else {
Packit Service a31ea6
#endif /* LIBXML_PUSH_ENABLED */
Packit Service a31ea6
	doc = htmlSAXParseFile(filename, NULL, emptySAXHandler, NULL);
Packit Service a31ea6
	if (doc != NULL) {
Packit Service a31ea6
	    fprintf(stdout, "htmlSAXParseFile returned non-NULL\n");
Packit Service a31ea6
	    xmlFreeDoc(doc);
Packit Service a31ea6
	}
Packit Service a31ea6
Packit Service a31ea6
	if (!noout) {
Packit Service a31ea6
	    /*
Packit Service a31ea6
	     * Debug callback
Packit Service a31ea6
	     */
Packit Service a31ea6
	    doc = htmlSAXParseFile(filename, NULL, debugSAXHandler, NULL);
Packit Service a31ea6
	    if (doc != NULL) {
Packit Service a31ea6
		fprintf(stdout, "htmlSAXParseFile returned non-NULL\n");
Packit Service a31ea6
		xmlFreeDoc(doc);
Packit Service a31ea6
	    }
Packit Service a31ea6
	}
Packit Service a31ea6
#ifdef LIBXML_PUSH_ENABLED
Packit Service a31ea6
    }
Packit Service a31ea6
#endif /* LIBXML_PUSH_ENABLED */
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
static void
Packit Service a31ea6
parseAndPrintFile(char *filename) {
Packit Service a31ea6
    htmlDocPtr doc = NULL;
Packit Service a31ea6
Packit Service a31ea6
    /*
Packit Service a31ea6
     * build an HTML tree from a string;
Packit Service a31ea6
     */
Packit Service a31ea6
#ifdef LIBXML_PUSH_ENABLED
Packit Service a31ea6
    if (push) {
Packit Service a31ea6
	FILE *f;
Packit Service a31ea6
Packit Service a31ea6
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
Packit Service a31ea6
	f = fopen(filename, "rb");
Packit Service a31ea6
#else
Packit Service a31ea6
	f = fopen(filename, "r");
Packit Service a31ea6
#endif
Packit Service a31ea6
	if (f != NULL) {
Packit Service a31ea6
	    int res, size = 3;
Packit Service a31ea6
	    char chars[4096];
Packit Service a31ea6
	    htmlParserCtxtPtr ctxt;
Packit Service a31ea6
Packit Service a31ea6
	    /* if (repeat) */
Packit Service a31ea6
		size = 4096;
Packit Service a31ea6
	    res = fread(chars, 1, 4, f);
Packit Service a31ea6
	    if (res > 0) {
Packit Service a31ea6
		ctxt = htmlCreatePushParserCtxt(NULL, NULL,
Packit Service a31ea6
			    chars, res, filename, XML_CHAR_ENCODING_NONE);
Packit Service a31ea6
		while ((res = fread(chars, 1, size, f)) > 0) {
Packit Service a31ea6
		    htmlParseChunk(ctxt, chars, res, 0);
Packit Service a31ea6
		}
Packit Service a31ea6
		htmlParseChunk(ctxt, chars, 0, 1);
Packit Service a31ea6
		doc = ctxt->myDoc;
Packit Service a31ea6
		htmlFreeParserCtxt(ctxt);
Packit Service a31ea6
	    }
Packit Service a31ea6
	    fclose(f);
Packit Service a31ea6
	}
Packit Service a31ea6
    } else {
Packit Service a31ea6
	doc = htmlReadFile(filename, NULL, options);
Packit Service a31ea6
    }
Packit Service a31ea6
#else
Packit Service a31ea6
	doc = htmlReadFile(filename,NULL,options);
Packit Service a31ea6
#endif
Packit Service a31ea6
    if (doc == NULL) {
Packit Service a31ea6
        xmlGenericError(xmlGenericErrorContext,
Packit Service a31ea6
		"Could not parse %s\n", filename);
Packit Service a31ea6
    }
Packit Service a31ea6
Packit Service a31ea6
#ifdef LIBXML_TREE_ENABLED
Packit Service a31ea6
    /*
Packit Service a31ea6
     * test intermediate copy if needed.
Packit Service a31ea6
     */
Packit Service a31ea6
    if (copy) {
Packit Service a31ea6
        htmlDocPtr tmp;
Packit Service a31ea6
Packit Service a31ea6
        tmp = doc;
Packit Service a31ea6
	doc = xmlCopyDoc(doc, 1);
Packit Service a31ea6
	xmlFreeDoc(tmp);
Packit Service a31ea6
    }
Packit Service a31ea6
#endif
Packit Service a31ea6
Packit Service a31ea6
#ifdef LIBXML_OUTPUT_ENABLED
Packit Service a31ea6
    /*
Packit Service a31ea6
     * print it.
Packit Service a31ea6
     */
Packit Service a31ea6
    if (!noout) {
Packit Service a31ea6
#ifdef LIBXML_DEBUG_ENABLED
Packit Service a31ea6
	if (!debug) {
Packit Service a31ea6
	    if (encoding)
Packit Service a31ea6
		htmlSaveFileEnc("-", doc, encoding);
Packit Service a31ea6
	    else
Packit Service a31ea6
		htmlDocDump(stdout, doc);
Packit Service a31ea6
	} else
Packit Service a31ea6
	    xmlDebugDumpDocument(stdout, doc);
Packit Service a31ea6
#else
Packit Service a31ea6
	if (encoding)
Packit Service a31ea6
	    htmlSaveFileEnc("-", doc, encoding);
Packit Service a31ea6
	else
Packit Service a31ea6
	    htmlDocDump(stdout, doc);
Packit Service a31ea6
#endif
Packit Service a31ea6
    }
Packit Service a31ea6
#endif /* LIBXML_OUTPUT_ENABLED */
Packit Service a31ea6
Packit Service a31ea6
    /*
Packit Service a31ea6
     * free it.
Packit Service a31ea6
     */
Packit Service a31ea6
    xmlFreeDoc(doc);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
int main(int argc, char **argv) {
Packit Service a31ea6
    int i, count;
Packit Service a31ea6
    int files = 0;
Packit Service a31ea6
Packit Service a31ea6
    for (i = 1; i < argc ; i++) {
Packit Service a31ea6
#ifdef LIBXML_DEBUG_ENABLED
Packit Service a31ea6
	if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
Packit Service a31ea6
	    debug++;
Packit Service a31ea6
	else
Packit Service a31ea6
#endif
Packit Service a31ea6
	    if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
Packit Service a31ea6
	    copy++;
Packit Service a31ea6
#ifdef LIBXML_PUSH_ENABLED
Packit Service a31ea6
	else if ((!strcmp(argv[i], "-push")) || (!strcmp(argv[i], "--push")))
Packit Service a31ea6
	    push++;
Packit Service a31ea6
#endif /* LIBXML_PUSH_ENABLED */
Packit Service a31ea6
	else if ((!strcmp(argv[i], "-sax")) || (!strcmp(argv[i], "--sax")))
Packit Service a31ea6
	    sax++;
Packit Service a31ea6
	else if ((!strcmp(argv[i], "-noout")) || (!strcmp(argv[i], "--noout")))
Packit Service a31ea6
	    noout++;
Packit Service a31ea6
	else if ((!strcmp(argv[i], "-repeat")) ||
Packit Service a31ea6
	         (!strcmp(argv[i], "--repeat")))
Packit Service a31ea6
	    repeat++;
Packit Service a31ea6
	else if ((!strcmp(argv[i], "-encode")) ||
Packit Service a31ea6
	         (!strcmp(argv[i], "--encode"))) {
Packit Service a31ea6
	    i++;
Packit Service a31ea6
	    encoding = argv[i];
Packit Service a31ea6
        }
Packit Service a31ea6
    }
Packit Service a31ea6
    for (i = 1; i < argc ; i++) {
Packit Service a31ea6
	if ((!strcmp(argv[i], "-encode")) ||
Packit Service a31ea6
	         (!strcmp(argv[i], "--encode"))) {
Packit Service a31ea6
	    i++;
Packit Service a31ea6
	    continue;
Packit Service a31ea6
        }
Packit Service a31ea6
	if (argv[i][0] != '-') {
Packit Service a31ea6
	    if (repeat) {
Packit Service a31ea6
		for (count = 0;count < 100 * repeat;count++) {
Packit Service a31ea6
		    if (sax)
Packit Service a31ea6
			parseSAXFile(argv[i]);
Packit Service a31ea6
		    else
Packit Service a31ea6
			parseAndPrintFile(argv[i]);
Packit Service a31ea6
		}
Packit Service a31ea6
	    } else {
Packit Service a31ea6
		if (sax)
Packit Service a31ea6
		    parseSAXFile(argv[i]);
Packit Service a31ea6
		else
Packit Service a31ea6
		    parseAndPrintFile(argv[i]);
Packit Service a31ea6
	    }
Packit Service a31ea6
	    files ++;
Packit Service a31ea6
	}
Packit Service a31ea6
    }
Packit Service a31ea6
    if (files == 0) {
Packit Service a31ea6
	printf("Usage : %s [--debug] [--copy] [--copy] HTMLfiles ...\n",
Packit Service a31ea6
	       argv[0]);
Packit Service a31ea6
	printf("\tParse the HTML files and output the result of the parsing\n");
Packit Service a31ea6
#ifdef LIBXML_DEBUG_ENABLED
Packit Service a31ea6
	printf("\t--debug : dump a debug tree of the in-memory document\n");
Packit Service a31ea6
#endif
Packit Service a31ea6
	printf("\t--copy : used to test the internal copy implementation\n");
Packit Service a31ea6
	printf("\t--sax : debug the sequence of SAX callbacks\n");
Packit Service a31ea6
	printf("\t--repeat : parse the file 100 times, for timing\n");
Packit Service a31ea6
	printf("\t--noout : do not print the result\n");
Packit Service a31ea6
#ifdef LIBXML_PUSH_ENABLED
Packit Service a31ea6
	printf("\t--push : use the push mode parser\n");
Packit Service a31ea6
#endif /* LIBXML_PUSH_ENABLED */
Packit Service a31ea6
	printf("\t--encode encoding : output in the given encoding\n");
Packit Service a31ea6
    }
Packit Service a31ea6
    xmlCleanupParser();
Packit Service a31ea6
    xmlMemoryDump();
Packit Service a31ea6
Packit Service a31ea6
    return(0);
Packit Service a31ea6
}
Packit Service a31ea6
#else /* !LIBXML_HTML_ENABLED */
Packit Service a31ea6
#include <stdio.h>
Packit Service a31ea6
int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
Packit Service a31ea6
    printf("%s : HTML support not compiled in\n", argv[0]);
Packit Service a31ea6
    return(0);
Packit Service a31ea6
}
Packit Service a31ea6
#endif