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