10de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/*
20de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * testlimits.c: C program to run libxml2 regression tests checking various
30de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *       limits in document size. Will consume a lot of RAM and CPU cycles
40de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
50de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * To compile on Unixes:
60de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * cc -o testlimits `xml2-config --cflags` testlimits.c `xml2-config --libs` -lpthread
70de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
80de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * See Copyright for the status of this software.
90de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * daniel@veillard.com
110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include "libxml.h"
140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <stdio.h>
150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#if !defined(_WIN32) || defined(__CYGWIN__)
170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <unistd.h>
180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#endif
190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <string.h>
200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <sys/types.h>
210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <sys/stat.h>
220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <fcntl.h>
23e02869807eea99ded75d389855699e86f0c8d7d5Eric Zurcher#include <time.h>
240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <libxml/parser.h>
260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <libxml/parserInternals.h>
270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <libxml/tree.h>
280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <libxml/uri.h>
290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#ifdef LIBXML_READER_ENABLED
300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <libxml/xmlreader.h>
310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#endif
320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int verbose = 0;
340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int tests_quiet = 0;
350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/************************************************************************
370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
383f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *		time handling                                           *
393f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *									*
403f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard ************************************************************************/
413f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
42e02869807eea99ded75d389855699e86f0c8d7d5Eric Zurcher/* maximum time for one parsing before declaring a timeout */
433f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard#define MAX_TIME 2 /* seconds */
443f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
45e02869807eea99ded75d389855699e86f0c8d7d5Eric Zurcherstatic clock_t t0;
463f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardint timeout = 0;
473f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
483f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic void reset_timout(void) {
493f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    timeout = 0;
50e02869807eea99ded75d389855699e86f0c8d7d5Eric Zurcher    t0 = clock();
513f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
523f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
533f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic int check_time(void) {
54e02869807eea99ded75d389855699e86f0c8d7d5Eric Zurcher    clock_t tnow = clock();
55e02869807eea99ded75d389855699e86f0c8d7d5Eric Zurcher    if (((tnow - t0) / CLOCKS_PER_SEC) > MAX_TIME) {
563f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        timeout = 1;
573f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        return(0);
583f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
593f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    return(1);
603f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
613f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
623f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard/************************************************************************
633f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *									*
640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *		Huge document generator					*
650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard ************************************************************************/
670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#include <libxml/xmlIO.h>
690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/*
710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Huge documents are built using fixed start and end chunks
720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * and filling between the two an unconventional amount of char data
730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardtypedef struct hugeTest hugeTest;
750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardtypedef hugeTest *hugeTestPtr;
760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstruct hugeTest {
770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    const char *description;
780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    const char *name;
790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    const char *start;
800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    const char *end;
810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard};
820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic struct hugeTest hugeTests[] = {
840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    { "Huge text node", "huge:textNode", "<foo>", "</foo>" },
850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    { "Huge attribute node", "huge:attrNode", "<foo bar='", "'/>" },
860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    { "Huge comment node", "huge:commentNode", "<foo><!--", "--></foo>" },
87747c2c1083f1e226a9707112bbdfca21def7ac3dDaniel Veillard    { "Huge PI node", "huge:piNode", "<foo><?bar ", "?></foo>" },
880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard};
890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic const char *current;
910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int rlen;
920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic unsigned int currentTest = 0;
930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int instate = 0;
940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * hugeMatch:
970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @URI: an URI to test
980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Check for an huge: query
1000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
1010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns 1 if yes and 0 if another Input module should be used
1020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
1030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
1040de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardhugeMatch(const char * URI) {
1050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if ((URI != NULL) && (!strncmp(URI, "huge:", 5)))
1060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return(1);
1070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return(0);
1080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
1090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
1110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * hugeOpen:
1120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @URI: an URI to test
1130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
1140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Return a pointer to the huge: query handler, in this example simply
1150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * the current pointer...
1160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
1170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns an Input context or NULL in case or error
1180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
1190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void *
1200de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardhugeOpen(const char * URI) {
1210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if ((URI == NULL) || (strncmp(URI, "huge:", 5)))
1220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return(NULL);
1230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    for (currentTest = 0;currentTest < sizeof(hugeTests)/sizeof(hugeTests[0]);
1250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard         currentTest++)
1260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard         if (!strcmp(hugeTests[currentTest].name, URI))
1270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard             goto found;
1280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return(NULL);
1300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardfound:
1320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    rlen = strlen(hugeTests[currentTest].start);
1330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    current = hugeTests[currentTest].start;
1340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    instate = 0;
1350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return((void *) current);
1360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
1370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
1390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * hugeClose:
1400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @context: the read context
1410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
1420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Close the huge: query handler
1430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
1440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns 0 or -1 in case of error
1450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
1460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
1470de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardhugeClose(void * context) {
1480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (context == NULL) return(-1);
1493f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    fprintf(stderr, "\n");
1500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return(0);
1510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
1520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#define CHUNK 4096
1540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardchar filling[CHUNK + 1];
1560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void fillFilling(void) {
1580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int i;
1590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    for (i = 0;i < CHUNK;i++) {
1610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        filling[i] = 'a';
1620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
1630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    filling[CHUNK] = 0;
1640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
1650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardsize_t maxlen = 64 * 1024 * 1024;
1670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardsize_t curlen = 0;
1680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardsize_t dotlen;
1690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
1710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * hugeRead:
1720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @context: the read context
1730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @buffer: where to store data
1740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @len: number of bytes to read
1750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
1760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Implement an huge: query read.
1770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
1780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns the number of bytes read or -1 in case of error
1790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
1800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
1810de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardhugeRead(void *context, char *buffer, int len)
1820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
1830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if ((context == NULL) || (buffer == NULL) || (len < 0))
1840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return (-1);
1850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
1860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (instate == 0) {
1870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (len >= rlen) {
1880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            len = rlen;
1890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            rlen = 0;
1900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            memcpy(buffer, current, len);
1910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            instate = 1;
1920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            curlen = 0;
1930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            dotlen = maxlen / 10;
1940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        } else {
1950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            memcpy(buffer, current, len);
1960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            rlen -= len;
1970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            current += len;
1980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
1990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else if (instate == 2) {
2000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (len >= rlen) {
2010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            len = rlen;
2020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            rlen = 0;
2030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            memcpy(buffer, current, len);
2040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            instate = 3;
2050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            curlen = 0;
2060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        } else {
2070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            memcpy(buffer, current, len);
2080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            rlen -= len;
2090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            current += len;
2100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
2110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else if (instate == 1) {
2120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (len > CHUNK) len = CHUNK;
2130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        memcpy(buffer, &filling[0], len);
2140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        curlen += len;
2150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (curlen >= maxlen) {
2160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            rlen = strlen(hugeTests[currentTest].end);
2170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            current = hugeTests[currentTest].end;
2180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            instate = 2;
2190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	} else {
2200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            if (curlen > dotlen) {
2210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                fprintf(stderr, ".");
2220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                dotlen += maxlen / 10;
2230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            }
2240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
2250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else
2260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard      len = 0;
2270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return (len);
2280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
2290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
2300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/************************************************************************
2310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
2323f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *		Crazy document generator				*
2333f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *									*
2343f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard ************************************************************************/
2353f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
2363f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardunsigned int crazy_indx = 0;
2373f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
2383f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardconst char *crazy = "<?xml version='1.0' encoding='UTF-8'?>\
2393f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<?tst ?>\
2403f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<!-- tst -->\
2413f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<!DOCTYPE foo [\
2423f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<?tst ?>\
2433f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<!-- tst -->\
2443f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<!ELEMENT foo (#PCDATA)>\
2453f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<!ELEMENT p (#PCDATA|emph)* >\
2463f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard]>\
2473f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<?tst ?>\
2483f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<!-- tst -->\
2493f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<foo bar='foo'>\
2503f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<?tst ?>\
2513f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<!-- tst -->\
2523f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardfoo\
2533f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<![CDATA[ ]]>\
2543f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard</foo>\
2553f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<?tst ?>\
2563f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard<!-- tst -->";
2573f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
2583f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard/**
2593f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * crazyMatch:
2603f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * @URI: an URI to test
2613f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *
2623f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * Check for a crazy: query
2633f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *
2643f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * Returns 1 if yes and 0 if another Input module should be used
2653f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard */
2663f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic int
2673f0c613f28396c2b1acf90ad08382f0c9620d035Daniel VeillardcrazyMatch(const char * URI) {
2683f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if ((URI != NULL) && (!strncmp(URI, "crazy:", 6)))
2693f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        return(1);
2703f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    return(0);
2713f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
2723f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
2733f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard/**
2743f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * crazyOpen:
2753f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * @URI: an URI to test
2763f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *
2773f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * Return a pointer to the crazy: query handler, in this example simply
2783f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * the current pointer...
2793f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *
2803f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * Returns an Input context or NULL in case or error
2813f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard */
2823f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic void *
2833f0c613f28396c2b1acf90ad08382f0c9620d035Daniel VeillardcrazyOpen(const char * URI) {
2843f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if ((URI == NULL) || (strncmp(URI, "crazy:", 6)))
2853f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        return(NULL);
2863f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
2873f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (crazy_indx > strlen(crazy))
2883f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        return(NULL);
2893f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    reset_timout();
2903f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    rlen = crazy_indx;
2913f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    current = &crazy[0];
2923f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    instate = 0;
2933f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    return((void *) current);
2943f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
2953f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
2963f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard/**
2973f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * crazyClose:
2983f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * @context: the read context
2993f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *
3003f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * Close the crazy: query handler
3013f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *
3023f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * Returns 0 or -1 in case of error
3033f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard */
3043f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic int
3053f0c613f28396c2b1acf90ad08382f0c9620d035Daniel VeillardcrazyClose(void * context) {
3063f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (context == NULL) return(-1);
3073f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    return(0);
3083f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
3093f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
3103f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
3113f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard/**
3123f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * crazyRead:
3133f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * @context: the read context
3143f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * @buffer: where to store data
3153f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * @len: number of bytes to read
3163f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *
3173f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * Implement an crazy: query read.
3183f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *
3193f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * Returns the number of bytes read or -1 in case of error
3203f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard */
3213f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic int
3223f0c613f28396c2b1acf90ad08382f0c9620d035Daniel VeillardcrazyRead(void *context, char *buffer, int len)
3233f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard{
3243f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if ((context == NULL) || (buffer == NULL) || (len < 0))
3253f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        return (-1);
3263f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
3273f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if ((check_time() <= 0) && (instate == 1)) {
3283f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        fprintf(stderr, "\ntimeout in crazy(%d)\n", crazy_indx);
3293f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        rlen = strlen(crazy) - crazy_indx;
3303f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        current = &crazy[crazy_indx];
3313f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        instate = 2;
3323f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
3333f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (instate == 0) {
3343f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        if (len >= rlen) {
3353f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            len = rlen;
3363f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            rlen = 0;
3373f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            memcpy(buffer, current, len);
3383f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            instate = 1;
3393f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            curlen = 0;
3403f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        } else {
3413f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            memcpy(buffer, current, len);
3423f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            rlen -= len;
3433f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            current += len;
3443f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        }
3453f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    } else if (instate == 2) {
3463f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        if (len >= rlen) {
3473f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            len = rlen;
3483f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            rlen = 0;
3493f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            memcpy(buffer, current, len);
3503f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            instate = 3;
3513f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            curlen = 0;
3523f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        } else {
3533f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            memcpy(buffer, current, len);
3543f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            rlen -= len;
3553f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            current += len;
3563f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        }
3573f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    } else if (instate == 1) {
3583f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        if (len > CHUNK) len = CHUNK;
3593f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        memcpy(buffer, &filling[0], len);
3603f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        curlen += len;
3613f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        if (curlen >= maxlen) {
3623f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            rlen = strlen(crazy) - crazy_indx;
3633f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            current = &crazy[crazy_indx];
3643f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            instate = 2;
3653f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        }
3663f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    } else
3673f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard      len = 0;
3683f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    return (len);
3693f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
3703f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard/************************************************************************
3713f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard *									*
3720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *		Libxml2 specific routines				*
3730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
3740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard ************************************************************************/
3750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
3760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int nb_tests = 0;
3770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int nb_errors = 0;
3780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int nb_leaks = 0;
3790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int extraMemoryFromResolver = 0;
3800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
3810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/*
3820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * We need to trap calls to the resolver to not account memory for the catalog
3830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * which is shared to the current running test. We also don't want to have
3840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * network downloads modifying tests.
3850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
3860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic xmlParserInputPtr
3870de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardtestExternalEntityLoader(const char *URL, const char *ID,
3880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard			 xmlParserCtxtPtr ctxt) {
3890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlParserInputPtr ret;
3900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int memused = xmlMemUsed();
3910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
3920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
3930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    extraMemoryFromResolver += xmlMemUsed() - memused;
3940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
3950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return(ret);
3960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
3970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
3980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/*
3990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Trapping the error messages at the generic level to grab the equivalent of
4000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * stderr messages on CLI tools.
4010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
4020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic char testErrors[32769];
4030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int testErrorsSize = 0;
4040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
4050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void XMLCDECL
4060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardchannel(void *ctx  ATTRIBUTE_UNUSED, const char *msg, ...) {
4070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    va_list args;
4080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int res;
4090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
4100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (testErrorsSize >= 32768)
4110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return;
4120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    va_start(args, msg);
4130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    res = vsnprintf(&testErrors[testErrorsSize],
4140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                    32768 - testErrorsSize,
4150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard		    msg, args);
4160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    va_end(args);
4170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (testErrorsSize + res >= 32768) {
4180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        /* buffer is full */
4190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	testErrorsSize = 32768;
4200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	testErrors[testErrorsSize] = 0;
4210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else {
4220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        testErrorsSize += res;
4230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
4240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    testErrors[testErrorsSize] = 0;
4250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
4260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
4270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
4280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * xmlParserPrintFileContext:
4290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @input:  an xmlParserInputPtr input
4300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
4310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Displays current context within the input content for error tracking
4320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
4330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
4340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
4350de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardxmlParserPrintFileContextInternal(xmlParserInputPtr input ,
4360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard		xmlGenericErrorFunc chanl, void *data ) {
4370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    const xmlChar *cur, *base;
4380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    unsigned int n, col;	/* GCC warns if signed, because compared with sizeof() */
4390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlChar  content[81]; /* space for 80 chars + line terminator */
4400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlChar *ctnt;
4410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
4420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (input == NULL) return;
4430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    cur = input->cur;
4440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    base = input->base;
4450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /* skip backwards over any end-of-lines */
4460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) {
4470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	cur--;
4480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
4490de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    n = 0;
4500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /* search backwards for beginning-of-line (to max buff size) */
4510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    while ((n++ < (sizeof(content)-1)) && (cur > base) &&
4520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard   (*(cur) != '\n') && (*(cur) != '\r'))
4530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        cur--;
4540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if ((*(cur) == '\n') || (*(cur) == '\r')) cur++;
4550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /* calculate the error position in terms of the current position */
4560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    col = input->cur - cur;
4570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /* search forward for end-of-line (to max buff size) */
4580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    n = 0;
4590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    ctnt = content;
4600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /* copy selected text to our buffer */
4610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    while ((*cur != 0) && (*(cur) != '\n') &&
4620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard   (*(cur) != '\r') && (n < sizeof(content)-1)) {
4630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard		*ctnt++ = *cur++;
4640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	n++;
4650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
4660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    *ctnt = 0;
4670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /* print out the selected text */
4680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    chanl(data ,"%s\n", content);
4690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /* create blank line with problem pointer */
4700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    n = 0;
4710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    ctnt = content;
4720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /* (leave buffer space for pointer + line terminator) */
4730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    while ((n<col) && (n++ < sizeof(content)-2) && (*ctnt != 0)) {
4740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	if (*(ctnt) != '\t')
4750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	    *(ctnt) = ' ';
4760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	ctnt++;
4770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
4780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    *ctnt++ = '^';
4790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    *ctnt = 0;
4800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    chanl(data ,"%s\n", content);
4810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
4820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
4830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
4840de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardtestStructuredErrorHandler(void *ctx  ATTRIBUTE_UNUSED, xmlErrorPtr err) {
4850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    char *file = NULL;
4860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int line = 0;
4870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int code = -1;
4880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int domain;
4890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    void *data = NULL;
4900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    const char *str;
4910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    const xmlChar *name = NULL;
4920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlNodePtr node;
4930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlErrorLevel level;
4940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlParserInputPtr input = NULL;
4950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlParserInputPtr cur = NULL;
4960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlParserCtxtPtr ctxt = NULL;
4970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
4980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (err == NULL)
4990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return;
5000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
5010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    file = err->file;
5020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    line = err->line;
5030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    code = err->code;
5040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    domain = err->domain;
5050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    level = err->level;
5060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    node = err->node;
5070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) ||
5080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) ||
5090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	(domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) {
5100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	ctxt = err->ctxt;
5110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
5120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    str = err->message;
5130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
5140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (code == XML_ERR_OK)
5150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return;
5160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
5170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if ((node != NULL) && (node->type == XML_ELEMENT_NODE))
5180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        name = node->name;
5190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
5200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /*
5210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard     * Maintain the compatibility with the legacy error handling
5220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard     */
5230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (ctxt != NULL) {
5240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        input = ctxt->input;
5250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if ((input != NULL) && (input->filename == NULL) &&
5260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            (ctxt->inputNr > 1)) {
5270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            cur = input;
5280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            input = ctxt->inputTab[ctxt->inputNr - 2];
5290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
5300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (input != NULL) {
5310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            if (input->filename)
5320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                channel(data, "%s:%d: ", input->filename, input->line);
5330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            else if ((line != 0) && (domain == XML_FROM_PARSER))
5340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                channel(data, "Entity: line %d: ", input->line);
5350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
5360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else {
5370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (file != NULL)
5380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "%s:%d: ", file, line);
5390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        else if ((line != 0) && (domain == XML_FROM_PARSER))
5400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "Entity: line %d: ", line);
5410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
5420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (name != NULL) {
5430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        channel(data, "element %s: ", name);
5440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
5450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (code == XML_ERR_OK)
5460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return;
5470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    switch (domain) {
5480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_PARSER:
5490de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "parser ");
5500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_NAMESPACE:
5520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "namespace ");
5530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_DTD:
5550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_VALID:
5560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "validity ");
5570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_HTML:
5590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "HTML parser ");
5600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_MEMORY:
5620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "memory ");
5630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_OUTPUT:
5650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "output ");
5660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_IO:
5680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "I/O ");
5690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_XINCLUDE:
5710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "XInclude ");
5720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_XPATH:
5740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "XPath ");
5750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_XPOINTER:
5770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "parser ");
5780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_REGEXP:
5800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "regexp ");
5810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_MODULE:
5830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "module ");
5840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_SCHEMASV:
5860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "Schemas validity ");
5870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_SCHEMASP:
5890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "Schemas parser ");
5900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_RELAXNGP:
5920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "Relax-NG parser ");
5930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_RELAXNGV:
5950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "Relax-NG validity ");
5960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
5970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_CATALOG:
5980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "Catalog ");
5990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
6000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_C14N:
6010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "C14N ");
6020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
6030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_FROM_XSLT:
6040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "XSLT ");
6050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
6060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        default:
6070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
6080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
6090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (code == XML_ERR_OK)
6100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return;
6110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    switch (level) {
6120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_ERR_NONE:
6130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, ": ");
6140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
6150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_ERR_WARNING:
6160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "warning : ");
6170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
6180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_ERR_ERROR:
6190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "error : ");
6200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
6210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        case XML_ERR_FATAL:
6220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            channel(data, "error : ");
6230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            break;
6240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
6250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (code == XML_ERR_OK)
6260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return;
6270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (str != NULL) {
6280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        int len;
6290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	len = xmlStrlen((const xmlChar *)str);
6300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	if ((len > 0) && (str[len - 1] != '\n'))
6310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	    channel(data, "%s\n", str);
6320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	else
6330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	    channel(data, "%s", str);
6340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else {
6350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        channel(data, "%s\n", "out of memory error");
6360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
6370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (code == XML_ERR_OK)
6380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        return;
6390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
6400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (ctxt != NULL) {
6410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        xmlParserPrintFileContextInternal(input, channel, data);
6420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (cur != NULL) {
6430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            if (cur->filename)
6440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                channel(data, "%s:%d: \n", cur->filename, cur->line);
6450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            else if ((line != 0) && (domain == XML_FROM_PARSER))
6460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                channel(data, "Entity: line %d: \n", cur->line);
6470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            xmlParserPrintFileContextInternal(cur, channel, data);
6480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
6490de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
6500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) &&
6510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        (err->int1 < 100) &&
6520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	(err->int1 < xmlStrlen((const xmlChar *)err->str1))) {
6530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	xmlChar buf[150];
6540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	int i;
6550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
6560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	channel(data, "%s\n", err->str1);
6570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	for (i=0;i < err->int1;i++)
6580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	     buf[i] = ' ';
6590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	buf[i++] = '^';
6600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	buf[i] = 0;
6610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	channel(data, "%s\n", buf);
6620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
6630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
6640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
6650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
6660de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardinitializeLibxml2(void) {
6670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlGetWarningsDefaultValue = 0;
6680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlPedanticParserDefault(0);
6690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
6700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);
6710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlInitParser();
6720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlSetExternalEntityLoader(testExternalEntityLoader);
6730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlSetStructuredErrorFunc(NULL, testStructuredErrorHandler);
6740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /*
6750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard     * register the new I/O handlers
6760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard     */
6770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (xmlRegisterInputCallbacks(hugeMatch, hugeOpen,
6780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                                  hugeRead, hugeClose) < 0) {
6790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        fprintf(stderr, "failed to register Huge handlers\n");
6800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	exit(1);
6810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
6823f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (xmlRegisterInputCallbacks(crazyMatch, crazyOpen,
6833f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard                                  crazyRead, crazyClose) < 0) {
6843f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        fprintf(stderr, "failed to register Crazy handlers\n");
6853f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard	exit(1);
6863f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
6870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
6880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
6890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/************************************************************************
6900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
6910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *		SAX empty callbacks                                     *
6920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
6930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard ************************************************************************/
6940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
6950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardunsigned long callbacks = 0;
6960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
6970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
6980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * isStandaloneCallback:
6990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
7000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Is this document tagged standalone ?
7020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns 1 if true
7040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
7050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
7060de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardisStandaloneCallback(void *ctx ATTRIBUTE_UNUSED)
7070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
7080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
7090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return (0);
7100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
7110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
7120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
7130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * hasInternalSubsetCallback:
7140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
7150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Does this document has an internal subset
7170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns 1 if true
7190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
7200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
7210de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardhasInternalSubsetCallback(void *ctx ATTRIBUTE_UNUSED)
7220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
7230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
7240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return (0);
7250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
7260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
7270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
7280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * hasExternalSubsetCallback:
7290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
7300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Does this document has an external subset
7320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns 1 if true
7340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
7350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
7360de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardhasExternalSubsetCallback(void *ctx ATTRIBUTE_UNUSED)
7370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
7380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
7390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return (0);
7400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
7410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
7420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
7430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * internalSubsetCallback:
7440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
7450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Does this document has an internal subset
7470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
7480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
7490de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardinternalSubsetCallback(void *ctx ATTRIBUTE_UNUSED,
7500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar * name ATTRIBUTE_UNUSED,
7510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar * ExternalID ATTRIBUTE_UNUSED,
7520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar * SystemID ATTRIBUTE_UNUSED)
7530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
7540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
7550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
7560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
7570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
7580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
7590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * externalSubsetCallback:
7600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
7610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Does this document has an external subset
7630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
7640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
7650de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardexternalSubsetCallback(void *ctx ATTRIBUTE_UNUSED,
7660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar * name ATTRIBUTE_UNUSED,
7670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar * ExternalID ATTRIBUTE_UNUSED,
7680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar * SystemID ATTRIBUTE_UNUSED)
7690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
7700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
7710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
7720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
7730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
7740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
7750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * resolveEntityCallback:
7760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
7770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @publicId: The public ID of the entity
7780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @systemId: The system ID of the entity
7790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Special entity resolver, better left to the parser, it has
7810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * more context than the application layer.
7820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * The default behaviour is to NOT resolve the entities, in that case
7830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * the ENTITY_REF nodes are built in the structure (and the parameter
7840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * values).
7850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
7860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
7870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
7880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic xmlParserInputPtr
7890de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardresolveEntityCallback(void *ctx ATTRIBUTE_UNUSED,
7900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                      const xmlChar * publicId ATTRIBUTE_UNUSED,
7910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                      const xmlChar * systemId ATTRIBUTE_UNUSED)
7920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
7930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
7940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return (NULL);
7950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
7960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
7970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
7980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * getEntityCallback:
7990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
8000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @name: The entity name
8010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
8020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Get an entity by name
8030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
8040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
8050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
8060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic xmlEntityPtr
8070de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardgetEntityCallback(void *ctx ATTRIBUTE_UNUSED,
8080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                  const xmlChar * name ATTRIBUTE_UNUSED)
8090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
8100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
8110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return (NULL);
8120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
8130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
8140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
8150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * getParameterEntityCallback:
8160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
8170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @name: The entity name
8180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
8190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Get a parameter entity by name
8200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
8210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns the xmlParserInputPtr
8220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
8230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic xmlEntityPtr
8240de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardgetParameterEntityCallback(void *ctx ATTRIBUTE_UNUSED,
8250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                           const xmlChar * name ATTRIBUTE_UNUSED)
8260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
8270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
8280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return (NULL);
8290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
8300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
8310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
8320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
8330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * entityDeclCallback:
8340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
835f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * @name:  the entity name
836f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * @type:  the entity type
8370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @publicId: The public ID of the entity
8380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @systemId: The system ID of the entity
8390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @content: the entity value (without processing).
8400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
8410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * An entity definition has been parsed
8420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
8430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
8440de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardentityDeclCallback(void *ctx ATTRIBUTE_UNUSED,
8450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   const xmlChar * name ATTRIBUTE_UNUSED,
8460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   int type ATTRIBUTE_UNUSED,
8470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   const xmlChar * publicId ATTRIBUTE_UNUSED,
8480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   const xmlChar * systemId ATTRIBUTE_UNUSED,
8490de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   xmlChar * content ATTRIBUTE_UNUSED)
8500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
8510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
8520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
8530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
8540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
8550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
8560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * attributeDeclCallback:
8570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
858f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * @name:  the attribute name
859f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * @type:  the attribute type
8600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
8610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * An attribute definition has been parsed
8620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
8630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
8640de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardattributeDeclCallback(void *ctx ATTRIBUTE_UNUSED,
8650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                      const xmlChar * elem ATTRIBUTE_UNUSED,
8660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                      const xmlChar * name ATTRIBUTE_UNUSED,
8670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                      int type ATTRIBUTE_UNUSED, int def ATTRIBUTE_UNUSED,
8680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                      const xmlChar * defaultValue ATTRIBUTE_UNUSED,
8690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                      xmlEnumerationPtr tree ATTRIBUTE_UNUSED)
8700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
8710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
8720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
8730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
8740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
8750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
8760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * elementDeclCallback:
8770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
878f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * @name:  the element name
879f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * @type:  the element type
8800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @content: the element value (without processing).
8810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
8820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * An element definition has been parsed
8830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
8840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
8850de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardelementDeclCallback(void *ctx ATTRIBUTE_UNUSED,
8860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                    const xmlChar * name ATTRIBUTE_UNUSED,
8870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                    int type ATTRIBUTE_UNUSED,
8880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                    xmlElementContentPtr content ATTRIBUTE_UNUSED)
8890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
8900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
8910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
8920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
8930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
8940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
8950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * notationDeclCallback:
8960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
8970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @name: The name of the notation
8980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @publicId: The public ID of the entity
8990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @systemId: The system ID of the entity
9000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
9010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * What to do when a notation declaration has been parsed.
9020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
9030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
9040de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardnotationDeclCallback(void *ctx ATTRIBUTE_UNUSED,
9050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                     const xmlChar * name ATTRIBUTE_UNUSED,
9060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                     const xmlChar * publicId ATTRIBUTE_UNUSED,
9070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                     const xmlChar * systemId ATTRIBUTE_UNUSED)
9080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
9090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
9100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
9110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
9120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
9130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
9140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * unparsedEntityDeclCallback:
9150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
9160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @name: The name of the entity
9170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @publicId: The public ID of the entity
9180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @systemId: The system ID of the entity
9190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @notationName: the name of the notation
9200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
9210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * What to do when an unparsed entity declaration is parsed
9220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
9230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
9240de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardunparsedEntityDeclCallback(void *ctx ATTRIBUTE_UNUSED,
9250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                           const xmlChar * name ATTRIBUTE_UNUSED,
9260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                           const xmlChar * publicId ATTRIBUTE_UNUSED,
9270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                           const xmlChar * systemId ATTRIBUTE_UNUSED,
9280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                           const xmlChar * notationName ATTRIBUTE_UNUSED)
9290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
9300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
9310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
9320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
9330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
9340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
9350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * setDocumentLocatorCallback:
9360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
9370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @loc: A SAX Locator
9380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
9390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Receive the document locator at startup, actually xmlDefaultSAXLocator
9400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Everything is available on the context, so this is useless in our case.
9410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
9420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
9430de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardsetDocumentLocatorCallback(void *ctx ATTRIBUTE_UNUSED,
9440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                           xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
9450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
9460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
9470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
9480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
9490de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
9500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
9510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * startDocumentCallback:
9520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
9530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
9540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * called when the document start being processed.
9550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
9560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
9570de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardstartDocumentCallback(void *ctx ATTRIBUTE_UNUSED)
9580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
9590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
9600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
9610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
9620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
9630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
9640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * endDocumentCallback:
9650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
9660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
9670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * called when the document end has been detected.
9680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
9690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
9700de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardendDocumentCallback(void *ctx ATTRIBUTE_UNUSED)
9710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
9720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
9730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
9740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
9750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
9760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#if 0
9770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
9780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * startElementCallback:
9790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
9800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @name:  The element name
9810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
9820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * called when an opening tag has been processed.
9830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
9840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
9850de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardstartElementCallback(void *ctx ATTRIBUTE_UNUSED,
9860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                     const xmlChar * name ATTRIBUTE_UNUSED,
9870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                     const xmlChar ** atts ATTRIBUTE_UNUSED)
9880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
9890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
9900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
9910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
9920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
9930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
9940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * endElementCallback:
9950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
9960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @name:  The element name
9970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
9980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * called when the end of an element has been detected.
9990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
10000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
10010de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardendElementCallback(void *ctx ATTRIBUTE_UNUSED,
10020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   const xmlChar * name ATTRIBUTE_UNUSED)
10030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
10040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
10050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
10060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
10070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#endif
10080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
10090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
10100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * charactersCallback:
10110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
10120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ch:  a xmlChar string
10130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @len: the number of xmlChar
10140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
10150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * receiving some chars from the parser.
10160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Question: how much at a time ???
10170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
10180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
10190de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardcharactersCallback(void *ctx ATTRIBUTE_UNUSED,
10200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   const xmlChar * ch ATTRIBUTE_UNUSED,
10210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   int len ATTRIBUTE_UNUSED)
10220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
10230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
10240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
10250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
10260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
10270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
10280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * referenceCallback:
10290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
10300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @name:  The entity name
10310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
1032f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * called when an entity reference is detected.
10330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
10340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
10350de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardreferenceCallback(void *ctx ATTRIBUTE_UNUSED,
10360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                  const xmlChar * name ATTRIBUTE_UNUSED)
10370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
10380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
10390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
10400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
10410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
10420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
10430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * ignorableWhitespaceCallback:
10440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
10450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ch:  a xmlChar string
10460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @start: the first char in the string
10470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @len: the number of xmlChar
10480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
10490de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * receiving some ignorable whitespaces from the parser.
10500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Question: how much at a time ???
10510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
10520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
10530de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardignorableWhitespaceCallback(void *ctx ATTRIBUTE_UNUSED,
10540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                            const xmlChar * ch ATTRIBUTE_UNUSED,
10550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                            int len ATTRIBUTE_UNUSED)
10560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
10570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
10580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
10590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
10600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
10610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
10620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * processingInstructionCallback:
10630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
10640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @target:  the target name
10650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @data: the PI data's
10660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @len: the number of xmlChar
10670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
10680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * A processing instruction has been parsed.
10690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
10700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
10710de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardprocessingInstructionCallback(void *ctx ATTRIBUTE_UNUSED,
10720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                              const xmlChar * target ATTRIBUTE_UNUSED,
10730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                              const xmlChar * data ATTRIBUTE_UNUSED)
10740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
10750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
10760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
10770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
10780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
10790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
10800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * cdataBlockCallback:
10810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctx: the user data (XML parser context)
10820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @value:  The pcdata content
10830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @len:  the block length
10840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
10850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * called when a pcdata block has been parsed
10860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
10870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
10880de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardcdataBlockCallback(void *ctx ATTRIBUTE_UNUSED,
10890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   const xmlChar * value ATTRIBUTE_UNUSED,
10900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   int len ATTRIBUTE_UNUSED)
10910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
10920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
10930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
10940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
10950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
10960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
10970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * commentCallback:
10980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
10990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @value:  the comment content
11000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
11010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * A comment has been parsed.
11020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
11030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
11040de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardcommentCallback(void *ctx ATTRIBUTE_UNUSED,
11050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                const xmlChar * value ATTRIBUTE_UNUSED)
11060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
11070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
11080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
11090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
11100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
11110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
11120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * warningCallback:
11130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
11140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @msg:  the message to display/transmit
11150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @...:  extra parameters for the message display
11160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
11170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Display and format a warning messages, gives file, line, position and
11180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * extra parameters.
11190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
11200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void XMLCDECL
11210de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardwarningCallback(void *ctx ATTRIBUTE_UNUSED,
11220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                const char *msg ATTRIBUTE_UNUSED, ...)
11230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
11240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
11250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
11260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
11270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
11280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
11290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * errorCallback:
11300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
11310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @msg:  the message to display/transmit
11320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @...:  extra parameters for the message display
11330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
11340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Display and format a error messages, gives file, line, position and
11350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * extra parameters.
11360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
11370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void XMLCDECL
11380de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillarderrorCallback(void *ctx ATTRIBUTE_UNUSED, const char *msg ATTRIBUTE_UNUSED,
11390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard              ...)
11400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
11410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
11420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
11430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
11440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
11450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
11460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * fatalErrorCallback:
11470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
11480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @msg:  the message to display/transmit
11490de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @...:  extra parameters for the message display
11500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
11510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Display and format a fatalError messages, gives file, line, position and
11520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * extra parameters.
11530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
11540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void XMLCDECL
11550de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardfatalErrorCallback(void *ctx ATTRIBUTE_UNUSED,
11560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                   const char *msg ATTRIBUTE_UNUSED, ...)
11570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
11580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
11590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
11600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
11610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
11620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/*
11630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * SAX2 specific callbacks
11640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
11650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
11660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
11670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * startElementNsCallback:
11680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
11690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @name:  The element name
11700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
11710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * called when an opening tag has been processed.
11720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
11730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
11740de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardstartElementNsCallback(void *ctx ATTRIBUTE_UNUSED,
11750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar * localname ATTRIBUTE_UNUSED,
11760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar * prefix ATTRIBUTE_UNUSED,
11770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar * URI ATTRIBUTE_UNUSED,
11780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       int nb_namespaces ATTRIBUTE_UNUSED,
11790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar ** namespaces ATTRIBUTE_UNUSED,
11800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       int nb_attributes ATTRIBUTE_UNUSED,
11810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       int nb_defaulted ATTRIBUTE_UNUSED,
11820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                       const xmlChar ** attributes ATTRIBUTE_UNUSED)
11830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
11840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
11850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
11860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
11870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
11880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
11890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * endElementCallback:
11900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @ctxt:  An XML parser context
11910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @name:  The element name
11920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
11930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * called when the end of an element has been detected.
11940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
11950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic void
11960de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardendElementNsCallback(void *ctx ATTRIBUTE_UNUSED,
11970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                     const xmlChar * localname ATTRIBUTE_UNUSED,
11980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                     const xmlChar * prefix ATTRIBUTE_UNUSED,
11990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                     const xmlChar * URI ATTRIBUTE_UNUSED)
12000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard{
12010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    callbacks++;
12020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return;
12030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
12040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
12050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic xmlSAXHandler callbackSAX2HandlerStruct = {
12060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    internalSubsetCallback,
12070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    isStandaloneCallback,
12080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    hasInternalSubsetCallback,
12090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    hasExternalSubsetCallback,
12100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    resolveEntityCallback,
12110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    getEntityCallback,
12120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    entityDeclCallback,
12130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    notationDeclCallback,
12140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    attributeDeclCallback,
12150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    elementDeclCallback,
12160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    unparsedEntityDeclCallback,
12170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    setDocumentLocatorCallback,
12180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    startDocumentCallback,
12190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    endDocumentCallback,
12200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    NULL,
12210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    NULL,
12220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    referenceCallback,
12230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    charactersCallback,
12240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    ignorableWhitespaceCallback,
12250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    processingInstructionCallback,
12260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    commentCallback,
12270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    warningCallback,
12280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    errorCallback,
12290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    fatalErrorCallback,
12300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    getParameterEntityCallback,
12310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    cdataBlockCallback,
12320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    externalSubsetCallback,
12330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    XML_SAX2_MAGIC,
12340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    NULL,
12350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    startElementNsCallback,
12360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    endElementNsCallback,
12370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    NULL
12380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard};
12390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
12400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic xmlSAXHandlerPtr callbackSAX2Handler = &callbackSAX2HandlerStruct;
12410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
12420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/************************************************************************
12430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
12440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *		The tests front-ends                                     *
12450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
12460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard ************************************************************************/
12470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
12480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
12490de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * readerTest:
12500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @filename: the file to parse
12510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @max_size: size of the limit to test
12520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @options: parsing options
12530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @fail: should a failure be reported
12540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
12553f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard * Parse a memory generated file using SAX
12560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
12570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns 0 in case of success, an error code otherwise
12580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
12590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
12600de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardsaxTest(const char *filename, size_t limit, int options, int fail) {
12610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int res = 0;
12620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlParserCtxtPtr ctxt;
12630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlDocPtr doc;
12640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlSAXHandlerPtr old_sax;
12650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
12660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    nb_tests++;
12670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
12680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    maxlen = limit;
12690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    ctxt = xmlNewParserCtxt();
12700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (ctxt == NULL) {
12710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        fprintf(stderr, "Failed to create parser context\n");
12720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	return(1);
12730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
12740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    old_sax = ctxt->sax;
12750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    ctxt->sax = callbackSAX2Handler;
12760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    ctxt->userData = NULL;
12770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
12780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
12790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (doc != NULL) {
12800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        fprintf(stderr, "SAX parsing generated a document !\n");
12810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        xmlFreeDoc(doc);
12820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        res = 0;
12830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else if (ctxt->wellFormed == 0) {
12840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (fail)
12850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            res = 0;
12860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        else {
12870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            fprintf(stderr, "Failed to parse '%s' %lu\n", filename, limit);
12880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            res = 1;
12890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
12900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else {
12910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (fail) {
12920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            fprintf(stderr, "Failed to get failure for '%s' %lu\n",
12930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                    filename, limit);
12940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            res = 1;
12950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        } else
12960de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            res = 0;
12970de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
12980de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    ctxt->sax = old_sax;
12990de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlFreeParserCtxt(ctxt);
13000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
13010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return(res);
13020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
13030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#ifdef LIBXML_READER_ENABLED
13040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/**
13050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * readerTest:
13060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @filename: the file to parse
13070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @max_size: size of the limit to test
13080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @options: parsing options
13090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * @fail: should a failure be reported
13100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
13110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Parse a memory generated file using the xmlReader
13120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *
13130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard * Returns 0 in case of success, an error code otherwise
13140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard */
13150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
13160de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardreaderTest(const char *filename, size_t limit, int options, int fail) {
13170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlTextReaderPtr reader;
13180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int res = 0;
13190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int ret;
13200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
13210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    nb_tests++;
13220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
13230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    maxlen = limit;
13240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    reader = xmlReaderForFile(filename , NULL, options);
13250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (reader == NULL) {
13260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        fprintf(stderr, "Failed to open '%s' test\n", filename);
13270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	return(1);
13280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
13290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    ret = xmlTextReaderRead(reader);
13300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    while (ret == 1) {
13310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        ret = xmlTextReaderRead(reader);
13320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
13330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (ret != 0) {
13340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (fail)
13350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            res = 0;
13360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        else {
1337f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard            if (strncmp(filename, "crazy:", 6) == 0)
13383f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard                fprintf(stderr, "Failed to parse '%s' %u\n",
13393f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard                        filename, crazy_indx);
13403f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            else
13413f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard                fprintf(stderr, "Failed to parse '%s' %lu\n",
13423f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard                        filename, limit);
13430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            res = 1;
13440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
13450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else {
13460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (fail) {
1347f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard            if (strncmp(filename, "crazy:", 6) == 0)
13483f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard                fprintf(stderr, "Failed to get failure for '%s' %u\n",
13493f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard                        filename, crazy_indx);
13503f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            else
13513f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard                fprintf(stderr, "Failed to get failure for '%s' %lu\n",
13523f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard                        filename, limit);
13530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            res = 1;
13540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        } else
13550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            res = 0;
13560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
13573f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (timeout)
13583f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        res = 1;
13590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlFreeTextReader(reader);
13600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
13610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return(res);
13620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
13630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#endif
13640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
13650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/************************************************************************
13660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
13670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *			Tests descriptions				*
13680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard *									*
13690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard ************************************************************************/
13700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
13710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardtypedef int (*functest) (const char *filename, size_t limit, int options,
13720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                         int fail);
13730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
13740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardtypedef struct limitDesc limitDesc;
13750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardtypedef limitDesc *limitDescPtr;
13760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstruct limitDesc {
13770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    const char *name; /* the huge generator name */
13780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    size_t limit;     /* the limit to test */
13790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int options;      /* extra parser options */
13800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int fail;         /* whether the test should fail */
13810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard};
13820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
13830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic limitDesc limitDescriptions[] = {
1384fb27e2cd204ddb2cb0163b4b6418cc494889d279Michael Wood    /* max length of a text node in content */
13850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {"huge:textNode", XML_MAX_TEXT_LENGTH - CHUNK, 0, 0},
13860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {"huge:textNode", XML_MAX_TEXT_LENGTH + CHUNK, 0, 1},
13870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {"huge:textNode", XML_MAX_TEXT_LENGTH + CHUNK, XML_PARSE_HUGE, 0},
1388fb27e2cd204ddb2cb0163b4b6418cc494889d279Michael Wood    /* max length of a text node in content */
13890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {"huge:attrNode", XML_MAX_TEXT_LENGTH - CHUNK, 0, 0},
13900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {"huge:attrNode", XML_MAX_TEXT_LENGTH + CHUNK, 0, 1},
13910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {"huge:attrNode", XML_MAX_TEXT_LENGTH + CHUNK, XML_PARSE_HUGE, 0},
1392fb27e2cd204ddb2cb0163b4b6418cc494889d279Michael Wood    /* max length of a comment node */
13930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {"huge:commentNode", XML_MAX_TEXT_LENGTH - CHUNK, 0, 0},
13940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {"huge:commentNode", XML_MAX_TEXT_LENGTH + CHUNK, 0, 1},
13950de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {"huge:commentNode", XML_MAX_TEXT_LENGTH + CHUNK, XML_PARSE_HUGE, 0},
1396fb27e2cd204ddb2cb0163b4b6418cc494889d279Michael Wood    /* max length of a PI node */
1397747c2c1083f1e226a9707112bbdfca21def7ac3dDaniel Veillard    {"huge:piNode", XML_MAX_TEXT_LENGTH - CHUNK, 0, 0},
1398747c2c1083f1e226a9707112bbdfca21def7ac3dDaniel Veillard    {"huge:piNode", XML_MAX_TEXT_LENGTH + CHUNK, 0, 1},
1399747c2c1083f1e226a9707112bbdfca21def7ac3dDaniel Veillard    {"huge:piNode", XML_MAX_TEXT_LENGTH + CHUNK, XML_PARSE_HUGE, 0},
14000de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard};
14010de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardtypedef struct testDesc testDesc;
14030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardtypedef testDesc *testDescPtr;
14040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstruct testDesc {
14050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    const char *desc; /* descripton of the test */
14060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    functest    func; /* function implementing the test */
14070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard};
14080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic
14100de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardtestDesc testDescriptions[] = {
14110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    { "Parsing of huge files with the sax parser", saxTest},
14120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard/*    { "Parsing of huge files with the tree parser", treeTest}, */
14130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#ifdef LIBXML_READER_ENABLED
14140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    { "Parsing of huge files with the reader", readerTest},
14150de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard#endif
14160de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    {NULL, NULL}
14170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard};
14180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardtypedef struct testException testException;
14200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardtypedef testException *testExceptionPtr;
14210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstruct testException {
14220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    unsigned int test;  /* the parser test number */
14230de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    unsigned int limit; /* the limit test number */
14240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int fail;           /* new fail value or -1*/
14250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    size_t size;        /* new limit value or 0 */
14260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard};
14270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic
14290de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardtestException testExceptions[] = {
14300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    /* the SAX parser doesn't hit a limit of XML_MAX_TEXT_LENGTH text nodes */
14310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    { 0, 1, 0, 0},
14320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard};
14330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
14350de1f3114a167126e0f16daa7ff389f91a474914Daniel VeillardlaunchTests(testDescPtr tst, unsigned int test) {
14360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int res = 0, err = 0;
14370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    unsigned int i, j;
14380de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    size_t limit;
14390de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int fail;
14400de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14410de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (tst == NULL) return(-1);
14420de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14430de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    for (i = 0;i < sizeof(limitDescriptions)/sizeof(limitDescriptions[0]);i++) {
14440de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        limit = limitDescriptions[i].limit;
14450de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        fail = limitDescriptions[i].fail;
14460de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        /*
14470de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard         * Handle exceptions if any
14480de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard         */
14490de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        for (j = 0;j < sizeof(testExceptions)/sizeof(testExceptions[0]);j++) {
14500de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            if ((testExceptions[j].test == test) &&
14510de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                (testExceptions[j].limit == i)) {
14520de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                if (testExceptions[j].fail != -1)
14530de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                    fail = testExceptions[j].fail;
14540de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                if (testExceptions[j].size != 0)
14550de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                    limit = testExceptions[j].size;
14560de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                break;
14570de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            }
14580de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
14590de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        res = tst->func(limitDescriptions[i].name, limit,
14600de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard                        limitDescriptions[i].options, fail);
14610de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (res != 0) {
14620de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            nb_errors++;
14630de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard            err++;
14640de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        }
14650de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
14660de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return(err);
14670de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
14680de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14690de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14700de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardstatic int
14710de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardruntest(unsigned int i) {
14720de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int ret = 0, res;
14730de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int old_errors, old_tests, old_leaks;
14740de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14750de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    old_errors = nb_errors;
14760de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    old_tests = nb_tests;
14770de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    old_leaks = nb_leaks;
14780de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if ((tests_quiet == 0) && (testDescriptions[i].desc != NULL))
14790de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	printf("## %s\n", testDescriptions[i].desc);
14800de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    res = launchTests(&testDescriptions[i], i);
14810de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (res != 0)
14820de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	ret++;
14830de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (verbose) {
14840de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
14850de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	    printf("Ran %d tests, no errors\n", nb_tests - old_tests);
14860de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	else
14870de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	    printf("Ran %d tests, %d errors, %d leaks\n",
14880de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard		   nb_tests - old_tests,
14890de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard		   nb_errors - old_errors,
14900de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard		   nb_leaks - old_leaks);
14910de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
14920de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return(ret);
14930de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
14940de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
14953f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic int
14963f0c613f28396c2b1acf90ad08382f0c9620d035Daniel VeillardlaunchCrazySAX(unsigned int test, int fail) {
14973f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    int res = 0, err = 0;
14983f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
14993f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    crazy_indx = test;
15003f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
15013f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    res = saxTest("crazy::test", XML_MAX_LOOKUP_LIMIT - CHUNK, 0, fail);
15023f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (res != 0) {
15033f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        nb_errors++;
15043f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        err++;
15053f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
15063f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (tests_quiet == 0)
15073f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        fprintf(stderr, "%c", crazy[test]);
15083f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
15093f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    return(err);
15103f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
15113f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
1512e28c8a1acef3047cceae1035924edae5e903a778Denis Pauk#ifdef LIBXML_READER_ENABLED
15133f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic int
15143f0c613f28396c2b1acf90ad08382f0c9620d035Daniel VeillardlaunchCrazy(unsigned int test, int fail) {
15153f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    int res = 0, err = 0;
15163f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
15173f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    crazy_indx = test;
15183f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
15193f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    res = readerTest("crazy::test", XML_MAX_LOOKUP_LIMIT - CHUNK, 0, fail);
15203f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (res != 0) {
15213f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        nb_errors++;
15223f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        err++;
15233f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
15243f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (tests_quiet == 0)
15253f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        fprintf(stderr, "%c", crazy[test]);
15263f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
15273f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    return(err);
15283f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
1529e28c8a1acef3047cceae1035924edae5e903a778Denis Pauk#endif
15303f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
15313f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic int get_crazy_fail(int test) {
15323f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    /*
15333f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard     * adding 1000000 of character 'a' leads to parser failure mostly
15343f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard     * everywhere except in those special spots. Need to be updated
15353f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard     * each time crazy is updated
15363f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard     */
15373f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    int fail = 1;
15383f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if ((test == 44) || /* PI in Misc */
15393f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        ((test >= 50) && (test <= 55)) || /* Comment in Misc */
15403f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        (test == 79) || /* PI in DTD */
15413f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        ((test >= 85) && (test <= 90)) || /* Comment in DTD */
15423f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        (test == 154) || /* PI in Misc */
15433f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        ((test >= 160) && (test <= 165)) || /* Comment in Misc */
15443f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        ((test >= 178) && (test <= 181)) || /* attribute value */
15453f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        (test == 183) || /* Text */
15463f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        (test == 189) || /* PI in Content */
15473f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        (test == 191) || /* Text */
15483f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        ((test >= 195) && (test <= 200)) || /* Comment in Content */
15493f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        ((test >= 203) && (test <= 206)) || /* Text */
15503f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        (test == 215) || (test == 216) || /* in CDATA */
15513f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        (test == 219) || /* Text */
15523f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        (test == 231) || /* PI in Misc */
15533f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        ((test >= 237) && (test <= 242))) /* Comment in Misc */
15543f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        fail = 0;
15553f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    return(fail);
15563f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
15573f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
15583f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardstatic int
15593f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillardruncrazy(void) {
15608f2d6b575a23e2c4c4a6e831ecaf0b7bfb55c2b4Rob Richards    int ret = 0, res = 0;
15613f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    int old_errors, old_tests, old_leaks;
15623f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    unsigned int i;
15633f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
15643f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    old_errors = nb_errors;
15653f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    old_tests = nb_tests;
15663f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    old_leaks = nb_leaks;
1567e28c8a1acef3047cceae1035924edae5e903a778Denis Pauk
1568e28c8a1acef3047cceae1035924edae5e903a778Denis Pauk#ifdef LIBXML_READER_ENABLED
15693f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (tests_quiet == 0) {
15703f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard	printf("## Crazy tests on reader\n");
15713f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
15723f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    for (i = 0;i < strlen(crazy);i++) {
15733f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        res += launchCrazy(i, get_crazy_fail(i));
15743f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        if (res != 0)
15753f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            ret++;
15763f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
1577e28c8a1acef3047cceae1035924edae5e903a778Denis Pauk#endif
1578e28c8a1acef3047cceae1035924edae5e903a778Denis Pauk
15793f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (tests_quiet == 0) {
15803f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard	printf("\n## Crazy tests on SAX\n");
15813f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
15823f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    for (i = 0;i < strlen(crazy);i++) {
15833f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        res += launchCrazySAX(i, get_crazy_fail(i));
15843f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        if (res != 0)
15853f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard            ret++;
15863f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
15873f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (tests_quiet == 0)
15883f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        fprintf(stderr, "\n");
15893f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    if (verbose) {
15903f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard	if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
15913f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard	    printf("Ran %d tests, no errors\n", nb_tests - old_tests);
15923f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard	else
15933f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard	    printf("Ran %d tests, %d errors, %d leaks\n",
15943f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard		   nb_tests - old_tests,
15953f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard		   nb_errors - old_errors,
15963f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard		   nb_leaks - old_leaks);
15973f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    }
15983f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    return(ret);
15993f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard}
16003f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
16013f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard
16020de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardint
16030de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillardmain(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
16040de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int i, a, ret = 0;
16050de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    int subset = 0;
16060de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
16070de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    fillFilling();
16080de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    initializeLibxml2();
16090de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
16100de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    for (a = 1; a < argc;a++) {
16110de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        if (!strcmp(argv[a], "-v"))
16120de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	    verbose = 1;
16130de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        else if (!strcmp(argv[a], "-quiet"))
16140de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	    tests_quiet = 1;
16153f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard        else if (!strcmp(argv[a], "-crazy"))
16163f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard	    subset = 1;
16170de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
16180de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if (subset == 0) {
16190de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	for (i = 0; testDescriptions[i].func != NULL; i++) {
16200de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	    ret += runtest(i);
16210de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	}
16220de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
16233f0c613f28396c2b1acf90ad08382f0c9620d035Daniel Veillard    ret += runcrazy();
16240de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    if ((nb_errors == 0) && (nb_leaks == 0)) {
16250de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        ret = 0;
16260de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	printf("Total %d tests, no errors\n",
16270de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	       nb_tests);
16280de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    } else {
16290de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard        ret = 1;
16300de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	printf("Total %d tests, %d errors, %d leaks\n",
16310de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard	       nb_tests, nb_errors, nb_leaks);
16320de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    }
16330de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlCleanupParser();
16340de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    xmlMemoryDump();
16350de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard
16360de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard    return(ret);
16370de1f3114a167126e0f16daa7ff389f91a474914Daniel Veillard}
1638