/*
 * testapi.c: libxml2 API tester program.
 *
 * Automatically generated by gentest.py from libxml2-api.xml
 *
 * See Copyright for the status of this software.
 *
 * daniel@veillard.com
 */

#include "libxml.h"
#include <stdio.h>

#include <stdlib.h> /* for putenv() */
#include <string.h>
#include <libxml/xmlerror.h>
#include <libxml/relaxng.h>


static int testlibxml2(void);
static int test_module(const char *module);

static int generic_errors = 0;
static int call_tests = 0;
static int function_tests = 0;

static xmlChar chartab[1024];
static int inttab[1024];
static unsigned long longtab[1024];

static xmlDocPtr api_doc = NULL;
static xmlDtdPtr api_dtd = NULL;
static xmlNodePtr api_root = NULL;
static xmlAttrPtr api_attr = NULL;
static xmlNsPtr api_ns = NULL;

static void
structured_errors(void *userData ATTRIBUTE_UNUSED,
                  xmlErrorPtr error ATTRIBUTE_UNUSED) {
    generic_errors++;
}

static void
free_api_doc(void) {
    xmlFreeDoc(api_doc);
    api_doc = NULL;
    api_dtd = NULL;
    api_root = NULL;
    api_attr = NULL;
    api_ns = NULL;
}

static xmlDocPtr
get_api_doc(void) {
    if (api_doc == NULL) {
        api_doc = xmlReadMemory("<!DOCTYPE root [<!ELEMENT root EMPTY>]><root xmlns:h='http://example.com/' h:foo='bar'/>", 88, "root_test", NULL, 0);
	api_root = NULL;
	api_attr = NULL;
    }
    return(api_doc);
}

static xmlDtdPtr
get_api_dtd(void) {
    if ((api_dtd == NULL) || (api_dtd->type != XML_DTD_NODE)) {
        get_api_doc();
	if ((api_doc != NULL) && (api_doc->children != NULL) &&
	    (api_doc->children->type == XML_DTD_NODE))
	    api_dtd = (xmlDtdPtr) api_doc->children;
    }
    return(api_dtd);
}

static xmlNodePtr
get_api_root(void) {
    if ((api_root == NULL) || (api_root->type != XML_ELEMENT_NODE)) {
        get_api_doc();
	if ((api_doc != NULL) && (api_doc->children != NULL) &&
	    (api_doc->children->next != NULL) &&
	    (api_doc->children->next->type == XML_ELEMENT_NODE))
	    api_root = api_doc->children->next;
    }
    return(api_root);
}

static xmlNsPtr
get_api_ns(void) {
    get_api_root();
    if (api_root != NULL)
        api_ns = api_root->nsDef;
    return(api_ns);
}

static xmlAttrPtr
get_api_attr(void) {
#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED)
    static int nr = 0;
    xmlChar name[20];
#endif

    if ((api_root == NULL) || (api_root->type != XML_ELEMENT_NODE)) {
        get_api_root();
    }
    if (api_root == NULL)
        return(NULL);
    if (api_root->properties != NULL) {
        api_attr = api_root->properties;
        return(api_root->properties);
    }
    api_attr = NULL;
#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED)
    snprintf((char *) name, 20, "foo%d", nr++);
    api_attr = xmlSetProp(api_root, name, (const xmlChar *) "bar");
#endif
    return(api_attr);
}

static int quiet = 0;

int main(int argc, char **argv) {
    int ret;
    int blocks, mem;

#ifdef HAVE_PUTENV
    /* access to the proxy can slow up regression tests a lot */
    putenv((char *) "http_proxy=");
#endif

    memset(chartab, 0, sizeof(chartab));
    strncpy((char *) chartab, "  chartab\n", 20);
    memset(inttab, 0, sizeof(inttab));
    memset(longtab, 0, sizeof(longtab));

    xmlInitParser();
#ifdef LIBXML_SCHEMAS_ENABLED
    xmlRelaxNGInitTypes();
#endif

    LIBXML_TEST_VERSION

    xmlSetStructuredErrorFunc(NULL, structured_errors);

    if (argc >= 2) {
        if (!strcmp(argv[1], "-q")) {
	    quiet = 1;
	    if (argc >= 3)
	        ret = test_module(argv[2]);
	    else
		ret = testlibxml2();
        } else {
	   ret = test_module(argv[1]);
	}
    } else
	ret = testlibxml2();

    xmlCleanupParser();
    blocks = xmlMemBlocks();
    mem = xmlMemUsed();
    if ((blocks != 0) || (mem != 0)) {
        printf("testapi leaked %d bytes in %d blocks\n", mem, blocks);
    }
    xmlMemoryDump();

    return (ret != 0);
}

#include <libxml/HTMLparser.h>
#include <libxml/HTMLtree.h>
#include <libxml/catalog.h>
#include <libxml/chvalid.h>
#include <libxml/dict.h>
#include <libxml/encoding.h>
#include <libxml/entities.h>
#include <libxml/hash.h>
#include <libxml/list.h>
#include <libxml/nanoftp.h>
#include <libxml/nanohttp.h>
#include <libxml/parser.h>
#include <libxml/parserInternals.h>
#include <libxml/pattern.h>
#include <libxml/relaxng.h>
#include <libxml/schemasInternals.h>
#include <libxml/schematron.h>
#include <libxml/tree.h>
#include <libxml/uri.h>
#include <libxml/valid.h>
#include <libxml/xinclude.h>
#include <libxml/xmlIO.h>
#include <libxml/xmlerror.h>
#include <libxml/xmlreader.h>
#include <libxml/xmlsave.h>
#include <libxml/xmlschemas.h>
#include <libxml/xmlschemastypes.h>
#include <libxml/xmlstring.h>
#include <libxml/xmlwriter.h>
#include <libxml/xpath.h>
#include <libxml/xpointer.h>
#include <libxml/debugXML.h>

/*
  We manually define xmlErrMemory because it's normal declaration
  is "hidden" by #ifdef IN_LIBXML
*/
void xmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra);

/*
 We need some "remote" addresses, but want to avoid getting into
 name resolution delays, so we use these
*/
#define	REMOTE1GOOD	"http://localhost/"
#define	REMOTE1BAD	"http:http://http"
#define	REMOTE2GOOD	"ftp://localhost/foo"

#define gen_nb_void_ptr 2

static void *gen_void_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_void_ptr(int no ATTRIBUTE_UNUSED, void *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#if 0
#define gen_nb_const_void_ptr 2

static const void *gen_const_void_ptr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return((const void *) "immutable string");
    return(NULL);
}
static void des_const_void_ptr(int no ATTRIBUTE_UNUSED, const void *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#define gen_nb_userdata 3

static void *gen_userdata(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return((void *) &call_tests);
    if (no == 1) return((void *) -1);
    return(NULL);
}
static void des_userdata(int no ATTRIBUTE_UNUSED, void *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}


#define gen_nb_int 4

static int gen_int(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(0);
    if (no == 1) return(1);
    if (no == 2) return(-1);
    if (no == 3) return(122);
    return(-1);
}

static void des_int(int no ATTRIBUTE_UNUSED, int val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_parseroptions 5

static int gen_parseroptions(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(XML_PARSE_NOBLANKS | XML_PARSE_RECOVER);
    if (no == 1) return(XML_PARSE_NOENT | XML_PARSE_DTDLOAD | XML_PARSE_DTDATTR | XML_PARSE_DTDVALID | XML_PARSE_NOCDATA);
    if (no == 2) return(XML_PARSE_XINCLUDE | XML_PARSE_NOXINCNODE | XML_PARSE_NSCLEAN);
    if (no == 3) return(XML_PARSE_XINCLUDE | XML_PARSE_NODICT);
    return(XML_PARSE_SAX1);
}

static void des_parseroptions(int no ATTRIBUTE_UNUSED, int val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#if 0
#define gen_nb_long 5

static long gen_long(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(0);
    if (no == 1) return(1);
    if (no == 2) return(-1);
    if (no == 3) return(122);
    return(-1);
}

static void des_long(int no ATTRIBUTE_UNUSED, long val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#define gen_nb_xmlChar 4

static xmlChar gen_xmlChar(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return('a');
    if (no == 1) return(' ');
    if (no == 2) return((xmlChar) '\xf8');
    return(0);
}

static void des_xmlChar(int no ATTRIBUTE_UNUSED, xmlChar val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_unsigned_int 3

static unsigned int gen_unsigned_int(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(0);
    if (no == 1) return(1);
    if (no == 2) return(122);
    return((unsigned int) -1);
}

static void des_unsigned_int(int no ATTRIBUTE_UNUSED, unsigned int val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_unsigned_long 4

static unsigned long gen_unsigned_long(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(0);
    if (no == 1) return(1);
    if (no == 2) return(122);
    return((unsigned long) -1);
}

static void des_unsigned_long(int no ATTRIBUTE_UNUSED, unsigned long val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_double 4

static double gen_double(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(0);
    if (no == 1) return(-1.1);
#if defined(LIBXML_XPATH_ENABLED)
    if (no == 2) return(xmlXPathNAN);
#endif
    return(-1);
}

static void des_double(int no ATTRIBUTE_UNUSED, double val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_unsigned_long_ptr 2

static unsigned long *gen_unsigned_long_ptr(int no, int nr) {
    if (no == 0) return(&longtab[nr]);
    return(NULL);
}

static void des_unsigned_long_ptr(int no ATTRIBUTE_UNUSED, unsigned long *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_int_ptr 2

static int *gen_int_ptr(int no, int nr) {
    if (no == 0) return(&inttab[nr]);
    return(NULL);
}

static void des_int_ptr(int no ATTRIBUTE_UNUSED, int *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_const_char_ptr 4

static char *gen_const_char_ptr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return((char *) "foo");
    if (no == 1) return((char *) "<foo/>");
    if (no == 2) return((char *) "test/ent2");
    return(NULL);
}
static void des_const_char_ptr(int no ATTRIBUTE_UNUSED, const char *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_xmlChar_ptr 2

static xmlChar *gen_xmlChar_ptr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(&chartab[0]);
    return(NULL);
}
static void des_xmlChar_ptr(int no ATTRIBUTE_UNUSED, xmlChar *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_FILE_ptr 2

static FILE *gen_FILE_ptr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(fopen("test.out", "a+"));
    return(NULL);
}
static void des_FILE_ptr(int no ATTRIBUTE_UNUSED, FILE *val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) fclose(val);
}

#define gen_nb_debug_FILE_ptr 2
static FILE *gen_debug_FILE_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(fopen("test.out", "a+"));
}
static void des_debug_FILE_ptr(int no ATTRIBUTE_UNUSED, FILE *val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) fclose(val);
}

#define gen_nb_const_xmlChar_ptr 5

static xmlChar *gen_const_xmlChar_ptr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return((xmlChar *) "foo");
    if (no == 1) return((xmlChar *) "<foo/>");
    if (no == 2) return((xmlChar *) "n" "\xf8" "ne");
    if (no == 3) return((xmlChar *) " 2ab ");
    return(NULL);
}
static void des_const_xmlChar_ptr(int no ATTRIBUTE_UNUSED, const xmlChar *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_filepath 8

static const char *gen_filepath(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return("missing.xml");
    if (no == 1) return("<foo/>");
    if (no == 2) return("test/ent2");
    if (no == 3) return("test/valid/REC-xml-19980210.xml");
    if (no == 4) return("test/valid/dtds/xhtml1-strict.dtd");
    if (no == 5) return(REMOTE1GOOD);
    if (no == 6) return(REMOTE1BAD);
    return(NULL);
}
static void des_filepath(int no ATTRIBUTE_UNUSED, const char *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_eaten_name 2

static xmlChar *gen_eaten_name(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlStrdup(BAD_CAST "eaten"));
    return(NULL);
}
static void des_eaten_name(int no ATTRIBUTE_UNUSED, xmlChar *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_fileoutput 6

static const char *gen_fileoutput(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return("/missing.xml");
    if (no == 1) return("<foo/>");
    if (no == 2) return(REMOTE2GOOD);
    if (no == 3) return(REMOTE1GOOD);
    if (no == 4) return(REMOTE1BAD);
    return(NULL);
}
static void des_fileoutput(int no ATTRIBUTE_UNUSED, const char *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_xmlParserCtxtPtr 3
static xmlParserCtxtPtr gen_xmlParserCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlNewParserCtxt());
    if (no == 1) return(xmlCreateMemoryParserCtxt("<doc/>", 6));
    return(NULL);
}
static void des_xmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, xmlParserCtxtPtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL)
        xmlFreeParserCtxt(val);
}

#define gen_nb_xmlSAXHandlerPtr 2
static xmlSAXHandlerPtr gen_xmlSAXHandlerPtr(int no, int nr ATTRIBUTE_UNUSED) {
#ifdef LIBXML_SAX1_ENABLED
    if (no == 0) return((xmlSAXHandlerPtr) &xmlDefaultSAXHandler);
#endif
    return(NULL);
}
static void des_xmlSAXHandlerPtr(int no ATTRIBUTE_UNUSED, xmlSAXHandlerPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_xmlValidCtxtPtr 2
static xmlValidCtxtPtr gen_xmlValidCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) {
#ifdef LIBXML_VALID_ENABLED
    if (no == 0) return(xmlNewValidCtxt());
#endif
    return(NULL);
}
static void des_xmlValidCtxtPtr(int no ATTRIBUTE_UNUSED, xmlValidCtxtPtr val, int nr ATTRIBUTE_UNUSED) {
#ifdef LIBXML_VALID_ENABLED
    if (val != NULL)
        xmlFreeValidCtxt(val);
#endif
}

#define gen_nb_xmlParserInputBufferPtr 8

static xmlParserInputBufferPtr gen_xmlParserInputBufferPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlParserInputBufferCreateFilename("missing.xml", XML_CHAR_ENCODING_NONE));
    if (no == 1) return(xmlParserInputBufferCreateFilename("<foo/>", XML_CHAR_ENCODING_NONE));
    if (no == 2) return(xmlParserInputBufferCreateFilename("test/ent2", XML_CHAR_ENCODING_NONE));
    if (no == 3) return(xmlParserInputBufferCreateFilename("test/valid/REC-xml-19980210.xml", XML_CHAR_ENCODING_NONE));
    if (no == 4) return(xmlParserInputBufferCreateFilename("test/valid/dtds/xhtml1-strict.dtd", XML_CHAR_ENCODING_NONE));
    if (no == 5) return(xmlParserInputBufferCreateFilename(REMOTE1GOOD, XML_CHAR_ENCODING_NONE));
    if (no == 6) return(xmlParserInputBufferCreateFilename(REMOTE1BAD, XML_CHAR_ENCODING_NONE));
    return(NULL);
}
static void des_xmlParserInputBufferPtr(int no ATTRIBUTE_UNUSED, xmlParserInputBufferPtr val, int nr ATTRIBUTE_UNUSED) {
    xmlFreeParserInputBuffer(val);
}

#define gen_nb_xmlDocPtr 4
static xmlDocPtr gen_xmlDocPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlNewDoc(BAD_CAST "1.0"));
    if (no == 1) return(xmlReadMemory("<foo/>", 6, "test", NULL, 0));
    if (no == 2) return(xmlReadMemory("<!DOCTYPE foo []> <foo/>", 24, "test", NULL, 0));
    return(NULL);
}
static void des_xmlDocPtr(int no ATTRIBUTE_UNUSED, xmlDocPtr val, int nr ATTRIBUTE_UNUSED) {
    if ((val != NULL) && (val != api_doc) && (val->doc != api_doc))
        xmlFreeDoc(val);
}

#define gen_nb_xmlAttrPtr 2
static xmlAttrPtr gen_xmlAttrPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(get_api_attr());
    return(NULL);
}
static void des_xmlAttrPtr(int no, xmlAttrPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) free_api_doc();
}

#define gen_nb_xmlDictPtr 2
static xmlDictPtr gen_xmlDictPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlDictCreate());
    return(NULL);
}
static void des_xmlDictPtr(int no ATTRIBUTE_UNUSED, xmlDictPtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL)
        xmlDictFree(val);
}

#define gen_nb_xmlNodePtr 3
static xmlNodePtr gen_xmlNodePtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlNewPI(BAD_CAST "test", NULL));
    if (no == 1) return(get_api_root());
    return(NULL);
/*     if (no == 2) return((xmlNodePtr) get_api_doc()); */
}
static void des_xmlNodePtr(int no, xmlNodePtr val, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) {
        free_api_doc();
    } else if (val != NULL) {
        xmlUnlinkNode(val);
        xmlFreeNode(val);
    }
}

#define gen_nb_xmlDtdPtr 3
static xmlDtdPtr gen_xmlDtdPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0)
        return(xmlNewDtd(NULL, BAD_CAST "dtd", BAD_CAST"foo", BAD_CAST"bar"));
    if (no == 1) return(get_api_dtd());
    return(NULL);
}
static void des_xmlDtdPtr(int no, xmlDtdPtr val, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) free_api_doc();
    else if (val != NULL) {
        xmlUnlinkNode((xmlNodePtr) val);
        xmlFreeNode((xmlNodePtr) val);
    }
}

#define gen_nb_xmlNsPtr 2
static xmlNsPtr gen_xmlNsPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(get_api_ns());
    return(NULL);
}
static void des_xmlNsPtr(int no, xmlNsPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) free_api_doc();
}

#define gen_nb_xmlNodePtr_in 3
static xmlNodePtr gen_xmlNodePtr_in(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlNewPI(BAD_CAST "test", NULL));
    if (no == 0) return(xmlNewText(BAD_CAST "text"));
    return(NULL);
}
static void des_xmlNodePtr_in(int no ATTRIBUTE_UNUSED, xmlNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#ifdef LIBXML_WRITER_ENABLED
#define gen_nb_xmlTextWriterPtr 2
static xmlTextWriterPtr gen_xmlTextWriterPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlNewTextWriterFilename("test.out", 0));
    return(NULL);
}
static void des_xmlTextWriterPtr(int no ATTRIBUTE_UNUSED, xmlTextWriterPtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) xmlFreeTextWriter(val);
}
#endif

#ifdef LIBXML_READER_ENABLED
#define gen_nb_xmlTextReaderPtr 4
static xmlTextReaderPtr gen_xmlTextReaderPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlNewTextReaderFilename("test/ent2"));
    if (no == 1) return(xmlNewTextReaderFilename("test/valid/REC-xml-19980210.xml"));
    if (no == 2) return(xmlNewTextReaderFilename("test/valid/dtds/xhtml1-strict.dtd"));
    return(NULL);
}
static void des_xmlTextReaderPtr(int no ATTRIBUTE_UNUSED, xmlTextReaderPtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) xmlFreeTextReader(val);
}
#endif

#define gen_nb_xmlBufferPtr 3
static const xmlChar *static_buf_content = (xmlChar *)"a static buffer";
static xmlBufferPtr gen_xmlBufferPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlBufferCreate());
    if (no == 1) return(xmlBufferCreateStatic((void *)static_buf_content, 13));
    return(NULL);
}
static void des_xmlBufferPtr(int no ATTRIBUTE_UNUSED, xmlBufferPtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) {
        xmlBufferFree(val);
    }
}

#define gen_nb_xmlListPtr 2
static xmlListPtr gen_xmlListPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlListCreate(NULL, NULL));
    return(NULL);
}
static void des_xmlListPtr(int no ATTRIBUTE_UNUSED, xmlListPtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) {
        xmlListDelete(val);
    }
}

#define gen_nb_xmlHashTablePtr 2
static xmlHashTablePtr gen_xmlHashTablePtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlHashCreate(10));
    return(NULL);
}
static void des_xmlHashTablePtr(int no ATTRIBUTE_UNUSED, xmlHashTablePtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) {
        xmlHashFree(val, NULL);
    }
}

#include <libxml/xpathInternals.h>

#ifdef LIBXML_XPATH_ENABLED
#define gen_nb_xmlXPathObjectPtr 5
static xmlXPathObjectPtr gen_xmlXPathObjectPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlXPathNewString(BAD_CAST "string object"));
    if (no == 1) return(xmlXPathNewFloat(1.1));
    if (no == 2) return(xmlXPathNewBoolean(1));
    if (no == 3) return(xmlXPathNewNodeSet(NULL));
    return(NULL);
}
static void des_xmlXPathObjectPtr(int no ATTRIBUTE_UNUSED, xmlXPathObjectPtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) {
        xmlXPathFreeObject(val);
    }
}
#endif

#ifdef LIBXML_OUTPUT_ENABLED
#define gen_nb_xmlOutputBufferPtr 2
static xmlOutputBufferPtr gen_xmlOutputBufferPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlOutputBufferCreateFilename("test.out", NULL, 0));
    return(NULL);
}
static void des_xmlOutputBufferPtr(int no ATTRIBUTE_UNUSED, xmlOutputBufferPtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) {
        xmlOutputBufferClose(val);
    }
}
#endif

#ifdef LIBXML_FTP_ENABLED
#define gen_nb_xmlNanoFTPCtxtPtr 4
static void *gen_xmlNanoFTPCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlNanoFTPNewCtxt(REMOTE2GOOD));
    if (no == 1) return(xmlNanoFTPNewCtxt(REMOTE1GOOD));
    if (no == 2) return(xmlNanoFTPNewCtxt("foo"));
    return(NULL);
}
static void des_xmlNanoFTPCtxtPtr(int no ATTRIBUTE_UNUSED, void *val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) {
        xmlNanoFTPFreeCtxt(val);
    }
}
#endif

#ifdef LIBXML_HTTP_ENABLED
#define gen_nb_xmlNanoHTTPCtxtPtr 1
static void *gen_xmlNanoHTTPCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlNanoHTTPOpen(REMOTE1GOOD, NULL));
    if (no == 1) return(xmlNanoHTTPOpen(REMOTE2GOOD, NULL));
    if (no == 2) return(xmlNanoHTTPOpen(REMOTE1BAD, NULL));
    return(NULL);
}
static void des_xmlNanoHTTPCtxtPtr(int no ATTRIBUTE_UNUSED, void *val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL) {
	xmlNanoHTTPClose(val);
    }
}
#endif

#define gen_nb_xmlCharEncoding 4
static xmlCharEncoding gen_xmlCharEncoding(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(XML_CHAR_ENCODING_UTF8);
    if (no == 1) return(XML_CHAR_ENCODING_NONE);
    if (no == 2) return(XML_CHAR_ENCODING_8859_1);
    return(XML_CHAR_ENCODING_ERROR);
}
static void des_xmlCharEncoding(int no ATTRIBUTE_UNUSED, xmlCharEncoding val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)

#define gen_nb_xmlExpCtxtPtr 1
static xmlExpCtxtPtr gen_xmlExpCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlExpCtxtPtr(int no ATTRIBUTE_UNUSED, xmlExpCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_xmlExpNodePtr 1
static xmlExpNodePtr gen_xmlExpNodePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlExpNodePtr(int no ATTRIBUTE_UNUSED, xmlExpNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#endif

#if defined(LIBXML_SCHEMAS_ENABLED)
#define gen_nb_xmlSchemaPtr 1
static xmlSchemaPtr gen_xmlSchemaPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaPtr(int no ATTRIBUTE_UNUSED, xmlSchemaPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_xmlSchemaValidCtxtPtr 1
static xmlSchemaValidCtxtPtr gen_xmlSchemaValidCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaValidCtxtPtr(int no ATTRIBUTE_UNUSED, xmlSchemaValidCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#endif /* LIBXML_SCHEMAS_ENABLED */

#define gen_nb_xmlHashDeallocator 2
static void
test_xmlHashDeallocator(void *payload ATTRIBUTE_UNUSED,
                        const xmlChar *name ATTRIBUTE_UNUSED) {
}

static xmlHashDeallocator gen_xmlHashDeallocator(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(test_xmlHashDeallocator);
    return(NULL);
}
static void des_xmlHashDeallocator(int no ATTRIBUTE_UNUSED, xmlHashDeallocator val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}


static void desret_int(int val ATTRIBUTE_UNUSED) {
}
static void desret_xmlChar(xmlChar val ATTRIBUTE_UNUSED) {
}
static void desret_long(long val ATTRIBUTE_UNUSED) {
}
static void desret_unsigned_long(unsigned long val ATTRIBUTE_UNUSED) {
}
static void desret_double(double val ATTRIBUTE_UNUSED) {
}
static void desret_xmlCharEncoding(xmlCharEncoding val ATTRIBUTE_UNUSED) {
}
#if 0
static void desret_const_void_ptr(void *val ATTRIBUTE_UNUSED) {
}
#endif
static void desret_void_ptr(void *val ATTRIBUTE_UNUSED) {
}
static void desret_const_char_ptr(const char *val ATTRIBUTE_UNUSED) {
}
static void desret_const_xmlChar_ptr(const xmlChar *val ATTRIBUTE_UNUSED) {
}
static void desret_xmlChar_ptr(xmlChar *val) {
    if (val != NULL)
	xmlFree(val);
}
static void desret_xmlDocPtr(xmlDocPtr val) {
    if (val != api_doc)
	xmlFreeDoc(val);
}
static void desret_xmlDictPtr(xmlDictPtr val) {
    xmlDictFree(val);
}
#ifdef LIBXML_OUTPUT_ENABLED
static void desret_xmlOutputBufferPtr(xmlOutputBufferPtr val) {
    xmlOutputBufferClose(val);
}
#endif
#ifdef LIBXML_READER_ENABLED
static void desret_xmlTextReaderPtr(xmlTextReaderPtr val) {
    xmlFreeTextReader(val);
}
#endif
static void desret_xmlNodePtr(xmlNodePtr val) {
    if ((val != NULL) && (val != api_root) && (val != (xmlNodePtr) api_doc)) {
	xmlUnlinkNode(val);
	xmlFreeNode(val);
    }
}
static void desret_xmlAttrPtr(xmlAttrPtr val) {
    if (val != NULL) {
	xmlUnlinkNode((xmlNodePtr) val);
	xmlFreeNode((xmlNodePtr) val);
    }
}
static void desret_xmlEntityPtr(xmlEntityPtr val) {
    if (val != NULL) {
	xmlUnlinkNode((xmlNodePtr) val);
	xmlFreeNode((xmlNodePtr) val);
    }
}
static void desret_xmlElementPtr(xmlElementPtr val) {
    if (val != NULL) {
	xmlUnlinkNode((xmlNodePtr) val);
    }
}
static void desret_xmlAttributePtr(xmlAttributePtr val) {
    if (val != NULL) {
	xmlUnlinkNode((xmlNodePtr) val);
    }
}
static void desret_xmlNsPtr(xmlNsPtr val ATTRIBUTE_UNUSED) {
}
static void desret_xmlDtdPtr(xmlDtdPtr val) {
    desret_xmlNodePtr((xmlNodePtr)val);
}
#ifdef LIBXML_XPATH_ENABLED
static void desret_xmlXPathObjectPtr(xmlXPathObjectPtr val) {
    xmlXPathFreeObject(val);
}
static void desret_xmlNodeSetPtr(xmlNodeSetPtr val) {
    xmlXPathFreeNodeSet(val);
}
#endif
static void desret_xmlParserCtxtPtr(xmlParserCtxtPtr val) {
    xmlFreeParserCtxt(val);
}
static void desret_xmlParserInputBufferPtr(xmlParserInputBufferPtr val) {
    xmlFreeParserInputBuffer(val);
}
static void desret_xmlParserInputPtr(xmlParserInputPtr val) {
    xmlFreeInputStream(val);
}
#ifdef LIBXML_WRITER_ENABLED
static void desret_xmlTextWriterPtr(xmlTextWriterPtr val) {
    xmlFreeTextWriter(val);
}
#endif
static void desret_xmlBufferPtr(xmlBufferPtr val) {
    xmlBufferFree(val);
}
#ifdef LIBXML_SCHEMAS_ENABLED
static void desret_xmlSchemaParserCtxtPtr(xmlSchemaParserCtxtPtr val) {
    xmlSchemaFreeParserCtxt(val);
}
static void desret_xmlSchemaTypePtr(xmlSchemaTypePtr val ATTRIBUTE_UNUSED) {
}
static void desret_xmlRelaxNGParserCtxtPtr(xmlRelaxNGParserCtxtPtr val) {
    xmlRelaxNGFreeParserCtxt(val);
}
#endif
#ifdef LIBXML_HTML_ENABLED
static void desret_const_htmlEntityDesc_ptr(const htmlEntityDesc * val ATTRIBUTE_UNUSED) {
}
#endif
#ifdef LIBXML_HTTP_ENABLED
static void desret_xmlNanoHTTPCtxtPtr(void *val) {
    xmlNanoHTTPClose(val);
}
#endif
#ifdef LIBXML_FTP_ENABLED
static void desret_xmlNanoFTPCtxtPtr(void *val) {
    xmlNanoFTPClose(val);
}
#endif
/* cut and pasted from autogenerated to avoid troubles */
#define gen_nb_const_xmlChar_ptr_ptr 1
static xmlChar ** gen_const_xmlChar_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlChar_ptr_ptr(int no ATTRIBUTE_UNUSED, const xmlChar ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_unsigned_char_ptr 1
static unsigned char * gen_unsigned_char_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_unsigned_char_ptr(int no ATTRIBUTE_UNUSED, unsigned char * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_const_unsigned_char_ptr 1
static unsigned char * gen_const_unsigned_char_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_unsigned_char_ptr(int no ATTRIBUTE_UNUSED, const unsigned char * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#ifdef LIBXML_HTML_ENABLED
#define gen_nb_const_htmlNodePtr 1
static htmlNodePtr gen_const_htmlNodePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_htmlNodePtr(int no ATTRIBUTE_UNUSED, const htmlNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#ifdef LIBXML_HTML_ENABLED
#define gen_nb_htmlDocPtr 3
static htmlDocPtr gen_htmlDocPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(htmlNewDoc(NULL, NULL));
    if (no == 1) return(htmlReadMemory("<html/>", 7, "test", NULL, 0));
    return(NULL);
}
static void des_htmlDocPtr(int no ATTRIBUTE_UNUSED, htmlDocPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    if ((val != NULL) && (val != api_doc) && (val->doc != api_doc))
        xmlFreeDoc(val);
}
static void desret_htmlDocPtr(htmlDocPtr val) {
    if ((val != NULL) && (val != api_doc) && (val->doc != api_doc))
        xmlFreeDoc(val);
}
#define gen_nb_htmlParserCtxtPtr 3
static htmlParserCtxtPtr gen_htmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    if (no == 0) return(xmlNewParserCtxt());
    if (no == 1) return(htmlCreateMemoryParserCtxt("<html/>", 7));
    return(NULL);
}
static void des_htmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, htmlParserCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL)
        htmlFreeParserCtxt(val);
}
static void desret_htmlParserCtxtPtr(htmlParserCtxtPtr val) {
    if (val != NULL)
        htmlFreeParserCtxt(val);
}
#endif

#ifdef LIBXML_XPATH_ENABLED
#define gen_nb_xmlNodeSetPtr 1
static xmlNodeSetPtr gen_xmlNodeSetPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlNodeSetPtr(int no ATTRIBUTE_UNUSED, xmlNodeSetPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#ifdef LIBXML_DEBUG_ENABLED
#ifdef LIBXML_XPATH_ENABLED
#define gen_nb_xmlShellCtxtPtr 1
static xmlShellCtxtPtr gen_xmlShellCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlShellCtxtPtr(int no ATTRIBUTE_UNUSED, xmlShellCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif
#endif

#ifdef LIBXML_PATTERN_ENABLED
#define gen_nb_xmlPatternPtr 1
static xmlPatternPtr gen_xmlPatternPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlPatternPtr(int no ATTRIBUTE_UNUSED, xmlPatternPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#define gen_nb_xmlElementContentPtr 1
static xmlElementContentPtr gen_xmlElementContentPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlElementContentPtr(int no ATTRIBUTE_UNUSED, xmlElementContentPtr val, int nr ATTRIBUTE_UNUSED) {
    if (val != NULL)
        xmlFreeElementContent(val);
}
static void desret_xmlElementContentPtr(xmlElementContentPtr val) {
    if (val != NULL)
        xmlFreeElementContent(val);
}

#define gen_nb_xmlParserNodeInfoSeqPtr 1
static xmlParserNodeInfoSeqPtr gen_xmlParserNodeInfoSeqPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlParserNodeInfoSeqPtr(int no ATTRIBUTE_UNUSED, xmlParserNodeInfoSeqPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static void desret_const_xmlParserNodeInfo_ptr(const xmlParserNodeInfo *val ATTRIBUTE_UNUSED) {
}

#define gen_nb_void_ptr_ptr 1
static void ** gen_void_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_void_ptr_ptr(int no ATTRIBUTE_UNUSED, void ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

/************************************************************************
 *									*
 *   WARNING: end of the manually maintained part of the test code	*
 *            do not remove or alter the CUT HERE line			*
 *									*
 ************************************************************************/

/* CUT HERE: everything below that line is generated */
#ifdef LIBXML_HTML_ENABLED
static void desret_htmlStatus(htmlStatus val ATTRIBUTE_UNUSED) {
}

#endif

#define gen_nb_xmlAttributeDefault 4
static xmlAttributeDefault gen_xmlAttributeDefault(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_ATTRIBUTE_FIXED);
    if (no == 2) return(XML_ATTRIBUTE_IMPLIED);
    if (no == 3) return(XML_ATTRIBUTE_NONE);
    if (no == 4) return(XML_ATTRIBUTE_REQUIRED);
    return(0);
}

static void des_xmlAttributeDefault(int no ATTRIBUTE_UNUSED, xmlAttributeDefault val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_xmlAttributeType 4
static xmlAttributeType gen_xmlAttributeType(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_ATTRIBUTE_CDATA);
    if (no == 2) return(XML_ATTRIBUTE_ENTITIES);
    if (no == 3) return(XML_ATTRIBUTE_ENTITY);
    if (no == 4) return(XML_ATTRIBUTE_ENUMERATION);
    return(0);
}

static void des_xmlAttributeType(int no ATTRIBUTE_UNUSED, xmlAttributeType val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_xmlBufferAllocationScheme 4
static xmlBufferAllocationScheme gen_xmlBufferAllocationScheme(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_BUFFER_ALLOC_BOUNDED);
    if (no == 2) return(XML_BUFFER_ALLOC_DOUBLEIT);
    if (no == 3) return(XML_BUFFER_ALLOC_EXACT);
    if (no == 4) return(XML_BUFFER_ALLOC_HYBRID);
    return(0);
}

static void des_xmlBufferAllocationScheme(int no ATTRIBUTE_UNUSED, xmlBufferAllocationScheme val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static void desret_xmlBufferAllocationScheme(xmlBufferAllocationScheme val ATTRIBUTE_UNUSED) {
}

#ifdef LIBXML_CATALOG_ENABLED
#define gen_nb_xmlCatalogAllow 4
static xmlCatalogAllow gen_xmlCatalogAllow(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_CATA_ALLOW_ALL);
    if (no == 2) return(XML_CATA_ALLOW_DOCUMENT);
    if (no == 3) return(XML_CATA_ALLOW_GLOBAL);
    if (no == 4) return(XML_CATA_ALLOW_NONE);
    return(0);
}

static void des_xmlCatalogAllow(int no ATTRIBUTE_UNUSED, xmlCatalogAllow val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static void desret_xmlCatalogAllow(xmlCatalogAllow val ATTRIBUTE_UNUSED) {
}

#endif

#ifdef LIBXML_CATALOG_ENABLED
#define gen_nb_xmlCatalogPrefer 3
static xmlCatalogPrefer gen_xmlCatalogPrefer(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_CATA_PREFER_NONE);
    if (no == 2) return(XML_CATA_PREFER_PUBLIC);
    if (no == 3) return(XML_CATA_PREFER_SYSTEM);
    return(0);
}

static void des_xmlCatalogPrefer(int no ATTRIBUTE_UNUSED, xmlCatalogPrefer val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static void desret_xmlCatalogPrefer(xmlCatalogPrefer val ATTRIBUTE_UNUSED) {
}

#endif

#define gen_nb_xmlElementContentType 4
static xmlElementContentType gen_xmlElementContentType(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_ELEMENT_CONTENT_ELEMENT);
    if (no == 2) return(XML_ELEMENT_CONTENT_OR);
    if (no == 3) return(XML_ELEMENT_CONTENT_PCDATA);
    if (no == 4) return(XML_ELEMENT_CONTENT_SEQ);
    return(0);
}

static void des_xmlElementContentType(int no ATTRIBUTE_UNUSED, xmlElementContentType val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_xmlElementTypeVal 4
static xmlElementTypeVal gen_xmlElementTypeVal(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_ELEMENT_TYPE_ANY);
    if (no == 2) return(XML_ELEMENT_TYPE_ELEMENT);
    if (no == 3) return(XML_ELEMENT_TYPE_EMPTY);
    if (no == 4) return(XML_ELEMENT_TYPE_MIXED);
    return(0);
}

static void des_xmlElementTypeVal(int no ATTRIBUTE_UNUSED, xmlElementTypeVal val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_xmlFeature 4
static xmlFeature gen_xmlFeature(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_WITH_AUTOMATA);
    if (no == 2) return(XML_WITH_C14N);
    if (no == 3) return(XML_WITH_CATALOG);
    if (no == 4) return(XML_WITH_DEBUG);
    return(0);
}

static void des_xmlFeature(int no ATTRIBUTE_UNUSED, xmlFeature val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static void desret_xmlParserErrors(xmlParserErrors val ATTRIBUTE_UNUSED) {
}

#ifdef LIBXML_SCHEMAS_ENABLED
#define gen_nb_xmlSchemaValType 4
static xmlSchemaValType gen_xmlSchemaValType(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_SCHEMAS_ANYSIMPLETYPE);
    if (no == 2) return(XML_SCHEMAS_ANYTYPE);
    if (no == 3) return(XML_SCHEMAS_ANYURI);
    if (no == 4) return(XML_SCHEMAS_BASE64BINARY);
    return(0);
}

static void des_xmlSchemaValType(int no ATTRIBUTE_UNUSED, xmlSchemaValType val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static void desret_xmlSchemaValType(xmlSchemaValType val ATTRIBUTE_UNUSED) {
}

#endif

#ifdef LIBXML_SCHEMAS_ENABLED
#define gen_nb_xmlSchemaWhitespaceValueType 4
static xmlSchemaWhitespaceValueType gen_xmlSchemaWhitespaceValueType(int no, int nr ATTRIBUTE_UNUSED) {
    if (no == 1) return(XML_SCHEMA_WHITESPACE_COLLAPSE);
    if (no == 2) return(XML_SCHEMA_WHITESPACE_PRESERVE);
    if (no == 3) return(XML_SCHEMA_WHITESPACE_REPLACE);
    if (no == 4) return(XML_SCHEMA_WHITESPACE_UNKNOWN);
    return(0);
}

static void des_xmlSchemaWhitespaceValueType(int no ATTRIBUTE_UNUSED, xmlSchemaWhitespaceValueType val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#endif

#include <libxml/HTMLparser.h>
#include <libxml/HTMLtree.h>
#include <libxml/SAX2.h>
#include <libxml/c14n.h>
#include <libxml/catalog.h>
#include <libxml/chvalid.h>
#include <libxml/debugXML.h>
#include <libxml/dict.h>
#include <libxml/encoding.h>
#include <libxml/entities.h>
#include <libxml/hash.h>
#include <libxml/list.h>
#include <libxml/nanoftp.h>
#include <libxml/nanohttp.h>
#include <libxml/parser.h>
#include <libxml/parserInternals.h>
#include <libxml/pattern.h>
#include <libxml/relaxng.h>
#include <libxml/schemasInternals.h>
#include <libxml/schematron.h>
#include <libxml/tree.h>
#include <libxml/uri.h>
#include <libxml/valid.h>
#include <libxml/xinclude.h>
#include <libxml/xmlIO.h>
#include <libxml/xmlautomata.h>
#include <libxml/xmlerror.h>
#include <libxml/xmlmodule.h>
#include <libxml/xmlreader.h>
#include <libxml/xmlregexp.h>
#include <libxml/xmlsave.h>
#include <libxml/xmlschemas.h>
#include <libxml/xmlschemastypes.h>
#include <libxml/xmlstring.h>
#include <libxml/xmlunicode.h>
#include <libxml/xmlwriter.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <libxml/xpointer.h>
static int test_HTMLparser(void);
static int test_HTMLtree(void);
static int test_SAX2(void);
static int test_c14n(void);
static int test_catalog(void);
static int test_chvalid(void);
static int test_debugXML(void);
static int test_dict(void);
static int test_encoding(void);
static int test_entities(void);
static int test_hash(void);
static int test_list(void);
static int test_nanoftp(void);
static int test_nanohttp(void);
static int test_parser(void);
static int test_parserInternals(void);
static int test_pattern(void);
static int test_relaxng(void);
static int test_schemasInternals(void);
static int test_schematron(void);
static int test_tree(void);
static int test_uri(void);
static int test_valid(void);
static int test_xinclude(void);
static int test_xmlIO(void);
static int test_xmlautomata(void);
static int test_xmlerror(void);
static int test_xmlmodule(void);
static int test_xmlreader(void);
static int test_xmlregexp(void);
static int test_xmlsave(void);
static int test_xmlschemas(void);
static int test_xmlschemastypes(void);
static int test_xmlstring(void);
static int test_xmlunicode(void);
static int test_xmlwriter(void);
static int test_xpath(void);
static int test_xpathInternals(void);
static int test_xpointer(void);

/**
 * testlibxml2:
 *
 * Main entry point of the tester for the full libxml2 module,
 * it calls all the tester entry point for each module.
 *
 * Returns the number of error found
 */
static int
testlibxml2(void)
{
    int test_ret = 0;

    test_ret += test_HTMLparser();
    test_ret += test_HTMLtree();
    test_ret += test_SAX2();
    test_ret += test_c14n();
    test_ret += test_catalog();
    test_ret += test_chvalid();
    test_ret += test_debugXML();
    test_ret += test_dict();
    test_ret += test_encoding();
    test_ret += test_entities();
    test_ret += test_hash();
    test_ret += test_list();
    test_ret += test_nanoftp();
    test_ret += test_nanohttp();
    test_ret += test_parser();
    test_ret += test_parserInternals();
    test_ret += test_pattern();
    test_ret += test_relaxng();
    test_ret += test_schemasInternals();
    test_ret += test_schematron();
    test_ret += test_tree();
    test_ret += test_uri();
    test_ret += test_valid();
    test_ret += test_xinclude();
    test_ret += test_xmlIO();
    test_ret += test_xmlautomata();
    test_ret += test_xmlerror();
    test_ret += test_xmlmodule();
    test_ret += test_xmlreader();
    test_ret += test_xmlregexp();
    test_ret += test_xmlsave();
    test_ret += test_xmlschemas();
    test_ret += test_xmlschemastypes();
    test_ret += test_xmlstring();
    test_ret += test_xmlunicode();
    test_ret += test_xmlwriter();
    test_ret += test_xpath();
    test_ret += test_xpathInternals();
    test_ret += test_xpointer();

    printf("Total: %d functions, %d tests, %d errors\n",
           function_tests, call_tests, test_ret);
    return(test_ret);
}


static int
test_UTF8ToHtml(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    unsigned char * out; /* a pointer to an array of bytes to store the result */
    int n_out;
    int * outlen; /* the length of @out */
    int n_outlen;
    unsigned char * in; /* a pointer to an array of UTF-8 chars */
    int n_in;
    int * inlen; /* the length of @in */
    int n_inlen;

    for (n_out = 0;n_out < gen_nb_unsigned_char_ptr;n_out++) {
    for (n_outlen = 0;n_outlen < gen_nb_int_ptr;n_outlen++) {
    for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) {
    for (n_inlen = 0;n_inlen < gen_nb_int_ptr;n_inlen++) {
        mem_base = xmlMemBlocks();
        out = gen_unsigned_char_ptr(n_out, 0);
        outlen = gen_int_ptr(n_outlen, 1);
        in = gen_const_unsigned_char_ptr(n_in, 2);
        inlen = gen_int_ptr(n_inlen, 3);

        ret_val = UTF8ToHtml(out, outlen, (const unsigned char *)in, inlen);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_char_ptr(n_out, out, 0);
        des_int_ptr(n_outlen, outlen, 1);
        des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 2);
        des_int_ptr(n_inlen, inlen, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in UTF8ToHtml",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf(" %d", n_outlen);
            printf(" %d", n_in);
            printf(" %d", n_inlen);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_HTML_ENABLED

#define gen_nb_const_htmlElemDesc_ptr 1
static htmlElemDesc * gen_const_htmlElemDesc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_htmlElemDesc_ptr(int no ATTRIBUTE_UNUSED, const htmlElemDesc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_htmlAttrAllowed(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlStatus ret_val;
    htmlElemDesc * elt; /* HTML element */
    int n_elt;
    xmlChar * attr; /* HTML attribute */
    int n_attr;
    int legacy; /* whether to allow deprecated attributes */
    int n_legacy;

    for (n_elt = 0;n_elt < gen_nb_const_htmlElemDesc_ptr;n_elt++) {
    for (n_attr = 0;n_attr < gen_nb_const_xmlChar_ptr;n_attr++) {
    for (n_legacy = 0;n_legacy < gen_nb_int;n_legacy++) {
        mem_base = xmlMemBlocks();
        elt = gen_const_htmlElemDesc_ptr(n_elt, 0);
        attr = gen_const_xmlChar_ptr(n_attr, 1);
        legacy = gen_int(n_legacy, 2);

        ret_val = htmlAttrAllowed((const htmlElemDesc *)elt, (const xmlChar *)attr, legacy);
        desret_htmlStatus(ret_val);
        call_tests++;
        des_const_htmlElemDesc_ptr(n_elt, (const htmlElemDesc *)elt, 0);
        des_const_xmlChar_ptr(n_attr, (const xmlChar *)attr, 1);
        des_int(n_legacy, legacy, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlAttrAllowed",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_elt);
            printf(" %d", n_attr);
            printf(" %d", n_legacy);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_HTML_ENABLED

#define gen_nb_htmlNodePtr 1
static htmlNodePtr gen_htmlNodePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_htmlNodePtr(int no ATTRIBUTE_UNUSED, htmlNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_htmlAutoCloseTag(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    htmlDocPtr doc; /* the HTML document */
    int n_doc;
    xmlChar * name; /* The tag name */
    int n_name;
    htmlNodePtr elem; /* the HTML element */
    int n_elem;

    for (n_doc = 0;n_doc < gen_nb_htmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_elem = 0;n_elem < gen_nb_htmlNodePtr;n_elem++) {
        mem_base = xmlMemBlocks();
        doc = gen_htmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        elem = gen_htmlNodePtr(n_elem, 2);

        ret_val = htmlAutoCloseTag(doc, (const xmlChar *)name, elem);
        desret_int(ret_val);
        call_tests++;
        des_htmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_htmlNodePtr(n_elem, elem, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlAutoCloseTag",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlCreateMemoryParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlParserCtxtPtr ret_val;
    char * buffer; /* a pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;

    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
        mem_base = xmlMemBlocks();
        buffer = gen_const_char_ptr(n_buffer, 0);
        size = gen_int(n_size, 1);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = htmlCreateMemoryParserCtxt((const char *)buffer, size);
        desret_htmlParserCtxtPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_buffer, (const char *)buffer, 0);
        des_int(n_size, size, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlCreateMemoryParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_HTML_ENABLED

#define gen_nb_htmlSAXHandlerPtr 1
static htmlSAXHandlerPtr gen_htmlSAXHandlerPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_htmlSAXHandlerPtr(int no ATTRIBUTE_UNUSED, htmlSAXHandlerPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_htmlCreatePushParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED)
    int mem_base;
    htmlParserCtxtPtr ret_val;
    htmlSAXHandlerPtr sax; /* a SAX handler */
    int n_sax;
    void * user_data; /* The user data returned on SAX callbacks */
    int n_user_data;
    char * chunk; /* a pointer to an array of chars */
    int n_chunk;
    int size; /* number of chars in the array */
    int n_size;
    const char * filename; /* an optional file name or URI */
    int n_filename;
    xmlCharEncoding enc; /* an optional encoding */
    int n_enc;

    for (n_sax = 0;n_sax < gen_nb_htmlSAXHandlerPtr;n_sax++) {
    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
    for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        sax = gen_htmlSAXHandlerPtr(n_sax, 0);
        user_data = gen_userdata(n_user_data, 1);
        chunk = gen_const_char_ptr(n_chunk, 2);
        size = gen_int(n_size, 3);
        filename = gen_fileoutput(n_filename, 4);
        enc = gen_xmlCharEncoding(n_enc, 5);
        if ((chunk != NULL) &&
            (size > (int) strlen((const char *) chunk) + 1))
            continue;

        ret_val = htmlCreatePushParserCtxt(sax, user_data, (const char *)chunk, size, filename, enc);
        desret_htmlParserCtxtPtr(ret_val);
        call_tests++;
        des_htmlSAXHandlerPtr(n_sax, sax, 0);
        des_userdata(n_user_data, user_data, 1);
        des_const_char_ptr(n_chunk, (const char *)chunk, 2);
        des_int(n_size, size, 3);
        des_fileoutput(n_filename, filename, 4);
        des_xmlCharEncoding(n_enc, enc, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlCreatePushParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_user_data);
            printf(" %d", n_chunk);
            printf(" %d", n_size);
            printf(" %d", n_filename);
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlCtxtReadDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;
    xmlChar * cur; /* a pointer to a zero terminated string */
    int n_cur;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of htmlParserOption(s) */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);
        cur = gen_const_xmlChar_ptr(n_cur, 1);
        URL = gen_filepath(n_URL, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);
        options = gen_int(n_options, 4);

        ret_val = htmlCtxtReadDoc(ctxt, (const xmlChar *)cur, URL, (const char *)encoding, options);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1);
        des_filepath(n_URL, URL, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        des_int(n_options, options, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlCtxtReadDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlCtxtReadFile(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    htmlDocPtr ret_val;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;
    const char * filename; /* a file or URL */
    int n_filename;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of htmlParserOption(s) */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);
        filename = gen_filepath(n_filename, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        options = gen_int(n_options, 3);

        ret_val = htmlCtxtReadFile(ctxt, filename, (const char *)encoding, options);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_filepath(n_filename, filename, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_int(n_options, options, 3);
        xmlResetLastError();
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlCtxtReadMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;
    char * buffer; /* a pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of htmlParserOption(s) */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);
        buffer = gen_const_char_ptr(n_buffer, 1);
        size = gen_int(n_size, 2);
        URL = gen_filepath(n_URL, 3);
        encoding = gen_const_char_ptr(n_encoding, 4);
        options = gen_int(n_options, 5);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = htmlCtxtReadMemory(ctxt, (const char *)buffer, size, URL, (const char *)encoding, options);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_char_ptr(n_buffer, (const char *)buffer, 1);
        des_int(n_size, size, 2);
        des_filepath(n_URL, URL, 3);
        des_const_char_ptr(n_encoding, (const char *)encoding, 4);
        des_int(n_options, options, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlCtxtReadMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlCtxtReset(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);

        htmlCtxtReset(ctxt);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlCtxtReset",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlCtxtUseOptions(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;
    int options; /* a combination of htmlParserOption(s) */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);
        options = gen_int(n_options, 1);

        ret_val = htmlCtxtUseOptions(ctxt, options);
        desret_int(ret_val);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_int(n_options, options, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlCtxtUseOptions",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlElementAllowedHere(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    htmlElemDesc * parent; /* HTML parent element */
    int n_parent;
    xmlChar * elt; /* HTML element */
    int n_elt;

    for (n_parent = 0;n_parent < gen_nb_const_htmlElemDesc_ptr;n_parent++) {
    for (n_elt = 0;n_elt < gen_nb_const_xmlChar_ptr;n_elt++) {
        mem_base = xmlMemBlocks();
        parent = gen_const_htmlElemDesc_ptr(n_parent, 0);
        elt = gen_const_xmlChar_ptr(n_elt, 1);

        ret_val = htmlElementAllowedHere((const htmlElemDesc *)parent, (const xmlChar *)elt);
        desret_int(ret_val);
        call_tests++;
        des_const_htmlElemDesc_ptr(n_parent, (const htmlElemDesc *)parent, 0);
        des_const_xmlChar_ptr(n_elt, (const xmlChar *)elt, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlElementAllowedHere",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf(" %d", n_elt);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlElementStatusHere(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlStatus ret_val;
    htmlElemDesc * parent; /* HTML parent element */
    int n_parent;
    htmlElemDesc * elt; /* HTML element */
    int n_elt;

    for (n_parent = 0;n_parent < gen_nb_const_htmlElemDesc_ptr;n_parent++) {
    for (n_elt = 0;n_elt < gen_nb_const_htmlElemDesc_ptr;n_elt++) {
        mem_base = xmlMemBlocks();
        parent = gen_const_htmlElemDesc_ptr(n_parent, 0);
        elt = gen_const_htmlElemDesc_ptr(n_elt, 1);

        ret_val = htmlElementStatusHere((const htmlElemDesc *)parent, (const htmlElemDesc *)elt);
        desret_htmlStatus(ret_val);
        call_tests++;
        des_const_htmlElemDesc_ptr(n_parent, (const htmlElemDesc *)parent, 0);
        des_const_htmlElemDesc_ptr(n_elt, (const htmlElemDesc *)elt, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlElementStatusHere",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf(" %d", n_elt);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlEncodeEntities(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    unsigned char * out; /* a pointer to an array of bytes to store the result */
    int n_out;
    int * outlen; /* the length of @out */
    int n_outlen;
    unsigned char * in; /* a pointer to an array of UTF-8 chars */
    int n_in;
    int * inlen; /* the length of @in */
    int n_inlen;
    int quoteChar; /* the quote character to escape (' or ") or zero. */
    int n_quoteChar;

    for (n_out = 0;n_out < gen_nb_unsigned_char_ptr;n_out++) {
    for (n_outlen = 0;n_outlen < gen_nb_int_ptr;n_outlen++) {
    for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) {
    for (n_inlen = 0;n_inlen < gen_nb_int_ptr;n_inlen++) {
    for (n_quoteChar = 0;n_quoteChar < gen_nb_int;n_quoteChar++) {
        mem_base = xmlMemBlocks();
        out = gen_unsigned_char_ptr(n_out, 0);
        outlen = gen_int_ptr(n_outlen, 1);
        in = gen_const_unsigned_char_ptr(n_in, 2);
        inlen = gen_int_ptr(n_inlen, 3);
        quoteChar = gen_int(n_quoteChar, 4);

        ret_val = htmlEncodeEntities(out, outlen, (const unsigned char *)in, inlen, quoteChar);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_char_ptr(n_out, out, 0);
        des_int_ptr(n_outlen, outlen, 1);
        des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 2);
        des_int_ptr(n_inlen, inlen, 3);
        des_int(n_quoteChar, quoteChar, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlEncodeEntities",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf(" %d", n_outlen);
            printf(" %d", n_in);
            printf(" %d", n_inlen);
            printf(" %d", n_quoteChar);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlEntityLookup(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    const htmlEntityDesc * ret_val;
    xmlChar * name; /* the entity name */
    int n_name;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);

        ret_val = htmlEntityLookup((const xmlChar *)name);
        desret_const_htmlEntityDesc_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlEntityLookup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlEntityValueLookup(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    const htmlEntityDesc * ret_val;
    unsigned int value; /* the entity's unicode value */
    int n_value;

    for (n_value = 0;n_value < gen_nb_unsigned_int;n_value++) {
        mem_base = xmlMemBlocks();
        value = gen_unsigned_int(n_value, 0);

        ret_val = htmlEntityValueLookup(value);
        desret_const_htmlEntityDesc_ptr(ret_val);
        call_tests++;
        des_unsigned_int(n_value, value, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlEntityValueLookup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlHandleOmittedElem(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    int val; /* int 0 or 1 */
    int n_val;

    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_int(n_val, 0);

        ret_val = htmlHandleOmittedElem(val);
        desret_int(ret_val);
        call_tests++;
        des_int(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlHandleOmittedElem",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlIsAutoClosed(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    htmlDocPtr doc; /* the HTML document */
    int n_doc;
    htmlNodePtr elem; /* the HTML element */
    int n_elem;

    for (n_doc = 0;n_doc < gen_nb_htmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_htmlNodePtr;n_elem++) {
        mem_base = xmlMemBlocks();
        doc = gen_htmlDocPtr(n_doc, 0);
        elem = gen_htmlNodePtr(n_elem, 1);

        ret_val = htmlIsAutoClosed(doc, elem);
        desret_int(ret_val);
        call_tests++;
        des_htmlDocPtr(n_doc, doc, 0);
        des_htmlNodePtr(n_elem, elem, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlIsAutoClosed",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlIsScriptAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    xmlChar * name; /* an attribute name */
    int n_name;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);

        ret_val = htmlIsScriptAttribute((const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlIsScriptAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlNewParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlParserCtxtPtr ret_val;

        mem_base = xmlMemBlocks();

        ret_val = htmlNewParserCtxt();
        desret_htmlParserCtxtPtr(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlNewParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlNodeStatus(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlStatus ret_val;
    htmlNodePtr node; /* an htmlNodePtr in a tree */
    int n_node;
    int legacy; /* whether to allow deprecated elements (YES is faster here for Element nodes) */
    int n_legacy;

    for (n_node = 0;n_node < gen_nb_const_htmlNodePtr;n_node++) {
    for (n_legacy = 0;n_legacy < gen_nb_int;n_legacy++) {
        mem_base = xmlMemBlocks();
        node = gen_const_htmlNodePtr(n_node, 0);
        legacy = gen_int(n_legacy, 1);

        ret_val = htmlNodeStatus((const htmlNodePtr)node, legacy);
        desret_htmlStatus(ret_val);
        call_tests++;
        des_const_htmlNodePtr(n_node, (const htmlNodePtr)node, 0);
        des_int(n_legacy, legacy, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlNodeStatus",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_legacy);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlParseCharRef(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);

        ret_val = htmlParseCharRef(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlParseCharRef",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlParseChunk(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_PUSH_ENABLED)
    int mem_base;
    int ret_val;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;
    char * chunk; /* an char array */
    int n_chunk;
    int size; /* the size in byte of the chunk */
    int n_size;
    int terminate; /* last chunk indicator */
    int n_terminate;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
    for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_terminate = 0;n_terminate < gen_nb_int;n_terminate++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);
        chunk = gen_const_char_ptr(n_chunk, 1);
        size = gen_int(n_size, 2);
        terminate = gen_int(n_terminate, 3);
        if ((chunk != NULL) &&
            (size > (int) strlen((const char *) chunk) + 1))
            continue;

        ret_val = htmlParseChunk(ctxt, (const char *)chunk, size, terminate);
        if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}
        desret_int(ret_val);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_char_ptr(n_chunk, (const char *)chunk, 1);
        des_int(n_size, size, 2);
        des_int(n_terminate, terminate, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlParseChunk",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_chunk);
            printf(" %d", n_size);
            printf(" %d", n_terminate);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlParseDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    xmlChar * cur; /* a pointer to an array of xmlChar */
    int n_cur;
    char * encoding; /* a free form C string describing the HTML document encoding, or NULL */
    int n_encoding;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);
        encoding = gen_const_char_ptr(n_encoding, 1);

        ret_val = htmlParseDoc((const xmlChar *)cur, (const char *)encoding);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        des_const_char_ptr(n_encoding, (const char *)encoding, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlParseDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlParseDocument(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);

        ret_val = htmlParseDocument(ctxt);
        if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}
        desret_int(ret_val);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlParseDocument",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlParseElement(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);

        htmlParseElement(ctxt);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlParseElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlParseEntityRef(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    const htmlEntityDesc * ret_val;
    htmlParserCtxtPtr ctxt; /* an HTML parser context */
    int n_ctxt;
    xmlChar ** str; /* location to store the entity name */
    int n_str;

    for (n_ctxt = 0;n_ctxt < gen_nb_htmlParserCtxtPtr;n_ctxt++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_htmlParserCtxtPtr(n_ctxt, 0);
        str = gen_const_xmlChar_ptr_ptr(n_str, 1);

        ret_val = htmlParseEntityRef(ctxt, (const xmlChar **)str);
        desret_const_htmlEntityDesc_ptr(ret_val);
        call_tests++;
        des_htmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr_ptr(n_str, (const xmlChar **)str, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlParseEntityRef",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlParseFile(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    htmlDocPtr ret_val;
    const char * filename; /* the filename */
    int n_filename;
    char * encoding; /* a free form C string describing the HTML document encoding, or NULL */
    int n_encoding;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        filename = gen_filepath(n_filename, 0);
        encoding = gen_const_char_ptr(n_encoding, 1);

        ret_val = htmlParseFile(filename, (const char *)encoding);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        des_const_char_ptr(n_encoding, (const char *)encoding, 1);
        xmlResetLastError();
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlReadDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    xmlChar * cur; /* a pointer to a zero terminated string */
    int n_cur;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of htmlParserOption(s) */
    int n_options;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);
        URL = gen_filepath(n_URL, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        options = gen_int(n_options, 3);

        ret_val = htmlReadDoc((const xmlChar *)cur, URL, (const char *)encoding, options);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        des_filepath(n_URL, URL, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_int(n_options, options, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlReadDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlReadFile(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    const char * filename; /* a file or URL */
    int n_filename;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of htmlParserOption(s) */
    int n_options;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);
        encoding = gen_const_char_ptr(n_encoding, 1);
        options = gen_int(n_options, 2);

        ret_val = htmlReadFile(filename, (const char *)encoding, options);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        des_const_char_ptr(n_encoding, (const char *)encoding, 1);
        des_int(n_options, options, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlReadFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlReadMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    char * buffer; /* a pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of htmlParserOption(s) */
    int n_options;

    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        buffer = gen_const_char_ptr(n_buffer, 0);
        size = gen_int(n_size, 1);
        URL = gen_filepath(n_URL, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);
        options = gen_int(n_options, 4);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = htmlReadMemory((const char *)buffer, size, URL, (const char *)encoding, options);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_buffer, (const char *)buffer, 0);
        des_int(n_size, size, 1);
        des_filepath(n_URL, URL, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        des_int(n_options, options, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlReadMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlSAXParseDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    xmlChar * cur; /* a pointer to an array of xmlChar */
    int n_cur;
    char * encoding; /* a free form C string describing the HTML document encoding, or NULL */
    int n_encoding;
    htmlSAXHandlerPtr sax; /* the SAX handler block */
    int n_sax;
    void * userData; /* if using SAX, this pointer will be provided on callbacks. */
    int n_userData;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_sax = 0;n_sax < gen_nb_htmlSAXHandlerPtr;n_sax++) {
    for (n_userData = 0;n_userData < gen_nb_userdata;n_userData++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);
        encoding = gen_const_char_ptr(n_encoding, 1);
        sax = gen_htmlSAXHandlerPtr(n_sax, 2);
        userData = gen_userdata(n_userData, 3);

        ret_val = htmlSAXParseDoc((const xmlChar *)cur, (const char *)encoding, sax, userData);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        des_const_char_ptr(n_encoding, (const char *)encoding, 1);
        des_htmlSAXHandlerPtr(n_sax, sax, 2);
        des_userdata(n_userData, userData, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlSAXParseDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf(" %d", n_sax);
            printf(" %d", n_userData);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlSAXParseFile(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    const char * filename; /* the filename */
    int n_filename;
    char * encoding; /* a free form C string describing the HTML document encoding, or NULL */
    int n_encoding;
    htmlSAXHandlerPtr sax; /* the SAX handler block */
    int n_sax;
    void * userData; /* if using SAX, this pointer will be provided on callbacks. */
    int n_userData;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_sax = 0;n_sax < gen_nb_htmlSAXHandlerPtr;n_sax++) {
    for (n_userData = 0;n_userData < gen_nb_userdata;n_userData++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);
        encoding = gen_const_char_ptr(n_encoding, 1);
        sax = gen_htmlSAXHandlerPtr(n_sax, 2);
        userData = gen_userdata(n_userData, 3);

        ret_val = htmlSAXParseFile(filename, (const char *)encoding, sax, userData);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        des_const_char_ptr(n_encoding, (const char *)encoding, 1);
        des_htmlSAXHandlerPtr(n_sax, sax, 2);
        des_userdata(n_userData, userData, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlSAXParseFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_encoding);
            printf(" %d", n_sax);
            printf(" %d", n_userData);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlTagLookup(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

static int
test_HTMLparser(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing HTMLparser : 32 of 38 functions ...\n");
    test_ret += test_UTF8ToHtml();
    test_ret += test_htmlAttrAllowed();
    test_ret += test_htmlAutoCloseTag();
    test_ret += test_htmlCreateMemoryParserCtxt();
    test_ret += test_htmlCreatePushParserCtxt();
    test_ret += test_htmlCtxtReadDoc();
    test_ret += test_htmlCtxtReadFile();
    test_ret += test_htmlCtxtReadMemory();
    test_ret += test_htmlCtxtReset();
    test_ret += test_htmlCtxtUseOptions();
    test_ret += test_htmlElementAllowedHere();
    test_ret += test_htmlElementStatusHere();
    test_ret += test_htmlEncodeEntities();
    test_ret += test_htmlEntityLookup();
    test_ret += test_htmlEntityValueLookup();
    test_ret += test_htmlHandleOmittedElem();
    test_ret += test_htmlIsAutoClosed();
    test_ret += test_htmlIsScriptAttribute();
    test_ret += test_htmlNewParserCtxt();
    test_ret += test_htmlNodeStatus();
    test_ret += test_htmlParseCharRef();
    test_ret += test_htmlParseChunk();
    test_ret += test_htmlParseDoc();
    test_ret += test_htmlParseDocument();
    test_ret += test_htmlParseElement();
    test_ret += test_htmlParseEntityRef();
    test_ret += test_htmlParseFile();
    test_ret += test_htmlReadDoc();
    test_ret += test_htmlReadFile();
    test_ret += test_htmlReadMemory();
    test_ret += test_htmlSAXParseDoc();
    test_ret += test_htmlSAXParseFile();
    test_ret += test_htmlTagLookup();

    if (test_ret != 0)
	printf("Module HTMLparser: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_htmlDocContentDumpFormatOutput(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr buf; /* the HTML buffer output */
    int n_buf;
    xmlDocPtr cur; /* the document */
    int n_cur;
    char * encoding; /* the encoding string */
    int n_encoding;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlOutputBufferPtr(n_buf, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        format = gen_int(n_format, 3);

        htmlDocContentDumpFormatOutput(buf, cur, (const char *)encoding, format);
        call_tests++;
        des_xmlOutputBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_int(n_format, format, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlDocContentDumpFormatOutput",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlDocContentDumpOutput(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr buf; /* the HTML buffer output */
    int n_buf;
    xmlDocPtr cur; /* the document */
    int n_cur;
    char * encoding; /* the encoding string */
    int n_encoding;

    for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlOutputBufferPtr(n_buf, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);

        htmlDocContentDumpOutput(buf, cur, (const char *)encoding);
        call_tests++;
        des_xmlOutputBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlDocContentDumpOutput",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlDocDump(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    FILE * f; /* the FILE* */
    int n_f;
    xmlDocPtr cur; /* the document */
    int n_cur;

    for (n_f = 0;n_f < gen_nb_FILE_ptr;n_f++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        f = gen_FILE_ptr(n_f, 0);
        cur = gen_xmlDocPtr(n_cur, 1);

        ret_val = htmlDocDump(f, cur);
        desret_int(ret_val);
        call_tests++;
        des_FILE_ptr(n_f, f, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlDocDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_f);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


#define gen_nb_xmlChar_ptr_ptr 1
static xmlChar ** gen_xmlChar_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlChar_ptr_ptr(int no ATTRIBUTE_UNUSED, xmlChar ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_htmlDocDumpMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlDocPtr cur; /* the document */
    int n_cur;
    xmlChar ** mem; /* OUT: the memory pointer */
    int n_mem;
    int * size; /* OUT: the memory length */
    int n_size;

    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_mem = 0;n_mem < gen_nb_xmlChar_ptr_ptr;n_mem++) {
    for (n_size = 0;n_size < gen_nb_int_ptr;n_size++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlDocPtr(n_cur, 0);
        mem = gen_xmlChar_ptr_ptr(n_mem, 1);
        size = gen_int_ptr(n_size, 2);

        htmlDocDumpMemory(cur, mem, size);
        call_tests++;
        des_xmlDocPtr(n_cur, cur, 0);
        des_xmlChar_ptr_ptr(n_mem, mem, 1);
        des_int_ptr(n_size, size, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlDocDumpMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_mem);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlDocDumpMemoryFormat(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlDocPtr cur; /* the document */
    int n_cur;
    xmlChar ** mem; /* OUT: the memory pointer */
    int n_mem;
    int * size; /* OUT: the memory length */
    int n_size;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_mem = 0;n_mem < gen_nb_xmlChar_ptr_ptr;n_mem++) {
    for (n_size = 0;n_size < gen_nb_int_ptr;n_size++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlDocPtr(n_cur, 0);
        mem = gen_xmlChar_ptr_ptr(n_mem, 1);
        size = gen_int_ptr(n_size, 2);
        format = gen_int(n_format, 3);

        htmlDocDumpMemoryFormat(cur, mem, size, format);
        call_tests++;
        des_xmlDocPtr(n_cur, cur, 0);
        des_xmlChar_ptr_ptr(n_mem, mem, 1);
        des_int_ptr(n_size, size, 2);
        des_int(n_format, format, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlDocDumpMemoryFormat",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_mem);
            printf(" %d", n_size);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlGetMetaEncoding(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    htmlDocPtr doc; /* the document */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_htmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_htmlDocPtr(n_doc, 0);

        ret_val = htmlGetMetaEncoding(doc);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_htmlDocPtr(n_doc, doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlGetMetaEncoding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlIsBooleanAttr(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    xmlChar * name; /* the name of the attribute to check */
    int n_name;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);

        ret_val = htmlIsBooleanAttr((const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlIsBooleanAttr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlNewDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    xmlChar * URI; /* URI for the dtd, or NULL */
    int n_URI;
    xmlChar * ExternalID; /* the external ID of the DTD, or NULL */
    int n_ExternalID;

    for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
        mem_base = xmlMemBlocks();
        URI = gen_const_xmlChar_ptr(n_URI, 0);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 1);

        ret_val = htmlNewDoc((const xmlChar *)URI, (const xmlChar *)ExternalID);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlNewDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URI);
            printf(" %d", n_ExternalID);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlNewDocNoDtD(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlDocPtr ret_val;
    xmlChar * URI; /* URI for the dtd, or NULL */
    int n_URI;
    xmlChar * ExternalID; /* the external ID of the DTD, or NULL */
    int n_ExternalID;

    for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
        mem_base = xmlMemBlocks();
        URI = gen_const_xmlChar_ptr(n_URI, 0);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 1);

        ret_val = htmlNewDocNoDtD((const xmlChar *)URI, (const xmlChar *)ExternalID);
        desret_htmlDocPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlNewDocNoDtD",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URI);
            printf(" %d", n_ExternalID);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlNodeDump(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlBufferPtr buf; /* the HTML buffer output */
    int n_buf;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr cur; /* the current node */
    int n_cur;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        cur = gen_xmlNodePtr(n_cur, 2);

        ret_val = htmlNodeDump(buf, doc, cur);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_cur, cur, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlNodeDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlNodeDumpFile(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    FILE * out; /* the FILE pointer */
    int n_out;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr cur; /* the current node */
    int n_cur;

    for (n_out = 0;n_out < gen_nb_FILE_ptr;n_out++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        out = gen_FILE_ptr(n_out, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        cur = gen_xmlNodePtr(n_cur, 2);

        htmlNodeDumpFile(out, doc, cur);
        call_tests++;
        des_FILE_ptr(n_out, out, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_cur, cur, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlNodeDumpFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlNodeDumpFileFormat(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    FILE * out; /* the FILE pointer */
    int n_out;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr cur; /* the current node */
    int n_cur;
    char * encoding; /* the document encoding */
    int n_encoding;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_out = 0;n_out < gen_nb_FILE_ptr;n_out++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        out = gen_FILE_ptr(n_out, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        cur = gen_xmlNodePtr(n_cur, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);
        format = gen_int(n_format, 4);

        ret_val = htmlNodeDumpFileFormat(out, doc, cur, (const char *)encoding, format);
        desret_int(ret_val);
        call_tests++;
        des_FILE_ptr(n_out, out, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_cur, cur, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        des_int(n_format, format, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlNodeDumpFileFormat",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlNodeDumpFormatOutput(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr buf; /* the HTML buffer output */
    int n_buf;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr cur; /* the current node */
    int n_cur;
    char * encoding; /* the encoding string */
    int n_encoding;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlOutputBufferPtr(n_buf, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        cur = gen_xmlNodePtr(n_cur, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);
        format = gen_int(n_format, 4);

        htmlNodeDumpFormatOutput(buf, doc, cur, (const char *)encoding, format);
        call_tests++;
        des_xmlOutputBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_cur, cur, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        des_int(n_format, format, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlNodeDumpFormatOutput",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlNodeDumpOutput(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr buf; /* the HTML buffer output */
    int n_buf;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr cur; /* the current node */
    int n_cur;
    char * encoding; /* the encoding string */
    int n_encoding;

    for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlOutputBufferPtr(n_buf, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        cur = gen_xmlNodePtr(n_cur, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);

        htmlNodeDumpOutput(buf, doc, cur, (const char *)encoding);
        call_tests++;
        des_xmlOutputBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_cur, cur, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlNodeDumpOutput",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlSaveFile(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    const char * filename; /* the filename (or URL) */
    int n_filename;
    xmlDocPtr cur; /* the document */
    int n_cur;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);
        cur = gen_xmlDocPtr(n_cur, 1);

        ret_val = htmlSaveFile(filename, cur);
        desret_int(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlSaveFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlSaveFileEnc(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    const char * filename; /* the filename */
    int n_filename;
    xmlDocPtr cur; /* the document */
    int n_cur;
    char * encoding; /* the document encoding */
    int n_encoding;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);

        ret_val = htmlSaveFileEnc(filename, cur, (const char *)encoding);
        desret_int(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlSaveFileEnc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlSaveFileFormat(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    const char * filename; /* the filename */
    int n_filename;
    xmlDocPtr cur; /* the document */
    int n_cur;
    char * encoding; /* the document encoding */
    int n_encoding;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        format = gen_int(n_format, 3);

        ret_val = htmlSaveFileFormat(filename, cur, (const char *)encoding, format);
        desret_int(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_int(n_format, format, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlSaveFileFormat",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlSetMetaEncoding(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    int ret_val;
    htmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * encoding; /* the encoding string */
    int n_encoding;

    for (n_doc = 0;n_doc < gen_nb_htmlDocPtr;n_doc++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_xmlChar_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        doc = gen_htmlDocPtr(n_doc, 0);
        encoding = gen_const_xmlChar_ptr(n_encoding, 1);

        ret_val = htmlSetMetaEncoding(doc, (const xmlChar *)encoding);
        desret_int(ret_val);
        call_tests++;
        des_htmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_encoding, (const xmlChar *)encoding, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlSetMetaEncoding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_HTMLtree(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing HTMLtree : 18 of 18 functions ...\n");
    test_ret += test_htmlDocContentDumpFormatOutput();
    test_ret += test_htmlDocContentDumpOutput();
    test_ret += test_htmlDocDump();
    test_ret += test_htmlDocDumpMemory();
    test_ret += test_htmlDocDumpMemoryFormat();
    test_ret += test_htmlGetMetaEncoding();
    test_ret += test_htmlIsBooleanAttr();
    test_ret += test_htmlNewDoc();
    test_ret += test_htmlNewDocNoDtD();
    test_ret += test_htmlNodeDump();
    test_ret += test_htmlNodeDumpFile();
    test_ret += test_htmlNodeDumpFileFormat();
    test_ret += test_htmlNodeDumpFormatOutput();
    test_ret += test_htmlNodeDumpOutput();
    test_ret += test_htmlSaveFile();
    test_ret += test_htmlSaveFileEnc();
    test_ret += test_htmlSaveFileFormat();
    test_ret += test_htmlSetMetaEncoding();

    if (test_ret != 0)
	printf("Module HTMLtree: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_docbDefaultSAXHandlerInit(void) {
    int test_ret = 0;

#if defined(LIBXML_DOCB_ENABLED)
#ifdef LIBXML_DOCB_ENABLED
    int mem_base;

        mem_base = xmlMemBlocks();

        docbDefaultSAXHandlerInit();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in docbDefaultSAXHandlerInit",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_htmlDefaultSAXHandlerInit(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
#ifdef LIBXML_HTML_ENABLED
    int mem_base;

        mem_base = xmlMemBlocks();

        htmlDefaultSAXHandlerInit();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlDefaultSAXHandlerInit",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlDefaultSAXHandlerInit(void) {
    int test_ret = 0;

    int mem_base;

        mem_base = xmlMemBlocks();

        xmlDefaultSAXHandlerInit();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDefaultSAXHandlerInit",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlEnumerationPtr 1
static xmlEnumerationPtr gen_xmlEnumerationPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlEnumerationPtr(int no ATTRIBUTE_UNUSED, xmlEnumerationPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlSAX2AttributeDecl(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * elem; /* the name of the element */
    int n_elem;
    xmlChar * fullname; /* the attribute name */
    int n_fullname;
    int type; /* the attribute type */
    int n_type;
    int def; /* the type of default value */
    int n_def;
    xmlChar * defaultValue; /* the attribute default value */
    int n_defaultValue;
    xmlEnumerationPtr tree; /* the tree of enumerated value set */
    int n_tree;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_elem = 0;n_elem < gen_nb_const_xmlChar_ptr;n_elem++) {
    for (n_fullname = 0;n_fullname < gen_nb_const_xmlChar_ptr;n_fullname++) {
    for (n_type = 0;n_type < gen_nb_int;n_type++) {
    for (n_def = 0;n_def < gen_nb_int;n_def++) {
    for (n_defaultValue = 0;n_defaultValue < gen_nb_const_xmlChar_ptr;n_defaultValue++) {
    for (n_tree = 0;n_tree < gen_nb_xmlEnumerationPtr;n_tree++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        elem = gen_const_xmlChar_ptr(n_elem, 1);
        fullname = gen_const_xmlChar_ptr(n_fullname, 2);
        type = gen_int(n_type, 3);
        def = gen_int(n_def, 4);
        defaultValue = gen_const_xmlChar_ptr(n_defaultValue, 5);
        tree = gen_xmlEnumerationPtr(n_tree, 6);

        xmlSAX2AttributeDecl(ctx, (const xmlChar *)elem, (const xmlChar *)fullname, type, def, (const xmlChar *)defaultValue, tree);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_elem, (const xmlChar *)elem, 1);
        des_const_xmlChar_ptr(n_fullname, (const xmlChar *)fullname, 2);
        des_int(n_type, type, 3);
        des_int(n_def, def, 4);
        des_const_xmlChar_ptr(n_defaultValue, (const xmlChar *)defaultValue, 5);
        des_xmlEnumerationPtr(n_tree, tree, 6);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2AttributeDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_elem);
            printf(" %d", n_fullname);
            printf(" %d", n_type);
            printf(" %d", n_def);
            printf(" %d", n_defaultValue);
            printf(" %d", n_tree);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2CDataBlock(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * value; /* The pcdata content */
    int n_value;
    int len; /* the block length */
    int n_len;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);
        len = gen_int(n_len, 2);
        if ((value != NULL) &&
            (len > (int) strlen((const char *) value) + 1))
            continue;

        xmlSAX2CDataBlock(ctx, (const xmlChar *)value, len);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2CDataBlock",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_value);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2Characters(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * ch; /* a xmlChar string */
    int n_ch;
    int len; /* the number of xmlChar */
    int n_len;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_ch = 0;n_ch < gen_nb_const_xmlChar_ptr;n_ch++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        ch = gen_const_xmlChar_ptr(n_ch, 1);
        len = gen_int(n_len, 2);
        if ((ch != NULL) &&
            (len > (int) strlen((const char *) ch) + 1))
            continue;

        xmlSAX2Characters(ctx, (const xmlChar *)ch, len);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_ch, (const xmlChar *)ch, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2Characters",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_ch);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2Comment(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * value; /* the xmlSAX2Comment content */
    int n_value;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);

        xmlSAX2Comment(ctx, (const xmlChar *)value);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2Comment",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2ElementDecl(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* the element name */
    int n_name;
    int type; /* the element type */
    int n_type;
    xmlElementContentPtr content; /* the element value tree */
    int n_content;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_type = 0;n_type < gen_nb_int;n_type++) {
    for (n_content = 0;n_content < gen_nb_xmlElementContentPtr;n_content++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        type = gen_int(n_type, 2);
        content = gen_xmlElementContentPtr(n_content, 3);

        xmlSAX2ElementDecl(ctx, (const xmlChar *)name, type, content);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_int(n_type, type, 2);
        des_xmlElementContentPtr(n_content, content, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2ElementDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf(" %d", n_type);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2EndDocument(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        xmlSAX2EndDocument(ctx);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2EndDocument",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2EndElement(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) || defined(LIBXML_LEGACY_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* The element name */
    int n_name;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        xmlSAX2EndElement(ctx, (const xmlChar *)name);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2EndElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAX2EndElementNs(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * localname; /* the local name of the element */
    int n_localname;
    xmlChar * prefix; /* the element namespace prefix if available */
    int n_prefix;
    xmlChar * URI; /* the element namespace name if available */
    int n_URI;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_localname = 0;n_localname < gen_nb_const_xmlChar_ptr;n_localname++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        localname = gen_const_xmlChar_ptr(n_localname, 1);
        prefix = gen_const_xmlChar_ptr(n_prefix, 2);
        URI = gen_const_xmlChar_ptr(n_URI, 3);

        xmlSAX2EndElementNs(ctx, (const xmlChar *)localname, (const xmlChar *)prefix, (const xmlChar *)URI);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_localname, (const xmlChar *)localname, 1);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 2);
        des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2EndElementNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_localname);
            printf(" %d", n_prefix);
            printf(" %d", n_URI);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2EntityDecl(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* the entity name */
    int n_name;
    int type; /* the entity type */
    int n_type;
    xmlChar * publicId; /* The public ID of the entity */
    int n_publicId;
    xmlChar * systemId; /* The system ID of the entity */
    int n_systemId;
    xmlChar * content; /* the entity value (without processing). */
    int n_content;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_type = 0;n_type < gen_nb_int;n_type++) {
    for (n_publicId = 0;n_publicId < gen_nb_const_xmlChar_ptr;n_publicId++) {
    for (n_systemId = 0;n_systemId < gen_nb_const_xmlChar_ptr;n_systemId++) {
    for (n_content = 0;n_content < gen_nb_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        type = gen_int(n_type, 2);
        publicId = gen_const_xmlChar_ptr(n_publicId, 3);
        systemId = gen_const_xmlChar_ptr(n_systemId, 4);
        content = gen_xmlChar_ptr(n_content, 5);

        xmlSAX2EntityDecl(ctx, (const xmlChar *)name, type, (const xmlChar *)publicId, (const xmlChar *)systemId, content);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_int(n_type, type, 2);
        des_const_xmlChar_ptr(n_publicId, (const xmlChar *)publicId, 3);
        des_const_xmlChar_ptr(n_systemId, (const xmlChar *)systemId, 4);
        des_xmlChar_ptr(n_content, content, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2EntityDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf(" %d", n_type);
            printf(" %d", n_publicId);
            printf(" %d", n_systemId);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2ExternalSubset(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* the root element name */
    int n_name;
    xmlChar * ExternalID; /* the external ID */
    int n_ExternalID;
    xmlChar * SystemID; /* the SYSTEM ID (e.g. filename or URL) */
    int n_SystemID;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2);
        SystemID = gen_const_xmlChar_ptr(n_SystemID, 3);

        xmlSAX2ExternalSubset(ctx, (const xmlChar *)name, (const xmlChar *)ExternalID, (const xmlChar *)SystemID);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 2);
        des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2ExternalSubset",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf(" %d", n_ExternalID);
            printf(" %d", n_SystemID);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2GetColumnNumber(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        ret_val = xmlSAX2GetColumnNumber(ctx);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2GetColumnNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2GetEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlEntityPtr ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* The entity name */
    int n_name;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlSAX2GetEntity(ctx, (const xmlChar *)name);
        desret_xmlEntityPtr(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2GetEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2GetLineNumber(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        ret_val = xmlSAX2GetLineNumber(ctx);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2GetLineNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2GetParameterEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlEntityPtr ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* The entity name */
    int n_name;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlSAX2GetParameterEntity(ctx, (const xmlChar *)name);
        desret_xmlEntityPtr(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2GetParameterEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2GetPublicId(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        ret_val = xmlSAX2GetPublicId(ctx);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2GetPublicId",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2GetSystemId(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        ret_val = xmlSAX2GetSystemId(ctx);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2GetSystemId",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2HasExternalSubset(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        ret_val = xmlSAX2HasExternalSubset(ctx);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2HasExternalSubset",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2HasInternalSubset(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        ret_val = xmlSAX2HasInternalSubset(ctx);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2HasInternalSubset",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2IgnorableWhitespace(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * ch; /* a xmlChar string */
    int n_ch;
    int len; /* the number of xmlChar */
    int n_len;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_ch = 0;n_ch < gen_nb_const_xmlChar_ptr;n_ch++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        ch = gen_const_xmlChar_ptr(n_ch, 1);
        len = gen_int(n_len, 2);
        if ((ch != NULL) &&
            (len > (int) strlen((const char *) ch) + 1))
            continue;

        xmlSAX2IgnorableWhitespace(ctx, (const xmlChar *)ch, len);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_ch, (const xmlChar *)ch, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2IgnorableWhitespace",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_ch);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlSAXHandler_ptr 1
static xmlSAXHandler * gen_xmlSAXHandler_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSAXHandler_ptr(int no ATTRIBUTE_UNUSED, xmlSAXHandler * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlSAX2InitDefaultSAXHandler(void) {
    int test_ret = 0;

    int mem_base;
    xmlSAXHandler * hdlr; /* the SAX handler */
    int n_hdlr;
    int warning; /* flag if non-zero sets the handler warning procedure */
    int n_warning;

    for (n_hdlr = 0;n_hdlr < gen_nb_xmlSAXHandler_ptr;n_hdlr++) {
    for (n_warning = 0;n_warning < gen_nb_int;n_warning++) {
        mem_base = xmlMemBlocks();
        hdlr = gen_xmlSAXHandler_ptr(n_hdlr, 0);
        warning = gen_int(n_warning, 1);

        xmlSAX2InitDefaultSAXHandler(hdlr, warning);
        call_tests++;
        des_xmlSAXHandler_ptr(n_hdlr, hdlr, 0);
        des_int(n_warning, warning, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2InitDefaultSAXHandler",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_hdlr);
            printf(" %d", n_warning);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2InitDocbDefaultSAXHandler(void) {
    int test_ret = 0;

#if defined(LIBXML_DOCB_ENABLED)
    int mem_base;
    xmlSAXHandler * hdlr; /* the SAX handler */
    int n_hdlr;

    for (n_hdlr = 0;n_hdlr < gen_nb_xmlSAXHandler_ptr;n_hdlr++) {
        mem_base = xmlMemBlocks();
        hdlr = gen_xmlSAXHandler_ptr(n_hdlr, 0);

        xmlSAX2InitDocbDefaultSAXHandler(hdlr);
        call_tests++;
        des_xmlSAXHandler_ptr(n_hdlr, hdlr, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2InitDocbDefaultSAXHandler",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_hdlr);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSAX2InitHtmlDefaultSAXHandler(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    xmlSAXHandler * hdlr; /* the SAX handler */
    int n_hdlr;

    for (n_hdlr = 0;n_hdlr < gen_nb_xmlSAXHandler_ptr;n_hdlr++) {
        mem_base = xmlMemBlocks();
        hdlr = gen_xmlSAXHandler_ptr(n_hdlr, 0);

        xmlSAX2InitHtmlDefaultSAXHandler(hdlr);
        call_tests++;
        des_xmlSAXHandler_ptr(n_hdlr, hdlr, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2InitHtmlDefaultSAXHandler",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_hdlr);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSAX2InternalSubset(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* the root element name */
    int n_name;
    xmlChar * ExternalID; /* the external ID */
    int n_ExternalID;
    xmlChar * SystemID; /* the SYSTEM ID (e.g. filename or URL) */
    int n_SystemID;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2);
        SystemID = gen_const_xmlChar_ptr(n_SystemID, 3);

        xmlSAX2InternalSubset(ctx, (const xmlChar *)name, (const xmlChar *)ExternalID, (const xmlChar *)SystemID);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 2);
        des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2InternalSubset",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf(" %d", n_ExternalID);
            printf(" %d", n_SystemID);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2IsStandalone(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        ret_val = xmlSAX2IsStandalone(ctx);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2IsStandalone",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2NotationDecl(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* The name of the notation */
    int n_name;
    xmlChar * publicId; /* The public ID of the entity */
    int n_publicId;
    xmlChar * systemId; /* The system ID of the entity */
    int n_systemId;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_publicId = 0;n_publicId < gen_nb_const_xmlChar_ptr;n_publicId++) {
    for (n_systemId = 0;n_systemId < gen_nb_const_xmlChar_ptr;n_systemId++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        publicId = gen_const_xmlChar_ptr(n_publicId, 2);
        systemId = gen_const_xmlChar_ptr(n_systemId, 3);

        xmlSAX2NotationDecl(ctx, (const xmlChar *)name, (const xmlChar *)publicId, (const xmlChar *)systemId);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_publicId, (const xmlChar *)publicId, 2);
        des_const_xmlChar_ptr(n_systemId, (const xmlChar *)systemId, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2NotationDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf(" %d", n_publicId);
            printf(" %d", n_systemId);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2ProcessingInstruction(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * target; /* the target name */
    int n_target;
    xmlChar * data; /* the PI data's */
    int n_data;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_target = 0;n_target < gen_nb_const_xmlChar_ptr;n_target++) {
    for (n_data = 0;n_data < gen_nb_const_xmlChar_ptr;n_data++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        target = gen_const_xmlChar_ptr(n_target, 1);
        data = gen_const_xmlChar_ptr(n_data, 2);

        xmlSAX2ProcessingInstruction(ctx, (const xmlChar *)target, (const xmlChar *)data);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_target, (const xmlChar *)target, 1);
        des_const_xmlChar_ptr(n_data, (const xmlChar *)data, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2ProcessingInstruction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_target);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2Reference(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* The entity name */
    int n_name;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        xmlSAX2Reference(ctx, (const xmlChar *)name);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2Reference",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2ResolveEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * publicId; /* The public ID of the entity */
    int n_publicId;
    xmlChar * systemId; /* The system ID of the entity */
    int n_systemId;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_publicId = 0;n_publicId < gen_nb_const_xmlChar_ptr;n_publicId++) {
    for (n_systemId = 0;n_systemId < gen_nb_const_xmlChar_ptr;n_systemId++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        publicId = gen_const_xmlChar_ptr(n_publicId, 1);
        systemId = gen_const_xmlChar_ptr(n_systemId, 2);

        ret_val = xmlSAX2ResolveEntity(ctx, (const xmlChar *)publicId, (const xmlChar *)systemId);
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_publicId, (const xmlChar *)publicId, 1);
        des_const_xmlChar_ptr(n_systemId, (const xmlChar *)systemId, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2ResolveEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_publicId);
            printf(" %d", n_systemId);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlSAXLocatorPtr 1
static xmlSAXLocatorPtr gen_xmlSAXLocatorPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSAXLocatorPtr(int no ATTRIBUTE_UNUSED, xmlSAXLocatorPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlSAX2SetDocumentLocator(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlSAXLocatorPtr loc; /* A SAX Locator */
    int n_loc;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_loc = 0;n_loc < gen_nb_xmlSAXLocatorPtr;n_loc++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        loc = gen_xmlSAXLocatorPtr(n_loc, 1);

        xmlSAX2SetDocumentLocator(ctx, loc);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_xmlSAXLocatorPtr(n_loc, loc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2SetDocumentLocator",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_loc);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2StartDocument(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        xmlSAX2StartDocument(ctx);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2StartDocument",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2StartElement(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) || defined(LIBXML_LEGACY_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * fullname; /* The element name, including namespace prefix */
    int n_fullname;
    xmlChar ** atts; /* An array of name/value attributes pairs, NULL terminated */
    int n_atts;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_fullname = 0;n_fullname < gen_nb_const_xmlChar_ptr;n_fullname++) {
    for (n_atts = 0;n_atts < gen_nb_const_xmlChar_ptr_ptr;n_atts++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        fullname = gen_const_xmlChar_ptr(n_fullname, 1);
        atts = gen_const_xmlChar_ptr_ptr(n_atts, 2);

        xmlSAX2StartElement(ctx, (const xmlChar *)fullname, (const xmlChar **)atts);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_fullname, (const xmlChar *)fullname, 1);
        des_const_xmlChar_ptr_ptr(n_atts, (const xmlChar **)atts, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2StartElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_fullname);
            printf(" %d", n_atts);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAX2StartElementNs(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * localname; /* the local name of the element */
    int n_localname;
    xmlChar * prefix; /* the element namespace prefix if available */
    int n_prefix;
    xmlChar * URI; /* the element namespace name if available */
    int n_URI;
    int nb_namespaces; /* number of namespace definitions on that node */
    int n_nb_namespaces;
    xmlChar ** namespaces; /* pointer to the array of prefix/URI pairs namespace definitions */
    int n_namespaces;
    int nb_attributes; /* the number of attributes on that node */
    int n_nb_attributes;
    int nb_defaulted; /* the number of defaulted attributes. */
    int n_nb_defaulted;
    xmlChar ** attributes; /* pointer to the array of (localname/prefix/URI/value/end) attribute values. */
    int n_attributes;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_localname = 0;n_localname < gen_nb_const_xmlChar_ptr;n_localname++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) {
    for (n_nb_namespaces = 0;n_nb_namespaces < gen_nb_int;n_nb_namespaces++) {
    for (n_namespaces = 0;n_namespaces < gen_nb_const_xmlChar_ptr_ptr;n_namespaces++) {
    for (n_nb_attributes = 0;n_nb_attributes < gen_nb_int;n_nb_attributes++) {
    for (n_nb_defaulted = 0;n_nb_defaulted < gen_nb_int;n_nb_defaulted++) {
    for (n_attributes = 0;n_attributes < gen_nb_const_xmlChar_ptr_ptr;n_attributes++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        localname = gen_const_xmlChar_ptr(n_localname, 1);
        prefix = gen_const_xmlChar_ptr(n_prefix, 2);
        URI = gen_const_xmlChar_ptr(n_URI, 3);
        nb_namespaces = gen_int(n_nb_namespaces, 4);
        namespaces = gen_const_xmlChar_ptr_ptr(n_namespaces, 5);
        nb_attributes = gen_int(n_nb_attributes, 6);
        nb_defaulted = gen_int(n_nb_defaulted, 7);
        attributes = gen_const_xmlChar_ptr_ptr(n_attributes, 8);

        xmlSAX2StartElementNs(ctx, (const xmlChar *)localname, (const xmlChar *)prefix, (const xmlChar *)URI, nb_namespaces, (const xmlChar **)namespaces, nb_attributes, nb_defaulted, (const xmlChar **)attributes);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_localname, (const xmlChar *)localname, 1);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 2);
        des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 3);
        des_int(n_nb_namespaces, nb_namespaces, 4);
        des_const_xmlChar_ptr_ptr(n_namespaces, (const xmlChar **)namespaces, 5);
        des_int(n_nb_attributes, nb_attributes, 6);
        des_int(n_nb_defaulted, nb_defaulted, 7);
        des_const_xmlChar_ptr_ptr(n_attributes, (const xmlChar **)attributes, 8);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2StartElementNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_localname);
            printf(" %d", n_prefix);
            printf(" %d", n_URI);
            printf(" %d", n_nb_namespaces);
            printf(" %d", n_namespaces);
            printf(" %d", n_nb_attributes);
            printf(" %d", n_nb_defaulted);
            printf(" %d", n_attributes);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAX2UnparsedEntityDecl(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* the user data (XML parser context) */
    int n_ctx;
    xmlChar * name; /* The name of the entity */
    int n_name;
    xmlChar * publicId; /* The public ID of the entity */
    int n_publicId;
    xmlChar * systemId; /* The system ID of the entity */
    int n_systemId;
    xmlChar * notationName; /* the name of the notation */
    int n_notationName;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_publicId = 0;n_publicId < gen_nb_const_xmlChar_ptr;n_publicId++) {
    for (n_systemId = 0;n_systemId < gen_nb_const_xmlChar_ptr;n_systemId++) {
    for (n_notationName = 0;n_notationName < gen_nb_const_xmlChar_ptr;n_notationName++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        publicId = gen_const_xmlChar_ptr(n_publicId, 2);
        systemId = gen_const_xmlChar_ptr(n_systemId, 3);
        notationName = gen_const_xmlChar_ptr(n_notationName, 4);

        xmlSAX2UnparsedEntityDecl(ctx, (const xmlChar *)name, (const xmlChar *)publicId, (const xmlChar *)systemId, (const xmlChar *)notationName);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_publicId, (const xmlChar *)publicId, 2);
        des_const_xmlChar_ptr(n_systemId, (const xmlChar *)systemId, 3);
        des_const_xmlChar_ptr(n_notationName, (const xmlChar *)notationName, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAX2UnparsedEntityDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_name);
            printf(" %d", n_publicId);
            printf(" %d", n_systemId);
            printf(" %d", n_notationName);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSAXDefaultVersion(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    int ret_val;
    int version; /* the version, 1 or 2 */
    int n_version;

    for (n_version = 0;n_version < gen_nb_int;n_version++) {
        mem_base = xmlMemBlocks();
        version = gen_int(n_version, 0);

        ret_val = xmlSAXDefaultVersion(version);
        desret_int(ret_val);
        call_tests++;
        des_int(n_version, version, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXDefaultVersion",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_version);
            printf("\n");
        }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXVersion(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlSAXHandler * hdlr; /* the SAX handler */
    int n_hdlr;
    int version; /* the version, 1 or 2 */
    int n_version;

    for (n_hdlr = 0;n_hdlr < gen_nb_xmlSAXHandler_ptr;n_hdlr++) {
    for (n_version = 0;n_version < gen_nb_int;n_version++) {
        mem_base = xmlMemBlocks();
        hdlr = gen_xmlSAXHandler_ptr(n_hdlr, 0);
        version = gen_int(n_version, 1);

        ret_val = xmlSAXVersion(hdlr, version);
        desret_int(ret_val);
        call_tests++;
        des_xmlSAXHandler_ptr(n_hdlr, hdlr, 0);
        des_int(n_version, version, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXVersion",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_hdlr);
            printf(" %d", n_version);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}

static int
test_SAX2(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing SAX2 : 38 of 38 functions ...\n");
    test_ret += test_docbDefaultSAXHandlerInit();
    test_ret += test_htmlDefaultSAXHandlerInit();
    test_ret += test_xmlDefaultSAXHandlerInit();
    test_ret += test_xmlSAX2AttributeDecl();
    test_ret += test_xmlSAX2CDataBlock();
    test_ret += test_xmlSAX2Characters();
    test_ret += test_xmlSAX2Comment();
    test_ret += test_xmlSAX2ElementDecl();
    test_ret += test_xmlSAX2EndDocument();
    test_ret += test_xmlSAX2EndElement();
    test_ret += test_xmlSAX2EndElementNs();
    test_ret += test_xmlSAX2EntityDecl();
    test_ret += test_xmlSAX2ExternalSubset();
    test_ret += test_xmlSAX2GetColumnNumber();
    test_ret += test_xmlSAX2GetEntity();
    test_ret += test_xmlSAX2GetLineNumber();
    test_ret += test_xmlSAX2GetParameterEntity();
    test_ret += test_xmlSAX2GetPublicId();
    test_ret += test_xmlSAX2GetSystemId();
    test_ret += test_xmlSAX2HasExternalSubset();
    test_ret += test_xmlSAX2HasInternalSubset();
    test_ret += test_xmlSAX2IgnorableWhitespace();
    test_ret += test_xmlSAX2InitDefaultSAXHandler();
    test_ret += test_xmlSAX2InitDocbDefaultSAXHandler();
    test_ret += test_xmlSAX2InitHtmlDefaultSAXHandler();
    test_ret += test_xmlSAX2InternalSubset();
    test_ret += test_xmlSAX2IsStandalone();
    test_ret += test_xmlSAX2NotationDecl();
    test_ret += test_xmlSAX2ProcessingInstruction();
    test_ret += test_xmlSAX2Reference();
    test_ret += test_xmlSAX2ResolveEntity();
    test_ret += test_xmlSAX2SetDocumentLocator();
    test_ret += test_xmlSAX2StartDocument();
    test_ret += test_xmlSAX2StartElement();
    test_ret += test_xmlSAX2StartElementNs();
    test_ret += test_xmlSAX2UnparsedEntityDecl();
    test_ret += test_xmlSAXDefaultVersion();
    test_ret += test_xmlSAXVersion();

    if (test_ret != 0)
	printf("Module SAX2: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlC14NDocDumpMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the XML document for canonization */
    int n_doc;
    xmlNodeSetPtr nodes; /* the nodes set to be included in the canonized image or NULL if all document nodes should be included */
    int n_nodes;
    int mode; /* the c14n mode (see @xmlC14NMode) */
    int n_mode;
    xmlChar ** inclusive_ns_prefixes; /* the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise) */
    int n_inclusive_ns_prefixes;
    int with_comments; /* include comments in the result (!=0) or not (==0) */
    int n_with_comments;
    xmlChar ** doc_txt_ptr; /* the memory pointer for allocated canonical XML text; the caller of this functions is responsible for calling xmlFree() to free allocated memory */
    int n_doc_txt_ptr;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) {
    for (n_mode = 0;n_mode < gen_nb_int;n_mode++) {
    for (n_inclusive_ns_prefixes = 0;n_inclusive_ns_prefixes < gen_nb_xmlChar_ptr_ptr;n_inclusive_ns_prefixes++) {
    for (n_with_comments = 0;n_with_comments < gen_nb_int;n_with_comments++) {
    for (n_doc_txt_ptr = 0;n_doc_txt_ptr < gen_nb_xmlChar_ptr_ptr;n_doc_txt_ptr++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        nodes = gen_xmlNodeSetPtr(n_nodes, 1);
        mode = gen_int(n_mode, 2);
        inclusive_ns_prefixes = gen_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, 3);
        with_comments = gen_int(n_with_comments, 4);
        doc_txt_ptr = gen_xmlChar_ptr_ptr(n_doc_txt_ptr, 5);

        ret_val = xmlC14NDocDumpMemory(doc, nodes, mode, inclusive_ns_prefixes, with_comments, doc_txt_ptr);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodeSetPtr(n_nodes, nodes, 1);
        des_int(n_mode, mode, 2);
        des_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, inclusive_ns_prefixes, 3);
        des_int(n_with_comments, with_comments, 4);
        des_xmlChar_ptr_ptr(n_doc_txt_ptr, doc_txt_ptr, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlC14NDocDumpMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_nodes);
            printf(" %d", n_mode);
            printf(" %d", n_inclusive_ns_prefixes);
            printf(" %d", n_with_comments);
            printf(" %d", n_doc_txt_ptr);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlC14NDocSave(void) {
    int test_ret = 0;

#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the XML document for canonization */
    int n_doc;
    xmlNodeSetPtr nodes; /* the nodes set to be included in the canonized image or NULL if all document nodes should be included */
    int n_nodes;
    int mode; /* the c14n mode (see @xmlC14NMode) */
    int n_mode;
    xmlChar ** inclusive_ns_prefixes; /* the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise) */
    int n_inclusive_ns_prefixes;
    int with_comments; /* include comments in the result (!=0) or not (==0) */
    int n_with_comments;
    const char * filename; /* the filename to store canonical XML image */
    int n_filename;
    int compression; /* the compression level (zlib required): -1 - libxml default, 0 - uncompressed, >0 - compression level */
    int n_compression;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) {
    for (n_mode = 0;n_mode < gen_nb_int;n_mode++) {
    for (n_inclusive_ns_prefixes = 0;n_inclusive_ns_prefixes < gen_nb_xmlChar_ptr_ptr;n_inclusive_ns_prefixes++) {
    for (n_with_comments = 0;n_with_comments < gen_nb_int;n_with_comments++) {
    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_compression = 0;n_compression < gen_nb_int;n_compression++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        nodes = gen_xmlNodeSetPtr(n_nodes, 1);
        mode = gen_int(n_mode, 2);
        inclusive_ns_prefixes = gen_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, 3);
        with_comments = gen_int(n_with_comments, 4);
        filename = gen_fileoutput(n_filename, 5);
        compression = gen_int(n_compression, 6);

        ret_val = xmlC14NDocSave(doc, nodes, mode, inclusive_ns_prefixes, with_comments, filename, compression);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodeSetPtr(n_nodes, nodes, 1);
        des_int(n_mode, mode, 2);
        des_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, inclusive_ns_prefixes, 3);
        des_int(n_with_comments, with_comments, 4);
        des_fileoutput(n_filename, filename, 5);
        des_int(n_compression, compression, 6);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlC14NDocSave",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_nodes);
            printf(" %d", n_mode);
            printf(" %d", n_inclusive_ns_prefixes);
            printf(" %d", n_with_comments);
            printf(" %d", n_filename);
            printf(" %d", n_compression);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlC14NDocSaveTo(void) {
    int test_ret = 0;

#if defined(LIBXML_C14N_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the XML document for canonization */
    int n_doc;
    xmlNodeSetPtr nodes; /* the nodes set to be included in the canonized image or NULL if all document nodes should be included */
    int n_nodes;
    int mode; /* the c14n mode (see @xmlC14NMode) */
    int n_mode;
    xmlChar ** inclusive_ns_prefixes; /* the list of inclusive namespace prefixes ended with a NULL or NULL if there is no inclusive namespaces (only for exclusive canonicalization, ignored otherwise) */
    int n_inclusive_ns_prefixes;
    int with_comments; /* include comments in the result (!=0) or not (==0) */
    int n_with_comments;
    xmlOutputBufferPtr buf; /* the output buffer to store canonical XML; this buffer MUST have encoder==NULL because C14N requires UTF-8 output */
    int n_buf;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) {
    for (n_mode = 0;n_mode < gen_nb_int;n_mode++) {
    for (n_inclusive_ns_prefixes = 0;n_inclusive_ns_prefixes < gen_nb_xmlChar_ptr_ptr;n_inclusive_ns_prefixes++) {
    for (n_with_comments = 0;n_with_comments < gen_nb_int;n_with_comments++) {
    for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        nodes = gen_xmlNodeSetPtr(n_nodes, 1);
        mode = gen_int(n_mode, 2);
        inclusive_ns_prefixes = gen_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, 3);
        with_comments = gen_int(n_with_comments, 4);
        buf = gen_xmlOutputBufferPtr(n_buf, 5);

        ret_val = xmlC14NDocSaveTo(doc, nodes, mode, inclusive_ns_prefixes, with_comments, buf);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodeSetPtr(n_nodes, nodes, 1);
        des_int(n_mode, mode, 2);
        des_xmlChar_ptr_ptr(n_inclusive_ns_prefixes, inclusive_ns_prefixes, 3);
        des_int(n_with_comments, with_comments, 4);
        des_xmlOutputBufferPtr(n_buf, buf, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlC14NDocSaveTo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_nodes);
            printf(" %d", n_mode);
            printf(" %d", n_inclusive_ns_prefixes);
            printf(" %d", n_with_comments);
            printf(" %d", n_buf);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlC14NExecute(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

static int
test_c14n(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing c14n : 3 of 4 functions ...\n");
    test_ret += test_xmlC14NDocDumpMemory();
    test_ret += test_xmlC14NDocSave();
    test_ret += test_xmlC14NDocSaveTo();
    test_ret += test_xmlC14NExecute();

    if (test_ret != 0)
	printf("Module c14n: %d errors\n", test_ret);
    return(test_ret);
}
#ifdef LIBXML_CATALOG_ENABLED

#define gen_nb_xmlCatalogPtr 1
static xmlCatalogPtr gen_xmlCatalogPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlCatalogPtr(int no ATTRIBUTE_UNUSED, xmlCatalogPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlACatalogAdd(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    int ret_val;
    xmlCatalogPtr catal; /* a Catalog */
    int n_catal;
    xmlChar * type; /* the type of record to add to the catalog */
    int n_type;
    xmlChar * orig; /* the system, public or prefix to match */
    int n_orig;
    xmlChar * replace; /* the replacement value for the match */
    int n_replace;

    for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) {
    for (n_type = 0;n_type < gen_nb_const_xmlChar_ptr;n_type++) {
    for (n_orig = 0;n_orig < gen_nb_const_xmlChar_ptr;n_orig++) {
    for (n_replace = 0;n_replace < gen_nb_const_xmlChar_ptr;n_replace++) {
        mem_base = xmlMemBlocks();
        catal = gen_xmlCatalogPtr(n_catal, 0);
        type = gen_const_xmlChar_ptr(n_type, 1);
        orig = gen_const_xmlChar_ptr(n_orig, 2);
        replace = gen_const_xmlChar_ptr(n_replace, 3);

        ret_val = xmlACatalogAdd(catal, (const xmlChar *)type, (const xmlChar *)orig, (const xmlChar *)replace);
        desret_int(ret_val);
        call_tests++;
        des_xmlCatalogPtr(n_catal, catal, 0);
        des_const_xmlChar_ptr(n_type, (const xmlChar *)type, 1);
        des_const_xmlChar_ptr(n_orig, (const xmlChar *)orig, 2);
        des_const_xmlChar_ptr(n_replace, (const xmlChar *)replace, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlACatalogAdd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catal);
            printf(" %d", n_type);
            printf(" %d", n_orig);
            printf(" %d", n_replace);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlACatalogDump(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlCatalogPtr catal; /* a Catalog */
    int n_catal;
    FILE * out; /* the file. */
    int n_out;

    for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) {
    for (n_out = 0;n_out < gen_nb_FILE_ptr;n_out++) {
        mem_base = xmlMemBlocks();
        catal = gen_xmlCatalogPtr(n_catal, 0);
        out = gen_FILE_ptr(n_out, 1);

        xmlACatalogDump(catal, out);
        call_tests++;
        des_xmlCatalogPtr(n_catal, catal, 0);
        des_FILE_ptr(n_out, out, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlACatalogDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catal);
            printf(" %d", n_out);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlACatalogRemove(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    int ret_val;
    xmlCatalogPtr catal; /* a Catalog */
    int n_catal;
    xmlChar * value; /* the value to remove */
    int n_value;

    for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        catal = gen_xmlCatalogPtr(n_catal, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);

        ret_val = xmlACatalogRemove(catal, (const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_xmlCatalogPtr(n_catal, catal, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlACatalogRemove",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catal);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlACatalogResolve(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlCatalogPtr catal; /* a Catalog */
    int n_catal;
    xmlChar * pubID; /* the public ID string */
    int n_pubID;
    xmlChar * sysID; /* the system ID string */
    int n_sysID;

    for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) {
    for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) {
    for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) {
        mem_base = xmlMemBlocks();
        catal = gen_xmlCatalogPtr(n_catal, 0);
        pubID = gen_const_xmlChar_ptr(n_pubID, 1);
        sysID = gen_const_xmlChar_ptr(n_sysID, 2);

        ret_val = xmlACatalogResolve(catal, (const xmlChar *)pubID, (const xmlChar *)sysID);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlCatalogPtr(n_catal, catal, 0);
        des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 1);
        des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlACatalogResolve",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catal);
            printf(" %d", n_pubID);
            printf(" %d", n_sysID);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlACatalogResolvePublic(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlCatalogPtr catal; /* a Catalog */
    int n_catal;
    xmlChar * pubID; /* the public ID string */
    int n_pubID;

    for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) {
    for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) {
        mem_base = xmlMemBlocks();
        catal = gen_xmlCatalogPtr(n_catal, 0);
        pubID = gen_const_xmlChar_ptr(n_pubID, 1);

        ret_val = xmlACatalogResolvePublic(catal, (const xmlChar *)pubID);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlCatalogPtr(n_catal, catal, 0);
        des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlACatalogResolvePublic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catal);
            printf(" %d", n_pubID);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlACatalogResolveSystem(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlCatalogPtr catal; /* a Catalog */
    int n_catal;
    xmlChar * sysID; /* the system ID string */
    int n_sysID;

    for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) {
    for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) {
        mem_base = xmlMemBlocks();
        catal = gen_xmlCatalogPtr(n_catal, 0);
        sysID = gen_const_xmlChar_ptr(n_sysID, 1);

        ret_val = xmlACatalogResolveSystem(catal, (const xmlChar *)sysID);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlCatalogPtr(n_catal, catal, 0);
        des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlACatalogResolveSystem",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catal);
            printf(" %d", n_sysID);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlACatalogResolveURI(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlCatalogPtr catal; /* a Catalog */
    int n_catal;
    xmlChar * URI; /* the URI */
    int n_URI;

    for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) {
    for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) {
        mem_base = xmlMemBlocks();
        catal = gen_xmlCatalogPtr(n_catal, 0);
        URI = gen_const_xmlChar_ptr(n_URI, 1);

        ret_val = xmlACatalogResolveURI(catal, (const xmlChar *)URI);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlCatalogPtr(n_catal, catal, 0);
        des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlACatalogResolveURI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catal);
            printf(" %d", n_URI);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogAdd(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    int ret_val;
    xmlChar * type; /* the type of record to add to the catalog */
    int n_type;
    xmlChar * orig; /* the system, public or prefix to match */
    int n_orig;
    xmlChar * replace; /* the replacement value for the match */
    int n_replace;

    for (n_type = 0;n_type < gen_nb_const_xmlChar_ptr;n_type++) {
    for (n_orig = 0;n_orig < gen_nb_const_xmlChar_ptr;n_orig++) {
    for (n_replace = 0;n_replace < gen_nb_const_xmlChar_ptr;n_replace++) {
        mem_base = xmlMemBlocks();
        type = gen_const_xmlChar_ptr(n_type, 0);
        orig = gen_const_xmlChar_ptr(n_orig, 1);
        replace = gen_const_xmlChar_ptr(n_replace, 2);

        ret_val = xmlCatalogAdd((const xmlChar *)type, (const xmlChar *)orig, (const xmlChar *)replace);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_type, (const xmlChar *)type, 0);
        des_const_xmlChar_ptr(n_orig, (const xmlChar *)orig, 1);
        des_const_xmlChar_ptr(n_replace, (const xmlChar *)replace, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogAdd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_type);
            printf(" %d", n_orig);
            printf(" %d", n_replace);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogCleanup(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)


        xmlCatalogCleanup();
        call_tests++;
        xmlResetLastError();
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogConvert(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int ret_val;


        ret_val = xmlCatalogConvert();
        desret_int(ret_val);
        call_tests++;
        xmlResetLastError();
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogDump(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    FILE * out; /* the file. */
    int n_out;

    for (n_out = 0;n_out < gen_nb_FILE_ptr;n_out++) {
        mem_base = xmlMemBlocks();
        out = gen_FILE_ptr(n_out, 0);

        xmlCatalogDump(out);
        call_tests++;
        des_FILE_ptr(n_out, out, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogGetDefaults(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlCatalogAllow ret_val;

        mem_base = xmlMemBlocks();

        ret_val = xmlCatalogGetDefaults();
        desret_xmlCatalogAllow(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogGetDefaults",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogIsEmpty(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    int ret_val;
    xmlCatalogPtr catal; /* should this create an SGML catalog */
    int n_catal;

    for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) {
        mem_base = xmlMemBlocks();
        catal = gen_xmlCatalogPtr(n_catal, 0);

        ret_val = xmlCatalogIsEmpty(catal);
        desret_int(ret_val);
        call_tests++;
        des_xmlCatalogPtr(n_catal, catal, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogIsEmpty",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catal);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogLocalResolve(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    void * catalogs; /* a document's list of catalogs */
    int n_catalogs;
    xmlChar * pubID; /* the public ID string */
    int n_pubID;
    xmlChar * sysID; /* the system ID string */
    int n_sysID;

    for (n_catalogs = 0;n_catalogs < gen_nb_void_ptr;n_catalogs++) {
    for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) {
    for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) {
        mem_base = xmlMemBlocks();
        catalogs = gen_void_ptr(n_catalogs, 0);
        pubID = gen_const_xmlChar_ptr(n_pubID, 1);
        sysID = gen_const_xmlChar_ptr(n_sysID, 2);

        ret_val = xmlCatalogLocalResolve(catalogs, (const xmlChar *)pubID, (const xmlChar *)sysID);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_void_ptr(n_catalogs, catalogs, 0);
        des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 1);
        des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogLocalResolve",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catalogs);
            printf(" %d", n_pubID);
            printf(" %d", n_sysID);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogLocalResolveURI(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    void * catalogs; /* a document's list of catalogs */
    int n_catalogs;
    xmlChar * URI; /* the URI */
    int n_URI;

    for (n_catalogs = 0;n_catalogs < gen_nb_void_ptr;n_catalogs++) {
    for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) {
        mem_base = xmlMemBlocks();
        catalogs = gen_void_ptr(n_catalogs, 0);
        URI = gen_const_xmlChar_ptr(n_URI, 1);

        ret_val = xmlCatalogLocalResolveURI(catalogs, (const xmlChar *)URI);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_void_ptr(n_catalogs, catalogs, 0);
        des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogLocalResolveURI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catalogs);
            printf(" %d", n_URI);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogRemove(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int ret_val;
    xmlChar * value; /* the value to remove */
    int n_value;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        value = gen_const_xmlChar_ptr(n_value, 0);

        ret_val = xmlCatalogRemove((const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        xmlResetLastError();
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogResolve(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    xmlChar * ret_val;
    xmlChar * pubID; /* the public ID string */
    int n_pubID;
    xmlChar * sysID; /* the system ID string */
    int n_sysID;

    for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) {
    for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) {
        pubID = gen_const_xmlChar_ptr(n_pubID, 0);
        sysID = gen_const_xmlChar_ptr(n_sysID, 1);

        ret_val = xmlCatalogResolve((const xmlChar *)pubID, (const xmlChar *)sysID);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 0);
        des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 1);
        xmlResetLastError();
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogResolvePublic(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlChar * pubID; /* the public ID string */
    int n_pubID;

    for (n_pubID = 0;n_pubID < gen_nb_const_xmlChar_ptr;n_pubID++) {
        mem_base = xmlMemBlocks();
        pubID = gen_const_xmlChar_ptr(n_pubID, 0);

        ret_val = xmlCatalogResolvePublic((const xmlChar *)pubID);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_pubID, (const xmlChar *)pubID, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogResolvePublic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_pubID);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogResolveSystem(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlChar * sysID; /* the system ID string */
    int n_sysID;

    for (n_sysID = 0;n_sysID < gen_nb_const_xmlChar_ptr;n_sysID++) {
        mem_base = xmlMemBlocks();
        sysID = gen_const_xmlChar_ptr(n_sysID, 0);

        ret_val = xmlCatalogResolveSystem((const xmlChar *)sysID);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_sysID, (const xmlChar *)sysID, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogResolveSystem",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sysID);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogResolveURI(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlChar * URI; /* the URI */
    int n_URI;

    for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) {
        mem_base = xmlMemBlocks();
        URI = gen_const_xmlChar_ptr(n_URI, 0);

        ret_val = xmlCatalogResolveURI((const xmlChar *)URI);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogResolveURI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URI);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogSetDefaultPrefer(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlCatalogPrefer ret_val;
    xmlCatalogPrefer prefer; /* the default preference for delegation */
    int n_prefer;

    for (n_prefer = 0;n_prefer < gen_nb_xmlCatalogPrefer;n_prefer++) {
        mem_base = xmlMemBlocks();
        prefer = gen_xmlCatalogPrefer(n_prefer, 0);

        ret_val = xmlCatalogSetDefaultPrefer(prefer);
        desret_xmlCatalogPrefer(ret_val);
        call_tests++;
        des_xmlCatalogPrefer(n_prefer, prefer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogSetDefaultPrefer",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_prefer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCatalogSetDefaults(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlCatalogAllow allow; /* what catalogs should be accepted */
    int n_allow;

    for (n_allow = 0;n_allow < gen_nb_xmlCatalogAllow;n_allow++) {
        mem_base = xmlMemBlocks();
        allow = gen_xmlCatalogAllow(n_allow, 0);

        xmlCatalogSetDefaults(allow);
        call_tests++;
        des_xmlCatalogAllow(n_allow, allow, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCatalogSetDefaults",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_allow);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlConvertSGMLCatalog(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    int ret_val;
    xmlCatalogPtr catal; /* the catalog */
    int n_catal;

    for (n_catal = 0;n_catal < gen_nb_xmlCatalogPtr;n_catal++) {
        mem_base = xmlMemBlocks();
        catal = gen_xmlCatalogPtr(n_catal, 0);

        ret_val = xmlConvertSGMLCatalog(catal);
        desret_int(ret_val);
        call_tests++;
        des_xmlCatalogPtr(n_catal, catal, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlConvertSGMLCatalog",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_catal);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlInitializeCatalog(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlInitializeCatalog();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlInitializeCatalog",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlLoadACatalog(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlLoadCatalog(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int ret_val;
    const char * filename; /* a file path */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlLoadCatalog(filename);
        desret_int(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlLoadCatalogs(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    char * pathss; /* a list of directories separated by a colon or a space. */
    int n_pathss;

    for (n_pathss = 0;n_pathss < gen_nb_const_char_ptr;n_pathss++) {
        pathss = gen_const_char_ptr(n_pathss, 0);

        xmlLoadCatalogs((const char *)pathss);
        call_tests++;
        des_const_char_ptr(n_pathss, (const char *)pathss, 0);
        xmlResetLastError();
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlLoadSGMLSuperCatalog(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlNewCatalog(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlParseCatalogFile(void) {
    int test_ret = 0;

#if defined(LIBXML_CATALOG_ENABLED)
    int mem_base;
    xmlDocPtr ret_val;
    const char * filename; /* the filename */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlParseCatalogFile(filename);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseCatalogFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_catalog(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing catalog : 27 of 36 functions ...\n");
    test_ret += test_xmlACatalogAdd();
    test_ret += test_xmlACatalogDump();
    test_ret += test_xmlACatalogRemove();
    test_ret += test_xmlACatalogResolve();
    test_ret += test_xmlACatalogResolvePublic();
    test_ret += test_xmlACatalogResolveSystem();
    test_ret += test_xmlACatalogResolveURI();
    test_ret += test_xmlCatalogAdd();
    test_ret += test_xmlCatalogCleanup();
    test_ret += test_xmlCatalogConvert();
    test_ret += test_xmlCatalogDump();
    test_ret += test_xmlCatalogGetDefaults();
    test_ret += test_xmlCatalogIsEmpty();
    test_ret += test_xmlCatalogLocalResolve();
    test_ret += test_xmlCatalogLocalResolveURI();
    test_ret += test_xmlCatalogRemove();
    test_ret += test_xmlCatalogResolve();
    test_ret += test_xmlCatalogResolvePublic();
    test_ret += test_xmlCatalogResolveSystem();
    test_ret += test_xmlCatalogResolveURI();
    test_ret += test_xmlCatalogSetDefaultPrefer();
    test_ret += test_xmlCatalogSetDefaults();
    test_ret += test_xmlConvertSGMLCatalog();
    test_ret += test_xmlInitializeCatalog();
    test_ret += test_xmlLoadACatalog();
    test_ret += test_xmlLoadCatalog();
    test_ret += test_xmlLoadCatalogs();
    test_ret += test_xmlLoadSGMLSuperCatalog();
    test_ret += test_xmlNewCatalog();
    test_ret += test_xmlParseCatalogFile();

    if (test_ret != 0)
	printf("Module catalog: %d errors\n", test_ret);
    return(test_ret);
}

#define gen_nb_const_xmlChRangeGroup_ptr 1
static xmlChRangeGroup * gen_const_xmlChRangeGroup_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlChRangeGroup_ptr(int no ATTRIBUTE_UNUSED, const xmlChRangeGroup * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlCharInRange(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned int val; /* character to be validated */
    int n_val;
    xmlChRangeGroup * rptr; /* pointer to range to be used to validate */
    int n_rptr;

    for (n_val = 0;n_val < gen_nb_unsigned_int;n_val++) {
    for (n_rptr = 0;n_rptr < gen_nb_const_xmlChRangeGroup_ptr;n_rptr++) {
        mem_base = xmlMemBlocks();
        val = gen_unsigned_int(n_val, 0);
        rptr = gen_const_xmlChRangeGroup_ptr(n_rptr, 1);

        ret_val = xmlCharInRange(val, (const xmlChRangeGroup *)rptr);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_int(n_val, val, 0);
        des_const_xmlChRangeGroup_ptr(n_rptr, (const xmlChRangeGroup *)rptr, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCharInRange",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf(" %d", n_rptr);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsBaseChar(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned int ch; /* character to validate */
    int n_ch;

    for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) {
        mem_base = xmlMemBlocks();
        ch = gen_unsigned_int(n_ch, 0);

        ret_val = xmlIsBaseChar(ch);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_int(n_ch, ch, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsBaseChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ch);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsBlank(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned int ch; /* character to validate */
    int n_ch;

    for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) {
        mem_base = xmlMemBlocks();
        ch = gen_unsigned_int(n_ch, 0);

        ret_val = xmlIsBlank(ch);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_int(n_ch, ch, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsBlank",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ch);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsChar(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned int ch; /* character to validate */
    int n_ch;

    for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) {
        mem_base = xmlMemBlocks();
        ch = gen_unsigned_int(n_ch, 0);

        ret_val = xmlIsChar(ch);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_int(n_ch, ch, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ch);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsCombining(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned int ch; /* character to validate */
    int n_ch;

    for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) {
        mem_base = xmlMemBlocks();
        ch = gen_unsigned_int(n_ch, 0);

        ret_val = xmlIsCombining(ch);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_int(n_ch, ch, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsCombining",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ch);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsDigit(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned int ch; /* character to validate */
    int n_ch;

    for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) {
        mem_base = xmlMemBlocks();
        ch = gen_unsigned_int(n_ch, 0);

        ret_val = xmlIsDigit(ch);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_int(n_ch, ch, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsDigit",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ch);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsExtender(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned int ch; /* character to validate */
    int n_ch;

    for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) {
        mem_base = xmlMemBlocks();
        ch = gen_unsigned_int(n_ch, 0);

        ret_val = xmlIsExtender(ch);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_int(n_ch, ch, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsExtender",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ch);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsIdeographic(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned int ch; /* character to validate */
    int n_ch;

    for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) {
        mem_base = xmlMemBlocks();
        ch = gen_unsigned_int(n_ch, 0);

        ret_val = xmlIsIdeographic(ch);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_int(n_ch, ch, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsIdeographic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ch);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsPubidChar(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned int ch; /* character to validate */
    int n_ch;

    for (n_ch = 0;n_ch < gen_nb_unsigned_int;n_ch++) {
        mem_base = xmlMemBlocks();
        ch = gen_unsigned_int(n_ch, 0);

        ret_val = xmlIsPubidChar(ch);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_int(n_ch, ch, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsPubidChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ch);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}

static int
test_chvalid(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing chvalid : 9 of 9 functions ...\n");
    test_ret += test_xmlCharInRange();
    test_ret += test_xmlIsBaseChar();
    test_ret += test_xmlIsBlank();
    test_ret += test_xmlIsChar();
    test_ret += test_xmlIsCombining();
    test_ret += test_xmlIsDigit();
    test_ret += test_xmlIsExtender();
    test_ret += test_xmlIsIdeographic();
    test_ret += test_xmlIsPubidChar();

    if (test_ret != 0)
	printf("Module chvalid: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlBoolToText(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    const char * ret_val;
    int boolval; /* a bool to turn into text */
    int n_boolval;

    for (n_boolval = 0;n_boolval < gen_nb_int;n_boolval++) {
        mem_base = xmlMemBlocks();
        boolval = gen_int(n_boolval, 0);

        ret_val = xmlBoolToText(boolval);
        desret_const_char_ptr(ret_val);
        call_tests++;
        des_int(n_boolval, boolval, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBoolToText",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_boolval);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugCheckDocument(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    int ret_val;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlDocPtr doc; /* the document */
    int n_doc;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        ret_val = xmlDebugCheckDocument(output, doc);
        desret_int(ret_val);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugCheckDocument",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpAttr(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlAttrPtr attr; /* the attribute */
    int n_attr;
    int depth; /* the indentation level. */
    int n_depth;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        attr = gen_xmlAttrPtr(n_attr, 1);
        depth = gen_int(n_depth, 2);

        xmlDebugDumpAttr(output, attr, depth);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlAttrPtr(n_attr, attr, 1);
        des_int(n_depth, depth, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpAttr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_attr);
            printf(" %d", n_depth);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpAttrList(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlAttrPtr attr; /* the attribute list */
    int n_attr;
    int depth; /* the indentation level. */
    int n_depth;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        attr = gen_xmlAttrPtr(n_attr, 1);
        depth = gen_int(n_depth, 2);

        xmlDebugDumpAttrList(output, attr, depth);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlAttrPtr(n_attr, attr, 1);
        des_int(n_depth, depth, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpAttrList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_attr);
            printf(" %d", n_depth);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpDTD(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlDtdPtr dtd; /* the DTD */
    int n_dtd;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        dtd = gen_xmlDtdPtr(n_dtd, 1);

        xmlDebugDumpDTD(output, dtd);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlDtdPtr(n_dtd, dtd, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpDTD",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_dtd);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpDocument(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlDocPtr doc; /* the document */
    int n_doc;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        xmlDebugDumpDocument(output, doc);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpDocument",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpDocumentHead(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlDocPtr doc; /* the document */
    int n_doc;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        xmlDebugDumpDocumentHead(output, doc);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpDocumentHead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpEntities(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlDocPtr doc; /* the document */
    int n_doc;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        xmlDebugDumpEntities(output, doc);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpEntities",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpNode(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlNodePtr node; /* the node */
    int n_node;
    int depth; /* the indentation level. */
    int n_depth;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        node = gen_xmlNodePtr(n_node, 1);
        depth = gen_int(n_depth, 2);

        xmlDebugDumpNode(output, node, depth);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlNodePtr(n_node, node, 1);
        des_int(n_depth, depth, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_node);
            printf(" %d", n_depth);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpNodeList(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlNodePtr node; /* the node list */
    int n_node;
    int depth; /* the indentation level. */
    int n_depth;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        node = gen_xmlNodePtr(n_node, 1);
        depth = gen_int(n_depth, 2);

        xmlDebugDumpNodeList(output, node, depth);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlNodePtr(n_node, node, 1);
        des_int(n_depth, depth, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpNodeList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_node);
            printf(" %d", n_depth);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpOneNode(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlNodePtr node; /* the node */
    int n_node;
    int depth; /* the indentation level. */
    int n_depth;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        node = gen_xmlNodePtr(n_node, 1);
        depth = gen_int(n_depth, 2);

        xmlDebugDumpOneNode(output, node, depth);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlNodePtr(n_node, node, 1);
        des_int(n_depth, depth, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpOneNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_node);
            printf(" %d", n_depth);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDebugDumpString(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlChar * str; /* the string */
    int n_str;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);

        xmlDebugDumpString(output, (const xmlChar *)str);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDebugDumpString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlLsCountNode(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodePtr node; /* the node to count */
    int n_node;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);

        ret_val = xmlLsCountNode(node);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlLsCountNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlLsOneNode(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlNodePtr node; /* the node to dump */
    int n_node;

    for (n_output = 0;n_output < gen_nb_debug_FILE_ptr;n_output++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        output = gen_debug_FILE_ptr(n_output, 0);
        node = gen_xmlNodePtr(n_node, 1);

        xmlLsOneNode(output, node);
        call_tests++;
        des_debug_FILE_ptr(n_output, output, 0);
        des_xmlNodePtr(n_node, node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlLsOneNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShell(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


#define gen_nb_char_ptr 1
static char * gen_char_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_char_ptr(int no ATTRIBUTE_UNUSED, char * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlShellBase(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * arg; /* unused */
    int n_arg;
    xmlNodePtr node; /* a node */
    int n_node;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        arg = gen_char_ptr(n_arg, 1);
        node = gen_xmlNodePtr(n_node, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellBase(ctxt, arg, node, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_arg, arg, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellBase",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_arg);
            printf(" %d", n_node);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellCat(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * arg; /* unused */
    int n_arg;
    xmlNodePtr node; /* a node */
    int n_node;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        arg = gen_char_ptr(n_arg, 1);
        node = gen_xmlNodePtr(n_node, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellCat(ctxt, arg, node, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_arg, arg, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellCat",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_arg);
            printf(" %d", n_node);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellDir(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * arg; /* unused */
    int n_arg;
    xmlNodePtr node; /* a node */
    int n_node;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        arg = gen_char_ptr(n_arg, 1);
        node = gen_xmlNodePtr(n_node, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellDir(ctxt, arg, node, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_arg, arg, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellDir",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_arg);
            printf(" %d", n_node);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellDu(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * arg; /* unused */
    int n_arg;
    xmlNodePtr tree; /* a node defining a subtree */
    int n_tree;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) {
    for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        arg = gen_char_ptr(n_arg, 1);
        tree = gen_xmlNodePtr(n_tree, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellDu(ctxt, arg, tree, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_arg, arg, 1);
        des_xmlNodePtr(n_tree, tree, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellDu",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_arg);
            printf(" %d", n_tree);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellList(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * arg; /* unused */
    int n_arg;
    xmlNodePtr node; /* a node */
    int n_node;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_arg = 0;n_arg < gen_nb_char_ptr;n_arg++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        arg = gen_char_ptr(n_arg, 1);
        node = gen_xmlNodePtr(n_node, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellList(ctxt, arg, node, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_arg, arg, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_arg);
            printf(" %d", n_node);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellLoad(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * filename; /* the file name */
    int n_filename;
    xmlNodePtr node; /* unused */
    int n_node;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_filename = 0;n_filename < gen_nb_char_ptr;n_filename++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        filename = gen_char_ptr(n_filename, 1);
        node = gen_xmlNodePtr(n_node, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellLoad(ctxt, filename, node, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_filename, filename, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellLoad",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_filename);
            printf(" %d", n_node);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellPrintXPathResult(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr list; /* a valid result generated by an xpath evaluation */
    int n_list;

    for (n_list = 0;n_list < gen_nb_xmlXPathObjectPtr;n_list++) {
        mem_base = xmlMemBlocks();
        list = gen_xmlXPathObjectPtr(n_list, 0);

        xmlShellPrintXPathResult(list);
        call_tests++;
        des_xmlXPathObjectPtr(n_list, list, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellPrintXPathResult",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_list);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellPwd(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * buffer; /* the output buffer */
    int n_buffer;
    xmlNodePtr node; /* a node */
    int n_node;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_buffer = 0;n_buffer < gen_nb_char_ptr;n_buffer++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        buffer = gen_char_ptr(n_buffer, 1);
        node = gen_xmlNodePtr(n_node, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellPwd(ctxt, buffer, node, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_buffer, buffer, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellPwd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_buffer);
            printf(" %d", n_node);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellSave(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * filename; /* the file name (optional) */
    int n_filename;
    xmlNodePtr node; /* unused */
    int n_node;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_filename = 0;n_filename < gen_nb_char_ptr;n_filename++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        filename = gen_char_ptr(n_filename, 1);
        node = gen_xmlNodePtr(n_node, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellSave(ctxt, filename, node, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_filename, filename, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellSave",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_filename);
            printf(" %d", n_node);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellValidate(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * dtd; /* the DTD URI (optional) */
    int n_dtd;
    xmlNodePtr node; /* unused */
    int n_node;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_dtd = 0;n_dtd < gen_nb_char_ptr;n_dtd++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        dtd = gen_char_ptr(n_dtd, 1);
        node = gen_xmlNodePtr(n_node, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellValidate(ctxt, dtd, node, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_dtd, dtd, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellValidate",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_dtd);
            printf(" %d", n_node);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlShellWrite(void) {
    int test_ret = 0;

#if defined(LIBXML_DEBUG_ENABLED) && defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlShellCtxtPtr ctxt; /* the shell context */
    int n_ctxt;
    char * filename; /* the file name */
    int n_filename;
    xmlNodePtr node; /* a node in the tree */
    int n_node;
    xmlNodePtr node2; /* unused */
    int n_node2;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlShellCtxtPtr;n_ctxt++) {
    for (n_filename = 0;n_filename < gen_nb_char_ptr;n_filename++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlShellCtxtPtr(n_ctxt, 0);
        filename = gen_char_ptr(n_filename, 1);
        node = gen_xmlNodePtr(n_node, 2);
        node2 = gen_xmlNodePtr(n_node2, 3);

        ret_val = xmlShellWrite(ctxt, filename, node, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlShellCtxtPtr(n_ctxt, ctxt, 0);
        des_char_ptr(n_filename, filename, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr(n_node2, node2, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlShellWrite",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_filename);
            printf(" %d", n_node);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_debugXML(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing debugXML : 25 of 28 functions ...\n");
    test_ret += test_xmlBoolToText();
    test_ret += test_xmlDebugCheckDocument();
    test_ret += test_xmlDebugDumpAttr();
    test_ret += test_xmlDebugDumpAttrList();
    test_ret += test_xmlDebugDumpDTD();
    test_ret += test_xmlDebugDumpDocument();
    test_ret += test_xmlDebugDumpDocumentHead();
    test_ret += test_xmlDebugDumpEntities();
    test_ret += test_xmlDebugDumpNode();
    test_ret += test_xmlDebugDumpNodeList();
    test_ret += test_xmlDebugDumpOneNode();
    test_ret += test_xmlDebugDumpString();
    test_ret += test_xmlLsCountNode();
    test_ret += test_xmlLsOneNode();
    test_ret += test_xmlShell();
    test_ret += test_xmlShellBase();
    test_ret += test_xmlShellCat();
    test_ret += test_xmlShellDir();
    test_ret += test_xmlShellDu();
    test_ret += test_xmlShellList();
    test_ret += test_xmlShellLoad();
    test_ret += test_xmlShellPrintXPathResult();
    test_ret += test_xmlShellPwd();
    test_ret += test_xmlShellSave();
    test_ret += test_xmlShellValidate();
    test_ret += test_xmlShellWrite();

    if (test_ret != 0)
	printf("Module debugXML: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlDictCleanup(void) {
    int test_ret = 0;

    int mem_base;

        mem_base = xmlMemBlocks();

        xmlDictCleanup();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDictCleanup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDictCreate(void) {
    int test_ret = 0;

    int mem_base;
    xmlDictPtr ret_val;

        mem_base = xmlMemBlocks();

        ret_val = xmlDictCreate();
        desret_xmlDictPtr(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDictCreate",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDictCreateSub(void) {
    int test_ret = 0;

    int mem_base;
    xmlDictPtr ret_val;
    xmlDictPtr sub; /* an existing dictionary */
    int n_sub;

    for (n_sub = 0;n_sub < gen_nb_xmlDictPtr;n_sub++) {
        mem_base = xmlMemBlocks();
        sub = gen_xmlDictPtr(n_sub, 0);

        ret_val = xmlDictCreateSub(sub);
        desret_xmlDictPtr(ret_val);
        call_tests++;
        des_xmlDictPtr(n_sub, sub, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDictCreateSub",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sub);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDictExists(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlDictPtr dict; /* the dictionary */
    int n_dict;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    int len; /* the length of the name, if -1 it is recomputed */
    int n_len;

    for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        dict = gen_xmlDictPtr(n_dict, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        len = gen_int(n_len, 2);
        if ((name != NULL) &&
            (len > (int) strlen((const char *) name) + 1))
            continue;

        ret_val = xmlDictExists(dict, (const xmlChar *)name, len);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlDictPtr(n_dict, dict, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDictExists",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dict);
            printf(" %d", n_name);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDictGetUsage(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlDictLookup(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlDictPtr dict; /* the dictionary */
    int n_dict;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    int len; /* the length of the name, if -1 it is recomputed */
    int n_len;

    for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        dict = gen_xmlDictPtr(n_dict, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        len = gen_int(n_len, 2);
        if ((name != NULL) &&
            (len > (int) strlen((const char *) name) + 1))
            continue;

        ret_val = xmlDictLookup(dict, (const xmlChar *)name, len);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlDictPtr(n_dict, dict, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDictLookup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dict);
            printf(" %d", n_name);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDictOwns(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDictPtr dict; /* the dictionary */
    int n_dict;
    xmlChar * str; /* the string */
    int n_str;

    for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        dict = gen_xmlDictPtr(n_dict, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);

        ret_val = xmlDictOwns(dict, (const xmlChar *)str);
        desret_int(ret_val);
        call_tests++;
        des_xmlDictPtr(n_dict, dict, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDictOwns",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dict);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDictQLookup(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlDictPtr dict; /* the dictionary */
    int n_dict;
    xmlChar * prefix; /* the prefix */
    int n_prefix;
    xmlChar * name; /* the name */
    int n_name;

    for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        dict = gen_xmlDictPtr(n_dict, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);

        ret_val = xmlDictQLookup(dict, (const xmlChar *)prefix, (const xmlChar *)name);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlDictPtr(n_dict, dict, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDictQLookup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dict);
            printf(" %d", n_prefix);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDictReference(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDictPtr dict; /* the dictionary */
    int n_dict;

    for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) {
        mem_base = xmlMemBlocks();
        dict = gen_xmlDictPtr(n_dict, 0);

        ret_val = xmlDictReference(dict);
        xmlDictFree(dict);
        desret_int(ret_val);
        call_tests++;
        des_xmlDictPtr(n_dict, dict, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDictReference",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dict);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDictSetLimit(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlDictSize(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDictPtr dict; /* the dictionary */
    int n_dict;

    for (n_dict = 0;n_dict < gen_nb_xmlDictPtr;n_dict++) {
        mem_base = xmlMemBlocks();
        dict = gen_xmlDictPtr(n_dict, 0);

        ret_val = xmlDictSize(dict);
        desret_int(ret_val);
        call_tests++;
        des_xmlDictPtr(n_dict, dict, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDictSize",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dict);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlInitializeDict(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;

        mem_base = xmlMemBlocks();

        ret_val = xmlInitializeDict();
        desret_int(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlInitializeDict",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}

static int
test_dict(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing dict : 10 of 13 functions ...\n");
    test_ret += test_xmlDictCleanup();
    test_ret += test_xmlDictCreate();
    test_ret += test_xmlDictCreateSub();
    test_ret += test_xmlDictExists();
    test_ret += test_xmlDictGetUsage();
    test_ret += test_xmlDictLookup();
    test_ret += test_xmlDictOwns();
    test_ret += test_xmlDictQLookup();
    test_ret += test_xmlDictReference();
    test_ret += test_xmlDictSetLimit();
    test_ret += test_xmlDictSize();
    test_ret += test_xmlInitializeDict();

    if (test_ret != 0)
	printf("Module dict: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_UTF8Toisolat1(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
#ifdef LIBXML_OUTPUT_ENABLED
    int mem_base;
    int ret_val;
    unsigned char * out; /* a pointer to an array of bytes to store the result */
    int n_out;
    int * outlen; /* the length of @out */
    int n_outlen;
    unsigned char * in; /* a pointer to an array of UTF-8 chars */
    int n_in;
    int * inlen; /* the length of @in */
    int n_inlen;

    for (n_out = 0;n_out < gen_nb_unsigned_char_ptr;n_out++) {
    for (n_outlen = 0;n_outlen < gen_nb_int_ptr;n_outlen++) {
    for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) {
    for (n_inlen = 0;n_inlen < gen_nb_int_ptr;n_inlen++) {
        mem_base = xmlMemBlocks();
        out = gen_unsigned_char_ptr(n_out, 0);
        outlen = gen_int_ptr(n_outlen, 1);
        in = gen_const_unsigned_char_ptr(n_in, 2);
        inlen = gen_int_ptr(n_inlen, 3);

        ret_val = UTF8Toisolat1(out, outlen, (const unsigned char *)in, inlen);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_char_ptr(n_out, out, 0);
        des_int_ptr(n_outlen, outlen, 1);
        des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 2);
        des_int_ptr(n_inlen, inlen, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in UTF8Toisolat1",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf(" %d", n_outlen);
            printf(" %d", n_in);
            printf(" %d", n_inlen);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_isolat1ToUTF8(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned char * out; /* a pointer to an array of bytes to store the result */
    int n_out;
    int * outlen; /* the length of @out */
    int n_outlen;
    unsigned char * in; /* a pointer to an array of ISO Latin 1 chars */
    int n_in;
    int * inlen; /* the length of @in */
    int n_inlen;

    for (n_out = 0;n_out < gen_nb_unsigned_char_ptr;n_out++) {
    for (n_outlen = 0;n_outlen < gen_nb_int_ptr;n_outlen++) {
    for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) {
    for (n_inlen = 0;n_inlen < gen_nb_int_ptr;n_inlen++) {
        mem_base = xmlMemBlocks();
        out = gen_unsigned_char_ptr(n_out, 0);
        outlen = gen_int_ptr(n_outlen, 1);
        in = gen_const_unsigned_char_ptr(n_in, 2);
        inlen = gen_int_ptr(n_inlen, 3);

        ret_val = isolat1ToUTF8(out, outlen, (const unsigned char *)in, inlen);
        desret_int(ret_val);
        call_tests++;
        des_unsigned_char_ptr(n_out, out, 0);
        des_int_ptr(n_outlen, outlen, 1);
        des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 2);
        des_int_ptr(n_inlen, inlen, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in isolat1ToUTF8",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf(" %d", n_outlen);
            printf(" %d", n_in);
            printf(" %d", n_inlen);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlAddEncodingAlias(void) {
    int test_ret = 0;

    int ret_val;
    char * name; /* the encoding name as parsed, in UTF-8 format (ASCII actually) */
    int n_name;
    char * alias; /* the alias name as parsed, in UTF-8 format (ASCII actually) */
    int n_alias;

    for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) {
    for (n_alias = 0;n_alias < gen_nb_const_char_ptr;n_alias++) {
        name = gen_const_char_ptr(n_name, 0);
        alias = gen_const_char_ptr(n_alias, 1);

        ret_val = xmlAddEncodingAlias((const char *)name, (const char *)alias);
        desret_int(ret_val);
        call_tests++;
        des_const_char_ptr(n_name, (const char *)name, 0);
        des_const_char_ptr(n_alias, (const char *)alias, 1);
        xmlResetLastError();
    }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlCharEncodingHandler_ptr 1
static xmlCharEncodingHandler * gen_xmlCharEncodingHandler_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlCharEncodingHandler_ptr(int no ATTRIBUTE_UNUSED, xmlCharEncodingHandler * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlCharEncCloseFunc(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlCharEncodingHandler * handler; /* char encoding transformation data structure */
    int n_handler;

    for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandler_ptr;n_handler++) {
        mem_base = xmlMemBlocks();
        handler = gen_xmlCharEncodingHandler_ptr(n_handler, 0);

        ret_val = xmlCharEncCloseFunc(handler);
        desret_int(ret_val);
        call_tests++;
        des_xmlCharEncodingHandler_ptr(n_handler, handler, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCharEncCloseFunc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_handler);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCharEncFirstLine(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlCharEncodingHandler * handler; /* char encoding transformation data structure */
    int n_handler;
    xmlBufferPtr out; /* an xmlBuffer for the output. */
    int n_out;
    xmlBufferPtr in; /* an xmlBuffer for the input */
    int n_in;

    for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandler_ptr;n_handler++) {
    for (n_out = 0;n_out < gen_nb_xmlBufferPtr;n_out++) {
    for (n_in = 0;n_in < gen_nb_xmlBufferPtr;n_in++) {
        mem_base = xmlMemBlocks();
        handler = gen_xmlCharEncodingHandler_ptr(n_handler, 0);
        out = gen_xmlBufferPtr(n_out, 1);
        in = gen_xmlBufferPtr(n_in, 2);

        ret_val = xmlCharEncFirstLine(handler, out, in);
        desret_int(ret_val);
        call_tests++;
        des_xmlCharEncodingHandler_ptr(n_handler, handler, 0);
        des_xmlBufferPtr(n_out, out, 1);
        des_xmlBufferPtr(n_in, in, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCharEncFirstLine",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_handler);
            printf(" %d", n_out);
            printf(" %d", n_in);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCharEncInFunc(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlCharEncodingHandler * handler; /* char encoding transformation data structure */
    int n_handler;
    xmlBufferPtr out; /* an xmlBuffer for the output. */
    int n_out;
    xmlBufferPtr in; /* an xmlBuffer for the input */
    int n_in;

    for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandler_ptr;n_handler++) {
    for (n_out = 0;n_out < gen_nb_xmlBufferPtr;n_out++) {
    for (n_in = 0;n_in < gen_nb_xmlBufferPtr;n_in++) {
        mem_base = xmlMemBlocks();
        handler = gen_xmlCharEncodingHandler_ptr(n_handler, 0);
        out = gen_xmlBufferPtr(n_out, 1);
        in = gen_xmlBufferPtr(n_in, 2);

        ret_val = xmlCharEncInFunc(handler, out, in);
        desret_int(ret_val);
        call_tests++;
        des_xmlCharEncodingHandler_ptr(n_handler, handler, 0);
        des_xmlBufferPtr(n_out, out, 1);
        des_xmlBufferPtr(n_in, in, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCharEncInFunc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_handler);
            printf(" %d", n_out);
            printf(" %d", n_in);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCharEncOutFunc(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlCharEncodingHandler * handler; /* char encoding transformation data structure */
    int n_handler;
    xmlBufferPtr out; /* an xmlBuffer for the output. */
    int n_out;
    xmlBufferPtr in; /* an xmlBuffer for the input */
    int n_in;

    for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandler_ptr;n_handler++) {
    for (n_out = 0;n_out < gen_nb_xmlBufferPtr;n_out++) {
    for (n_in = 0;n_in < gen_nb_xmlBufferPtr;n_in++) {
        mem_base = xmlMemBlocks();
        handler = gen_xmlCharEncodingHandler_ptr(n_handler, 0);
        out = gen_xmlBufferPtr(n_out, 1);
        in = gen_xmlBufferPtr(n_in, 2);

        ret_val = xmlCharEncOutFunc(handler, out, in);
        desret_int(ret_val);
        call_tests++;
        des_xmlCharEncodingHandler_ptr(n_handler, handler, 0);
        des_xmlBufferPtr(n_out, out, 1);
        des_xmlBufferPtr(n_in, in, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCharEncOutFunc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_handler);
            printf(" %d", n_out);
            printf(" %d", n_in);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCleanupCharEncodingHandlers(void) {
    int test_ret = 0;



        xmlCleanupCharEncodingHandlers();
        call_tests++;
        xmlResetLastError();
    function_tests++;

    return(test_ret);
}


static int
test_xmlCleanupEncodingAliases(void) {
    int test_ret = 0;

    int mem_base;

        mem_base = xmlMemBlocks();

        xmlCleanupEncodingAliases();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCleanupEncodingAliases",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDelEncodingAlias(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    char * alias; /* the alias name as parsed, in UTF-8 format (ASCII actually) */
    int n_alias;

    for (n_alias = 0;n_alias < gen_nb_const_char_ptr;n_alias++) {
        mem_base = xmlMemBlocks();
        alias = gen_const_char_ptr(n_alias, 0);

        ret_val = xmlDelEncodingAlias((const char *)alias);
        desret_int(ret_val);
        call_tests++;
        des_const_char_ptr(n_alias, (const char *)alias, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDelEncodingAlias",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_alias);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDetectCharEncoding(void) {
    int test_ret = 0;

    int mem_base;
    xmlCharEncoding ret_val;
    unsigned char * in; /* a pointer to the first bytes of the XML entity, must be at least 2 bytes long (at least 4 if encoding is UTF4 variant). */
    int n_in;
    int len; /* pointer to the length of the buffer */
    int n_len;

    for (n_in = 0;n_in < gen_nb_const_unsigned_char_ptr;n_in++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        in = gen_const_unsigned_char_ptr(n_in, 0);
        len = gen_int(n_len, 1);

        ret_val = xmlDetectCharEncoding((const unsigned char *)in, len);
        desret_xmlCharEncoding(ret_val);
        call_tests++;
        des_const_unsigned_char_ptr(n_in, (const unsigned char *)in, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDetectCharEncoding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_in);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlFindCharEncodingHandler(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlGetCharEncodingHandler(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlGetCharEncodingName(void) {
    int test_ret = 0;

    int mem_base;
    const char * ret_val;
    xmlCharEncoding enc; /* the encoding */
    int n_enc;

    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        enc = gen_xmlCharEncoding(n_enc, 0);

        ret_val = xmlGetCharEncodingName(enc);
        desret_const_char_ptr(ret_val);
        call_tests++;
        des_xmlCharEncoding(n_enc, enc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetCharEncodingName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetEncodingAlias(void) {
    int test_ret = 0;

    int mem_base;
    const char * ret_val;
    char * alias; /* the alias name as parsed, in UTF-8 format (ASCII actually) */
    int n_alias;

    for (n_alias = 0;n_alias < gen_nb_const_char_ptr;n_alias++) {
        mem_base = xmlMemBlocks();
        alias = gen_const_char_ptr(n_alias, 0);

        ret_val = xmlGetEncodingAlias((const char *)alias);
        desret_const_char_ptr(ret_val);
        call_tests++;
        des_const_char_ptr(n_alias, (const char *)alias, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetEncodingAlias",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_alias);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlInitCharEncodingHandlers(void) {
    int test_ret = 0;



        xmlInitCharEncodingHandlers();
        call_tests++;
        xmlResetLastError();
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewCharEncodingHandler(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlParseCharEncoding(void) {
    int test_ret = 0;

    int mem_base;
    xmlCharEncoding ret_val;
    char * name; /* the encoding name as parsed, in UTF-8 format (ASCII actually) */
    int n_name;

    for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        name = gen_const_char_ptr(n_name, 0);

        ret_val = xmlParseCharEncoding((const char *)name);
        desret_xmlCharEncoding(ret_val);
        call_tests++;
        des_const_char_ptr(n_name, (const char *)name, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseCharEncoding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlCharEncodingHandlerPtr 1
static xmlCharEncodingHandlerPtr gen_xmlCharEncodingHandlerPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlCharEncodingHandlerPtr(int no ATTRIBUTE_UNUSED, xmlCharEncodingHandlerPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlRegisterCharEncodingHandler(void) {
    int test_ret = 0;

    int mem_base;
    xmlCharEncodingHandlerPtr handler; /* the xmlCharEncodingHandlerPtr handler block */
    int n_handler;

    for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandlerPtr;n_handler++) {
        mem_base = xmlMemBlocks();
        handler = gen_xmlCharEncodingHandlerPtr(n_handler, 0);

        xmlRegisterCharEncodingHandler(handler);
        call_tests++;
        des_xmlCharEncodingHandlerPtr(n_handler, handler, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegisterCharEncodingHandler",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_handler);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}

static int
test_encoding(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing encoding : 16 of 19 functions ...\n");
    test_ret += test_UTF8Toisolat1();
    test_ret += test_isolat1ToUTF8();
    test_ret += test_xmlAddEncodingAlias();
    test_ret += test_xmlCharEncCloseFunc();
    test_ret += test_xmlCharEncFirstLine();
    test_ret += test_xmlCharEncInFunc();
    test_ret += test_xmlCharEncOutFunc();
    test_ret += test_xmlCleanupCharEncodingHandlers();
    test_ret += test_xmlCleanupEncodingAliases();
    test_ret += test_xmlDelEncodingAlias();
    test_ret += test_xmlDetectCharEncoding();
    test_ret += test_xmlFindCharEncodingHandler();
    test_ret += test_xmlGetCharEncodingHandler();
    test_ret += test_xmlGetCharEncodingName();
    test_ret += test_xmlGetEncodingAlias();
    test_ret += test_xmlInitCharEncodingHandlers();
    test_ret += test_xmlNewCharEncodingHandler();
    test_ret += test_xmlParseCharEncoding();
    test_ret += test_xmlRegisterCharEncodingHandler();

    if (test_ret != 0)
	printf("Module encoding: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlAddDocEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlEntityPtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * name; /* the entity name */
    int n_name;
    int type; /* the entity type XML_xxx_yyy_ENTITY */
    int n_type;
    xmlChar * ExternalID; /* the entity external ID if available */
    int n_ExternalID;
    xmlChar * SystemID; /* the entity system ID if available */
    int n_SystemID;
    xmlChar * content; /* the entity content */
    int n_content;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_type = 0;n_type < gen_nb_int;n_type++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        type = gen_int(n_type, 2);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 3);
        SystemID = gen_const_xmlChar_ptr(n_SystemID, 4);
        content = gen_const_xmlChar_ptr(n_content, 5);

        ret_val = xmlAddDocEntity(doc, (const xmlChar *)name, type, (const xmlChar *)ExternalID, (const xmlChar *)SystemID, (const xmlChar *)content);
        desret_xmlEntityPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_int(n_type, type, 2);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 3);
        des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 4);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAddDocEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf(" %d", n_type);
            printf(" %d", n_ExternalID);
            printf(" %d", n_SystemID);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlAddDtdEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlEntityPtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * name; /* the entity name */
    int n_name;
    int type; /* the entity type XML_xxx_yyy_ENTITY */
    int n_type;
    xmlChar * ExternalID; /* the entity external ID if available */
    int n_ExternalID;
    xmlChar * SystemID; /* the entity system ID if available */
    int n_SystemID;
    xmlChar * content; /* the entity content */
    int n_content;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_type = 0;n_type < gen_nb_int;n_type++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        type = gen_int(n_type, 2);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 3);
        SystemID = gen_const_xmlChar_ptr(n_SystemID, 4);
        content = gen_const_xmlChar_ptr(n_content, 5);

        ret_val = xmlAddDtdEntity(doc, (const xmlChar *)name, type, (const xmlChar *)ExternalID, (const xmlChar *)SystemID, (const xmlChar *)content);
        desret_xmlEntityPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_int(n_type, type, 2);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 3);
        des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 4);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAddDtdEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf(" %d", n_type);
            printf(" %d", n_ExternalID);
            printf(" %d", n_SystemID);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCleanupPredefinedEntities(void) {
    int test_ret = 0;

#if defined(LIBXML_LEGACY_ENABLED)
#ifdef LIBXML_LEGACY_ENABLED
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlCleanupPredefinedEntities();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCleanupPredefinedEntities",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlCopyEntitiesTable(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlCreateEntitiesTable(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


#define gen_nb_xmlEntitiesTablePtr 1
static xmlEntitiesTablePtr gen_xmlEntitiesTablePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlEntitiesTablePtr(int no ATTRIBUTE_UNUSED, xmlEntitiesTablePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlDumpEntitiesTable(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlBufferPtr buf; /* An XML buffer. */
    int n_buf;
    xmlEntitiesTablePtr table; /* An entity table */
    int n_table;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_table = 0;n_table < gen_nb_xmlEntitiesTablePtr;n_table++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        table = gen_xmlEntitiesTablePtr(n_table, 1);

        xmlDumpEntitiesTable(buf, table);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlEntitiesTablePtr(n_table, table, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDumpEntitiesTable",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_table);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


#define gen_nb_xmlEntityPtr 1
static xmlEntityPtr gen_xmlEntityPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlEntityPtr(int no ATTRIBUTE_UNUSED, xmlEntityPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlDumpEntityDecl(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlBufferPtr buf; /* An XML buffer. */
    int n_buf;
    xmlEntityPtr ent; /* An entity table */
    int n_ent;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_ent = 0;n_ent < gen_nb_xmlEntityPtr;n_ent++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        ent = gen_xmlEntityPtr(n_ent, 1);

        xmlDumpEntityDecl(buf, ent);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlEntityPtr(n_ent, ent, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDumpEntityDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_ent);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlEncodeEntitiesReentrant(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlDocPtr doc; /* the document containing the string */
    int n_doc;
    xmlChar * input; /* A string to convert to XML. */
    int n_input;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_input = 0;n_input < gen_nb_const_xmlChar_ptr;n_input++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        input = gen_const_xmlChar_ptr(n_input, 1);

        ret_val = xmlEncodeEntitiesReentrant(doc, (const xmlChar *)input);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_input, (const xmlChar *)input, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlEncodeEntitiesReentrant",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_input);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_const_xmlDoc_ptr 1
static xmlDoc * gen_const_xmlDoc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlDoc_ptr(int no ATTRIBUTE_UNUSED, const xmlDoc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlEncodeSpecialChars(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlDoc * doc; /* the document containing the string */
    int n_doc;
    xmlChar * input; /* A string to convert to XML. */
    int n_input;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
    for (n_input = 0;n_input < gen_nb_const_xmlChar_ptr;n_input++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);
        input = gen_const_xmlChar_ptr(n_input, 1);

        ret_val = xmlEncodeSpecialChars((const xmlDoc *)doc, (const xmlChar *)input);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        des_const_xmlChar_ptr(n_input, (const xmlChar *)input, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlEncodeSpecialChars",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_input);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetDocEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlEntityPtr ret_val;
    xmlDoc * doc; /* the document referencing the entity */
    int n_doc;
    xmlChar * name; /* the entity name */
    int n_name;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlGetDocEntity((const xmlDoc *)doc, (const xmlChar *)name);
        desret_xmlEntityPtr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetDocEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetDtdEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlEntityPtr ret_val;
    xmlDocPtr doc; /* the document referencing the entity */
    int n_doc;
    xmlChar * name; /* the entity name */
    int n_name;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlGetDtdEntity(doc, (const xmlChar *)name);
        desret_xmlEntityPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetDtdEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetParameterEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlEntityPtr ret_val;
    xmlDocPtr doc; /* the document referencing the entity */
    int n_doc;
    xmlChar * name; /* the entity name */
    int n_name;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlGetParameterEntity(doc, (const xmlChar *)name);
        desret_xmlEntityPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetParameterEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetPredefinedEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlEntityPtr ret_val;
    xmlChar * name; /* the entity name */
    int n_name;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);

        ret_val = xmlGetPredefinedEntity((const xmlChar *)name);
        desret_xmlEntityPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetPredefinedEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlInitializePredefinedEntities(void) {
    int test_ret = 0;

#if defined(LIBXML_LEGACY_ENABLED)
#ifdef LIBXML_LEGACY_ENABLED
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlInitializePredefinedEntities();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlInitializePredefinedEntities",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlNewEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlEntityPtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * name; /* the entity name */
    int n_name;
    int type; /* the entity type XML_xxx_yyy_ENTITY */
    int n_type;
    xmlChar * ExternalID; /* the entity external ID if available */
    int n_ExternalID;
    xmlChar * SystemID; /* the entity system ID if available */
    int n_SystemID;
    xmlChar * content; /* the entity content */
    int n_content;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_type = 0;n_type < gen_nb_int;n_type++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        type = gen_int(n_type, 2);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 3);
        SystemID = gen_const_xmlChar_ptr(n_SystemID, 4);
        content = gen_const_xmlChar_ptr(n_content, 5);

        ret_val = xmlNewEntity(doc, (const xmlChar *)name, type, (const xmlChar *)ExternalID, (const xmlChar *)SystemID, (const xmlChar *)content);
        desret_xmlEntityPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_int(n_type, type, 2);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 3);
        des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 4);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf(" %d", n_type);
            printf(" %d", n_ExternalID);
            printf(" %d", n_SystemID);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}

static int
test_entities(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing entities : 13 of 17 functions ...\n");
    test_ret += test_xmlAddDocEntity();
    test_ret += test_xmlAddDtdEntity();
    test_ret += test_xmlCleanupPredefinedEntities();
    test_ret += test_xmlCopyEntitiesTable();
    test_ret += test_xmlCreateEntitiesTable();
    test_ret += test_xmlDumpEntitiesTable();
    test_ret += test_xmlDumpEntityDecl();
    test_ret += test_xmlEncodeEntitiesReentrant();
    test_ret += test_xmlEncodeSpecialChars();
    test_ret += test_xmlGetDocEntity();
    test_ret += test_xmlGetDtdEntity();
    test_ret += test_xmlGetParameterEntity();
    test_ret += test_xmlGetPredefinedEntity();
    test_ret += test_xmlInitializePredefinedEntities();
    test_ret += test_xmlNewEntity();

    if (test_ret != 0)
	printf("Module entities: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlHashAddEntry(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    void * userdata; /* a pointer to the userdata */
    int n_userdata;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        userdata = gen_userdata(n_userdata, 2);

        ret_val = xmlHashAddEntry(table, (const xmlChar *)name, userdata);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_userdata(n_userdata, userdata, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashAddEntry",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_userdata);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashAddEntry2(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;
    void * userdata; /* a pointer to the userdata */
    int n_userdata;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
    for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        name2 = gen_const_xmlChar_ptr(n_name2, 2);
        userdata = gen_userdata(n_userdata, 3);

        ret_val = xmlHashAddEntry2(table, (const xmlChar *)name, (const xmlChar *)name2, userdata);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2);
        des_userdata(n_userdata, userdata, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashAddEntry2",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_name2);
            printf(" %d", n_userdata);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashAddEntry3(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;
    xmlChar * name3; /* a third name of the userdata */
    int n_name3;
    void * userdata; /* a pointer to the userdata */
    int n_userdata;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
    for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) {
    for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        name2 = gen_const_xmlChar_ptr(n_name2, 2);
        name3 = gen_const_xmlChar_ptr(n_name3, 3);
        userdata = gen_userdata(n_userdata, 4);

        ret_val = xmlHashAddEntry3(table, (const xmlChar *)name, (const xmlChar *)name2, (const xmlChar *)name3, userdata);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2);
        des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 3);
        des_userdata(n_userdata, userdata, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashAddEntry3",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_name2);
            printf(" %d", n_name3);
            printf(" %d", n_userdata);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashCopy(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlHashCreate(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlHashCreateDict(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlHashDefaultDeallocator(void) {
    int test_ret = 0;

    int mem_base;
    void * entry; /* the hash table entry */
    int n_entry;
    xmlChar * name; /* the entry's name */
    int n_name;

    for (n_entry = 0;n_entry < gen_nb_void_ptr;n_entry++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        entry = gen_void_ptr(n_entry, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        xmlHashDefaultDeallocator(entry, (const xmlChar *)name);
        call_tests++;
        des_void_ptr(n_entry, entry, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashDefaultDeallocator",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_entry);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashLookup(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlHashLookup(table, (const xmlChar *)name);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashLookup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashLookup2(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        name2 = gen_const_xmlChar_ptr(n_name2, 2);

        ret_val = xmlHashLookup2(table, (const xmlChar *)name, (const xmlChar *)name2);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashLookup2",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_name2);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashLookup3(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;
    xmlChar * name3; /* a third name of the userdata */
    int n_name3;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
    for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        name2 = gen_const_xmlChar_ptr(n_name2, 2);
        name3 = gen_const_xmlChar_ptr(n_name3, 3);

        ret_val = xmlHashLookup3(table, (const xmlChar *)name, (const xmlChar *)name2, (const xmlChar *)name3);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2);
        des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashLookup3",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_name2);
            printf(" %d", n_name3);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashQLookup(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * prefix; /* the prefix of the userdata */
    int n_prefix;
    xmlChar * name; /* the name of the userdata */
    int n_name;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);

        ret_val = xmlHashQLookup(table, (const xmlChar *)prefix, (const xmlChar *)name);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashQLookup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_prefix);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashQLookup2(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * prefix; /* the prefix of the userdata */
    int n_prefix;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * prefix2; /* the second prefix of the userdata */
    int n_prefix2;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_prefix2 = 0;n_prefix2 < gen_nb_const_xmlChar_ptr;n_prefix2++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        prefix2 = gen_const_xmlChar_ptr(n_prefix2, 3);
        name2 = gen_const_xmlChar_ptr(n_name2, 4);

        ret_val = xmlHashQLookup2(table, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)prefix2, (const xmlChar *)name2);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_prefix2, (const xmlChar *)prefix2, 3);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashQLookup2",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_prefix);
            printf(" %d", n_name);
            printf(" %d", n_prefix2);
            printf(" %d", n_name2);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashQLookup3(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * prefix; /* the prefix of the userdata */
    int n_prefix;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * prefix2; /* the second prefix of the userdata */
    int n_prefix2;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;
    xmlChar * prefix3; /* the third prefix of the userdata */
    int n_prefix3;
    xmlChar * name3; /* a third name of the userdata */
    int n_name3;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_prefix2 = 0;n_prefix2 < gen_nb_const_xmlChar_ptr;n_prefix2++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
    for (n_prefix3 = 0;n_prefix3 < gen_nb_const_xmlChar_ptr;n_prefix3++) {
    for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        prefix2 = gen_const_xmlChar_ptr(n_prefix2, 3);
        name2 = gen_const_xmlChar_ptr(n_name2, 4);
        prefix3 = gen_const_xmlChar_ptr(n_prefix3, 5);
        name3 = gen_const_xmlChar_ptr(n_name3, 6);

        ret_val = xmlHashQLookup3(table, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)prefix2, (const xmlChar *)name2, (const xmlChar *)prefix3, (const xmlChar *)name3);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_prefix2, (const xmlChar *)prefix2, 3);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 4);
        des_const_xmlChar_ptr(n_prefix3, (const xmlChar *)prefix3, 5);
        des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 6);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashQLookup3",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_prefix);
            printf(" %d", n_name);
            printf(" %d", n_prefix2);
            printf(" %d", n_name2);
            printf(" %d", n_prefix3);
            printf(" %d", n_name3);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashRemoveEntry(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlHashDeallocator f; /* the deallocator function for removed item (if any) */
    int n_f;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        f = gen_xmlHashDeallocator(n_f, 2);

        ret_val = xmlHashRemoveEntry(table, (const xmlChar *)name, f);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_xmlHashDeallocator(n_f, f, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashRemoveEntry",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_f);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashRemoveEntry2(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;
    xmlHashDeallocator f; /* the deallocator function for removed item (if any) */
    int n_f;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
    for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        name2 = gen_const_xmlChar_ptr(n_name2, 2);
        f = gen_xmlHashDeallocator(n_f, 3);

        ret_val = xmlHashRemoveEntry2(table, (const xmlChar *)name, (const xmlChar *)name2, f);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2);
        des_xmlHashDeallocator(n_f, f, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashRemoveEntry2",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_name2);
            printf(" %d", n_f);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashRemoveEntry3(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;
    xmlChar * name3; /* a third name of the userdata */
    int n_name3;
    xmlHashDeallocator f; /* the deallocator function for removed item (if any) */
    int n_f;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
    for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) {
    for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        name2 = gen_const_xmlChar_ptr(n_name2, 2);
        name3 = gen_const_xmlChar_ptr(n_name3, 3);
        f = gen_xmlHashDeallocator(n_f, 4);

        ret_val = xmlHashRemoveEntry3(table, (const xmlChar *)name, (const xmlChar *)name2, (const xmlChar *)name3, f);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2);
        des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 3);
        des_xmlHashDeallocator(n_f, f, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashRemoveEntry3",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_name2);
            printf(" %d", n_name3);
            printf(" %d", n_f);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashScan(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlHashScan3(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlHashScanFull(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlHashScanFull3(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlHashSize(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);

        ret_val = xmlHashSize(table);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashSize",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashUpdateEntry(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    void * userdata; /* a pointer to the userdata */
    int n_userdata;
    xmlHashDeallocator f; /* the deallocator function for replaced item (if any) */
    int n_f;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) {
    for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        userdata = gen_userdata(n_userdata, 2);
        f = gen_xmlHashDeallocator(n_f, 3);

        ret_val = xmlHashUpdateEntry(table, (const xmlChar *)name, userdata, f);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_userdata(n_userdata, userdata, 2);
        des_xmlHashDeallocator(n_f, f, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashUpdateEntry",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_userdata);
            printf(" %d", n_f);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashUpdateEntry2(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;
    void * userdata; /* a pointer to the userdata */
    int n_userdata;
    xmlHashDeallocator f; /* the deallocator function for replaced item (if any) */
    int n_f;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
    for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) {
    for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        name2 = gen_const_xmlChar_ptr(n_name2, 2);
        userdata = gen_userdata(n_userdata, 3);
        f = gen_xmlHashDeallocator(n_f, 4);

        ret_val = xmlHashUpdateEntry2(table, (const xmlChar *)name, (const xmlChar *)name2, userdata, f);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2);
        des_userdata(n_userdata, userdata, 3);
        des_xmlHashDeallocator(n_f, f, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashUpdateEntry2",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_name2);
            printf(" %d", n_userdata);
            printf(" %d", n_f);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHashUpdateEntry3(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlHashTablePtr table; /* the hash table */
    int n_table;
    xmlChar * name; /* the name of the userdata */
    int n_name;
    xmlChar * name2; /* a second name of the userdata */
    int n_name2;
    xmlChar * name3; /* a third name of the userdata */
    int n_name3;
    void * userdata; /* a pointer to the userdata */
    int n_userdata;
    xmlHashDeallocator f; /* the deallocator function for replaced item (if any) */
    int n_f;

    for (n_table = 0;n_table < gen_nb_xmlHashTablePtr;n_table++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_name2 = 0;n_name2 < gen_nb_const_xmlChar_ptr;n_name2++) {
    for (n_name3 = 0;n_name3 < gen_nb_const_xmlChar_ptr;n_name3++) {
    for (n_userdata = 0;n_userdata < gen_nb_userdata;n_userdata++) {
    for (n_f = 0;n_f < gen_nb_xmlHashDeallocator;n_f++) {
        mem_base = xmlMemBlocks();
        table = gen_xmlHashTablePtr(n_table, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        name2 = gen_const_xmlChar_ptr(n_name2, 2);
        name3 = gen_const_xmlChar_ptr(n_name3, 3);
        userdata = gen_userdata(n_userdata, 4);
        f = gen_xmlHashDeallocator(n_f, 5);

        ret_val = xmlHashUpdateEntry3(table, (const xmlChar *)name, (const xmlChar *)name2, (const xmlChar *)name3, userdata, f);
        desret_int(ret_val);
        call_tests++;
        des_xmlHashTablePtr(n_table, table, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_name2, (const xmlChar *)name2, 2);
        des_const_xmlChar_ptr(n_name3, (const xmlChar *)name3, 3);
        des_userdata(n_userdata, userdata, 4);
        des_xmlHashDeallocator(n_f, f, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHashUpdateEntry3",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_table);
            printf(" %d", n_name);
            printf(" %d", n_name2);
            printf(" %d", n_name3);
            printf(" %d", n_userdata);
            printf(" %d", n_f);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}

static int
test_hash(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing hash : 17 of 25 functions ...\n");
    test_ret += test_xmlHashAddEntry();
    test_ret += test_xmlHashAddEntry2();
    test_ret += test_xmlHashAddEntry3();
    test_ret += test_xmlHashCopy();
    test_ret += test_xmlHashCreate();
    test_ret += test_xmlHashCreateDict();
    test_ret += test_xmlHashDefaultDeallocator();
    test_ret += test_xmlHashLookup();
    test_ret += test_xmlHashLookup2();
    test_ret += test_xmlHashLookup3();
    test_ret += test_xmlHashQLookup();
    test_ret += test_xmlHashQLookup2();
    test_ret += test_xmlHashQLookup3();
    test_ret += test_xmlHashRemoveEntry();
    test_ret += test_xmlHashRemoveEntry2();
    test_ret += test_xmlHashRemoveEntry3();
    test_ret += test_xmlHashScan();
    test_ret += test_xmlHashScan3();
    test_ret += test_xmlHashScanFull();
    test_ret += test_xmlHashScanFull3();
    test_ret += test_xmlHashSize();
    test_ret += test_xmlHashUpdateEntry();
    test_ret += test_xmlHashUpdateEntry2();
    test_ret += test_xmlHashUpdateEntry3();

    if (test_ret != 0)
	printf("Module hash: %d errors\n", test_ret);
    return(test_ret);
}

#define gen_nb_xmlLinkPtr 1
static xmlLinkPtr gen_xmlLinkPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlLinkPtr(int no ATTRIBUTE_UNUSED, xmlLinkPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlLinkGetData(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    xmlLinkPtr lk; /* a link */
    int n_lk;

    for (n_lk = 0;n_lk < gen_nb_xmlLinkPtr;n_lk++) {
        mem_base = xmlMemBlocks();
        lk = gen_xmlLinkPtr(n_lk, 0);

        ret_val = xmlLinkGetData(lk);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlLinkPtr(n_lk, lk, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlLinkGetData",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_lk);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListAppend(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr l; /* a list */
    int n_l;
    void * data; /* the data */
    int n_data;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);
        data = gen_userdata(n_data, 1);

        ret_val = xmlListAppend(l, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        des_userdata(n_data, data, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListAppend",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListClear(void) {
    int test_ret = 0;

    int mem_base;
    xmlListPtr l; /* a list */
    int n_l;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);

        xmlListClear(l);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListClear",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_const_xmlListPtr 1
static xmlListPtr gen_const_xmlListPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlListPtr(int no ATTRIBUTE_UNUSED, const xmlListPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlListCopy(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr cur; /* the new list */
    int n_cur;
    xmlListPtr old; /* the old list */
    int n_old;

    for (n_cur = 0;n_cur < gen_nb_xmlListPtr;n_cur++) {
    for (n_old = 0;n_old < gen_nb_const_xmlListPtr;n_old++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlListPtr(n_cur, 0);
        old = gen_const_xmlListPtr(n_old, 1);

        ret_val = xmlListCopy(cur, (const xmlListPtr)old);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_cur, cur, 0);
        des_const_xmlListPtr(n_old, (const xmlListPtr)old, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListCopy",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_old);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListCreate(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlListDup(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlListEmpty(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr l; /* a list */
    int n_l;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);

        ret_val = xmlListEmpty(l);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListEmpty",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListEnd(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlListFront(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlListInsert(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr l; /* a list */
    int n_l;
    void * data; /* the data */
    int n_data;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);
        data = gen_userdata(n_data, 1);

        ret_val = xmlListInsert(l, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        des_userdata(n_data, data, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListInsert",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListMerge(void) {
    int test_ret = 0;

    int mem_base;
    xmlListPtr l1; /* the original list */
    int n_l1;
    xmlListPtr l2; /* the new list */
    int n_l2;

    for (n_l1 = 0;n_l1 < gen_nb_xmlListPtr;n_l1++) {
    for (n_l2 = 0;n_l2 < gen_nb_xmlListPtr;n_l2++) {
        mem_base = xmlMemBlocks();
        l1 = gen_xmlListPtr(n_l1, 0);
        l2 = gen_xmlListPtr(n_l2, 1);

        xmlListMerge(l1, l2);
        call_tests++;
        des_xmlListPtr(n_l1, l1, 0);
        des_xmlListPtr(n_l2, l2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListMerge",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l1);
            printf(" %d", n_l2);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListPopBack(void) {
    int test_ret = 0;

    int mem_base;
    xmlListPtr l; /* a list */
    int n_l;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);

        xmlListPopBack(l);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListPopBack",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListPopFront(void) {
    int test_ret = 0;

    int mem_base;
    xmlListPtr l; /* a list */
    int n_l;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);

        xmlListPopFront(l);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListPopFront",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListPushBack(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr l; /* a list */
    int n_l;
    void * data; /* new data */
    int n_data;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);
        data = gen_userdata(n_data, 1);

        ret_val = xmlListPushBack(l, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        des_userdata(n_data, data, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListPushBack",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListPushFront(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr l; /* a list */
    int n_l;
    void * data; /* new data */
    int n_data;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);
        data = gen_userdata(n_data, 1);

        ret_val = xmlListPushFront(l, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        des_userdata(n_data, data, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListPushFront",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListRemoveAll(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr l; /* a list */
    int n_l;
    void * data; /* list data */
    int n_data;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);
        data = gen_userdata(n_data, 1);

        ret_val = xmlListRemoveAll(l, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        des_userdata(n_data, data, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListRemoveAll",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListRemoveFirst(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr l; /* a list */
    int n_l;
    void * data; /* list data */
    int n_data;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);
        data = gen_userdata(n_data, 1);

        ret_val = xmlListRemoveFirst(l, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        des_userdata(n_data, data, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListRemoveFirst",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListRemoveLast(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr l; /* a list */
    int n_l;
    void * data; /* list data */
    int n_data;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);
        data = gen_userdata(n_data, 1);

        ret_val = xmlListRemoveLast(l, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        des_userdata(n_data, data, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListRemoveLast",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListReverse(void) {
    int test_ret = 0;

    int mem_base;
    xmlListPtr l; /* a list */
    int n_l;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);

        xmlListReverse(l);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListReverse",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListReverseSearch(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    xmlListPtr l; /* a list */
    int n_l;
    void * data; /* a search value */
    int n_data;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);
        data = gen_userdata(n_data, 1);

        ret_val = xmlListReverseSearch(l, data);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        des_userdata(n_data, data, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListReverseSearch",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListReverseWalk(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlListSearch(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    xmlListPtr l; /* a list */
    int n_l;
    void * data; /* a search value */
    int n_data;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);
        data = gen_userdata(n_data, 1);

        ret_val = xmlListSearch(l, data);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        des_userdata(n_data, data, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListSearch",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListSize(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlListPtr l; /* a list */
    int n_l;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);

        ret_val = xmlListSize(l);
        desret_int(ret_val);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListSize",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListSort(void) {
    int test_ret = 0;

    int mem_base;
    xmlListPtr l; /* a list */
    int n_l;

    for (n_l = 0;n_l < gen_nb_xmlListPtr;n_l++) {
        mem_base = xmlMemBlocks();
        l = gen_xmlListPtr(n_l, 0);

        xmlListSort(l);
        call_tests++;
        des_xmlListPtr(n_l, l, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlListSort",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_l);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlListWalk(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

static int
test_list(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing list : 19 of 26 functions ...\n");
    test_ret += test_xmlLinkGetData();
    test_ret += test_xmlListAppend();
    test_ret += test_xmlListClear();
    test_ret += test_xmlListCopy();
    test_ret += test_xmlListCreate();
    test_ret += test_xmlListDup();
    test_ret += test_xmlListEmpty();
    test_ret += test_xmlListEnd();
    test_ret += test_xmlListFront();
    test_ret += test_xmlListInsert();
    test_ret += test_xmlListMerge();
    test_ret += test_xmlListPopBack();
    test_ret += test_xmlListPopFront();
    test_ret += test_xmlListPushBack();
    test_ret += test_xmlListPushFront();
    test_ret += test_xmlListRemoveAll();
    test_ret += test_xmlListRemoveFirst();
    test_ret += test_xmlListRemoveLast();
    test_ret += test_xmlListReverse();
    test_ret += test_xmlListReverseSearch();
    test_ret += test_xmlListReverseWalk();
    test_ret += test_xmlListSearch();
    test_ret += test_xmlListSize();
    test_ret += test_xmlListSort();
    test_ret += test_xmlListWalk();

    if (test_ret != 0)
	printf("Module list: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlNanoFTPCheckResponse(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* an FTP context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0);

        ret_val = xmlNanoFTPCheckResponse(ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPCheckResponse",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPCleanup(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlNanoFTPCleanup();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPCleanup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPCloseConnection(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* an FTP context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0);

        ret_val = xmlNanoFTPCloseConnection(ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPCloseConnection",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPCwd(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* an FTP context */
    int n_ctx;
    char * directory; /* a directory on the server */
    int n_directory;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) {
    for (n_directory = 0;n_directory < gen_nb_const_char_ptr;n_directory++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0);
        directory = gen_const_char_ptr(n_directory, 1);

        ret_val = xmlNanoFTPCwd(ctx, (const char *)directory);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0);
        des_const_char_ptr(n_directory, (const char *)directory, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPCwd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_directory);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPDele(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* an FTP context */
    int n_ctx;
    const char * file; /* a file or directory on the server */
    int n_file;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) {
    for (n_file = 0;n_file < gen_nb_filepath;n_file++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0);
        file = gen_filepath(n_file, 1);

        ret_val = xmlNanoFTPDele(ctx, file);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0);
        des_filepath(n_file, file, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPDele",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_file);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPGet(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlNanoFTPGetConnection(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlNanoFTPGetResponse(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* an FTP context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0);

        ret_val = xmlNanoFTPGetResponse(ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPGetResponse",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPGetSocket(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlNanoFTPInit(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlNanoFTPInit();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPInit",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPList(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlNanoFTPNewCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    void * ret_val;
    const char * URL; /* The URL used to initialize the context */
    int n_URL;

    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
        mem_base = xmlMemBlocks();
        URL = gen_filepath(n_URL, 0);

        ret_val = xmlNanoFTPNewCtxt(URL);
        desret_xmlNanoFTPCtxtPtr(ret_val);
        call_tests++;
        des_filepath(n_URL, URL, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPNewCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPOpen(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    void * ret_val;
    const char * URL; /* the URL to the resource */
    int n_URL;

    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
        mem_base = xmlMemBlocks();
        URL = gen_filepath(n_URL, 0);

        ret_val = xmlNanoFTPOpen(URL);
        desret_xmlNanoFTPCtxtPtr(ret_val);
        call_tests++;
        des_filepath(n_URL, URL, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPOpen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPProxy(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    char * host; /* the proxy host name */
    int n_host;
    int port; /* the proxy port */
    int n_port;
    char * user; /* the proxy user name */
    int n_user;
    char * passwd; /* the proxy password */
    int n_passwd;
    int type; /* the type of proxy 1 for using SITE, 2 for USER a@b */
    int n_type;

    for (n_host = 0;n_host < gen_nb_const_char_ptr;n_host++) {
    for (n_port = 0;n_port < gen_nb_int;n_port++) {
    for (n_user = 0;n_user < gen_nb_const_char_ptr;n_user++) {
    for (n_passwd = 0;n_passwd < gen_nb_const_char_ptr;n_passwd++) {
    for (n_type = 0;n_type < gen_nb_int;n_type++) {
        host = gen_const_char_ptr(n_host, 0);
        port = gen_int(n_port, 1);
        user = gen_const_char_ptr(n_user, 2);
        passwd = gen_const_char_ptr(n_passwd, 3);
        type = gen_int(n_type, 4);

        xmlNanoFTPProxy((const char *)host, port, (const char *)user, (const char *)passwd, type);
        call_tests++;
        des_const_char_ptr(n_host, (const char *)host, 0);
        des_int(n_port, port, 1);
        des_const_char_ptr(n_user, (const char *)user, 2);
        des_const_char_ptr(n_passwd, (const char *)passwd, 3);
        des_int(n_type, type, 4);
        xmlResetLastError();
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPQuit(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* an FTP context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0);

        ret_val = xmlNanoFTPQuit(ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPQuit",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPRead(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* the FTP context */
    int n_ctx;
    void * dest; /* a buffer */
    int n_dest;
    int len; /* the buffer length */
    int n_len;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) {
    for (n_dest = 0;n_dest < gen_nb_void_ptr;n_dest++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0);
        dest = gen_void_ptr(n_dest, 1);
        len = gen_int(n_len, 2);

        ret_val = xmlNanoFTPRead(ctx, dest, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0);
        des_void_ptr(n_dest, dest, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPRead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_dest);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPScanProxy(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    const char * URL; /* The proxy URL used to initialize the proxy context */
    int n_URL;

    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
        URL = gen_filepath(n_URL, 0);

        xmlNanoFTPScanProxy(URL);
        call_tests++;
        des_filepath(n_URL, URL, 0);
        xmlResetLastError();
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoFTPUpdateURL(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* an FTP context */
    int n_ctx;
    const char * URL; /* The URL used to update the context */
    int n_URL;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoFTPCtxtPtr;n_ctx++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoFTPCtxtPtr(n_ctx, 0);
        URL = gen_filepath(n_URL, 1);

        ret_val = xmlNanoFTPUpdateURL(ctx, URL);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoFTPCtxtPtr(n_ctx, ctx, 0);
        des_filepath(n_URL, URL, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoFTPUpdateURL",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_URL);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_nanoftp(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing nanoftp : 14 of 22 functions ...\n");
    test_ret += test_xmlNanoFTPCheckResponse();
    test_ret += test_xmlNanoFTPCleanup();
    test_ret += test_xmlNanoFTPCloseConnection();
    test_ret += test_xmlNanoFTPCwd();
    test_ret += test_xmlNanoFTPDele();
    test_ret += test_xmlNanoFTPGet();
    test_ret += test_xmlNanoFTPGetConnection();
    test_ret += test_xmlNanoFTPGetResponse();
    test_ret += test_xmlNanoFTPGetSocket();
    test_ret += test_xmlNanoFTPInit();
    test_ret += test_xmlNanoFTPList();
    test_ret += test_xmlNanoFTPNewCtxt();
    test_ret += test_xmlNanoFTPOpen();
    test_ret += test_xmlNanoFTPProxy();
    test_ret += test_xmlNanoFTPQuit();
    test_ret += test_xmlNanoFTPRead();
    test_ret += test_xmlNanoFTPScanProxy();
    test_ret += test_xmlNanoFTPUpdateURL();

    if (test_ret != 0)
	printf("Module nanoftp: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlNanoHTTPAuthHeader(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    const char * ret_val;
    void * ctx; /* the HTTP context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0);

        ret_val = xmlNanoHTTPAuthHeader(ctx);
        desret_const_char_ptr(ret_val);
        call_tests++;
        des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPAuthHeader",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPCleanup(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlNanoHTTPCleanup();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPCleanup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPContentLength(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* the HTTP context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0);

        ret_val = xmlNanoHTTPContentLength(ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPContentLength",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPEncoding(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    const char * ret_val;
    void * ctx; /* the HTTP context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0);

        ret_val = xmlNanoHTTPEncoding(ctx);
        desret_const_char_ptr(ret_val);
        call_tests++;
        des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPEncoding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


#define gen_nb_char_ptr_ptr 1
static char ** gen_char_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_char_ptr_ptr(int no ATTRIBUTE_UNUSED, char ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlNanoHTTPFetch(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    int ret_val;
    const char * URL; /* The URL to load */
    int n_URL;
    const char * filename; /* the filename where the content should be saved */
    int n_filename;
    char ** contentType; /* if available the Content-Type information will be returned at that location */
    int n_contentType;

    for (n_URL = 0;n_URL < gen_nb_fileoutput;n_URL++) {
    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_contentType = 0;n_contentType < gen_nb_char_ptr_ptr;n_contentType++) {
        mem_base = xmlMemBlocks();
        URL = gen_fileoutput(n_URL, 0);
        filename = gen_fileoutput(n_filename, 1);
        contentType = gen_char_ptr_ptr(n_contentType, 2);

        ret_val = xmlNanoHTTPFetch(URL, filename, contentType);
        desret_int(ret_val);
        call_tests++;
        des_fileoutput(n_URL, URL, 0);
        des_fileoutput(n_filename, filename, 1);
        des_char_ptr_ptr(n_contentType, contentType, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPFetch",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf(" %d", n_filename);
            printf(" %d", n_contentType);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPInit(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlNanoHTTPInit();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPInit",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPMimeType(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    const char * ret_val;
    void * ctx; /* the HTTP context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0);

        ret_val = xmlNanoHTTPMimeType(ctx);
        desret_const_char_ptr(ret_val);
        call_tests++;
        des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPMimeType",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPOpen(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    void * ret_val;
    const char * URL; /* The URL to load */
    int n_URL;
    char ** contentType; /* if available the Content-Type information will be returned at that location */
    int n_contentType;

    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_contentType = 0;n_contentType < gen_nb_char_ptr_ptr;n_contentType++) {
        mem_base = xmlMemBlocks();
        URL = gen_filepath(n_URL, 0);
        contentType = gen_char_ptr_ptr(n_contentType, 1);

        ret_val = xmlNanoHTTPOpen(URL, contentType);
        desret_xmlNanoHTTPCtxtPtr(ret_val);
        call_tests++;
        des_filepath(n_URL, URL, 0);
        des_char_ptr_ptr(n_contentType, contentType, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPOpen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf(" %d", n_contentType);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPOpenRedir(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    void * ret_val;
    const char * URL; /* The URL to load */
    int n_URL;
    char ** contentType; /* if available the Content-Type information will be returned at that location */
    int n_contentType;
    char ** redir; /* if available the redirected URL will be returned */
    int n_redir;

    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_contentType = 0;n_contentType < gen_nb_char_ptr_ptr;n_contentType++) {
    for (n_redir = 0;n_redir < gen_nb_char_ptr_ptr;n_redir++) {
        mem_base = xmlMemBlocks();
        URL = gen_filepath(n_URL, 0);
        contentType = gen_char_ptr_ptr(n_contentType, 1);
        redir = gen_char_ptr_ptr(n_redir, 2);

        ret_val = xmlNanoHTTPOpenRedir(URL, contentType, redir);
        desret_xmlNanoHTTPCtxtPtr(ret_val);
        call_tests++;
        des_filepath(n_URL, URL, 0);
        des_char_ptr_ptr(n_contentType, contentType, 1);
        des_char_ptr_ptr(n_redir, redir, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPOpenRedir",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf(" %d", n_contentType);
            printf(" %d", n_redir);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPRead(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* the HTTP context */
    int n_ctx;
    void * dest; /* a buffer */
    int n_dest;
    int len; /* the buffer length */
    int n_len;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) {
    for (n_dest = 0;n_dest < gen_nb_void_ptr;n_dest++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0);
        dest = gen_void_ptr(n_dest, 1);
        len = gen_int(n_len, 2);

        ret_val = xmlNanoHTTPRead(ctx, dest, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0);
        des_void_ptr(n_dest, dest, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPRead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_dest);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPRedir(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlNanoHTTPReturnCode(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    int ret_val;
    void * ctx; /* the HTTP context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_xmlNanoHTTPCtxtPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlNanoHTTPCtxtPtr(n_ctx, 0);

        ret_val = xmlNanoHTTPReturnCode(ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlNanoHTTPCtxtPtr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPReturnCode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPSave(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    void * ctxt; /* the HTTP context */
    int n_ctxt;
    const char * filename; /* the filename where the content should be saved */
    int n_filename;

    for (n_ctxt = 0;n_ctxt < gen_nb_void_ptr;n_ctxt++) {
    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_void_ptr(n_ctxt, 0);
        filename = gen_fileoutput(n_filename, 1);

        ret_val = xmlNanoHTTPSave(ctxt, filename);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_ctxt, ctxt, 0);
        des_fileoutput(n_filename, filename, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNanoHTTPSave",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNanoHTTPScanProxy(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    const char * URL; /* The proxy URL used to initialize the proxy context */
    int n_URL;

    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
        URL = gen_filepath(n_URL, 0);

        xmlNanoHTTPScanProxy(URL);
        call_tests++;
        des_filepath(n_URL, URL, 0);
        xmlResetLastError();
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_nanohttp(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing nanohttp : 13 of 17 functions ...\n");
    test_ret += test_xmlNanoHTTPAuthHeader();
    test_ret += test_xmlNanoHTTPCleanup();
    test_ret += test_xmlNanoHTTPContentLength();
    test_ret += test_xmlNanoHTTPEncoding();
    test_ret += test_xmlNanoHTTPFetch();
    test_ret += test_xmlNanoHTTPInit();
    test_ret += test_xmlNanoHTTPMimeType();
    test_ret += test_xmlNanoHTTPOpen();
    test_ret += test_xmlNanoHTTPOpenRedir();
    test_ret += test_xmlNanoHTTPRead();
    test_ret += test_xmlNanoHTTPRedir();
    test_ret += test_xmlNanoHTTPReturnCode();
    test_ret += test_xmlNanoHTTPSave();
    test_ret += test_xmlNanoHTTPScanProxy();

    if (test_ret != 0)
	printf("Module nanohttp: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlByteConsumed(void) {
    int test_ret = 0;

    int mem_base;
    long ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        ret_val = xmlByteConsumed(ctxt);
        desret_long(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlByteConsumed",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlClearNodeInfoSeq(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserNodeInfoSeqPtr seq; /* a node info sequence pointer */
    int n_seq;

    for (n_seq = 0;n_seq < gen_nb_xmlParserNodeInfoSeqPtr;n_seq++) {
        mem_base = xmlMemBlocks();
        seq = gen_xmlParserNodeInfoSeqPtr(n_seq, 0);

        xmlClearNodeInfoSeq(seq);
        call_tests++;
        des_xmlParserNodeInfoSeqPtr(n_seq, seq, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlClearNodeInfoSeq",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_seq);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlClearParserCtxt(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        xmlClearParserCtxt(ctxt);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlClearParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCreateDocParserCtxt(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ret_val;
    xmlChar * cur; /* a pointer to an array of xmlChar */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);

        ret_val = xmlCreateDocParserCtxt((const xmlChar *)cur);
        desret_xmlParserCtxtPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCreateDocParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCreatePushParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_PUSH_ENABLED)
    int mem_base;
    xmlParserCtxtPtr ret_val;
    xmlSAXHandlerPtr sax; /* a SAX handler */
    int n_sax;
    void * user_data; /* The user data returned on SAX callbacks */
    int n_user_data;
    char * chunk; /* a pointer to an array of chars */
    int n_chunk;
    int size; /* number of chars in the array */
    int n_size;
    const char * filename; /* an optional file name or URI */
    int n_filename;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
    for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        user_data = gen_userdata(n_user_data, 1);
        chunk = gen_const_char_ptr(n_chunk, 2);
        size = gen_int(n_size, 3);
        filename = gen_fileoutput(n_filename, 4);
        if ((chunk != NULL) &&
            (size > (int) strlen((const char *) chunk) + 1))
            continue;

        ret_val = xmlCreatePushParserCtxt(sax, user_data, (const char *)chunk, size, filename);
        desret_xmlParserCtxtPtr(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_userdata(n_user_data, user_data, 1);
        des_const_char_ptr(n_chunk, (const char *)chunk, 2);
        des_int(n_size, size, 3);
        des_fileoutput(n_filename, filename, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCreatePushParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_user_data);
            printf(" %d", n_chunk);
            printf(" %d", n_size);
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCtxtReadDoc(void) {
    int test_ret = 0;

    int mem_base;
    xmlDocPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlChar * cur; /* a pointer to a zero terminated string */
    int n_cur;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        cur = gen_const_xmlChar_ptr(n_cur, 1);
        URL = gen_filepath(n_URL, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);
        options = gen_parseroptions(n_options, 4);

        ret_val = xmlCtxtReadDoc(ctxt, (const xmlChar *)cur, URL, (const char *)encoding, options);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1);
        des_filepath(n_URL, URL, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        des_parseroptions(n_options, options, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCtxtReadDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCtxtReadFile(void) {
    int test_ret = 0;

    int mem_base;
    xmlDocPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    const char * filename; /* a file or URL */
    int n_filename;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        filename = gen_filepath(n_filename, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        options = gen_parseroptions(n_options, 3);

        ret_val = xmlCtxtReadFile(ctxt, filename, (const char *)encoding, options);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_filepath(n_filename, filename, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_parseroptions(n_options, options, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCtxtReadFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_filename);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCtxtReadMemory(void) {
    int test_ret = 0;

    int mem_base;
    xmlDocPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    char * buffer; /* a pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        buffer = gen_const_char_ptr(n_buffer, 1);
        size = gen_int(n_size, 2);
        URL = gen_filepath(n_URL, 3);
        encoding = gen_const_char_ptr(n_encoding, 4);
        options = gen_parseroptions(n_options, 5);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlCtxtReadMemory(ctxt, (const char *)buffer, size, URL, (const char *)encoding, options);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_char_ptr(n_buffer, (const char *)buffer, 1);
        des_int(n_size, size, 2);
        des_filepath(n_URL, URL, 3);
        des_const_char_ptr(n_encoding, (const char *)encoding, 4);
        des_parseroptions(n_options, options, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCtxtReadMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCtxtReset(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        xmlCtxtReset(ctxt);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCtxtReset",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCtxtResetPush(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    char * chunk; /* a pointer to an array of chars */
    int n_chunk;
    int size; /* number of chars in the array */
    int n_size;
    const char * filename; /* an optional file name or URI */
    int n_filename;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        chunk = gen_const_char_ptr(n_chunk, 1);
        size = gen_int(n_size, 2);
        filename = gen_filepath(n_filename, 3);
        encoding = gen_const_char_ptr(n_encoding, 4);
        if ((chunk != NULL) &&
            (size > (int) strlen((const char *) chunk) + 1))
            continue;

        ret_val = xmlCtxtResetPush(ctxt, (const char *)chunk, size, filename, (const char *)encoding);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_char_ptr(n_chunk, (const char *)chunk, 1);
        des_int(n_size, size, 2);
        des_filepath(n_filename, filename, 3);
        des_const_char_ptr(n_encoding, (const char *)encoding, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCtxtResetPush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_chunk);
            printf(" %d", n_size);
            printf(" %d", n_filename);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCtxtUseOptions(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        options = gen_parseroptions(n_options, 1);

        ret_val = xmlCtxtUseOptions(ctxt, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_parseroptions(n_options, options, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCtxtUseOptions",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetExternalEntityLoader(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlGetFeature(void) {
    int test_ret = 0;

#if defined(LIBXML_LEGACY_ENABLED)
#ifdef LIBXML_LEGACY_ENABLED
    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML/HTML parser context */
    int n_ctxt;
    char * name; /* the feature name */
    int n_name;
    void * result; /* location to store the result */
    int n_result;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) {
    for (n_result = 0;n_result < gen_nb_void_ptr;n_result++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        name = gen_const_char_ptr(n_name, 1);
        result = gen_void_ptr(n_result, 2);

        ret_val = xmlGetFeature(ctxt, (const char *)name, result);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_char_ptr(n_name, (const char *)name, 1);
        des_void_ptr(n_result, result, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetFeature",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_name);
            printf(" %d", n_result);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


#define gen_nb_const_char_ptr_ptr 1
static char ** gen_const_char_ptr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_char_ptr_ptr(int no ATTRIBUTE_UNUSED, const char ** val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlGetFeaturesList(void) {
    int test_ret = 0;

#if defined(LIBXML_LEGACY_ENABLED)
#ifdef LIBXML_LEGACY_ENABLED
    int mem_base;
    int ret_val;
    int * len; /* the length of the features name array (input/output) */
    int n_len;
    char ** result; /* an array of string to be filled with the features name. */
    int n_result;

    for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) {
    for (n_result = 0;n_result < gen_nb_const_char_ptr_ptr;n_result++) {
        mem_base = xmlMemBlocks();
        len = gen_int_ptr(n_len, 0);
        result = gen_const_char_ptr_ptr(n_result, 1);

        ret_val = xmlGetFeaturesList(len, (const char **)result);
        desret_int(ret_val);
        call_tests++;
        des_int_ptr(n_len, len, 0);
        des_const_char_ptr_ptr(n_result, (const char **)result, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetFeaturesList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_len);
            printf(" %d", n_result);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlHasFeature(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlFeature feature; /* the feature to be examined */
    int n_feature;

    for (n_feature = 0;n_feature < gen_nb_xmlFeature;n_feature++) {
        mem_base = xmlMemBlocks();
        feature = gen_xmlFeature(n_feature, 0);

        ret_val = xmlHasFeature(feature);
        desret_int(ret_val);
        call_tests++;
        des_xmlFeature(n_feature, feature, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHasFeature",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_feature);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIOParseDTD(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
#ifdef LIBXML_VALID_ENABLED
    xmlDtdPtr ret_val;
    xmlSAXHandlerPtr sax; /* the SAX handler block or NULL */
    int n_sax;
    xmlParserInputBufferPtr input; /* an Input Buffer */
    int n_input;
    xmlCharEncoding enc; /* the charset encoding if known */
    int n_enc;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        input = gen_xmlParserInputBufferPtr(n_input, 1);
        enc = gen_xmlCharEncoding(n_enc, 2);

        ret_val = xmlIOParseDTD(sax, input, enc);
        input = NULL;
        desret_xmlDtdPtr(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_xmlParserInputBufferPtr(n_input, input, 1);
        des_xmlCharEncoding(n_enc, enc, 2);
        xmlResetLastError();
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlInitNodeInfoSeq(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserNodeInfoSeqPtr seq; /* a node info sequence pointer */
    int n_seq;

    for (n_seq = 0;n_seq < gen_nb_xmlParserNodeInfoSeqPtr;n_seq++) {
        mem_base = xmlMemBlocks();
        seq = gen_xmlParserNodeInfoSeqPtr(n_seq, 0);

        xmlInitNodeInfoSeq(seq);
        call_tests++;
        des_xmlParserNodeInfoSeqPtr(n_seq, seq, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlInitNodeInfoSeq",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_seq);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlInitParser(void) {
    int test_ret = 0;

    int mem_base;

        mem_base = xmlMemBlocks();

        xmlInitParser();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlInitParser",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlInitParserCtxt(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        ret_val = xmlInitParserCtxt(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlInitParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlKeepBlanksDefault(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    int val; /* int 0 or 1 */
    int n_val;

    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_int(n_val, 0);

        ret_val = xmlKeepBlanksDefault(val);
        desret_int(ret_val);
        call_tests++;
        des_int(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlKeepBlanksDefault",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlLineNumbersDefault(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    int val; /* int 0 or 1 */
    int n_val;

    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_int(n_val, 0);

        ret_val = xmlLineNumbersDefault(val);
        desret_int(ret_val);
        call_tests++;
        des_int(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlLineNumbersDefault",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlLoadExternalEntity(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    const char * URL; /* the URL for the entity to load */
    int n_URL;
    char * ID; /* the Public ID for the entity to load */
    int n_ID;
    xmlParserCtxtPtr ctxt; /* the context in which the entity is called or NULL */
    int n_ctxt;

    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_ID = 0;n_ID < gen_nb_const_char_ptr;n_ID++) {
    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        URL = gen_filepath(n_URL, 0);
        ID = gen_const_char_ptr(n_ID, 1);
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 2);

        ret_val = xmlLoadExternalEntity(URL, (const char *)ID, ctxt);
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_filepath(n_URL, URL, 0);
        des_const_char_ptr(n_ID, (const char *)ID, 1);
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlLoadExternalEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf(" %d", n_ID);
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewIOInputStream(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlParserInputBufferPtr input; /* an I/O Input */
    int n_input;
    xmlCharEncoding enc; /* the charset encoding if known */
    int n_enc;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        input = gen_xmlParserInputBufferPtr(n_input, 1);
        enc = gen_xmlCharEncoding(n_enc, 2);

        ret_val = xmlNewIOInputStream(ctxt, input, enc);
        if (ret_val != NULL) input = NULL;
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlParserInputBufferPtr(n_input, input, 1);
        des_xmlCharEncoding(n_enc, enc, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewIOInputStream",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_input);
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewParserCtxt(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ret_val;

        mem_base = xmlMemBlocks();

        ret_val = xmlNewParserCtxt();
        desret_xmlParserCtxtPtr(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlNodePtr_ptr 1
static xmlNodePtr * gen_xmlNodePtr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlNodePtr_ptr(int no ATTRIBUTE_UNUSED, xmlNodePtr * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlParseBalancedChunkMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the document the chunk pertains to */
    int n_doc;
    xmlSAXHandlerPtr sax; /* the SAX handler block (possibly NULL) */
    int n_sax;
    void * user_data; /* The user data returned on SAX callbacks (possibly NULL) */
    int n_user_data;
    int depth; /* Used for loop detection, use 0 */
    int n_depth;
    xmlChar * string; /* the input string in UTF8 or ISO-Latin (zero terminated) */
    int n_string;
    xmlNodePtr * lst; /* the return value for the set of parsed nodes */
    int n_lst;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
    for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) {
    for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        sax = gen_xmlSAXHandlerPtr(n_sax, 1);
        user_data = gen_userdata(n_user_data, 2);
        depth = gen_int(n_depth, 3);
        string = gen_const_xmlChar_ptr(n_string, 4);
        lst = gen_xmlNodePtr_ptr(n_lst, 5);
        
#ifdef LIBXML_SAX1_ENABLED
        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
#endif


        ret_val = xmlParseBalancedChunkMemory(doc, sax, user_data, depth, (const xmlChar *)string, lst);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlSAXHandlerPtr(n_sax, sax, 1);
        des_userdata(n_user_data, user_data, 2);
        des_int(n_depth, depth, 3);
        des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 4);
        des_xmlNodePtr_ptr(n_lst, lst, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseBalancedChunkMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_sax);
            printf(" %d", n_user_data);
            printf(" %d", n_depth);
            printf(" %d", n_string);
            printf(" %d", n_lst);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlParseBalancedChunkMemoryRecover(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the document the chunk pertains to */
    int n_doc;
    xmlSAXHandlerPtr sax; /* the SAX handler block (possibly NULL) */
    int n_sax;
    void * user_data; /* The user data returned on SAX callbacks (possibly NULL) */
    int n_user_data;
    int depth; /* Used for loop detection, use 0 */
    int n_depth;
    xmlChar * string; /* the input string in UTF8 or ISO-Latin (zero terminated) */
    int n_string;
    xmlNodePtr * lst; /* the return value for the set of parsed nodes */
    int n_lst;
    int recover; /* return nodes even if the data is broken (use 0) */
    int n_recover;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
    for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) {
    for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) {
    for (n_recover = 0;n_recover < gen_nb_int;n_recover++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        sax = gen_xmlSAXHandlerPtr(n_sax, 1);
        user_data = gen_userdata(n_user_data, 2);
        depth = gen_int(n_depth, 3);
        string = gen_const_xmlChar_ptr(n_string, 4);
        lst = gen_xmlNodePtr_ptr(n_lst, 5);
        recover = gen_int(n_recover, 6);
        
#ifdef LIBXML_SAX1_ENABLED
        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
#endif


        ret_val = xmlParseBalancedChunkMemoryRecover(doc, sax, user_data, depth, (const xmlChar *)string, lst, recover);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlSAXHandlerPtr(n_sax, sax, 1);
        des_userdata(n_user_data, user_data, 2);
        des_int(n_depth, depth, 3);
        des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 4);
        des_xmlNodePtr_ptr(n_lst, lst, 5);
        des_int(n_recover, recover, 6);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseBalancedChunkMemoryRecover",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_sax);
            printf(" %d", n_user_data);
            printf(" %d", n_depth);
            printf(" %d", n_string);
            printf(" %d", n_lst);
            printf(" %d", n_recover);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlParseChunk(void) {
    int test_ret = 0;

#if defined(LIBXML_PUSH_ENABLED)
    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    char * chunk; /* an char array */
    int n_chunk;
    int size; /* the size in byte of the chunk */
    int n_size;
    int terminate; /* last chunk indicator */
    int n_terminate;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_terminate = 0;n_terminate < gen_nb_int;n_terminate++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        chunk = gen_const_char_ptr(n_chunk, 1);
        size = gen_int(n_size, 2);
        terminate = gen_int(n_terminate, 3);
        if ((chunk != NULL) &&
            (size > (int) strlen((const char *) chunk) + 1))
            continue;

        ret_val = xmlParseChunk(ctxt, (const char *)chunk, size, terminate);
        if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_char_ptr(n_chunk, (const char *)chunk, 1);
        des_int(n_size, size, 2);
        des_int(n_terminate, terminate, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseChunk",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_chunk);
            printf(" %d", n_size);
            printf(" %d", n_terminate);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlParseCtxtExternalEntity(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctx; /* the existing parsing context */
    int n_ctx;
    xmlChar * URL; /* the URL for the entity to load */
    int n_URL;
    xmlChar * ID; /* the System ID for the entity to load */
    int n_ID;
    xmlNodePtr * lst; /* the return value for the set of parsed nodes */
    int n_lst;

    for (n_ctx = 0;n_ctx < gen_nb_xmlParserCtxtPtr;n_ctx++) {
    for (n_URL = 0;n_URL < gen_nb_const_xmlChar_ptr;n_URL++) {
    for (n_ID = 0;n_ID < gen_nb_const_xmlChar_ptr;n_ID++) {
    for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) {
        mem_base = xmlMemBlocks();
        ctx = gen_xmlParserCtxtPtr(n_ctx, 0);
        URL = gen_const_xmlChar_ptr(n_URL, 1);
        ID = gen_const_xmlChar_ptr(n_ID, 2);
        lst = gen_xmlNodePtr_ptr(n_lst, 3);

        ret_val = xmlParseCtxtExternalEntity(ctx, (const xmlChar *)URL, (const xmlChar *)ID, lst);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctx, ctx, 0);
        des_const_xmlChar_ptr(n_URL, (const xmlChar *)URL, 1);
        des_const_xmlChar_ptr(n_ID, (const xmlChar *)ID, 2);
        des_xmlNodePtr_ptr(n_lst, lst, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseCtxtExternalEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_URL);
            printf(" %d", n_ID);
            printf(" %d", n_lst);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParseDTD(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
#ifdef LIBXML_VALID_ENABLED
    int mem_base;
    xmlDtdPtr ret_val;
    xmlChar * ExternalID; /* a NAME* containing the External ID of the DTD */
    int n_ExternalID;
    xmlChar * SystemID; /* a NAME* containing the URL to the DTD */
    int n_SystemID;

    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
        mem_base = xmlMemBlocks();
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 0);
        SystemID = gen_const_xmlChar_ptr(n_SystemID, 1);

        ret_val = xmlParseDTD((const xmlChar *)ExternalID, (const xmlChar *)SystemID);
        desret_xmlDtdPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 0);
        des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseDTD",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ExternalID);
            printf(" %d", n_SystemID);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlParseDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    xmlChar * cur; /* a pointer to an array of xmlChar */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);

        ret_val = xmlParseDoc((const xmlChar *)cur);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlParseDocument(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        ret_val = xmlParseDocument(ctxt);
        if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseDocument",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParseEntity(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    const char * filename; /* the filename */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlParseEntity(filename);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlParseExtParsedEnt(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        ret_val = xmlParseExtParsedEnt(ctxt);
        if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseExtParsedEnt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParseExternalEntity(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the document the chunk pertains to */
    int n_doc;
    xmlSAXHandlerPtr sax; /* the SAX handler block (possibly NULL) */
    int n_sax;
    void * user_data; /* The user data returned on SAX callbacks (possibly NULL) */
    int n_user_data;
    int depth; /* Used for loop detection, use 0 */
    int n_depth;
    xmlChar * URL; /* the URL for the entity to load */
    int n_URL;
    xmlChar * ID; /* the System ID for the entity to load */
    int n_ID;
    xmlNodePtr * lst; /* the return value for the set of parsed nodes */
    int n_lst;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
    for (n_URL = 0;n_URL < gen_nb_const_xmlChar_ptr;n_URL++) {
    for (n_ID = 0;n_ID < gen_nb_const_xmlChar_ptr;n_ID++) {
    for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        sax = gen_xmlSAXHandlerPtr(n_sax, 1);
        user_data = gen_userdata(n_user_data, 2);
        depth = gen_int(n_depth, 3);
        URL = gen_const_xmlChar_ptr(n_URL, 4);
        ID = gen_const_xmlChar_ptr(n_ID, 5);
        lst = gen_xmlNodePtr_ptr(n_lst, 6);

        ret_val = xmlParseExternalEntity(doc, sax, user_data, depth, (const xmlChar *)URL, (const xmlChar *)ID, lst);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlSAXHandlerPtr(n_sax, sax, 1);
        des_userdata(n_user_data, user_data, 2);
        des_int(n_depth, depth, 3);
        des_const_xmlChar_ptr(n_URL, (const xmlChar *)URL, 4);
        des_const_xmlChar_ptr(n_ID, (const xmlChar *)ID, 5);
        des_xmlNodePtr_ptr(n_lst, lst, 6);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseExternalEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_sax);
            printf(" %d", n_user_data);
            printf(" %d", n_depth);
            printf(" %d", n_URL);
            printf(" %d", n_ID);
            printf(" %d", n_lst);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlParseFile(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    const char * filename; /* the filename */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlParseFile(filename);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlParseInNodeContext(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserErrors ret_val;
    xmlNodePtr node; /* the context node */
    int n_node;
    char * data; /* the input string */
    int n_data;
    int datalen; /* the input string length in bytes */
    int n_datalen;
    int options; /* a combination of xmlParserOption */
    int n_options;
    xmlNodePtr * lst; /* the return value for the set of parsed nodes */
    int n_lst;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_data = 0;n_data < gen_nb_const_char_ptr;n_data++) {
    for (n_datalen = 0;n_datalen < gen_nb_int;n_datalen++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
    for (n_lst = 0;n_lst < gen_nb_xmlNodePtr_ptr;n_lst++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        data = gen_const_char_ptr(n_data, 1);
        datalen = gen_int(n_datalen, 2);
        options = gen_parseroptions(n_options, 3);
        lst = gen_xmlNodePtr_ptr(n_lst, 4);

        ret_val = xmlParseInNodeContext(node, (const char *)data, datalen, options, lst);
        desret_xmlParserErrors(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_const_char_ptr(n_data, (const char *)data, 1);
        des_int(n_datalen, datalen, 2);
        des_parseroptions(n_options, options, 3);
        des_xmlNodePtr_ptr(n_lst, lst, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseInNodeContext",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_data);
            printf(" %d", n_datalen);
            printf(" %d", n_options);
            printf(" %d", n_lst);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParseMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    char * buffer; /* an pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;

    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
        mem_base = xmlMemBlocks();
        buffer = gen_const_char_ptr(n_buffer, 0);
        size = gen_int(n_size, 1);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlParseMemory((const char *)buffer, size);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_buffer, (const char *)buffer, 0);
        des_int(n_size, size, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


#define gen_nb_const_xmlParserNodeInfoPtr 1
static xmlParserNodeInfoPtr gen_const_xmlParserNodeInfoPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlParserNodeInfoPtr(int no ATTRIBUTE_UNUSED, const xmlParserNodeInfoPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlParserAddNodeInfo(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlParserNodeInfoPtr info; /* a node info sequence pointer */
    int n_info;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_info = 0;n_info < gen_nb_const_xmlParserNodeInfoPtr;n_info++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        info = gen_const_xmlParserNodeInfoPtr(n_info, 1);

        xmlParserAddNodeInfo(ctxt, (const xmlParserNodeInfoPtr)info);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlParserNodeInfoPtr(n_info, (const xmlParserNodeInfoPtr)info, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserAddNodeInfo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_info);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_const_xmlParserCtxtPtr 1
static xmlParserCtxtPtr gen_const_xmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, const xmlParserCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

#define gen_nb_const_xmlNodePtr 1
static xmlNodePtr gen_const_xmlNodePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlNodePtr(int no ATTRIBUTE_UNUSED, const xmlNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlParserFindNodeInfo(void) {
    int test_ret = 0;

    int mem_base;
    const xmlParserNodeInfo * ret_val;
    xmlParserCtxtPtr ctx; /* an XML parser context */
    int n_ctx;
    xmlNodePtr node; /* an XML node within the tree */
    int n_node;

    for (n_ctx = 0;n_ctx < gen_nb_const_xmlParserCtxtPtr;n_ctx++) {
    for (n_node = 0;n_node < gen_nb_const_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        ctx = gen_const_xmlParserCtxtPtr(n_ctx, 0);
        node = gen_const_xmlNodePtr(n_node, 1);

        ret_val = xmlParserFindNodeInfo((const xmlParserCtxtPtr)ctx, (const xmlNodePtr)node);
        desret_const_xmlParserNodeInfo_ptr(ret_val);
        call_tests++;
        des_const_xmlParserCtxtPtr(n_ctx, (const xmlParserCtxtPtr)ctx, 0);
        des_const_xmlNodePtr(n_node, (const xmlNodePtr)node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserFindNodeInfo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_const_xmlParserNodeInfoSeqPtr 1
static xmlParserNodeInfoSeqPtr gen_const_xmlParserNodeInfoSeqPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlParserNodeInfoSeqPtr(int no ATTRIBUTE_UNUSED, const xmlParserNodeInfoSeqPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlParserFindNodeInfoIndex(void) {
    int test_ret = 0;

    int mem_base;
    unsigned long ret_val;
    xmlParserNodeInfoSeqPtr seq; /* a node info sequence pointer */
    int n_seq;
    xmlNodePtr node; /* an XML node pointer */
    int n_node;

    for (n_seq = 0;n_seq < gen_nb_const_xmlParserNodeInfoSeqPtr;n_seq++) {
    for (n_node = 0;n_node < gen_nb_const_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        seq = gen_const_xmlParserNodeInfoSeqPtr(n_seq, 0);
        node = gen_const_xmlNodePtr(n_node, 1);

        ret_val = xmlParserFindNodeInfoIndex((const xmlParserNodeInfoSeqPtr)seq, (const xmlNodePtr)node);
        desret_unsigned_long(ret_val);
        call_tests++;
        des_const_xmlParserNodeInfoSeqPtr(n_seq, (const xmlParserNodeInfoSeqPtr)seq, 0);
        des_const_xmlNodePtr(n_node, (const xmlNodePtr)node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserFindNodeInfoIndex",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_seq);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlParserInputPtr 1
static xmlParserInputPtr gen_xmlParserInputPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlParserInputPtr(int no ATTRIBUTE_UNUSED, xmlParserInputPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlParserInputGrow(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserInputPtr in; /* an XML parser input */
    int n_in;
    int len; /* an indicative size for the lookahead */
    int n_len;

    for (n_in = 0;n_in < gen_nb_xmlParserInputPtr;n_in++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        in = gen_xmlParserInputPtr(n_in, 0);
        len = gen_int(n_len, 1);

        ret_val = xmlParserInputGrow(in, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserInputPtr(n_in, in, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputGrow",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_in);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserInputRead(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserInputPtr in; /* an XML parser input */
    int n_in;
    int len; /* an indicative size for the lookahead */
    int n_len;

    for (n_in = 0;n_in < gen_nb_xmlParserInputPtr;n_in++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        in = gen_xmlParserInputPtr(n_in, 0);
        len = gen_int(n_len, 1);

        ret_val = xmlParserInputRead(in, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserInputPtr(n_in, in, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputRead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_in);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlPedanticParserDefault(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    int val; /* int 0 or 1 */
    int n_val;

    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_int(n_val, 0);

        ret_val = xmlPedanticParserDefault(val);
        desret_int(ret_val);
        call_tests++;
        des_int(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPedanticParserDefault",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlReadDoc(void) {
    int test_ret = 0;

    int mem_base;
    xmlDocPtr ret_val;
    xmlChar * cur; /* a pointer to a zero terminated string */
    int n_cur;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);
        URL = gen_filepath(n_URL, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        options = gen_parseroptions(n_options, 3);

        ret_val = xmlReadDoc((const xmlChar *)cur, URL, (const char *)encoding, options);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        des_filepath(n_URL, URL, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_parseroptions(n_options, options, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReadDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlReadFile(void) {
    int test_ret = 0;

    int mem_base;
    xmlDocPtr ret_val;
    const char * filename; /* a file or URL */
    int n_filename;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);
        encoding = gen_const_char_ptr(n_encoding, 1);
        options = gen_parseroptions(n_options, 2);

        ret_val = xmlReadFile(filename, (const char *)encoding, options);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        des_const_char_ptr(n_encoding, (const char *)encoding, 1);
        des_parseroptions(n_options, options, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReadFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlReadMemory(void) {
    int test_ret = 0;

    int mem_base;
    xmlDocPtr ret_val;
    char * buffer; /* a pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        buffer = gen_const_char_ptr(n_buffer, 0);
        size = gen_int(n_size, 1);
        URL = gen_filepath(n_URL, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);
        options = gen_parseroptions(n_options, 4);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlReadMemory((const char *)buffer, size, URL, (const char *)encoding, options);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_buffer, (const char *)buffer, 0);
        des_int(n_size, size, 1);
        des_filepath(n_URL, URL, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        des_parseroptions(n_options, options, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReadMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlRecoverDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    xmlChar * cur; /* a pointer to an array of xmlChar */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);

        ret_val = xmlRecoverDoc((const xmlChar *)cur);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRecoverDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlRecoverFile(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    const char * filename; /* the filename */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlRecoverFile(filename);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRecoverFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlRecoverMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    char * buffer; /* an pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;

    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
        mem_base = xmlMemBlocks();
        buffer = gen_const_char_ptr(n_buffer, 0);
        size = gen_int(n_size, 1);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlRecoverMemory((const char *)buffer, size);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_buffer, (const char *)buffer, 0);
        des_int(n_size, size, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRecoverMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXParseDTD(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDtdPtr ret_val;
    xmlSAXHandlerPtr sax; /* the SAX handler block */
    int n_sax;
    xmlChar * ExternalID; /* a NAME* containing the External ID of the DTD */
    int n_ExternalID;
    xmlChar * SystemID; /* a NAME* containing the URL to the DTD */
    int n_SystemID;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 1);
        SystemID = gen_const_xmlChar_ptr(n_SystemID, 2);

        ret_val = xmlSAXParseDTD(sax, (const xmlChar *)ExternalID, (const xmlChar *)SystemID);
        desret_xmlDtdPtr(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 1);
        des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXParseDTD",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_ExternalID);
            printf(" %d", n_SystemID);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXParseDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    xmlSAXHandlerPtr sax; /* the SAX handler block */
    int n_sax;
    xmlChar * cur; /* a pointer to an array of xmlChar */
    int n_cur;
    int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */
    int n_recovery;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        cur = gen_const_xmlChar_ptr(n_cur, 1);
        recovery = gen_int(n_recovery, 2);

        ret_val = xmlSAXParseDoc(sax, (const xmlChar *)cur, recovery);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1);
        des_int(n_recovery, recovery, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXParseDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_cur);
            printf(" %d", n_recovery);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXParseEntity(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    xmlSAXHandlerPtr sax; /* the SAX handler block */
    int n_sax;
    const char * filename; /* the filename */
    int n_filename;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        filename = gen_filepath(n_filename, 1);

        ret_val = xmlSAXParseEntity(sax, filename);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_filepath(n_filename, filename, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXParseEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXParseFile(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    xmlSAXHandlerPtr sax; /* the SAX handler block */
    int n_sax;
    const char * filename; /* the filename */
    int n_filename;
    int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */
    int n_recovery;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        filename = gen_filepath(n_filename, 1);
        recovery = gen_int(n_recovery, 2);

        ret_val = xmlSAXParseFile(sax, filename, recovery);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_filepath(n_filename, filename, 1);
        des_int(n_recovery, recovery, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXParseFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_filename);
            printf(" %d", n_recovery);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXParseFileWithData(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    xmlSAXHandlerPtr sax; /* the SAX handler block */
    int n_sax;
    const char * filename; /* the filename */
    int n_filename;
    int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */
    int n_recovery;
    void * data; /* the userdata */
    int n_data;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        filename = gen_filepath(n_filename, 1);
        recovery = gen_int(n_recovery, 2);
        data = gen_userdata(n_data, 3);

        ret_val = xmlSAXParseFileWithData(sax, filename, recovery, data);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_filepath(n_filename, filename, 1);
        des_int(n_recovery, recovery, 2);
        des_userdata(n_data, data, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXParseFileWithData",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_filename);
            printf(" %d", n_recovery);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXParseMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    xmlSAXHandlerPtr sax; /* the SAX handler block */
    int n_sax;
    char * buffer; /* an pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;
    int recovery; /* work in recovery mode, i.e. tries to read not Well Formed documents */
    int n_recovery;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        buffer = gen_const_char_ptr(n_buffer, 1);
        size = gen_int(n_size, 2);
        recovery = gen_int(n_recovery, 3);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlSAXParseMemory(sax, (const char *)buffer, size, recovery);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_const_char_ptr(n_buffer, (const char *)buffer, 1);
        des_int(n_size, size, 2);
        des_int(n_recovery, recovery, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXParseMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf(" %d", n_recovery);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXParseMemoryWithData(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlDocPtr ret_val;
    xmlSAXHandlerPtr sax; /* the SAX handler block */
    int n_sax;
    char * buffer; /* an pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;
    int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */
    int n_recovery;
    void * data; /* the userdata */
    int n_data;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        buffer = gen_const_char_ptr(n_buffer, 1);
        size = gen_int(n_size, 2);
        recovery = gen_int(n_recovery, 3);
        data = gen_userdata(n_data, 4);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlSAXParseMemoryWithData(sax, (const char *)buffer, size, recovery, data);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_const_char_ptr(n_buffer, (const char *)buffer, 1);
        des_int(n_size, size, 2);
        des_int(n_recovery, recovery, 3);
        des_userdata(n_data, data, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXParseMemoryWithData",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf(" %d", n_recovery);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXUserParseFile(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    int ret_val;
    xmlSAXHandlerPtr sax; /* a SAX handler */
    int n_sax;
    void * user_data; /* The user data returned on SAX callbacks */
    int n_user_data;
    const char * filename; /* a file name */
    int n_filename;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        user_data = gen_userdata(n_user_data, 1);
        filename = gen_filepath(n_filename, 2);
        
#ifdef LIBXML_SAX1_ENABLED
        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
#endif


        ret_val = xmlSAXUserParseFile(sax, user_data, filename);
        desret_int(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_userdata(n_user_data, user_data, 1);
        des_filepath(n_filename, filename, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXUserParseFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_user_data);
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSAXUserParseMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    int ret_val;
    xmlSAXHandlerPtr sax; /* a SAX handler */
    int n_sax;
    void * user_data; /* The user data returned on SAX callbacks */
    int n_user_data;
    char * buffer; /* an in-memory XML document input */
    int n_buffer;
    int size; /* the length of the XML document in bytes */
    int n_size;

    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
        mem_base = xmlMemBlocks();
        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
        user_data = gen_userdata(n_user_data, 1);
        buffer = gen_const_char_ptr(n_buffer, 2);
        size = gen_int(n_size, 3);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;
        
#ifdef LIBXML_SAX1_ENABLED
        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
#endif


        ret_val = xmlSAXUserParseMemory(sax, user_data, (const char *)buffer, size);
        desret_int(ret_val);
        call_tests++;
        des_xmlSAXHandlerPtr(n_sax, sax, 0);
        des_userdata(n_user_data, user_data, 1);
        des_const_char_ptr(n_buffer, (const char *)buffer, 2);
        des_int(n_size, size, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSAXUserParseMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_sax);
            printf(" %d", n_user_data);
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSetExternalEntityLoader(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSetFeature(void) {
    int test_ret = 0;

#if defined(LIBXML_LEGACY_ENABLED)
#ifdef LIBXML_LEGACY_ENABLED
    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML/HTML parser context */
    int n_ctxt;
    char * name; /* the feature name */
    int n_name;
    void * value; /* pointer to the location of the new value */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) {
    for (n_value = 0;n_value < gen_nb_void_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        name = gen_const_char_ptr(n_name, 1);
        value = gen_void_ptr(n_value, 2);

        ret_val = xmlSetFeature(ctxt, (const char *)name, value);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_char_ptr(n_name, (const char *)name, 1);
        des_void_ptr(n_value, value, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSetFeature",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlSetupParserForBuffer(void) {
    int test_ret = 0;

#if defined(LIBXML_SAX1_ENABLED)
#ifdef LIBXML_SAX1_ENABLED
    int mem_base;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlChar * buffer; /* a xmlChar * buffer */
    int n_buffer;
    const char * filename; /* a file name */
    int n_filename;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_buffer = 0;n_buffer < gen_nb_const_xmlChar_ptr;n_buffer++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        buffer = gen_const_xmlChar_ptr(n_buffer, 1);
        filename = gen_filepath(n_filename, 2);

        xmlSetupParserForBuffer(ctxt, (const xmlChar *)buffer, filename);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_buffer, (const xmlChar *)buffer, 1);
        des_filepath(n_filename, filename, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSetupParserForBuffer",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_buffer);
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlStopParser(void) {
    int test_ret = 0;

#ifdef LIBXML_PUSH_ENABLED
    int mem_base;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        xmlStopParser(ctxt);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStopParser",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSubstituteEntitiesDefault(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    int val; /* int 0 or 1 */
    int n_val;

    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_int(n_val, 0);

        ret_val = xmlSubstituteEntitiesDefault(val);
        desret_int(ret_val);
        call_tests++;
        des_int(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSubstituteEntitiesDefault",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}

static int
test_parser(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing parser : 61 of 70 functions ...\n");
    test_ret += test_xmlByteConsumed();
    test_ret += test_xmlClearNodeInfoSeq();
    test_ret += test_xmlClearParserCtxt();
    test_ret += test_xmlCreateDocParserCtxt();
    test_ret += test_xmlCreatePushParserCtxt();
    test_ret += test_xmlCtxtReadDoc();
    test_ret += test_xmlCtxtReadFile();
    test_ret += test_xmlCtxtReadMemory();
    test_ret += test_xmlCtxtReset();
    test_ret += test_xmlCtxtResetPush();
    test_ret += test_xmlCtxtUseOptions();
    test_ret += test_xmlGetExternalEntityLoader();
    test_ret += test_xmlGetFeature();
    test_ret += test_xmlGetFeaturesList();
    test_ret += test_xmlHasFeature();
    test_ret += test_xmlIOParseDTD();
    test_ret += test_xmlInitNodeInfoSeq();
    test_ret += test_xmlInitParser();
    test_ret += test_xmlInitParserCtxt();
    test_ret += test_xmlKeepBlanksDefault();
    test_ret += test_xmlLineNumbersDefault();
    test_ret += test_xmlLoadExternalEntity();
    test_ret += test_xmlNewIOInputStream();
    test_ret += test_xmlNewParserCtxt();
    test_ret += test_xmlParseBalancedChunkMemory();
    test_ret += test_xmlParseBalancedChunkMemoryRecover();
    test_ret += test_xmlParseChunk();
    test_ret += test_xmlParseCtxtExternalEntity();
    test_ret += test_xmlParseDTD();
    test_ret += test_xmlParseDoc();
    test_ret += test_xmlParseDocument();
    test_ret += test_xmlParseEntity();
    test_ret += test_xmlParseExtParsedEnt();
    test_ret += test_xmlParseExternalEntity();
    test_ret += test_xmlParseFile();
    test_ret += test_xmlParseInNodeContext();
    test_ret += test_xmlParseMemory();
    test_ret += test_xmlParserAddNodeInfo();
    test_ret += test_xmlParserFindNodeInfo();
    test_ret += test_xmlParserFindNodeInfoIndex();
    test_ret += test_xmlParserInputGrow();
    test_ret += test_xmlParserInputRead();
    test_ret += test_xmlPedanticParserDefault();
    test_ret += test_xmlReadDoc();
    test_ret += test_xmlReadFile();
    test_ret += test_xmlReadMemory();
    test_ret += test_xmlRecoverDoc();
    test_ret += test_xmlRecoverFile();
    test_ret += test_xmlRecoverMemory();
    test_ret += test_xmlSAXParseDTD();
    test_ret += test_xmlSAXParseDoc();
    test_ret += test_xmlSAXParseEntity();
    test_ret += test_xmlSAXParseFile();
    test_ret += test_xmlSAXParseFileWithData();
    test_ret += test_xmlSAXParseMemory();
    test_ret += test_xmlSAXParseMemoryWithData();
    test_ret += test_xmlSAXUserParseFile();
    test_ret += test_xmlSAXUserParseMemory();
    test_ret += test_xmlSetExternalEntityLoader();
    test_ret += test_xmlSetFeature();
    test_ret += test_xmlSetupParserForBuffer();
    test_ret += test_xmlStopParser();
    test_ret += test_xmlSubstituteEntitiesDefault();

    if (test_ret != 0)
	printf("Module parser: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_htmlCreateFileParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;
    htmlParserCtxtPtr ret_val;
    const char * filename; /* the filename */
    int n_filename;
    char * encoding; /* a free form C string describing the HTML document encoding, or NULL */
    int n_encoding;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);
        encoding = gen_const_char_ptr(n_encoding, 1);

        ret_val = htmlCreateFileParserCtxt(filename, (const char *)encoding);
        desret_htmlParserCtxtPtr(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        des_const_char_ptr(n_encoding, (const char *)encoding, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlCreateFileParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_htmlInitAutoClose(void) {
    int test_ret = 0;

#if defined(LIBXML_HTML_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        htmlInitAutoClose();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in htmlInitAutoClose",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_inputPop(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        ret_val = inputPop(ctxt);
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in inputPop",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_inputPush(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlParserInputPtr value; /* the parser input */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_value = 0;n_value < gen_nb_xmlParserInputPtr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        value = gen_xmlParserInputPtr(n_value, 1);

        ret_val = inputPush(ctxt, value);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlParserInputPtr(n_value, value, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in inputPush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_namePop(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        ret_val = namePop(ctxt);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in namePop",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_namePush(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlChar * value; /* the element name */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);

        ret_val = namePush(ctxt, (const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in namePush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_nodePop(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        ret_val = nodePop(ctxt);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in nodePop",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_nodePush(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlNodePtr value; /* the element node */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_value = 0;n_value < gen_nb_xmlNodePtr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        value = gen_xmlNodePtr(n_value, 1);

        ret_val = nodePush(ctxt, value);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_value, value, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in nodePush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCheckLanguageID(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * lang; /* pointer to the string value */
    int n_lang;

    for (n_lang = 0;n_lang < gen_nb_const_xmlChar_ptr;n_lang++) {
        mem_base = xmlMemBlocks();
        lang = gen_const_xmlChar_ptr(n_lang, 0);

        ret_val = xmlCheckLanguageID((const xmlChar *)lang);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_lang, (const xmlChar *)lang, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCheckLanguageID",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_lang);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCopyChar(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    int len; /* Ignored, compatibility */
    int n_len;
    xmlChar * out; /* pointer to an array of xmlChar */
    int n_out;
    int val; /* the char value */
    int n_val;

    for (n_len = 0;n_len < gen_nb_int;n_len++) {
    for (n_out = 0;n_out < gen_nb_xmlChar_ptr;n_out++) {
    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        len = gen_int(n_len, 0);
        out = gen_xmlChar_ptr(n_out, 1);
        val = gen_int(n_val, 2);

        ret_val = xmlCopyChar(len, out, val);
        desret_int(ret_val);
        call_tests++;
        des_int(n_len, len, 0);
        des_xmlChar_ptr(n_out, out, 1);
        des_int(n_val, val, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_len);
            printf(" %d", n_out);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCopyCharMultiByte(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * out; /* pointer to an array of xmlChar */
    int n_out;
    int val; /* the char value */
    int n_val;

    for (n_out = 0;n_out < gen_nb_xmlChar_ptr;n_out++) {
    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        out = gen_xmlChar_ptr(n_out, 0);
        val = gen_int(n_val, 1);

        ret_val = xmlCopyCharMultiByte(out, val);
        desret_int(ret_val);
        call_tests++;
        des_xmlChar_ptr(n_out, out, 0);
        des_int(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyCharMultiByte",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCreateEntityParserCtxt(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ret_val;
    xmlChar * URL; /* the entity URL */
    int n_URL;
    xmlChar * ID; /* the entity PUBLIC ID */
    int n_ID;
    xmlChar * base; /* a possible base for the target URI */
    int n_base;

    for (n_URL = 0;n_URL < gen_nb_const_xmlChar_ptr;n_URL++) {
    for (n_ID = 0;n_ID < gen_nb_const_xmlChar_ptr;n_ID++) {
    for (n_base = 0;n_base < gen_nb_const_xmlChar_ptr;n_base++) {
        mem_base = xmlMemBlocks();
        URL = gen_const_xmlChar_ptr(n_URL, 0);
        ID = gen_const_xmlChar_ptr(n_ID, 1);
        base = gen_const_xmlChar_ptr(n_base, 2);

        ret_val = xmlCreateEntityParserCtxt((const xmlChar *)URL, (const xmlChar *)ID, (const xmlChar *)base);
        desret_xmlParserCtxtPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_URL, (const xmlChar *)URL, 0);
        des_const_xmlChar_ptr(n_ID, (const xmlChar *)ID, 1);
        des_const_xmlChar_ptr(n_base, (const xmlChar *)base, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCreateEntityParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf(" %d", n_ID);
            printf(" %d", n_base);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCreateFileParserCtxt(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ret_val;
    const char * filename; /* the filename */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);

        ret_val = xmlCreateFileParserCtxt(filename);
        desret_xmlParserCtxtPtr(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCreateFileParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCreateMemoryParserCtxt(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ret_val;
    char * buffer; /* a pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;

    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
        mem_base = xmlMemBlocks();
        buffer = gen_const_char_ptr(n_buffer, 0);
        size = gen_int(n_size, 1);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlCreateMemoryParserCtxt((const char *)buffer, size);
        desret_xmlParserCtxtPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_buffer, (const char *)buffer, 0);
        des_int(n_size, size, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCreateMemoryParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCreateURLParserCtxt(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ret_val;
    const char * filename; /* the filename or URL */
    int n_filename;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);
        options = gen_int(n_options, 1);

        ret_val = xmlCreateURLParserCtxt(filename, options);
        desret_xmlParserCtxtPtr(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        des_int(n_options, options, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCreateURLParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCurrentChar(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* the XML parser context */
    int n_ctxt;
    int * len; /* pointer to the length of the char read */
    int n_len;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        len = gen_int_ptr(n_len, 1);

        ret_val = xmlCurrentChar(ctxt, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_int_ptr(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCurrentChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlErrMemory(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    char * extra; /* extra information */
    int n_extra;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_extra = 0;n_extra < gen_nb_const_char_ptr;n_extra++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        extra = gen_const_char_ptr(n_extra, 1);

        xmlErrMemory(ctxt, (const char *)extra);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_char_ptr(n_extra, (const char *)extra, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlErrMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_extra);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsLetter(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    int c; /* an unicode character (int) */
    int n_c;

    for (n_c = 0;n_c < gen_nb_int;n_c++) {
        mem_base = xmlMemBlocks();
        c = gen_int(n_c, 0);

        ret_val = xmlIsLetter(c);
        desret_int(ret_val);
        call_tests++;
        des_int(n_c, c, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsLetter",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_c);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewEntityInputStream(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlEntityPtr entity; /* an Entity pointer */
    int n_entity;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_entity = 0;n_entity < gen_nb_xmlEntityPtr;n_entity++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        entity = gen_xmlEntityPtr(n_entity, 1);

        ret_val = xmlNewEntityInputStream(ctxt, entity);
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlEntityPtr(n_entity, entity, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewEntityInputStream",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_entity);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewInputFromFile(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    const char * filename; /* the filename to use as entity */
    int n_filename;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        filename = gen_filepath(n_filename, 1);

        ret_val = xmlNewInputFromFile(ctxt, filename);
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_filepath(n_filename, filename, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewInputFromFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewInputStream(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        ret_val = xmlNewInputStream(ctxt);
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewInputStream",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewStringInputStream(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlChar * buffer; /* an memory buffer */
    int n_buffer;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_buffer = 0;n_buffer < gen_nb_const_xmlChar_ptr;n_buffer++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        buffer = gen_const_xmlChar_ptr(n_buffer, 1);

        ret_val = xmlNewStringInputStream(ctxt, (const xmlChar *)buffer);
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_buffer, (const xmlChar *)buffer, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewStringInputStream",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_buffer);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNextChar(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserCtxtPtr ctxt; /* the XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        xmlNextChar(ctxt);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNextChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserInputShrink(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr in; /* an XML parser input */
    int n_in;

    for (n_in = 0;n_in < gen_nb_xmlParserInputPtr;n_in++) {
        mem_base = xmlMemBlocks();
        in = gen_xmlParserInputPtr(n_in, 0);

        xmlParserInputShrink(in);
        call_tests++;
        des_xmlParserInputPtr(n_in, in, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputShrink",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_in);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlPopInput(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);

        ret_val = xmlPopInput(ctxt);
        desret_xmlChar(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPopInput",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlPushInput(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlParserInputPtr input; /* an XML parser input fragment (entity, XML fragment ...). */
    int n_input;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_input = 0;n_input < gen_nb_xmlParserInputPtr;n_input++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        input = gen_xmlParserInputPtr(n_input, 1);

        ret_val = xmlPushInput(ctxt, input);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlParserInputPtr(n_input, input, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPushInput",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_input);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSetEntityReferenceFunc(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSplitQName(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlChar * name; /* an XML parser context */
    int n_name;
    xmlChar ** prefix; /* a xmlChar ** */
    int n_prefix;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_prefix = 0;n_prefix < gen_nb_xmlChar_ptr_ptr;n_prefix++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        prefix = gen_xmlChar_ptr_ptr(n_prefix, 2);

        ret_val = xmlSplitQName(ctxt, (const xmlChar *)name, prefix);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_xmlChar_ptr_ptr(n_prefix, prefix, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSplitQName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_name);
            printf(" %d", n_prefix);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStringCurrentChar(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* the XML parser context */
    int n_ctxt;
    xmlChar * cur; /* pointer to the beginning of the char */
    int n_cur;
    int * len; /* pointer to the length of the char read */
    int n_len;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        cur = gen_const_xmlChar_ptr(n_cur, 1);
        len = gen_int_ptr(n_len, 2);

        ret_val = xmlStringCurrentChar(ctxt, (const xmlChar *)cur, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1);
        des_int_ptr(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStringCurrentChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStringDecodeEntities(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlParserCtxtPtr ctxt; /* the parser context */
    int n_ctxt;
    xmlChar * str; /* the input string */
    int n_str;
    int what; /* combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF */
    int n_what;
    xmlChar end; /* an end marker xmlChar, 0 if none */
    int n_end;
    xmlChar end2; /* an end marker xmlChar, 0 if none */
    int n_end2;
    xmlChar end3; /* an end marker xmlChar, 0 if none */
    int n_end3;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_what = 0;n_what < gen_nb_int;n_what++) {
    for (n_end = 0;n_end < gen_nb_xmlChar;n_end++) {
    for (n_end2 = 0;n_end2 < gen_nb_xmlChar;n_end2++) {
    for (n_end3 = 0;n_end3 < gen_nb_xmlChar;n_end3++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);
        what = gen_int(n_what, 2);
        end = gen_xmlChar(n_end, 3);
        end2 = gen_xmlChar(n_end2, 4);
        end3 = gen_xmlChar(n_end3, 5);

        ret_val = xmlStringDecodeEntities(ctxt, (const xmlChar *)str, what, end, end2, end3);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        des_int(n_what, what, 2);
        des_xmlChar(n_end, end, 3);
        des_xmlChar(n_end2, end2, 4);
        des_xmlChar(n_end3, end3, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStringDecodeEntities",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_str);
            printf(" %d", n_what);
            printf(" %d", n_end);
            printf(" %d", n_end2);
            printf(" %d", n_end3);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStringLenDecodeEntities(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlParserCtxtPtr ctxt; /* the parser context */
    int n_ctxt;
    xmlChar * str; /* the input string */
    int n_str;
    int len; /* the string length */
    int n_len;
    int what; /* combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF */
    int n_what;
    xmlChar end; /* an end marker xmlChar, 0 if none */
    int n_end;
    xmlChar end2; /* an end marker xmlChar, 0 if none */
    int n_end2;
    xmlChar end3; /* an end marker xmlChar, 0 if none */
    int n_end3;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
    for (n_what = 0;n_what < gen_nb_int;n_what++) {
    for (n_end = 0;n_end < gen_nb_xmlChar;n_end++) {
    for (n_end2 = 0;n_end2 < gen_nb_xmlChar;n_end2++) {
    for (n_end3 = 0;n_end3 < gen_nb_xmlChar;n_end3++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);
        len = gen_int(n_len, 2);
        what = gen_int(n_what, 3);
        end = gen_xmlChar(n_end, 4);
        end2 = gen_xmlChar(n_end2, 5);
        end3 = gen_xmlChar(n_end3, 6);
        if ((str != NULL) &&
            (len > (int) strlen((const char *) str) + 1))
            continue;

        ret_val = xmlStringLenDecodeEntities(ctxt, (const xmlChar *)str, len, what, end, end2, end3);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        des_int(n_len, len, 2);
        des_int(n_what, what, 3);
        des_xmlChar(n_end, end, 4);
        des_xmlChar(n_end2, end2, 5);
        des_xmlChar(n_end3, end3, 6);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStringLenDecodeEntities",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_str);
            printf(" %d", n_len);
            printf(" %d", n_what);
            printf(" %d", n_end);
            printf(" %d", n_end2);
            printf(" %d", n_end3);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSwitchEncoding(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* the parser context */
    int n_ctxt;
    xmlCharEncoding enc; /* the encoding value (number) */
    int n_enc;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        enc = gen_xmlCharEncoding(n_enc, 1);

        ret_val = xmlSwitchEncoding(ctxt, enc);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlCharEncoding(n_enc, enc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSwitchEncoding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSwitchInputEncoding(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* the parser context */
    int n_ctxt;
    xmlParserInputPtr input; /* the input stream */
    int n_input;
    xmlCharEncodingHandlerPtr handler; /* the encoding handler */
    int n_handler;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_input = 0;n_input < gen_nb_xmlParserInputPtr;n_input++) {
    for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandlerPtr;n_handler++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        input = gen_xmlParserInputPtr(n_input, 1);
        handler = gen_xmlCharEncodingHandlerPtr(n_handler, 2);

        ret_val = xmlSwitchInputEncoding(ctxt, input, handler);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlParserInputPtr(n_input, input, 1);
        des_xmlCharEncodingHandlerPtr(n_handler, handler, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSwitchInputEncoding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_input);
            printf(" %d", n_handler);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSwitchToEncoding(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserCtxtPtr ctxt; /* the parser context */
    int n_ctxt;
    xmlCharEncodingHandlerPtr handler; /* the encoding handler */
    int n_handler;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_handler = 0;n_handler < gen_nb_xmlCharEncodingHandlerPtr;n_handler++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        handler = gen_xmlCharEncodingHandlerPtr(n_handler, 1);

        ret_val = xmlSwitchToEncoding(ctxt, handler);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlCharEncodingHandlerPtr(n_handler, handler, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSwitchToEncoding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_handler);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}

static int
test_parserInternals(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing parserInternals : 33 of 90 functions ...\n");
    test_ret += test_htmlCreateFileParserCtxt();
    test_ret += test_htmlInitAutoClose();
    test_ret += test_inputPop();
    test_ret += test_inputPush();
    test_ret += test_namePop();
    test_ret += test_namePush();
    test_ret += test_nodePop();
    test_ret += test_nodePush();
    test_ret += test_xmlCheckLanguageID();
    test_ret += test_xmlCopyChar();
    test_ret += test_xmlCopyCharMultiByte();
    test_ret += test_xmlCreateEntityParserCtxt();
    test_ret += test_xmlCreateFileParserCtxt();
    test_ret += test_xmlCreateMemoryParserCtxt();
    test_ret += test_xmlCreateURLParserCtxt();
    test_ret += test_xmlCurrentChar();
    test_ret += test_xmlErrMemory();
    test_ret += test_xmlIsLetter();
    test_ret += test_xmlNewEntityInputStream();
    test_ret += test_xmlNewInputFromFile();
    test_ret += test_xmlNewInputStream();
    test_ret += test_xmlNewStringInputStream();
    test_ret += test_xmlNextChar();
    test_ret += test_xmlParserInputShrink();
    test_ret += test_xmlPopInput();
    test_ret += test_xmlPushInput();
    test_ret += test_xmlSetEntityReferenceFunc();
    test_ret += test_xmlSplitQName();
    test_ret += test_xmlStringCurrentChar();
    test_ret += test_xmlStringDecodeEntities();
    test_ret += test_xmlStringLenDecodeEntities();
    test_ret += test_xmlSwitchEncoding();
    test_ret += test_xmlSwitchInputEncoding();
    test_ret += test_xmlSwitchToEncoding();

    if (test_ret != 0)
	printf("Module parserInternals: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlPatternFromRoot(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlPatternPtr comp; /* the precompiled pattern */
    int n_comp;

    for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) {
        mem_base = xmlMemBlocks();
        comp = gen_xmlPatternPtr(n_comp, 0);

        ret_val = xmlPatternFromRoot(comp);
        desret_int(ret_val);
        call_tests++;
        des_xmlPatternPtr(n_comp, comp, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPatternFromRoot",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_comp);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlPatternGetStreamCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlPatternMatch(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlPatternPtr comp; /* the precompiled pattern */
    int n_comp;
    xmlNodePtr node; /* a node */
    int n_node;

    for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        comp = gen_xmlPatternPtr(n_comp, 0);
        node = gen_xmlNodePtr(n_node, 1);

        ret_val = xmlPatternMatch(comp, node);
        desret_int(ret_val);
        call_tests++;
        des_xmlPatternPtr(n_comp, comp, 0);
        des_xmlNodePtr(n_node, node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPatternMatch",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_comp);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlPatternMaxDepth(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlPatternPtr comp; /* the precompiled pattern */
    int n_comp;

    for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) {
        mem_base = xmlMemBlocks();
        comp = gen_xmlPatternPtr(n_comp, 0);

        ret_val = xmlPatternMaxDepth(comp);
        desret_int(ret_val);
        call_tests++;
        des_xmlPatternPtr(n_comp, comp, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPatternMaxDepth",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_comp);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlPatternMinDepth(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlPatternPtr comp; /* the precompiled pattern */
    int n_comp;

    for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) {
        mem_base = xmlMemBlocks();
        comp = gen_xmlPatternPtr(n_comp, 0);

        ret_val = xmlPatternMinDepth(comp);
        desret_int(ret_val);
        call_tests++;
        des_xmlPatternPtr(n_comp, comp, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPatternMinDepth",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_comp);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlPatternStreamable(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlPatternPtr comp; /* the precompiled pattern */
    int n_comp;

    for (n_comp = 0;n_comp < gen_nb_xmlPatternPtr;n_comp++) {
        mem_base = xmlMemBlocks();
        comp = gen_xmlPatternPtr(n_comp, 0);

        ret_val = xmlPatternStreamable(comp);
        desret_int(ret_val);
        call_tests++;
        des_xmlPatternPtr(n_comp, comp, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPatternStreamable",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_comp);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlPatterncompile(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

#ifdef LIBXML_PATTERN_ENABLED

#define gen_nb_xmlStreamCtxtPtr 1
static xmlStreamCtxtPtr gen_xmlStreamCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlStreamCtxtPtr(int no ATTRIBUTE_UNUSED, xmlStreamCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlStreamPop(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlStreamCtxtPtr stream; /* the stream context */
    int n_stream;

    for (n_stream = 0;n_stream < gen_nb_xmlStreamCtxtPtr;n_stream++) {
        mem_base = xmlMemBlocks();
        stream = gen_xmlStreamCtxtPtr(n_stream, 0);

        ret_val = xmlStreamPop(stream);
        desret_int(ret_val);
        call_tests++;
        des_xmlStreamCtxtPtr(n_stream, stream, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStreamPop",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_stream);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlStreamPush(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlStreamCtxtPtr stream; /* the stream context */
    int n_stream;
    xmlChar * name; /* the current name */
    int n_name;
    xmlChar * ns; /* the namespace name */
    int n_ns;

    for (n_stream = 0;n_stream < gen_nb_xmlStreamCtxtPtr;n_stream++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) {
        mem_base = xmlMemBlocks();
        stream = gen_xmlStreamCtxtPtr(n_stream, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        ns = gen_const_xmlChar_ptr(n_ns, 2);

        ret_val = xmlStreamPush(stream, (const xmlChar *)name, (const xmlChar *)ns);
        desret_int(ret_val);
        call_tests++;
        des_xmlStreamCtxtPtr(n_stream, stream, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStreamPush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_stream);
            printf(" %d", n_name);
            printf(" %d", n_ns);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlStreamPushAttr(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlStreamCtxtPtr stream; /* the stream context */
    int n_stream;
    xmlChar * name; /* the current name */
    int n_name;
    xmlChar * ns; /* the namespace name */
    int n_ns;

    for (n_stream = 0;n_stream < gen_nb_xmlStreamCtxtPtr;n_stream++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) {
        mem_base = xmlMemBlocks();
        stream = gen_xmlStreamCtxtPtr(n_stream, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        ns = gen_const_xmlChar_ptr(n_ns, 2);

        ret_val = xmlStreamPushAttr(stream, (const xmlChar *)name, (const xmlChar *)ns);
        desret_int(ret_val);
        call_tests++;
        des_xmlStreamCtxtPtr(n_stream, stream, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStreamPushAttr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_stream);
            printf(" %d", n_name);
            printf(" %d", n_ns);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlStreamPushNode(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlStreamCtxtPtr stream; /* the stream context */
    int n_stream;
    xmlChar * name; /* the current name */
    int n_name;
    xmlChar * ns; /* the namespace name */
    int n_ns;
    int nodeType; /* the type of the node being pushed */
    int n_nodeType;

    for (n_stream = 0;n_stream < gen_nb_xmlStreamCtxtPtr;n_stream++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) {
    for (n_nodeType = 0;n_nodeType < gen_nb_int;n_nodeType++) {
        mem_base = xmlMemBlocks();
        stream = gen_xmlStreamCtxtPtr(n_stream, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        ns = gen_const_xmlChar_ptr(n_ns, 2);
        nodeType = gen_int(n_nodeType, 3);

        ret_val = xmlStreamPushNode(stream, (const xmlChar *)name, (const xmlChar *)ns, nodeType);
        desret_int(ret_val);
        call_tests++;
        des_xmlStreamCtxtPtr(n_stream, stream, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 2);
        des_int(n_nodeType, nodeType, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStreamPushNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_stream);
            printf(" %d", n_name);
            printf(" %d", n_ns);
            printf(" %d", n_nodeType);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlStreamWantsAnyNode(void) {
    int test_ret = 0;

#if defined(LIBXML_PATTERN_ENABLED)
    int mem_base;
    int ret_val;
    xmlStreamCtxtPtr streamCtxt; /* the stream context */
    int n_streamCtxt;

    for (n_streamCtxt = 0;n_streamCtxt < gen_nb_xmlStreamCtxtPtr;n_streamCtxt++) {
        mem_base = xmlMemBlocks();
        streamCtxt = gen_xmlStreamCtxtPtr(n_streamCtxt, 0);

        ret_val = xmlStreamWantsAnyNode(streamCtxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlStreamCtxtPtr(n_streamCtxt, streamCtxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStreamWantsAnyNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_streamCtxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_pattern(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing pattern : 10 of 15 functions ...\n");
    test_ret += test_xmlPatternFromRoot();
    test_ret += test_xmlPatternGetStreamCtxt();
    test_ret += test_xmlPatternMatch();
    test_ret += test_xmlPatternMaxDepth();
    test_ret += test_xmlPatternMinDepth();
    test_ret += test_xmlPatternStreamable();
    test_ret += test_xmlPatterncompile();
    test_ret += test_xmlStreamPop();
    test_ret += test_xmlStreamPush();
    test_ret += test_xmlStreamPushAttr();
    test_ret += test_xmlStreamPushNode();
    test_ret += test_xmlStreamWantsAnyNode();

    if (test_ret != 0)
	printf("Module pattern: %d errors\n", test_ret);
    return(test_ret);
}
#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlRelaxNGPtr 1
static xmlRelaxNGPtr gen_xmlRelaxNGPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlRelaxNGPtr(int no ATTRIBUTE_UNUSED, xmlRelaxNGPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlRelaxNGDump(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    FILE * output; /* the file output */
    int n_output;
    xmlRelaxNGPtr schema; /* a schema structure */
    int n_schema;

    for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) {
    for (n_schema = 0;n_schema < gen_nb_xmlRelaxNGPtr;n_schema++) {
        mem_base = xmlMemBlocks();
        output = gen_FILE_ptr(n_output, 0);
        schema = gen_xmlRelaxNGPtr(n_schema, 1);

        xmlRelaxNGDump(output, schema);
        call_tests++;
        des_FILE_ptr(n_output, output, 0);
        des_xmlRelaxNGPtr(n_schema, schema, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_schema);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGDumpTree(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    FILE * output; /* the file output */
    int n_output;
    xmlRelaxNGPtr schema; /* a schema structure */
    int n_schema;

    for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) {
    for (n_schema = 0;n_schema < gen_nb_xmlRelaxNGPtr;n_schema++) {
        mem_base = xmlMemBlocks();
        output = gen_FILE_ptr(n_output, 0);
        schema = gen_xmlRelaxNGPtr(n_schema, 1);

        xmlRelaxNGDumpTree(output, schema);
        call_tests++;
        des_FILE_ptr(n_output, output, 0);
        des_xmlRelaxNGPtr(n_schema, schema, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGDumpTree",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_schema);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlRelaxNGParserCtxtPtr 1
static xmlRelaxNGParserCtxtPtr gen_xmlRelaxNGParserCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlRelaxNGParserCtxtPtr(int no ATTRIBUTE_UNUSED, xmlRelaxNGParserCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlRelaxNGValidityErrorFunc_ptr 1
static xmlRelaxNGValidityErrorFunc * gen_xmlRelaxNGValidityErrorFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlRelaxNGValidityErrorFunc_ptr(int no ATTRIBUTE_UNUSED, xmlRelaxNGValidityErrorFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlRelaxNGValidityWarningFunc_ptr 1
static xmlRelaxNGValidityWarningFunc * gen_xmlRelaxNGValidityWarningFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlRelaxNGValidityWarningFunc_ptr(int no ATTRIBUTE_UNUSED, xmlRelaxNGValidityWarningFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlRelaxNGGetParserErrors(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlRelaxNGParserCtxtPtr ctxt; /* a Relax-NG validation context */
    int n_ctxt;
    xmlRelaxNGValidityErrorFunc * err; /* the error callback result */
    int n_err;
    xmlRelaxNGValidityWarningFunc * warn; /* the warning callback result */
    int n_warn;
    void ** ctx; /* contextual data for the callbacks result */
    int n_ctx;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGParserCtxtPtr;n_ctxt++) {
    for (n_err = 0;n_err < gen_nb_xmlRelaxNGValidityErrorFunc_ptr;n_err++) {
    for (n_warn = 0;n_warn < gen_nb_xmlRelaxNGValidityWarningFunc_ptr;n_warn++) {
    for (n_ctx = 0;n_ctx < gen_nb_void_ptr_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlRelaxNGParserCtxtPtr(n_ctxt, 0);
        err = gen_xmlRelaxNGValidityErrorFunc_ptr(n_err, 1);
        warn = gen_xmlRelaxNGValidityWarningFunc_ptr(n_warn, 2);
        ctx = gen_void_ptr_ptr(n_ctx, 3);

        ret_val = xmlRelaxNGGetParserErrors(ctxt, err, warn, ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlRelaxNGParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlRelaxNGValidityErrorFunc_ptr(n_err, err, 1);
        des_xmlRelaxNGValidityWarningFunc_ptr(n_warn, warn, 2);
        des_void_ptr_ptr(n_ctx, ctx, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGGetParserErrors",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_err);
            printf(" %d", n_warn);
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlRelaxNGValidCtxtPtr 1
static xmlRelaxNGValidCtxtPtr gen_xmlRelaxNGValidCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlRelaxNGValidCtxtPtr(int no ATTRIBUTE_UNUSED, xmlRelaxNGValidCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlRelaxNGGetValidErrors(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlRelaxNGValidCtxtPtr ctxt; /* a Relax-NG validation context */
    int n_ctxt;
    xmlRelaxNGValidityErrorFunc * err; /* the error function result */
    int n_err;
    xmlRelaxNGValidityWarningFunc * warn; /* the warning function result */
    int n_warn;
    void ** ctx; /* the functions context result */
    int n_ctx;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) {
    for (n_err = 0;n_err < gen_nb_xmlRelaxNGValidityErrorFunc_ptr;n_err++) {
    for (n_warn = 0;n_warn < gen_nb_xmlRelaxNGValidityWarningFunc_ptr;n_warn++) {
    for (n_ctx = 0;n_ctx < gen_nb_void_ptr_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0);
        err = gen_xmlRelaxNGValidityErrorFunc_ptr(n_err, 1);
        warn = gen_xmlRelaxNGValidityWarningFunc_ptr(n_warn, 2);
        ctx = gen_void_ptr_ptr(n_ctx, 3);

        ret_val = xmlRelaxNGGetValidErrors(ctxt, err, warn, ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlRelaxNGValidityErrorFunc_ptr(n_err, err, 1);
        des_xmlRelaxNGValidityWarningFunc_ptr(n_warn, warn, 2);
        des_void_ptr_ptr(n_ctx, ctx, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGGetValidErrors",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_err);
            printf(" %d", n_warn);
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGInitTypes(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;

        mem_base = xmlMemBlocks();

        ret_val = xmlRelaxNGInitTypes();
        desret_int(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGInitTypes",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGNewDocParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlRelaxNGParserCtxtPtr ret_val;
    xmlDocPtr doc; /* a preparsed document tree */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);

        ret_val = xmlRelaxNGNewDocParserCtxt(doc);
        desret_xmlRelaxNGParserCtxtPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGNewDocParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGNewMemParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlRelaxNGParserCtxtPtr ret_val;
    char * buffer; /* a pointer to a char array containing the schemas */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;

    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
        mem_base = xmlMemBlocks();
        buffer = gen_const_char_ptr(n_buffer, 0);
        size = gen_int(n_size, 1);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlRelaxNGNewMemParserCtxt((const char *)buffer, size);
        desret_xmlRelaxNGParserCtxtPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_buffer, (const char *)buffer, 0);
        des_int(n_size, size, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGNewMemParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGNewParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlRelaxNGParserCtxtPtr ret_val;
    char * URL; /* the location of the schema */
    int n_URL;

    for (n_URL = 0;n_URL < gen_nb_const_char_ptr;n_URL++) {
        mem_base = xmlMemBlocks();
        URL = gen_const_char_ptr(n_URL, 0);

        ret_val = xmlRelaxNGNewParserCtxt((const char *)URL);
        desret_xmlRelaxNGParserCtxtPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_URL, (const char *)URL, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGNewParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGNewValidCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlRelaxNGParse(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlRelaxNGSetParserErrors(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlRelaxNGSetParserStructuredErrors(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlRelaxNGSetValidErrors(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlRelaxNGSetValidStructuredErrors(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlRelaxNGValidateDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlRelaxNGValidCtxtPtr ctxt; /* a Relax-NG validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a parsed document tree */
    int n_doc;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        ret_val = xmlRelaxNGValidateDoc(ctxt, doc);
        desret_int(ret_val);
        call_tests++;
        des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGValidateDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGValidateFullElement(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlRelaxNGValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNodePtr elem; /* an element instance */
    int n_elem;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);

        ret_val = xmlRelaxNGValidateFullElement(ctxt, doc, elem);
        desret_int(ret_val);
        call_tests++;
        des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGValidateFullElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGValidatePopElement(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlRelaxNGValidCtxtPtr ctxt; /* the RelaxNG validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNodePtr elem; /* an element instance */
    int n_elem;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);

        ret_val = xmlRelaxNGValidatePopElement(ctxt, doc, elem);
        desret_int(ret_val);
        call_tests++;
        des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGValidatePopElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGValidatePushCData(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlRelaxNGValidCtxtPtr ctxt; /* the RelaxNG validation context */
    int n_ctxt;
    xmlChar * data; /* some character data read */
    int n_data;
    int len; /* the length of the data */
    int n_len;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) {
    for (n_data = 0;n_data < gen_nb_const_xmlChar_ptr;n_data++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0);
        data = gen_const_xmlChar_ptr(n_data, 1);
        len = gen_int(n_len, 2);
        if ((data != NULL) &&
            (len > (int) strlen((const char *) data) + 1))
            continue;

        ret_val = xmlRelaxNGValidatePushCData(ctxt, (const xmlChar *)data, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_data, (const xmlChar *)data, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGValidatePushCData",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_data);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxNGValidatePushElement(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlRelaxNGValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNodePtr elem; /* an element instance */
    int n_elem;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);

        ret_val = xmlRelaxNGValidatePushElement(ctxt, doc, elem);
        desret_int(ret_val);
        call_tests++;
        des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxNGValidatePushElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRelaxParserSetFlag(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlRelaxNGParserCtxtPtr ctxt; /* a RelaxNG parser context */
    int n_ctxt;
    int flags; /* a set of flags values */
    int n_flags;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGParserCtxtPtr;n_ctxt++) {
    for (n_flags = 0;n_flags < gen_nb_int;n_flags++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlRelaxNGParserCtxtPtr(n_ctxt, 0);
        flags = gen_int(n_flags, 1);

        ret_val = xmlRelaxParserSetFlag(ctxt, flags);
        desret_int(ret_val);
        call_tests++;
        des_xmlRelaxNGParserCtxtPtr(n_ctxt, ctxt, 0);
        des_int(n_flags, flags, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRelaxParserSetFlag",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_flags);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_relaxng(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing relaxng : 14 of 24 functions ...\n");
    test_ret += test_xmlRelaxNGDump();
    test_ret += test_xmlRelaxNGDumpTree();
    test_ret += test_xmlRelaxNGGetParserErrors();
    test_ret += test_xmlRelaxNGGetValidErrors();
    test_ret += test_xmlRelaxNGInitTypes();
    test_ret += test_xmlRelaxNGNewDocParserCtxt();
    test_ret += test_xmlRelaxNGNewMemParserCtxt();
    test_ret += test_xmlRelaxNGNewParserCtxt();
    test_ret += test_xmlRelaxNGNewValidCtxt();
    test_ret += test_xmlRelaxNGParse();
    test_ret += test_xmlRelaxNGSetParserErrors();
    test_ret += test_xmlRelaxNGSetParserStructuredErrors();
    test_ret += test_xmlRelaxNGSetValidErrors();
    test_ret += test_xmlRelaxNGSetValidStructuredErrors();
    test_ret += test_xmlRelaxNGValidateDoc();
    test_ret += test_xmlRelaxNGValidateFullElement();
    test_ret += test_xmlRelaxNGValidatePopElement();
    test_ret += test_xmlRelaxNGValidatePushCData();
    test_ret += test_xmlRelaxNGValidatePushElement();
    test_ret += test_xmlRelaxParserSetFlag();

    if (test_ret != 0)
	printf("Module relaxng: %d errors\n", test_ret);
    return(test_ret);
}
static int
test_schemasInternals(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing schemasInternals : 0 of 2 functions ...\n");

    if (test_ret != 0)
	printf("Module schemasInternals: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlSchematronNewDocParserCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchematronNewMemParserCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchematronNewParserCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchematronNewValidCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchematronParse(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchematronSetValidStructuredErrors(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

#ifdef LIBXML_SCHEMATRON_ENABLED

#define gen_nb_xmlSchematronValidCtxtPtr 1
static xmlSchematronValidCtxtPtr gen_xmlSchematronValidCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchematronValidCtxtPtr(int no ATTRIBUTE_UNUSED, xmlSchematronValidCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlSchematronValidateDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMATRON_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchematronValidCtxtPtr ctxt; /* the schema validation context */
    int n_ctxt;
    xmlDocPtr instance; /* the document instance tree */
    int n_instance;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchematronValidCtxtPtr;n_ctxt++) {
    for (n_instance = 0;n_instance < gen_nb_xmlDocPtr;n_instance++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchematronValidCtxtPtr(n_ctxt, 0);
        instance = gen_xmlDocPtr(n_instance, 1);

        ret_val = xmlSchematronValidateDoc(ctxt, instance);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchematronValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_instance, instance, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchematronValidateDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_instance);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_schematron(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing schematron : 1 of 10 functions ...\n");
    test_ret += test_xmlSchematronNewDocParserCtxt();
    test_ret += test_xmlSchematronNewMemParserCtxt();
    test_ret += test_xmlSchematronNewParserCtxt();
    test_ret += test_xmlSchematronNewValidCtxt();
    test_ret += test_xmlSchematronParse();
    test_ret += test_xmlSchematronSetValidStructuredErrors();
    test_ret += test_xmlSchematronValidateDoc();

    if (test_ret != 0)
	printf("Module schematron: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlAddChild(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr parent; /* the parent node */
    int n_parent;
    xmlNodePtr cur; /* the child node */
    int n_cur;

    for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr_in;n_cur++) {
        mem_base = xmlMemBlocks();
        parent = gen_xmlNodePtr(n_parent, 0);
        cur = gen_xmlNodePtr_in(n_cur, 1);

        ret_val = xmlAddChild(parent, cur);
        if (ret_val == NULL) { xmlFreeNode(cur) ; cur = NULL ; }
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_parent, parent, 0);
        des_xmlNodePtr_in(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAddChild",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlAddChildList(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr parent; /* the parent node */
    int n_parent;
    xmlNodePtr cur; /* the first node in the list */
    int n_cur;

    for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr_in;n_cur++) {
        mem_base = xmlMemBlocks();
        parent = gen_xmlNodePtr(n_parent, 0);
        cur = gen_xmlNodePtr_in(n_cur, 1);

        ret_val = xmlAddChildList(parent, cur);
        if (ret_val == NULL) { xmlFreeNodeList(cur) ; cur = NULL ; }
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_parent, parent, 0);
        des_xmlNodePtr_in(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAddChildList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlAddNextSibling(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr cur; /* the child node */
    int n_cur;
    xmlNodePtr elem; /* the new node */
    int n_elem;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr_in;n_elem++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        elem = gen_xmlNodePtr_in(n_elem, 1);

        ret_val = xmlAddNextSibling(cur, elem);
        if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_xmlNodePtr_in(n_elem, elem, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAddNextSibling",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlAddPrevSibling(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr cur; /* the child node */
    int n_cur;
    xmlNodePtr elem; /* the new node */
    int n_elem;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr_in;n_elem++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        elem = gen_xmlNodePtr_in(n_elem, 1);

        ret_val = xmlAddPrevSibling(cur, elem);
        if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_xmlNodePtr_in(n_elem, elem, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAddPrevSibling",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlAddSibling(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr cur; /* the child node */
    int n_cur;
    xmlNodePtr elem; /* the new node */
    int n_elem;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr_in;n_elem++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        elem = gen_xmlNodePtr_in(n_elem, 1);

        ret_val = xmlAddSibling(cur, elem);
        if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_xmlNodePtr_in(n_elem, elem, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAddSibling",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlAttrSerializeTxtContent(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
#ifdef LIBXML_OUTPUT_ENABLED
    int mem_base;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlAttrPtr attr; /* the attribute node */
    int n_attr;
    xmlChar * string; /* the text content */
    int n_string;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) {
    for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        attr = gen_xmlAttrPtr(n_attr, 2);
        string = gen_const_xmlChar_ptr(n_string, 3);

        xmlAttrSerializeTxtContent(buf, doc, attr, (const xmlChar *)string);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlAttrPtr(n_attr, attr, 2);
        des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAttrSerializeTxtContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_doc);
            printf(" %d", n_attr);
            printf(" %d", n_string);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


#define gen_nb_const_xmlBuf_ptr 1
static xmlBuf * gen_const_xmlBuf_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlBuf_ptr(int no ATTRIBUTE_UNUSED, const xmlBuf * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlBufContent(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlBuf * buf; /* the buffer */
    int n_buf;

    for (n_buf = 0;n_buf < gen_nb_const_xmlBuf_ptr;n_buf++) {
        mem_base = xmlMemBlocks();
        buf = gen_const_xmlBuf_ptr(n_buf, 0);

        ret_val = xmlBufContent((const xmlBuf *)buf);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlBuf_ptr(n_buf, (const xmlBuf *)buf, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlBufPtr 1
static xmlBufPtr gen_xmlBufPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlBufPtr(int no ATTRIBUTE_UNUSED, xmlBufPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlBufEnd(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlBufPtr buf; /* the buffer */
    int n_buf;

    for (n_buf = 0;n_buf < gen_nb_xmlBufPtr;n_buf++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufPtr(n_buf, 0);

        ret_val = xmlBufEnd(buf);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlBufPtr(n_buf, buf, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufEnd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_const_xmlNode_ptr 1
static xmlNode * gen_const_xmlNode_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlNode_ptr(int no ATTRIBUTE_UNUSED, const xmlNode * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlBufGetNodeContent(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBufPtr buf; /* a buffer xmlBufPtr */
    int n_buf;
    xmlNode * cur; /* the node being read */
    int n_cur;

    for (n_buf = 0;n_buf < gen_nb_xmlBufPtr;n_buf++) {
    for (n_cur = 0;n_cur < gen_nb_const_xmlNode_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufPtr(n_buf, 0);
        cur = gen_const_xmlNode_ptr(n_cur, 1);

        ret_val = xmlBufGetNodeContent(buf, (const xmlNode *)cur);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufPtr(n_buf, buf, 0);
        des_const_xmlNode_ptr(n_cur, (const xmlNode *)cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufGetNodeContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufNodeDump(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlBufShrink(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlBufUse(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlBufferAdd(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBufferPtr buf; /* the buffer to dump */
    int n_buf;
    xmlChar * str; /* the #xmlChar string */
    int n_str;
    int len; /* the number of #xmlChar to add */
    int n_len;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);
        len = gen_int(n_len, 2);
        if ((str != NULL) &&
            (len > (int) strlen((const char *) str) + 1))
            continue;

        ret_val = xmlBufferAdd(buf, (const xmlChar *)str, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferAdd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_str);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferAddHead(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBufferPtr buf; /* the buffer */
    int n_buf;
    xmlChar * str; /* the #xmlChar string */
    int n_str;
    int len; /* the number of #xmlChar to add */
    int n_len;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);
        len = gen_int(n_len, 2);
        if ((str != NULL) &&
            (len > (int) strlen((const char *) str) + 1))
            continue;

        ret_val = xmlBufferAddHead(buf, (const xmlChar *)str, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferAddHead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_str);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferCCat(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBufferPtr buf; /* the buffer to dump */
    int n_buf;
    char * str; /* the C char string */
    int n_str;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_str = 0;n_str < gen_nb_const_char_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        str = gen_const_char_ptr(n_str, 1);

        ret_val = xmlBufferCCat(buf, (const char *)str);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_const_char_ptr(n_str, (const char *)str, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferCCat",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferCat(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBufferPtr buf; /* the buffer to add to */
    int n_buf;
    xmlChar * str; /* the #xmlChar string */
    int n_str;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);

        ret_val = xmlBufferCat(buf, (const xmlChar *)str);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferCat",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_const_xmlBuffer_ptr 1
static xmlBuffer * gen_const_xmlBuffer_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_const_xmlBuffer_ptr(int no ATTRIBUTE_UNUSED, const xmlBuffer * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlBufferContent(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlBuffer * buf; /* the buffer */
    int n_buf;

    for (n_buf = 0;n_buf < gen_nb_const_xmlBuffer_ptr;n_buf++) {
        mem_base = xmlMemBlocks();
        buf = gen_const_xmlBuffer_ptr(n_buf, 0);

        ret_val = xmlBufferContent((const xmlBuffer *)buf);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlBuffer_ptr(n_buf, (const xmlBuffer *)buf, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferCreate(void) {
    int test_ret = 0;

    int mem_base;
    xmlBufferPtr ret_val;

        mem_base = xmlMemBlocks();

        ret_val = xmlBufferCreate();
        desret_xmlBufferPtr(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferCreate",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferCreateSize(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlBufferCreateStatic(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlBufferDetach(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlBufferPtr buf; /* the buffer */
    int n_buf;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);

        ret_val = xmlBufferDetach(buf);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferDetach",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferEmpty(void) {
    int test_ret = 0;

    int mem_base;
    xmlBufferPtr buf; /* the buffer */
    int n_buf;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);

        xmlBufferEmpty(buf);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferEmpty",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferGrow(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBufferPtr buf; /* the buffer */
    int n_buf;
    unsigned int len; /* the minimum free size to allocate */
    int n_len;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_len = 0;n_len < gen_nb_unsigned_int;n_len++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        len = gen_unsigned_int(n_len, 1);

        ret_val = xmlBufferGrow(buf, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_unsigned_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferGrow",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferLength(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBuffer * buf; /* the buffer */
    int n_buf;

    for (n_buf = 0;n_buf < gen_nb_const_xmlBuffer_ptr;n_buf++) {
        mem_base = xmlMemBlocks();
        buf = gen_const_xmlBuffer_ptr(n_buf, 0);

        ret_val = xmlBufferLength((const xmlBuffer *)buf);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlBuffer_ptr(n_buf, (const xmlBuffer *)buf, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferLength",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferResize(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBufferPtr buf; /* the buffer to resize */
    int n_buf;
    unsigned int size; /* the desired size */
    int n_size;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_size = 0;n_size < gen_nb_unsigned_int;n_size++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        size = gen_unsigned_int(n_size, 1);

        ret_val = xmlBufferResize(buf, size);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_unsigned_int(n_size, size, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferResize",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferSetAllocationScheme(void) {
    int test_ret = 0;

    int mem_base;
    xmlBufferPtr buf; /* the buffer to tune */
    int n_buf;
    xmlBufferAllocationScheme scheme; /* allocation scheme to use */
    int n_scheme;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_scheme = 0;n_scheme < gen_nb_xmlBufferAllocationScheme;n_scheme++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        scheme = gen_xmlBufferAllocationScheme(n_scheme, 1);

        xmlBufferSetAllocationScheme(buf, scheme);
        if ((buf != NULL) && (scheme == XML_BUFFER_ALLOC_IMMUTABLE) && (buf->content != NULL) && (buf->content != static_buf_content)) { xmlFree(buf->content); buf->content = NULL;}
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlBufferAllocationScheme(n_scheme, scheme, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferSetAllocationScheme",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_scheme);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferShrink(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBufferPtr buf; /* the buffer to dump */
    int n_buf;
    unsigned int len; /* the number of xmlChar to remove */
    int n_len;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_len = 0;n_len < gen_nb_unsigned_int;n_len++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        len = gen_unsigned_int(n_len, 1);

        ret_val = xmlBufferShrink(buf, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_unsigned_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferShrink",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferWriteCHAR(void) {
    int test_ret = 0;

    int mem_base;
    xmlBufferPtr buf; /* the XML buffer */
    int n_buf;
    xmlChar * string; /* the string to add */
    int n_string;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        string = gen_const_xmlChar_ptr(n_string, 1);

        xmlBufferWriteCHAR(buf, (const xmlChar *)string);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferWriteCHAR",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_string);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferWriteChar(void) {
    int test_ret = 0;

    int mem_base;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    char * string; /* the string to add */
    int n_string;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_string = 0;n_string < gen_nb_const_char_ptr;n_string++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        string = gen_const_char_ptr(n_string, 1);

        xmlBufferWriteChar(buf, (const char *)string);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_const_char_ptr(n_string, (const char *)string, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferWriteChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_string);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBufferWriteQuotedString(void) {
    int test_ret = 0;

    int mem_base;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlChar * string; /* the string to add */
    int n_string;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr;n_string++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        string = gen_const_xmlChar_ptr(n_string, 1);

        xmlBufferWriteQuotedString(buf, (const xmlChar *)string);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_const_xmlChar_ptr(n_string, (const xmlChar *)string, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBufferWriteQuotedString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_string);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBuildQName(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * ncname; /* the Name */
    int n_ncname;
    xmlChar * prefix; /* the prefix */
    int n_prefix;
    xmlChar * memory; /* preallocated memory */
    int n_memory;
    int len; /* preallocated memory length */
    int n_len;

    for (n_ncname = 0;n_ncname < gen_nb_const_xmlChar_ptr;n_ncname++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_memory = 0;n_memory < gen_nb_xmlChar_ptr;n_memory++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ncname = gen_const_xmlChar_ptr(n_ncname, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        memory = gen_xmlChar_ptr(n_memory, 2);
        len = gen_int(n_len, 3);
        if ((prefix != NULL) &&
            (len > (int) strlen((const char *) prefix) + 1))
            continue;

        ret_val = xmlBuildQName((const xmlChar *)ncname, (const xmlChar *)prefix, memory, len);
        if ((ret_val != NULL) && (ret_val != ncname) &&
              (ret_val != prefix) && (ret_val != memory))
              xmlFree(ret_val);
	  ret_val = NULL;
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_ncname, (const xmlChar *)ncname, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_xmlChar_ptr(n_memory, memory, 2);
        des_int(n_len, len, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBuildQName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ncname);
            printf(" %d", n_prefix);
            printf(" %d", n_memory);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlChildElementCount(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    unsigned long ret_val;
    xmlNodePtr parent; /* the parent node */
    int n_parent;

    for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) {
        mem_base = xmlMemBlocks();
        parent = gen_xmlNodePtr(n_parent, 0);

        ret_val = xmlChildElementCount(parent);
        desret_unsigned_long(ret_val);
        call_tests++;
        des_xmlNodePtr(n_parent, parent, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlChildElementCount",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCopyDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlDocPtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    int recursive; /* if not zero do a recursive copy. */
    int n_recursive;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_recursive = 0;n_recursive < gen_nb_int;n_recursive++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        recursive = gen_int(n_recursive, 1);

        ret_val = xmlCopyDoc(doc, recursive);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_int(n_recursive, recursive, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_recursive);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCopyDtd(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlDtdPtr ret_val;
    xmlDtdPtr dtd; /* the dtd */
    int n_dtd;

    for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) {
        mem_base = xmlMemBlocks();
        dtd = gen_xmlDtdPtr(n_dtd, 0);

        ret_val = xmlCopyDtd(dtd);
        desret_xmlDtdPtr(ret_val);
        call_tests++;
        des_xmlDtdPtr(n_dtd, dtd, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyDtd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dtd);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlCopyNamespace(void) {
    int test_ret = 0;

    int mem_base;
    xmlNsPtr ret_val;
    xmlNsPtr cur; /* the namespace */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_xmlNsPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNsPtr(n_cur, 0);

        ret_val = xmlCopyNamespace(cur);
        if (ret_val != NULL) xmlFreeNs(ret_val);
        desret_xmlNsPtr(ret_val);
        call_tests++;
        des_xmlNsPtr(n_cur, cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyNamespace",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCopyNamespaceList(void) {
    int test_ret = 0;

    int mem_base;
    xmlNsPtr ret_val;
    xmlNsPtr cur; /* the first namespace */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_xmlNsPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNsPtr(n_cur, 0);

        ret_val = xmlCopyNamespaceList(cur);
        if (ret_val != NULL) xmlFreeNsList(ret_val);
        desret_xmlNsPtr(ret_val);
        call_tests++;
        des_xmlNsPtr(n_cur, cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyNamespaceList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCopyNode(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr node; /* the node */
    int n_node;
    int extended; /* if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable) */
    int n_extended;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_extended = 0;n_extended < gen_nb_int;n_extended++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        extended = gen_int(n_extended, 1);

        ret_val = xmlCopyNode(node, extended);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_int(n_extended, extended, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_extended);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCopyNodeList(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr node; /* the first node in the list. */
    int n_node;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);

        ret_val = xmlCopyNodeList(node);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyNodeList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCopyProp(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttrPtr ret_val;
    xmlNodePtr target; /* the element where the attribute will be grafted */
    int n_target;
    xmlAttrPtr cur; /* the attribute */
    int n_cur;

    for (n_target = 0;n_target < gen_nb_xmlNodePtr;n_target++) {
    for (n_cur = 0;n_cur < gen_nb_xmlAttrPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        target = gen_xmlNodePtr(n_target, 0);
        cur = gen_xmlAttrPtr(n_cur, 1);

        ret_val = xmlCopyProp(target, cur);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_target, target, 0);
        des_xmlAttrPtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_target);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCopyPropList(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttrPtr ret_val;
    xmlNodePtr target; /* the element where the attributes will be grafted */
    int n_target;
    xmlAttrPtr cur; /* the first attribute */
    int n_cur;

    for (n_target = 0;n_target < gen_nb_xmlNodePtr;n_target++) {
    for (n_cur = 0;n_cur < gen_nb_xmlAttrPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        target = gen_xmlNodePtr(n_target, 0);
        cur = gen_xmlAttrPtr(n_cur, 1);

        ret_val = xmlCopyPropList(target, cur);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_target, target, 0);
        des_xmlAttrPtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyPropList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_target);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCreateIntSubset(void) {
    int test_ret = 0;

    int mem_base;
    xmlDtdPtr ret_val;
    xmlDocPtr doc; /* the document pointer */
    int n_doc;
    xmlChar * name; /* the DTD name */
    int n_name;
    xmlChar * ExternalID; /* the external (PUBLIC) ID */
    int n_ExternalID;
    xmlChar * SystemID; /* the system ID */
    int n_SystemID;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2);
        SystemID = gen_const_xmlChar_ptr(n_SystemID, 3);

        ret_val = xmlCreateIntSubset(doc, (const xmlChar *)name, (const xmlChar *)ExternalID, (const xmlChar *)SystemID);
        desret_xmlDtdPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 2);
        des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCreateIntSubset",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf(" %d", n_ExternalID);
            printf(" %d", n_SystemID);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlDOMWrapCtxtPtr 1
static xmlDOMWrapCtxtPtr gen_xmlDOMWrapCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlDOMWrapCtxtPtr(int no ATTRIBUTE_UNUSED, xmlDOMWrapCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlDOMWrapAdoptNode(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDOMWrapCtxtPtr ctxt; /* the optional context for custom processing */
    int n_ctxt;
    xmlDocPtr sourceDoc; /* the optional sourceDoc */
    int n_sourceDoc;
    xmlNodePtr node; /* the node to start with */
    int n_node;
    xmlDocPtr destDoc; /* the destination doc */
    int n_destDoc;
    xmlNodePtr destParent; /* the optional new parent of @node in @destDoc */
    int n_destParent;
    int options; /* option flags */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlDOMWrapCtxtPtr;n_ctxt++) {
    for (n_sourceDoc = 0;n_sourceDoc < gen_nb_xmlDocPtr;n_sourceDoc++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_destDoc = 0;n_destDoc < gen_nb_xmlDocPtr;n_destDoc++) {
    for (n_destParent = 0;n_destParent < gen_nb_xmlNodePtr;n_destParent++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlDOMWrapCtxtPtr(n_ctxt, 0);
        sourceDoc = gen_xmlDocPtr(n_sourceDoc, 1);
        node = gen_xmlNodePtr(n_node, 2);
        destDoc = gen_xmlDocPtr(n_destDoc, 3);
        destParent = gen_xmlNodePtr(n_destParent, 4);
        options = gen_int(n_options, 5);

        ret_val = xmlDOMWrapAdoptNode(ctxt, sourceDoc, node, destDoc, destParent, options);
        if ((node != NULL) && (node->parent == NULL)) {xmlUnlinkNode(node);xmlFreeNode(node);node = NULL;}
        desret_int(ret_val);
        call_tests++;
        des_xmlDOMWrapCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_sourceDoc, sourceDoc, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlDocPtr(n_destDoc, destDoc, 3);
        des_xmlNodePtr(n_destParent, destParent, 4);
        des_int(n_options, options, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDOMWrapAdoptNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_sourceDoc);
            printf(" %d", n_node);
            printf(" %d", n_destDoc);
            printf(" %d", n_destParent);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDOMWrapCloneNode(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDOMWrapCtxtPtr ctxt; /* the optional context for custom processing */
    int n_ctxt;
    xmlDocPtr sourceDoc; /* the optional sourceDoc */
    int n_sourceDoc;
    xmlNodePtr node; /* the node to start with */
    int n_node;
    xmlNodePtr * resNode; /* the clone of the given @node */
    int n_resNode;
    xmlDocPtr destDoc; /* the destination doc */
    int n_destDoc;
    xmlNodePtr destParent; /* the optional new parent of @node in @destDoc */
    int n_destParent;
    int deep; /* descend into child if set */
    int n_deep;
    int options; /* option flags */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlDOMWrapCtxtPtr;n_ctxt++) {
    for (n_sourceDoc = 0;n_sourceDoc < gen_nb_xmlDocPtr;n_sourceDoc++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_resNode = 0;n_resNode < gen_nb_xmlNodePtr_ptr;n_resNode++) {
    for (n_destDoc = 0;n_destDoc < gen_nb_xmlDocPtr;n_destDoc++) {
    for (n_destParent = 0;n_destParent < gen_nb_xmlNodePtr;n_destParent++) {
    for (n_deep = 0;n_deep < gen_nb_int;n_deep++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlDOMWrapCtxtPtr(n_ctxt, 0);
        sourceDoc = gen_xmlDocPtr(n_sourceDoc, 1);
        node = gen_xmlNodePtr(n_node, 2);
        resNode = gen_xmlNodePtr_ptr(n_resNode, 3);
        destDoc = gen_xmlDocPtr(n_destDoc, 4);
        destParent = gen_xmlNodePtr(n_destParent, 5);
        deep = gen_int(n_deep, 6);
        options = gen_int(n_options, 7);

        ret_val = xmlDOMWrapCloneNode(ctxt, sourceDoc, node, resNode, destDoc, destParent, deep, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlDOMWrapCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_sourceDoc, sourceDoc, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_xmlNodePtr_ptr(n_resNode, resNode, 3);
        des_xmlDocPtr(n_destDoc, destDoc, 4);
        des_xmlNodePtr(n_destParent, destParent, 5);
        des_int(n_deep, deep, 6);
        des_int(n_options, options, 7);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDOMWrapCloneNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_sourceDoc);
            printf(" %d", n_node);
            printf(" %d", n_resNode);
            printf(" %d", n_destDoc);
            printf(" %d", n_destParent);
            printf(" %d", n_deep);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDOMWrapNewCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlDOMWrapReconcileNamespaces(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDOMWrapCtxtPtr ctxt; /* DOM wrapper context, unused at the moment */
    int n_ctxt;
    xmlNodePtr elem; /* the element-node */
    int n_elem;
    int options; /* option flags */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlDOMWrapCtxtPtr;n_ctxt++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlDOMWrapCtxtPtr(n_ctxt, 0);
        elem = gen_xmlNodePtr(n_elem, 1);
        options = gen_int(n_options, 2);

        ret_val = xmlDOMWrapReconcileNamespaces(ctxt, elem, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlDOMWrapCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_elem, elem, 1);
        des_int(n_options, options, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDOMWrapReconcileNamespaces",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_elem);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDOMWrapRemoveNode(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDOMWrapCtxtPtr ctxt; /* a DOM wrapper context */
    int n_ctxt;
    xmlDocPtr doc; /* the doc */
    int n_doc;
    xmlNodePtr node; /* the node to be removed. */
    int n_node;
    int options; /* set of options, unused at the moment */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlDOMWrapCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlDOMWrapCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        node = gen_xmlNodePtr(n_node, 2);
        options = gen_int(n_options, 3);

        ret_val = xmlDOMWrapRemoveNode(ctxt, doc, node, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlDOMWrapCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_node, node, 2);
        des_int(n_options, options, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDOMWrapRemoveNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_node);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDocCopyNode(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr node; /* the node */
    int n_node;
    xmlDocPtr doc; /* the document */
    int n_doc;
    int extended; /* if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable) */
    int n_extended;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_extended = 0;n_extended < gen_nb_int;n_extended++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        extended = gen_int(n_extended, 2);

        ret_val = xmlDocCopyNode(node, doc, extended);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_int(n_extended, extended, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocCopyNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_doc);
            printf(" %d", n_extended);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDocCopyNodeList(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the target document */
    int n_doc;
    xmlNodePtr node; /* the first node in the list. */
    int n_node;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        node = gen_xmlNodePtr(n_node, 1);

        ret_val = xmlDocCopyNodeList(doc, node);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodePtr(n_node, node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocCopyNodeList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDocDump(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    FILE * f; /* the FILE* */
    int n_f;
    xmlDocPtr cur; /* the document */
    int n_cur;

    for (n_f = 0;n_f < gen_nb_FILE_ptr;n_f++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        f = gen_FILE_ptr(n_f, 0);
        cur = gen_xmlDocPtr(n_cur, 1);

        ret_val = xmlDocDump(f, cur);
        desret_int(ret_val);
        call_tests++;
        des_FILE_ptr(n_f, f, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_f);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDocDumpFormatMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlDocPtr cur; /* the document */
    int n_cur;
    xmlChar ** mem; /* OUT: the memory pointer */
    int n_mem;
    int * size; /* OUT: the memory length */
    int n_size;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_mem = 0;n_mem < gen_nb_xmlChar_ptr_ptr;n_mem++) {
    for (n_size = 0;n_size < gen_nb_int_ptr;n_size++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlDocPtr(n_cur, 0);
        mem = gen_xmlChar_ptr_ptr(n_mem, 1);
        size = gen_int_ptr(n_size, 2);
        format = gen_int(n_format, 3);

        xmlDocDumpFormatMemory(cur, mem, size, format);
        call_tests++;
        des_xmlDocPtr(n_cur, cur, 0);
        des_xmlChar_ptr_ptr(n_mem, mem, 1);
        des_int_ptr(n_size, size, 2);
        des_int(n_format, format, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocDumpFormatMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_mem);
            printf(" %d", n_size);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDocDumpFormatMemoryEnc(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlDocPtr out_doc; /* Document to generate XML text from */
    int n_out_doc;
    xmlChar ** doc_txt_ptr; /* Memory pointer for allocated XML text */
    int n_doc_txt_ptr;
    int * doc_txt_len; /* Length of the generated XML text */
    int n_doc_txt_len;
    char * txt_encoding; /* Character encoding to use when generating XML text */
    int n_txt_encoding;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_out_doc = 0;n_out_doc < gen_nb_xmlDocPtr;n_out_doc++) {
    for (n_doc_txt_ptr = 0;n_doc_txt_ptr < gen_nb_xmlChar_ptr_ptr;n_doc_txt_ptr++) {
    for (n_doc_txt_len = 0;n_doc_txt_len < gen_nb_int_ptr;n_doc_txt_len++) {
    for (n_txt_encoding = 0;n_txt_encoding < gen_nb_const_char_ptr;n_txt_encoding++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        out_doc = gen_xmlDocPtr(n_out_doc, 0);
        doc_txt_ptr = gen_xmlChar_ptr_ptr(n_doc_txt_ptr, 1);
        doc_txt_len = gen_int_ptr(n_doc_txt_len, 2);
        txt_encoding = gen_const_char_ptr(n_txt_encoding, 3);
        format = gen_int(n_format, 4);

        xmlDocDumpFormatMemoryEnc(out_doc, doc_txt_ptr, doc_txt_len, (const char *)txt_encoding, format);
        call_tests++;
        des_xmlDocPtr(n_out_doc, out_doc, 0);
        des_xmlChar_ptr_ptr(n_doc_txt_ptr, doc_txt_ptr, 1);
        des_int_ptr(n_doc_txt_len, doc_txt_len, 2);
        des_const_char_ptr(n_txt_encoding, (const char *)txt_encoding, 3);
        des_int(n_format, format, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocDumpFormatMemoryEnc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out_doc);
            printf(" %d", n_doc_txt_ptr);
            printf(" %d", n_doc_txt_len);
            printf(" %d", n_txt_encoding);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDocDumpMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlDocPtr cur; /* the document */
    int n_cur;
    xmlChar ** mem; /* OUT: the memory pointer */
    int n_mem;
    int * size; /* OUT: the memory length */
    int n_size;

    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_mem = 0;n_mem < gen_nb_xmlChar_ptr_ptr;n_mem++) {
    for (n_size = 0;n_size < gen_nb_int_ptr;n_size++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlDocPtr(n_cur, 0);
        mem = gen_xmlChar_ptr_ptr(n_mem, 1);
        size = gen_int_ptr(n_size, 2);

        xmlDocDumpMemory(cur, mem, size);
        call_tests++;
        des_xmlDocPtr(n_cur, cur, 0);
        des_xmlChar_ptr_ptr(n_mem, mem, 1);
        des_int_ptr(n_size, size, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocDumpMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_mem);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDocDumpMemoryEnc(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlDocPtr out_doc; /* Document to generate XML text from */
    int n_out_doc;
    xmlChar ** doc_txt_ptr; /* Memory pointer for allocated XML text */
    int n_doc_txt_ptr;
    int * doc_txt_len; /* Length of the generated XML text */
    int n_doc_txt_len;
    char * txt_encoding; /* Character encoding to use when generating XML text */
    int n_txt_encoding;

    for (n_out_doc = 0;n_out_doc < gen_nb_xmlDocPtr;n_out_doc++) {
    for (n_doc_txt_ptr = 0;n_doc_txt_ptr < gen_nb_xmlChar_ptr_ptr;n_doc_txt_ptr++) {
    for (n_doc_txt_len = 0;n_doc_txt_len < gen_nb_int_ptr;n_doc_txt_len++) {
    for (n_txt_encoding = 0;n_txt_encoding < gen_nb_const_char_ptr;n_txt_encoding++) {
        mem_base = xmlMemBlocks();
        out_doc = gen_xmlDocPtr(n_out_doc, 0);
        doc_txt_ptr = gen_xmlChar_ptr_ptr(n_doc_txt_ptr, 1);
        doc_txt_len = gen_int_ptr(n_doc_txt_len, 2);
        txt_encoding = gen_const_char_ptr(n_txt_encoding, 3);

        xmlDocDumpMemoryEnc(out_doc, doc_txt_ptr, doc_txt_len, (const char *)txt_encoding);
        call_tests++;
        des_xmlDocPtr(n_out_doc, out_doc, 0);
        des_xmlChar_ptr_ptr(n_doc_txt_ptr, doc_txt_ptr, 1);
        des_int_ptr(n_doc_txt_len, doc_txt_len, 2);
        des_const_char_ptr(n_txt_encoding, (const char *)txt_encoding, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocDumpMemoryEnc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out_doc);
            printf(" %d", n_doc_txt_ptr);
            printf(" %d", n_doc_txt_len);
            printf(" %d", n_txt_encoding);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDocFormatDump(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    FILE * f; /* the FILE* */
    int n_f;
    xmlDocPtr cur; /* the document */
    int n_cur;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_f = 0;n_f < gen_nb_FILE_ptr;n_f++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        f = gen_FILE_ptr(n_f, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        format = gen_int(n_format, 2);

        ret_val = xmlDocFormatDump(f, cur, format);
        desret_int(ret_val);
        call_tests++;
        des_FILE_ptr(n_f, f, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_int(n_format, format, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocFormatDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_f);
            printf(" %d", n_cur);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlDocGetRootElement(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDoc * doc; /* the document */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);

        ret_val = xmlDocGetRootElement((const xmlDoc *)doc);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocGetRootElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlDocSetRootElement(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr root; /* the new document root element, if root is NULL no action is taken, to remove a node from a document use xmlUnlinkNode(root) instead. */
    int n_root;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_root = 0;n_root < gen_nb_xmlNodePtr_in;n_root++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        root = gen_xmlNodePtr_in(n_root, 1);

        ret_val = xmlDocSetRootElement(doc, root);
        if (doc == NULL) { xmlFreeNode(root) ; root = NULL ; }
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodePtr_in(n_root, root, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDocSetRootElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_root);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlElemDump(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    FILE * f; /* the FILE * for the output */
    int n_f;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr cur; /* the current node */
    int n_cur;

    for (n_f = 0;n_f < gen_nb_FILE_ptr;n_f++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        f = gen_FILE_ptr(n_f, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        cur = gen_xmlNodePtr(n_cur, 2);

        xmlElemDump(f, doc, cur);
        call_tests++;
        des_FILE_ptr(n_f, f, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_cur, cur, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlElemDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_f);
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlFirstElementChild(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr parent; /* the parent node */
    int n_parent;

    for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) {
        mem_base = xmlMemBlocks();
        parent = gen_xmlNodePtr(n_parent, 0);

        ret_val = xmlFirstElementChild(parent);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_parent, parent, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlFirstElementChild",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlGetBufferAllocationScheme(void) {
    int test_ret = 0;

    int mem_base;
    xmlBufferAllocationScheme ret_val;

        mem_base = xmlMemBlocks();

        ret_val = xmlGetBufferAllocationScheme();
        desret_xmlBufferAllocationScheme(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetBufferAllocationScheme",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetCompressMode(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;

        mem_base = xmlMemBlocks();

        ret_val = xmlGetCompressMode();
        desret_int(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetCompressMode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetDocCompressMode(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDoc * doc; /* the document */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);

        ret_val = xmlGetDocCompressMode((const xmlDoc *)doc);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetDocCompressMode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetIntSubset(void) {
    int test_ret = 0;

    int mem_base;
    xmlDtdPtr ret_val;
    xmlDoc * doc; /* the document pointer */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);

        ret_val = xmlGetIntSubset((const xmlDoc *)doc);
        desret_xmlDtdPtr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetIntSubset",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetLastChild(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNode * parent; /* the parent node */
    int n_parent;

    for (n_parent = 0;n_parent < gen_nb_const_xmlNode_ptr;n_parent++) {
        mem_base = xmlMemBlocks();
        parent = gen_const_xmlNode_ptr(n_parent, 0);

        ret_val = xmlGetLastChild((const xmlNode *)parent);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_parent, (const xmlNode *)parent, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetLastChild",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetLineNo(void) {
    int test_ret = 0;

    int mem_base;
    long ret_val;
    xmlNode * node; /* valid node */
    int n_node;

    for (n_node = 0;n_node < gen_nb_const_xmlNode_ptr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_const_xmlNode_ptr(n_node, 0);

        ret_val = xmlGetLineNo((const xmlNode *)node);
        desret_long(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_node, (const xmlNode *)node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetLineNo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetNoNsProp(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlNode * node; /* the node */
    int n_node;
    xmlChar * name; /* the attribute name */
    int n_name;

    for (n_node = 0;n_node < gen_nb_const_xmlNode_ptr;n_node++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        node = gen_const_xmlNode_ptr(n_node, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlGetNoNsProp((const xmlNode *)node, (const xmlChar *)name);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_node, (const xmlNode *)node, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetNoNsProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetNodePath(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlNode * node; /* a node */
    int n_node;

    for (n_node = 0;n_node < gen_nb_const_xmlNode_ptr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_const_xmlNode_ptr(n_node, 0);

        ret_val = xmlGetNodePath((const xmlNode *)node);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_node, (const xmlNode *)node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetNodePath",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlGetNsList(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlGetNsProp(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlNode * node; /* the node */
    int n_node;
    xmlChar * name; /* the attribute name */
    int n_name;
    xmlChar * nameSpace; /* the URI of the namespace */
    int n_nameSpace;

    for (n_node = 0;n_node < gen_nb_const_xmlNode_ptr;n_node++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_nameSpace = 0;n_nameSpace < gen_nb_const_xmlChar_ptr;n_nameSpace++) {
        mem_base = xmlMemBlocks();
        node = gen_const_xmlNode_ptr(n_node, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        nameSpace = gen_const_xmlChar_ptr(n_nameSpace, 2);

        ret_val = xmlGetNsProp((const xmlNode *)node, (const xmlChar *)name, (const xmlChar *)nameSpace);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_node, (const xmlNode *)node, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_nameSpace, (const xmlChar *)nameSpace, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetNsProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_name);
            printf(" %d", n_nameSpace);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetProp(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlNode * node; /* the node */
    int n_node;
    xmlChar * name; /* the attribute name */
    int n_name;

    for (n_node = 0;n_node < gen_nb_const_xmlNode_ptr;n_node++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        node = gen_const_xmlNode_ptr(n_node, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlGetProp((const xmlNode *)node, (const xmlChar *)name);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_node, (const xmlNode *)node, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHasNsProp(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttrPtr ret_val;
    xmlNode * node; /* the node */
    int n_node;
    xmlChar * name; /* the attribute name */
    int n_name;
    xmlChar * nameSpace; /* the URI of the namespace */
    int n_nameSpace;

    for (n_node = 0;n_node < gen_nb_const_xmlNode_ptr;n_node++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_nameSpace = 0;n_nameSpace < gen_nb_const_xmlChar_ptr;n_nameSpace++) {
        mem_base = xmlMemBlocks();
        node = gen_const_xmlNode_ptr(n_node, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        nameSpace = gen_const_xmlChar_ptr(n_nameSpace, 2);

        ret_val = xmlHasNsProp((const xmlNode *)node, (const xmlChar *)name, (const xmlChar *)nameSpace);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_node, (const xmlNode *)node, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_nameSpace, (const xmlChar *)nameSpace, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHasNsProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_name);
            printf(" %d", n_nameSpace);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlHasProp(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttrPtr ret_val;
    xmlNode * node; /* the node */
    int n_node;
    xmlChar * name; /* the attribute name */
    int n_name;

    for (n_node = 0;n_node < gen_nb_const_xmlNode_ptr;n_node++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        node = gen_const_xmlNode_ptr(n_node, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlHasProp((const xmlNode *)node, (const xmlChar *)name);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_node, (const xmlNode *)node, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlHasProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsBlankNode(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlNode * node; /* the node */
    int n_node;

    for (n_node = 0;n_node < gen_nb_const_xmlNode_ptr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_const_xmlNode_ptr(n_node, 0);

        ret_val = xmlIsBlankNode((const xmlNode *)node);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_node, (const xmlNode *)node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsBlankNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsXHTML(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * systemID; /* the system identifier */
    int n_systemID;
    xmlChar * publicID; /* the public identifier */
    int n_publicID;

    for (n_systemID = 0;n_systemID < gen_nb_const_xmlChar_ptr;n_systemID++) {
    for (n_publicID = 0;n_publicID < gen_nb_const_xmlChar_ptr;n_publicID++) {
        mem_base = xmlMemBlocks();
        systemID = gen_const_xmlChar_ptr(n_systemID, 0);
        publicID = gen_const_xmlChar_ptr(n_publicID, 1);

        ret_val = xmlIsXHTML((const xmlChar *)systemID, (const xmlChar *)publicID);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_systemID, (const xmlChar *)systemID, 0);
        des_const_xmlChar_ptr(n_publicID, (const xmlChar *)publicID, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsXHTML",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_systemID);
            printf(" %d", n_publicID);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlLastElementChild(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr parent; /* the parent node */
    int n_parent;

    for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) {
        mem_base = xmlMemBlocks();
        parent = gen_xmlNodePtr(n_parent, 0);

        ret_val = xmlLastElementChild(parent);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_parent, parent, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlLastElementChild",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNewCDataBlock(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * content; /* the CDATA block content content */
    int n_content;
    int len; /* the length of the block */
    int n_len;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);
        len = gen_int(n_len, 2);
        if ((content != NULL) &&
            (len > (int) strlen((const char *) content) + 1))
            continue;

        ret_val = xmlNewCDataBlock(doc, (const xmlChar *)content, len);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewCDataBlock",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_content);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewCharRef(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * name; /* the char ref string, starting with # or "&# ... ;" */
    int n_name;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlNewCharRef(doc, (const xmlChar *)name);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewCharRef",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewChild(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
#ifdef LIBXML_TREE_ENABLED
    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr parent; /* the parent node */
    int n_parent;
    xmlNsPtr ns; /* a namespace if any */
    int n_ns;
    xmlChar * name; /* the name of the child */
    int n_name;
    xmlChar * content; /* the XML content of the child if any. */
    int n_content;

    for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        parent = gen_xmlNodePtr(n_parent, 0);
        ns = gen_xmlNsPtr(n_ns, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        content = gen_const_xmlChar_ptr(n_content, 3);

        ret_val = xmlNewChild(parent, ns, (const xmlChar *)name, (const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_parent, parent, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewChild",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlNewComment(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlChar * content; /* the comment content */
    int n_content;

    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        content = gen_const_xmlChar_ptr(n_content, 0);

        ret_val = xmlNewComment((const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewComment",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_content);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDoc(void) {
    int test_ret = 0;

    int mem_base;
    xmlDocPtr ret_val;
    xmlChar * version; /* xmlChar string giving the version of XML "1.0" */
    int n_version;

    for (n_version = 0;n_version < gen_nb_const_xmlChar_ptr;n_version++) {
        mem_base = xmlMemBlocks();
        version = gen_const_xmlChar_ptr(n_version, 0);

        ret_val = xmlNewDoc((const xmlChar *)version);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_version, (const xmlChar *)version, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_version);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDocComment(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * content; /* the comment content */
    int n_content;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        ret_val = xmlNewDocComment(doc, (const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocComment",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDocFragment(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the document owning the fragment */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);

        ret_val = xmlNewDocFragment(doc);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocFragment",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNewDocNode(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNsPtr ns; /* namespace if any */
    int n_ns;
    xmlChar * name; /* the node name */
    int n_name;
    xmlChar * content; /* the XML text content if any */
    int n_content;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        ns = gen_xmlNsPtr(n_ns, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        content = gen_const_xmlChar_ptr(n_content, 3);

        ret_val = xmlNewDocNode(doc, ns, (const xmlChar *)name, (const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDocNodeEatName(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNsPtr ns; /* namespace if any */
    int n_ns;
    xmlChar * name; /* the node name */
    int n_name;
    xmlChar * content; /* the XML text content if any */
    int n_content;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_eaten_name;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        ns = gen_xmlNsPtr(n_ns, 1);
        name = gen_eaten_name(n_name, 2);
        content = gen_const_xmlChar_ptr(n_content, 3);

        ret_val = xmlNewDocNodeEatName(doc, ns, name, (const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        des_eaten_name(n_name, name, 2);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocNodeEatName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDocPI(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the target document */
    int n_doc;
    xmlChar * name; /* the processing instruction name */
    int n_name;
    xmlChar * content; /* the PI content */
    int n_content;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        content = gen_const_xmlChar_ptr(n_content, 2);

        ret_val = xmlNewDocPI(doc, (const xmlChar *)name, (const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocPI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDocProp(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttrPtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * name; /* the name of the attribute */
    int n_name;
    xmlChar * value; /* the value of the attribute */
    int n_value;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        value = gen_const_xmlChar_ptr(n_value, 2);

        ret_val = xmlNewDocProp(doc, (const xmlChar *)name, (const xmlChar *)value);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDocRawNode(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
#ifdef LIBXML_TREE_ENABLED
    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNsPtr ns; /* namespace if any */
    int n_ns;
    xmlChar * name; /* the node name */
    int n_name;
    xmlChar * content; /* the text content if any */
    int n_content;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        ns = gen_xmlNsPtr(n_ns, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        content = gen_const_xmlChar_ptr(n_content, 3);

        ret_val = xmlNewDocRawNode(doc, ns, (const xmlChar *)name, (const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocRawNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlNewDocText(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDoc * doc; /* the document */
    int n_doc;
    xmlChar * content; /* the text content */
    int n_content;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        ret_val = xmlNewDocText((const xmlDoc *)doc, (const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocText",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDocTextLen(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * content; /* the text content */
    int n_content;
    int len; /* the text len. */
    int n_len;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);
        len = gen_int(n_len, 2);
        if ((content != NULL) &&
            (len > (int) strlen((const char *) content) + 1))
            continue;

        ret_val = xmlNewDocTextLen(doc, (const xmlChar *)content, len);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocTextLen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_content);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDtd(void) {
    int test_ret = 0;

    int mem_base;
    xmlDtdPtr ret_val;
    xmlDocPtr doc; /* the document pointer */
    int n_doc;
    xmlChar * name; /* the DTD name */
    int n_name;
    xmlChar * ExternalID; /* the external ID */
    int n_ExternalID;
    xmlChar * SystemID; /* the system ID */
    int n_SystemID;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2);
        SystemID = gen_const_xmlChar_ptr(n_SystemID, 3);

        ret_val = xmlNewDtd(doc, (const xmlChar *)name, (const xmlChar *)ExternalID, (const xmlChar *)SystemID);
        desret_xmlDtdPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_ExternalID, (const xmlChar *)ExternalID, 2);
        des_const_xmlChar_ptr(n_SystemID, (const xmlChar *)SystemID, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDtd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf(" %d", n_ExternalID);
            printf(" %d", n_SystemID);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewNode(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNsPtr ns; /* namespace if any */
    int n_ns;
    xmlChar * name; /* the node name */
    int n_name;

    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        ns = gen_xmlNsPtr(n_ns, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlNewNode(ns, (const xmlChar *)name);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNsPtr(n_ns, ns, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewNodeEatName(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNsPtr ns; /* namespace if any */
    int n_ns;
    xmlChar * name; /* the node name */
    int n_name;

    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_eaten_name;n_name++) {
        mem_base = xmlMemBlocks();
        ns = gen_xmlNsPtr(n_ns, 0);
        name = gen_eaten_name(n_name, 1);

        ret_val = xmlNewNodeEatName(ns, name);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNsPtr(n_ns, ns, 0);
        des_eaten_name(n_name, name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewNodeEatName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewNs(void) {
    int test_ret = 0;

    int mem_base;
    xmlNsPtr ret_val;
    xmlNodePtr node; /* the element carrying the namespace */
    int n_node;
    xmlChar * href; /* the URI associated */
    int n_href;
    xmlChar * prefix; /* the prefix for the namespace */
    int n_prefix;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_href = 0;n_href < gen_nb_const_xmlChar_ptr;n_href++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        href = gen_const_xmlChar_ptr(n_href, 1);
        prefix = gen_const_xmlChar_ptr(n_prefix, 2);

        ret_val = xmlNewNs(node, (const xmlChar *)href, (const xmlChar *)prefix);
        if ((node == NULL) && (ret_val != NULL)) xmlFreeNs(ret_val);
        desret_xmlNsPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_const_xmlChar_ptr(n_href, (const xmlChar *)href, 1);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_href);
            printf(" %d", n_prefix);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewNsProp(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttrPtr ret_val;
    xmlNodePtr node; /* the holding node */
    int n_node;
    xmlNsPtr ns; /* the namespace */
    int n_ns;
    xmlChar * name; /* the name of the attribute */
    int n_name;
    xmlChar * value; /* the value of the attribute */
    int n_value;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        ns = gen_xmlNsPtr(n_ns, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        value = gen_const_xmlChar_ptr(n_value, 3);

        ret_val = xmlNewNsProp(node, ns, (const xmlChar *)name, (const xmlChar *)value);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewNsProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewNsPropEatName(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttrPtr ret_val;
    xmlNodePtr node; /* the holding node */
    int n_node;
    xmlNsPtr ns; /* the namespace */
    int n_ns;
    xmlChar * name; /* the name of the attribute */
    int n_name;
    xmlChar * value; /* the value of the attribute */
    int n_value;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_eaten_name;n_name++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        ns = gen_xmlNsPtr(n_ns, 1);
        name = gen_eaten_name(n_name, 2);
        value = gen_const_xmlChar_ptr(n_value, 3);

        ret_val = xmlNewNsPropEatName(node, ns, name, (const xmlChar *)value);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        des_eaten_name(n_name, name, 2);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewNsPropEatName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewPI(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlChar * name; /* the processing instruction name */
    int n_name;
    xmlChar * content; /* the PI content */
    int n_content;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        ret_val = xmlNewPI((const xmlChar *)name, (const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewPI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewProp(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
#ifdef LIBXML_TREE_ENABLED
    int mem_base;
    xmlAttrPtr ret_val;
    xmlNodePtr node; /* the holding node */
    int n_node;
    xmlChar * name; /* the name of the attribute */
    int n_name;
    xmlChar * value; /* the value of the attribute */
    int n_value;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        value = gen_const_xmlChar_ptr(n_value, 2);

        ret_val = xmlNewProp(node, (const xmlChar *)name, (const xmlChar *)value);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlNewReference(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDoc * doc; /* the document */
    int n_doc;
    xmlChar * name; /* the reference name, or the reference string with & and ; */
    int n_name;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlNewReference((const xmlDoc *)doc, (const xmlChar *)name);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewReference",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewText(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlChar * content; /* the text content */
    int n_content;

    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        content = gen_const_xmlChar_ptr(n_content, 0);

        ret_val = xmlNewText((const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewText",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_content);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewTextChild(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
#ifdef LIBXML_TREE_ENABLED
    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr parent; /* the parent node */
    int n_parent;
    xmlNsPtr ns; /* a namespace if any */
    int n_ns;
    xmlChar * name; /* the name of the child */
    int n_name;
    xmlChar * content; /* the text content of the child if any. */
    int n_content;

    for (n_parent = 0;n_parent < gen_nb_xmlNodePtr;n_parent++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        parent = gen_xmlNodePtr(n_parent, 0);
        ns = gen_xmlNsPtr(n_ns, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        content = gen_const_xmlChar_ptr(n_content, 3);

        ret_val = xmlNewTextChild(parent, ns, (const xmlChar *)name, (const xmlChar *)content);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_parent, parent, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewTextChild",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_parent);
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlNewTextLen(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlChar * content; /* the text content */
    int n_content;
    int len; /* the text len. */
    int n_len;

    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        content = gen_const_xmlChar_ptr(n_content, 0);
        len = gen_int(n_len, 1);
        if ((content != NULL) &&
            (len > (int) strlen((const char *) content) + 1))
            continue;

        ret_val = xmlNewTextLen((const xmlChar *)content, len);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewTextLen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_content);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNextElementSibling(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr node; /* the current node */
    int n_node;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);

        ret_val = xmlNextElementSibling(node);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNextElementSibling",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNodeAddContent(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr cur; /* the node being modified */
    int n_cur;
    xmlChar * content; /* extra content */
    int n_content;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        xmlNodeAddContent(cur, (const xmlChar *)content);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeAddContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeAddContentLen(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr cur; /* the node being modified */
    int n_cur;
    xmlChar * content; /* extra content */
    int n_content;
    int len; /* the size of @content */
    int n_len;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);
        len = gen_int(n_len, 2);
        if ((content != NULL) &&
            (len > (int) strlen((const char *) content) + 1))
            continue;

        xmlNodeAddContentLen(cur, (const xmlChar *)content, len);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeAddContentLen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_content);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeBufGetContent(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlBufferPtr buffer; /* a buffer */
    int n_buffer;
    xmlNode * cur; /* the node being read */
    int n_cur;

    for (n_buffer = 0;n_buffer < gen_nb_xmlBufferPtr;n_buffer++) {
    for (n_cur = 0;n_cur < gen_nb_const_xmlNode_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        buffer = gen_xmlBufferPtr(n_buffer, 0);
        cur = gen_const_xmlNode_ptr(n_cur, 1);

        ret_val = xmlNodeBufGetContent(buffer, (const xmlNode *)cur);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buffer, buffer, 0);
        des_const_xmlNode_ptr(n_cur, (const xmlNode *)cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeBufGetContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeDump(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr cur; /* the current node */
    int n_cur;
    int level; /* the imbrication level for indenting */
    int n_level;
    int format; /* is formatting allowed */
    int n_format;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_level = 0;n_level < gen_nb_int;n_level++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        cur = gen_xmlNodePtr(n_cur, 2);
        level = gen_int(n_level, 3);
        format = gen_int(n_format, 4);

        ret_val = xmlNodeDump(buf, doc, cur, level, format);
        desret_int(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_cur, cur, 2);
        des_int(n_level, level, 3);
        des_int(n_format, format, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf(" %d", n_level);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNodeDumpOutput(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr cur; /* the current node */
    int n_cur;
    int level; /* the imbrication level for indenting */
    int n_level;
    int format; /* is formatting allowed */
    int n_format;
    char * encoding; /* an optional encoding string */
    int n_encoding;

    for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_level = 0;n_level < gen_nb_int;n_level++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlOutputBufferPtr(n_buf, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        cur = gen_xmlNodePtr(n_cur, 2);
        level = gen_int(n_level, 3);
        format = gen_int(n_format, 4);
        encoding = gen_const_char_ptr(n_encoding, 5);

        xmlNodeDumpOutput(buf, doc, cur, level, format, (const char *)encoding);
        call_tests++;
        des_xmlOutputBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_cur, cur, 2);
        des_int(n_level, level, 3);
        des_int(n_format, format, 4);
        des_const_char_ptr(n_encoding, (const char *)encoding, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeDumpOutput",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf(" %d", n_level);
            printf(" %d", n_format);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNodeGetBase(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlDoc * doc; /* the document the node pertains to */
    int n_doc;
    xmlNode * cur; /* the node being checked */
    int n_cur;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_const_xmlNode_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);
        cur = gen_const_xmlNode_ptr(n_cur, 1);

        ret_val = xmlNodeGetBase((const xmlDoc *)doc, (const xmlNode *)cur);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        des_const_xmlNode_ptr(n_cur, (const xmlNode *)cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeGetBase",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeGetContent(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlNode * cur; /* the node being read */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_const_xmlNode_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlNode_ptr(n_cur, 0);

        ret_val = xmlNodeGetContent((const xmlNode *)cur);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_cur, (const xmlNode *)cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeGetContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeGetLang(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlNode * cur; /* the node being checked */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_const_xmlNode_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlNode_ptr(n_cur, 0);

        ret_val = xmlNodeGetLang((const xmlNode *)cur);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_cur, (const xmlNode *)cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeGetLang",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeGetSpacePreserve(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlNode * cur; /* the node being checked */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_const_xmlNode_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlNode_ptr(n_cur, 0);

        ret_val = xmlNodeGetSpacePreserve((const xmlNode *)cur);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_cur, (const xmlNode *)cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeGetSpacePreserve",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeIsText(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlNode * node; /* the node */
    int n_node;

    for (n_node = 0;n_node < gen_nb_const_xmlNode_ptr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_const_xmlNode_ptr(n_node, 0);

        ret_val = xmlNodeIsText((const xmlNode *)node);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlNode_ptr(n_node, (const xmlNode *)node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeIsText",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeListGetRawString(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlDoc * doc; /* the document */
    int n_doc;
    xmlNode * list; /* a Node list */
    int n_list;
    int inLine; /* should we replace entity contents or show their external form */
    int n_inLine;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
    for (n_list = 0;n_list < gen_nb_const_xmlNode_ptr;n_list++) {
    for (n_inLine = 0;n_inLine < gen_nb_int;n_inLine++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);
        list = gen_const_xmlNode_ptr(n_list, 1);
        inLine = gen_int(n_inLine, 2);

        ret_val = xmlNodeListGetRawString((const xmlDoc *)doc, (const xmlNode *)list, inLine);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        des_const_xmlNode_ptr(n_list, (const xmlNode *)list, 1);
        des_int(n_inLine, inLine, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeListGetRawString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_list);
            printf(" %d", n_inLine);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNodeListGetString(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNode * list; /* a Node list */
    int n_list;
    int inLine; /* should we replace entity contents or show their external form */
    int n_inLine;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_list = 0;n_list < gen_nb_const_xmlNode_ptr;n_list++) {
    for (n_inLine = 0;n_inLine < gen_nb_int;n_inLine++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        list = gen_const_xmlNode_ptr(n_list, 1);
        inLine = gen_int(n_inLine, 2);

        ret_val = xmlNodeListGetString(doc, (const xmlNode *)list, inLine);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlNode_ptr(n_list, (const xmlNode *)list, 1);
        des_int(n_inLine, inLine, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeListGetString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_list);
            printf(" %d", n_inLine);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeSetBase(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    xmlNodePtr cur; /* the node being changed */
    int n_cur;
    xmlChar * uri; /* the new base URI */
    int n_uri;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_uri = 0;n_uri < gen_nb_const_xmlChar_ptr;n_uri++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        uri = gen_const_xmlChar_ptr(n_uri, 1);

        xmlNodeSetBase(cur, (const xmlChar *)uri);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_const_xmlChar_ptr(n_uri, (const xmlChar *)uri, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeSetBase",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_uri);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNodeSetContent(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr cur; /* the node being modified */
    int n_cur;
    xmlChar * content; /* the new value of the content */
    int n_content;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        xmlNodeSetContent(cur, (const xmlChar *)content);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeSetContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNodeSetContentLen(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlNodePtr cur; /* the node being modified */
    int n_cur;
    xmlChar * content; /* the new value of the content */
    int n_content;
    int len; /* the size of @content */
    int n_len;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);
        len = gen_int(n_len, 2);
        if ((content != NULL) &&
            (len > (int) strlen((const char *) content) + 1))
            continue;

        xmlNodeSetContentLen(cur, (const xmlChar *)content, len);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeSetContentLen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_content);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNodeSetLang(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlNodePtr cur; /* the node being changed */
    int n_cur;
    xmlChar * lang; /* the language description */
    int n_lang;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_lang = 0;n_lang < gen_nb_const_xmlChar_ptr;n_lang++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        lang = gen_const_xmlChar_ptr(n_lang, 1);

        xmlNodeSetLang(cur, (const xmlChar *)lang);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_const_xmlChar_ptr(n_lang, (const xmlChar *)lang, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeSetLang",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_lang);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNodeSetName(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlNodePtr cur; /* the node being changed */
    int n_cur;
    xmlChar * name; /* the new tag name */
    int n_name;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        xmlNodeSetName(cur, (const xmlChar *)name);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeSetName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNodeSetSpacePreserve(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlNodePtr cur; /* the node being changed */
    int n_cur;
    int val; /* the xml:space value ("0": default, 1: "preserve") */
    int n_val;

    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodePtr(n_cur, 0);
        val = gen_int(n_val, 1);

        xmlNodeSetSpacePreserve(cur, val);
        call_tests++;
        des_xmlNodePtr(n_cur, cur, 0);
        des_int(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNodeSetSpacePreserve",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlPreviousElementSibling(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr node; /* the current node */
    int n_node;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);

        ret_val = xmlPreviousElementSibling(node);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPreviousElementSibling",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlReconciliateNs(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED)
#ifdef LIBXML_TREE_ENABLED
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr tree; /* a node defining the subtree to reconciliate */
    int n_tree;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        tree = gen_xmlNodePtr(n_tree, 1);

        ret_val = xmlReconciliateNs(doc, tree);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodePtr(n_tree, tree, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReconciliateNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_tree);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlRemoveProp(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlAttrPtr cur; /* an attribute */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_xmlAttrPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlAttrPtr(n_cur, 0);

        ret_val = xmlRemoveProp(cur);
        cur = NULL;
        desret_int(ret_val);
        call_tests++;
        des_xmlAttrPtr(n_cur, cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRemoveProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlReplaceNode(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr old; /* the old node */
    int n_old;
    xmlNodePtr cur; /* the node */
    int n_cur;

    for (n_old = 0;n_old < gen_nb_xmlNodePtr;n_old++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr_in;n_cur++) {
        mem_base = xmlMemBlocks();
        old = gen_xmlNodePtr(n_old, 0);
        cur = gen_xmlNodePtr_in(n_cur, 1);

        ret_val = xmlReplaceNode(old, cur);
        if (cur != NULL) {
              xmlUnlinkNode(cur);
              xmlFreeNode(cur) ; cur = NULL ; }
          if (old != NULL) {
              xmlUnlinkNode(old);
              xmlFreeNode(old) ; old = NULL ; }
	  ret_val = NULL;
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_old, old, 0);
        des_xmlNodePtr_in(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReplaceNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_old);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSaveFile(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    const char * filename; /* the filename (or URL) */
    int n_filename;
    xmlDocPtr cur; /* the document */
    int n_cur;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);
        cur = gen_xmlDocPtr(n_cur, 1);

        ret_val = xmlSaveFile(filename, cur);
        desret_int(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSaveFileEnc(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    const char * filename; /* the filename (or URL) */
    int n_filename;
    xmlDocPtr cur; /* the document */
    int n_cur;
    char * encoding; /* the name of an encoding (or NULL) */
    int n_encoding;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);

        ret_val = xmlSaveFileEnc(filename, cur, (const char *)encoding);
        desret_int(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveFileEnc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSaveFileTo(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlOutputBufferPtr buf; /* an output I/O buffer */
    int n_buf;
    xmlDocPtr cur; /* the document */
    int n_cur;
    char * encoding; /* the encoding if any assuming the I/O layer handles the transcoding */
    int n_encoding;

    for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlOutputBufferPtr(n_buf, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);

        ret_val = xmlSaveFileTo(buf, cur, (const char *)encoding);
        buf = NULL;
        desret_int(ret_val);
        call_tests++;
        des_xmlOutputBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveFileTo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSaveFormatFile(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    const char * filename; /* the filename (or URL) */
    int n_filename;
    xmlDocPtr cur; /* the document */
    int n_cur;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        format = gen_int(n_format, 2);

        ret_val = xmlSaveFormatFile(filename, cur, format);
        desret_int(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_int(n_format, format, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveFormatFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_cur);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSaveFormatFileEnc(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    const char * filename; /* the filename or URL to output */
    int n_filename;
    xmlDocPtr cur; /* the document being saved */
    int n_cur;
    char * encoding; /* the name of the encoding to use or NULL. */
    int n_encoding;
    int format; /* should formatting spaces be added. */
    int n_format;

    for (n_filename = 0;n_filename < gen_nb_fileoutput;n_filename++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        filename = gen_fileoutput(n_filename, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        format = gen_int(n_format, 3);

        ret_val = xmlSaveFormatFileEnc(filename, cur, (const char *)encoding, format);
        desret_int(ret_val);
        call_tests++;
        des_fileoutput(n_filename, filename, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_int(n_format, format, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveFormatFileEnc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSaveFormatFileTo(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlOutputBufferPtr buf; /* an output I/O buffer */
    int n_buf;
    xmlDocPtr cur; /* the document */
    int n_cur;
    char * encoding; /* the encoding if any assuming the I/O layer handles the transcoding */
    int n_encoding;
    int format; /* should formatting spaces been added */
    int n_format;

    for (n_buf = 0;n_buf < gen_nb_xmlOutputBufferPtr;n_buf++) {
    for (n_cur = 0;n_cur < gen_nb_xmlDocPtr;n_cur++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_format = 0;n_format < gen_nb_int;n_format++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlOutputBufferPtr(n_buf, 0);
        cur = gen_xmlDocPtr(n_cur, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        format = gen_int(n_format, 3);

        ret_val = xmlSaveFormatFileTo(buf, cur, (const char *)encoding, format);
        buf = NULL;
        desret_int(ret_val);
        call_tests++;
        des_xmlOutputBufferPtr(n_buf, buf, 0);
        des_xmlDocPtr(n_cur, cur, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_int(n_format, format, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveFormatFileTo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_cur);
            printf(" %d", n_encoding);
            printf(" %d", n_format);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSearchNs(void) {
    int test_ret = 0;

    int mem_base;
    xmlNsPtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr node; /* the current node */
    int n_node;
    xmlChar * nameSpace; /* the namespace prefix */
    int n_nameSpace;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_nameSpace = 0;n_nameSpace < gen_nb_const_xmlChar_ptr;n_nameSpace++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        node = gen_xmlNodePtr(n_node, 1);
        nameSpace = gen_const_xmlChar_ptr(n_nameSpace, 2);

        ret_val = xmlSearchNs(doc, node, (const xmlChar *)nameSpace);
        desret_xmlNsPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodePtr(n_node, node, 1);
        des_const_xmlChar_ptr(n_nameSpace, (const xmlChar *)nameSpace, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSearchNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_node);
            printf(" %d", n_nameSpace);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSearchNsByHref(void) {
    int test_ret = 0;

    int mem_base;
    xmlNsPtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr node; /* the current node */
    int n_node;
    xmlChar * href; /* the namespace value */
    int n_href;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_href = 0;n_href < gen_nb_const_xmlChar_ptr;n_href++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        node = gen_xmlNodePtr(n_node, 1);
        href = gen_const_xmlChar_ptr(n_href, 2);

        ret_val = xmlSearchNsByHref(doc, node, (const xmlChar *)href);
        desret_xmlNsPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodePtr(n_node, node, 1);
        des_const_xmlChar_ptr(n_href, (const xmlChar *)href, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSearchNsByHref",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_node);
            printf(" %d", n_href);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSetBufferAllocationScheme(void) {
    int test_ret = 0;

    int mem_base;
    xmlBufferAllocationScheme scheme; /* allocation method to use */
    int n_scheme;

    for (n_scheme = 0;n_scheme < gen_nb_xmlBufferAllocationScheme;n_scheme++) {
        mem_base = xmlMemBlocks();
        scheme = gen_xmlBufferAllocationScheme(n_scheme, 0);

        xmlSetBufferAllocationScheme(scheme);
        call_tests++;
        des_xmlBufferAllocationScheme(n_scheme, scheme, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSetBufferAllocationScheme",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_scheme);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSetCompressMode(void) {
    int test_ret = 0;

    int mem_base;
    int mode; /* the compression ratio */
    int n_mode;

    for (n_mode = 0;n_mode < gen_nb_int;n_mode++) {
        mem_base = xmlMemBlocks();
        mode = gen_int(n_mode, 0);

        xmlSetCompressMode(mode);
        call_tests++;
        des_int(n_mode, mode, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSetCompressMode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_mode);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSetDocCompressMode(void) {
    int test_ret = 0;

    int mem_base;
    xmlDocPtr doc; /* the document */
    int n_doc;
    int mode; /* the compression ratio */
    int n_mode;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_mode = 0;n_mode < gen_nb_int;n_mode++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        mode = gen_int(n_mode, 1);

        xmlSetDocCompressMode(doc, mode);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_int(n_mode, mode, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSetDocCompressMode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_mode);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSetNs(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr node; /* a node in the document */
    int n_node;
    xmlNsPtr ns; /* a namespace pointer */
    int n_ns;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        ns = gen_xmlNsPtr(n_ns, 1);

        xmlSetNs(node, ns);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSetNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_ns);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSetNsProp(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED)
    int mem_base;
    xmlAttrPtr ret_val;
    xmlNodePtr node; /* the node */
    int n_node;
    xmlNsPtr ns; /* the namespace definition */
    int n_ns;
    xmlChar * name; /* the attribute name */
    int n_name;
    xmlChar * value; /* the attribute value */
    int n_value;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        ns = gen_xmlNsPtr(n_ns, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        value = gen_const_xmlChar_ptr(n_value, 3);

        ret_val = xmlSetNsProp(node, ns, (const xmlChar *)name, (const xmlChar *)value);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSetNsProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSetProp(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED)
    int mem_base;
    xmlAttrPtr ret_val;
    xmlNodePtr node; /* the node */
    int n_node;
    xmlChar * name; /* the attribute name (a QName) */
    int n_name;
    xmlChar * value; /* the attribute value */
    int n_value;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        value = gen_const_xmlChar_ptr(n_value, 2);

        ret_val = xmlSetProp(node, (const xmlChar *)name, (const xmlChar *)value);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSetProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSplitQName2(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * name; /* the full QName */
    int n_name;
    xmlChar ** prefix; /* a xmlChar ** */
    int n_prefix;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_prefix = 0;n_prefix < gen_nb_xmlChar_ptr_ptr;n_prefix++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);
        prefix = gen_xmlChar_ptr_ptr(n_prefix, 1);

        ret_val = xmlSplitQName2((const xmlChar *)name, prefix);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        des_xmlChar_ptr_ptr(n_prefix, prefix, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSplitQName2",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf(" %d", n_prefix);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSplitQName3(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlChar * name; /* the full QName */
    int n_name;
    int * len; /* an int * */
    int n_len;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);
        len = gen_int_ptr(n_len, 1);

        ret_val = xmlSplitQName3((const xmlChar *)name, len);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        des_int_ptr(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSplitQName3",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStringGetNodeList(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDoc * doc; /* the document */
    int n_doc;
    xmlChar * value; /* the value of the attribute */
    int n_value;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);

        ret_val = xmlStringGetNodeList((const xmlDoc *)doc, (const xmlChar *)value);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStringGetNodeList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStringLenGetNodeList(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlDoc * doc; /* the document */
    int n_doc;
    xmlChar * value; /* the value of the text */
    int n_value;
    int len; /* the length of the string value */
    int n_len;

    for (n_doc = 0;n_doc < gen_nb_const_xmlDoc_ptr;n_doc++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        doc = gen_const_xmlDoc_ptr(n_doc, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);
        len = gen_int(n_len, 2);
        if ((value != NULL) &&
            (len > (int) strlen((const char *) value) + 1))
            continue;

        ret_val = xmlStringLenGetNodeList((const xmlDoc *)doc, (const xmlChar *)value, len);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_const_xmlDoc_ptr(n_doc, (const xmlDoc *)doc, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStringLenGetNodeList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_value);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlTextConcat(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlNodePtr node; /* the node */
    int n_node;
    xmlChar * content; /* the content */
    int n_content;
    int len; /* @content length */
    int n_len;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);
        len = gen_int(n_len, 2);
        if ((content != NULL) &&
            (len > (int) strlen((const char *) content) + 1))
            continue;

        ret_val = xmlTextConcat(node, (const xmlChar *)content, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextConcat",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_content);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlTextMerge(void) {
    int test_ret = 0;

    int mem_base;
    xmlNodePtr ret_val;
    xmlNodePtr first; /* the first text node */
    int n_first;
    xmlNodePtr second; /* the second text node being merged */
    int n_second;

    for (n_first = 0;n_first < gen_nb_xmlNodePtr_in;n_first++) {
    for (n_second = 0;n_second < gen_nb_xmlNodePtr_in;n_second++) {
        mem_base = xmlMemBlocks();
        first = gen_xmlNodePtr_in(n_first, 0);
        second = gen_xmlNodePtr_in(n_second, 1);

        ret_val = xmlTextMerge(first, second);
        if ((first != NULL) && (first->type != XML_TEXT_NODE)) {
              xmlUnlinkNode(second);
              xmlFreeNode(second) ; second = NULL ; }
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlNodePtr_in(n_first, first, 0);
        des_xmlNodePtr_in(n_second, second, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextMerge",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_first);
            printf(" %d", n_second);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlUnsetNsProp(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodePtr node; /* the node */
    int n_node;
    xmlNsPtr ns; /* the namespace definition */
    int n_ns;
    xmlChar * name; /* the attribute name */
    int n_name;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        ns = gen_xmlNsPtr(n_ns, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);

        ret_val = xmlUnsetNsProp(node, ns, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_xmlNsPtr(n_ns, ns, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUnsetNsProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_ns);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUnsetProp(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodePtr node; /* the node */
    int n_node;
    xmlChar * name; /* the attribute name */
    int n_name;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlUnsetProp(node, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUnsetProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateNCName(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) || defined(LIBXML_LEGACY_ENABLED)
#ifdef LIBXML_TREE_ENABLED
    int mem_base;
    int ret_val;
    xmlChar * value; /* the value to check */
    int n_value;
    int space; /* allow spaces in front and end of the string */
    int n_space;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_space = 0;n_space < gen_nb_int;n_space++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);
        space = gen_int(n_space, 1);

        ret_val = xmlValidateNCName((const xmlChar *)value, space);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        des_int(n_space, space, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateNCName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf(" %d", n_space);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlValidateNMToken(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
#ifdef LIBXML_TREE_ENABLED
    int mem_base;
    int ret_val;
    xmlChar * value; /* the value to check */
    int n_value;
    int space; /* allow spaces in front and end of the string */
    int n_space;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_space = 0;n_space < gen_nb_int;n_space++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);
        space = gen_int(n_space, 1);

        ret_val = xmlValidateNMToken((const xmlChar *)value, space);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        des_int(n_space, space, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateNMToken",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf(" %d", n_space);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlValidateName(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
#ifdef LIBXML_TREE_ENABLED
    int mem_base;
    int ret_val;
    xmlChar * value; /* the value to check */
    int n_value;
    int space; /* allow spaces in front and end of the string */
    int n_space;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_space = 0;n_space < gen_nb_int;n_space++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);
        space = gen_int(n_space, 1);

        ret_val = xmlValidateName((const xmlChar *)value, space);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        des_int(n_space, space, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf(" %d", n_space);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlValidateQName(void) {
    int test_ret = 0;

#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
#ifdef LIBXML_TREE_ENABLED
    int mem_base;
    int ret_val;
    xmlChar * value; /* the value to check */
    int n_value;
    int space; /* allow spaces in front and end of the string */
    int n_space;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_space = 0;n_space < gen_nb_int;n_space++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);
        space = gen_int(n_space, 1);

        ret_val = xmlValidateQName((const xmlChar *)value, space);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        des_int(n_space, space, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateQName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf(" %d", n_space);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}

static int
test_tree(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing tree : 142 of 164 functions ...\n");
    test_ret += test_xmlAddChild();
    test_ret += test_xmlAddChildList();
    test_ret += test_xmlAddNextSibling();
    test_ret += test_xmlAddPrevSibling();
    test_ret += test_xmlAddSibling();
    test_ret += test_xmlAttrSerializeTxtContent();
    test_ret += test_xmlBufContent();
    test_ret += test_xmlBufEnd();
    test_ret += test_xmlBufGetNodeContent();
    test_ret += test_xmlBufNodeDump();
    test_ret += test_xmlBufShrink();
    test_ret += test_xmlBufUse();
    test_ret += test_xmlBufferAdd();
    test_ret += test_xmlBufferAddHead();
    test_ret += test_xmlBufferCCat();
    test_ret += test_xmlBufferCat();
    test_ret += test_xmlBufferContent();
    test_ret += test_xmlBufferCreate();
    test_ret += test_xmlBufferCreateSize();
    test_ret += test_xmlBufferCreateStatic();
    test_ret += test_xmlBufferDetach();
    test_ret += test_xmlBufferEmpty();
    test_ret += test_xmlBufferGrow();
    test_ret += test_xmlBufferLength();
    test_ret += test_xmlBufferResize();
    test_ret += test_xmlBufferSetAllocationScheme();
    test_ret += test_xmlBufferShrink();
    test_ret += test_xmlBufferWriteCHAR();
    test_ret += test_xmlBufferWriteChar();
    test_ret += test_xmlBufferWriteQuotedString();
    test_ret += test_xmlBuildQName();
    test_ret += test_xmlChildElementCount();
    test_ret += test_xmlCopyDoc();
    test_ret += test_xmlCopyDtd();
    test_ret += test_xmlCopyNamespace();
    test_ret += test_xmlCopyNamespaceList();
    test_ret += test_xmlCopyNode();
    test_ret += test_xmlCopyNodeList();
    test_ret += test_xmlCopyProp();
    test_ret += test_xmlCopyPropList();
    test_ret += test_xmlCreateIntSubset();
    test_ret += test_xmlDOMWrapAdoptNode();
    test_ret += test_xmlDOMWrapCloneNode();
    test_ret += test_xmlDOMWrapNewCtxt();
    test_ret += test_xmlDOMWrapReconcileNamespaces();
    test_ret += test_xmlDOMWrapRemoveNode();
    test_ret += test_xmlDocCopyNode();
    test_ret += test_xmlDocCopyNodeList();
    test_ret += test_xmlDocDump();
    test_ret += test_xmlDocDumpFormatMemory();
    test_ret += test_xmlDocDumpFormatMemoryEnc();
    test_ret += test_xmlDocDumpMemory();
    test_ret += test_xmlDocDumpMemoryEnc();
    test_ret += test_xmlDocFormatDump();
    test_ret += test_xmlDocGetRootElement();
    test_ret += test_xmlDocSetRootElement();
    test_ret += test_xmlElemDump();
    test_ret += test_xmlFirstElementChild();
    test_ret += test_xmlGetBufferAllocationScheme();
    test_ret += test_xmlGetCompressMode();
    test_ret += test_xmlGetDocCompressMode();
    test_ret += test_xmlGetIntSubset();
    test_ret += test_xmlGetLastChild();
    test_ret += test_xmlGetLineNo();
    test_ret += test_xmlGetNoNsProp();
    test_ret += test_xmlGetNodePath();
    test_ret += test_xmlGetNsList();
    test_ret += test_xmlGetNsProp();
    test_ret += test_xmlGetProp();
    test_ret += test_xmlHasNsProp();
    test_ret += test_xmlHasProp();
    test_ret += test_xmlIsBlankNode();
    test_ret += test_xmlIsXHTML();
    test_ret += test_xmlLastElementChild();
    test_ret += test_xmlNewCDataBlock();
    test_ret += test_xmlNewCharRef();
    test_ret += test_xmlNewChild();
    test_ret += test_xmlNewComment();
    test_ret += test_xmlNewDoc();
    test_ret += test_xmlNewDocComment();
    test_ret += test_xmlNewDocFragment();
    test_ret += test_xmlNewDocNode();
    test_ret += test_xmlNewDocNodeEatName();
    test_ret += test_xmlNewDocPI();
    test_ret += test_xmlNewDocProp();
    test_ret += test_xmlNewDocRawNode();
    test_ret += test_xmlNewDocText();
    test_ret += test_xmlNewDocTextLen();
    test_ret += test_xmlNewDtd();
    test_ret += test_xmlNewNode();
    test_ret += test_xmlNewNodeEatName();
    test_ret += test_xmlNewNs();
    test_ret += test_xmlNewNsProp();
    test_ret += test_xmlNewNsPropEatName();
    test_ret += test_xmlNewPI();
    test_ret += test_xmlNewProp();
    test_ret += test_xmlNewReference();
    test_ret += test_xmlNewText();
    test_ret += test_xmlNewTextChild();
    test_ret += test_xmlNewTextLen();
    test_ret += test_xmlNextElementSibling();
    test_ret += test_xmlNodeAddContent();
    test_ret += test_xmlNodeAddContentLen();
    test_ret += test_xmlNodeBufGetContent();
    test_ret += test_xmlNodeDump();
    test_ret += test_xmlNodeDumpOutput();
    test_ret += test_xmlNodeGetBase();
    test_ret += test_xmlNodeGetContent();
    test_ret += test_xmlNodeGetLang();
    test_ret += test_xmlNodeGetSpacePreserve();
    test_ret += test_xmlNodeIsText();
    test_ret += test_xmlNodeListGetRawString();
    test_ret += test_xmlNodeListGetString();
    test_ret += test_xmlNodeSetBase();
    test_ret += test_xmlNodeSetContent();
    test_ret += test_xmlNodeSetContentLen();
    test_ret += test_xmlNodeSetLang();
    test_ret += test_xmlNodeSetName();
    test_ret += test_xmlNodeSetSpacePreserve();
    test_ret += test_xmlPreviousElementSibling();
    test_ret += test_xmlReconciliateNs();
    test_ret += test_xmlRemoveProp();
    test_ret += test_xmlReplaceNode();
    test_ret += test_xmlSaveFile();
    test_ret += test_xmlSaveFileEnc();
    test_ret += test_xmlSaveFileTo();
    test_ret += test_xmlSaveFormatFile();
    test_ret += test_xmlSaveFormatFileEnc();
    test_ret += test_xmlSaveFormatFileTo();
    test_ret += test_xmlSearchNs();
    test_ret += test_xmlSearchNsByHref();
    test_ret += test_xmlSetBufferAllocationScheme();
    test_ret += test_xmlSetCompressMode();
    test_ret += test_xmlSetDocCompressMode();
    test_ret += test_xmlSetNs();
    test_ret += test_xmlSetNsProp();
    test_ret += test_xmlSetProp();
    test_ret += test_xmlSplitQName2();
    test_ret += test_xmlSplitQName3();
    test_ret += test_xmlStringGetNodeList();
    test_ret += test_xmlStringLenGetNodeList();
    test_ret += test_xmlTextConcat();
    test_ret += test_xmlTextMerge();
    test_ret += test_xmlUnsetNsProp();
    test_ret += test_xmlUnsetProp();
    test_ret += test_xmlValidateNCName();
    test_ret += test_xmlValidateNMToken();
    test_ret += test_xmlValidateName();
    test_ret += test_xmlValidateQName();

    if (test_ret != 0)
	printf("Module tree: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlBuildRelativeURI(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * URI; /* the URI reference under consideration */
    int n_URI;
    xmlChar * base; /* the base value */
    int n_base;

    for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) {
    for (n_base = 0;n_base < gen_nb_const_xmlChar_ptr;n_base++) {
        mem_base = xmlMemBlocks();
        URI = gen_const_xmlChar_ptr(n_URI, 0);
        base = gen_const_xmlChar_ptr(n_base, 1);

        ret_val = xmlBuildRelativeURI((const xmlChar *)URI, (const xmlChar *)base);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0);
        des_const_xmlChar_ptr(n_base, (const xmlChar *)base, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBuildRelativeURI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URI);
            printf(" %d", n_base);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlBuildURI(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * URI; /* the URI instance found in the document */
    int n_URI;
    xmlChar * base; /* the base value */
    int n_base;

    for (n_URI = 0;n_URI < gen_nb_const_xmlChar_ptr;n_URI++) {
    for (n_base = 0;n_base < gen_nb_const_xmlChar_ptr;n_base++) {
        mem_base = xmlMemBlocks();
        URI = gen_const_xmlChar_ptr(n_URI, 0);
        base = gen_const_xmlChar_ptr(n_base, 1);

        ret_val = xmlBuildURI((const xmlChar *)URI, (const xmlChar *)base);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_URI, (const xmlChar *)URI, 0);
        des_const_xmlChar_ptr(n_base, (const xmlChar *)base, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlBuildURI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URI);
            printf(" %d", n_base);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCanonicPath(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * path; /* the resource locator in a filesystem notation */
    int n_path;

    for (n_path = 0;n_path < gen_nb_const_xmlChar_ptr;n_path++) {
        mem_base = xmlMemBlocks();
        path = gen_const_xmlChar_ptr(n_path, 0);

        ret_val = xmlCanonicPath((const xmlChar *)path);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_path, (const xmlChar *)path, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCanonicPath",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_path);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCreateURI(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlNormalizeURIPath(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    char * path; /* pointer to the path string */
    int n_path;

    for (n_path = 0;n_path < gen_nb_char_ptr;n_path++) {
        mem_base = xmlMemBlocks();
        path = gen_char_ptr(n_path, 0);

        ret_val = xmlNormalizeURIPath(path);
        desret_int(ret_val);
        call_tests++;
        des_char_ptr(n_path, path, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNormalizeURIPath",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_path);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParseURI(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlParseURIRaw(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


#define gen_nb_xmlURIPtr 1
static xmlURIPtr gen_xmlURIPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlURIPtr(int no ATTRIBUTE_UNUSED, xmlURIPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlParseURIReference(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlURIPtr uri; /* pointer to an URI structure */
    int n_uri;
    char * str; /* the string to analyze */
    int n_str;

    for (n_uri = 0;n_uri < gen_nb_xmlURIPtr;n_uri++) {
    for (n_str = 0;n_str < gen_nb_const_char_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        uri = gen_xmlURIPtr(n_uri, 0);
        str = gen_const_char_ptr(n_str, 1);

        ret_val = xmlParseURIReference(uri, (const char *)str);
        desret_int(ret_val);
        call_tests++;
        des_xmlURIPtr(n_uri, uri, 0);
        des_const_char_ptr(n_str, (const char *)str, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParseURIReference",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_uri);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlPathToURI(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * path; /* the resource locator in a filesystem notation */
    int n_path;

    for (n_path = 0;n_path < gen_nb_const_xmlChar_ptr;n_path++) {
        mem_base = xmlMemBlocks();
        path = gen_const_xmlChar_ptr(n_path, 0);

        ret_val = xmlPathToURI((const xmlChar *)path);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_path, (const xmlChar *)path, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPathToURI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_path);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlPrintURI(void) {
    int test_ret = 0;

    int mem_base;
    FILE * stream; /* a FILE* for the output */
    int n_stream;
    xmlURIPtr uri; /* pointer to an xmlURI */
    int n_uri;

    for (n_stream = 0;n_stream < gen_nb_FILE_ptr;n_stream++) {
    for (n_uri = 0;n_uri < gen_nb_xmlURIPtr;n_uri++) {
        mem_base = xmlMemBlocks();
        stream = gen_FILE_ptr(n_stream, 0);
        uri = gen_xmlURIPtr(n_uri, 1);

        xmlPrintURI(stream, uri);
        call_tests++;
        des_FILE_ptr(n_stream, stream, 0);
        des_xmlURIPtr(n_uri, uri, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPrintURI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_stream);
            printf(" %d", n_uri);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSaveUri(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlURIPtr uri; /* pointer to an xmlURI */
    int n_uri;

    for (n_uri = 0;n_uri < gen_nb_xmlURIPtr;n_uri++) {
        mem_base = xmlMemBlocks();
        uri = gen_xmlURIPtr(n_uri, 0);

        ret_val = xmlSaveUri(uri);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlURIPtr(n_uri, uri, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveUri",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_uri);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlURIEscape(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * str; /* the string of the URI to escape */
    int n_str;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);

        ret_val = xmlURIEscape((const xmlChar *)str);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlURIEscape",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlURIEscapeStr(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * str; /* string to escape */
    int n_str;
    xmlChar * list; /* exception list string of chars not to escape */
    int n_list;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_list = 0;n_list < gen_nb_const_xmlChar_ptr;n_list++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);
        list = gen_const_xmlChar_ptr(n_list, 1);

        ret_val = xmlURIEscapeStr((const xmlChar *)str, (const xmlChar *)list);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        des_const_xmlChar_ptr(n_list, (const xmlChar *)list, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlURIEscapeStr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf(" %d", n_list);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlURIUnescapeString(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

static int
test_uri(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing uri : 10 of 15 functions ...\n");
    test_ret += test_xmlBuildRelativeURI();
    test_ret += test_xmlBuildURI();
    test_ret += test_xmlCanonicPath();
    test_ret += test_xmlCreateURI();
    test_ret += test_xmlNormalizeURIPath();
    test_ret += test_xmlParseURI();
    test_ret += test_xmlParseURIRaw();
    test_ret += test_xmlParseURIReference();
    test_ret += test_xmlPathToURI();
    test_ret += test_xmlPrintURI();
    test_ret += test_xmlSaveUri();
    test_ret += test_xmlURIEscape();
    test_ret += test_xmlURIEscapeStr();
    test_ret += test_xmlURIUnescapeString();

    if (test_ret != 0)
	printf("Module uri: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlAddAttributeDecl(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttributePtr ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDtdPtr dtd; /* pointer to the DTD */
    int n_dtd;
    xmlChar * elem; /* the element name */
    int n_elem;
    xmlChar * name; /* the attribute name */
    int n_name;
    xmlChar * ns; /* the attribute namespace prefix */
    int n_ns;
    xmlAttributeType type; /* the attribute type */
    int n_type;
    xmlAttributeDefault def; /* the attribute default type */
    int n_def;
    xmlChar * defaultValue; /* the attribute default value */
    int n_defaultValue;
    xmlEnumerationPtr tree; /* if it's an enumeration, the associated list */
    int n_tree;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) {
    for (n_elem = 0;n_elem < gen_nb_const_xmlChar_ptr;n_elem++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) {
    for (n_type = 0;n_type < gen_nb_xmlAttributeType;n_type++) {
    for (n_def = 0;n_def < gen_nb_xmlAttributeDefault;n_def++) {
    for (n_defaultValue = 0;n_defaultValue < gen_nb_const_xmlChar_ptr;n_defaultValue++) {
    for (n_tree = 0;n_tree < gen_nb_xmlEnumerationPtr;n_tree++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        dtd = gen_xmlDtdPtr(n_dtd, 1);
        elem = gen_const_xmlChar_ptr(n_elem, 2);
        name = gen_const_xmlChar_ptr(n_name, 3);
        ns = gen_const_xmlChar_ptr(n_ns, 4);
        type = gen_xmlAttributeType(n_type, 5);
        def = gen_xmlAttributeDefault(n_def, 6);
        defaultValue = gen_const_xmlChar_ptr(n_defaultValue, 7);
        tree = gen_xmlEnumerationPtr(n_tree, 8);

        ret_val = xmlAddAttributeDecl(ctxt, dtd, (const xmlChar *)elem, (const xmlChar *)name, (const xmlChar *)ns, type, def, (const xmlChar *)defaultValue, tree);
        desret_xmlAttributePtr(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDtdPtr(n_dtd, dtd, 1);
        des_const_xmlChar_ptr(n_elem, (const xmlChar *)elem, 2);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 3);
        des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 4);
        des_xmlAttributeType(n_type, type, 5);
        des_xmlAttributeDefault(n_def, def, 6);
        des_const_xmlChar_ptr(n_defaultValue, (const xmlChar *)defaultValue, 7);
        des_xmlEnumerationPtr(n_tree, tree, 8);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAddAttributeDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_dtd);
            printf(" %d", n_elem);
            printf(" %d", n_name);
            printf(" %d", n_ns);
            printf(" %d", n_type);
            printf(" %d", n_def);
            printf(" %d", n_defaultValue);
            printf(" %d", n_tree);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlAddElementDecl(void) {
    int test_ret = 0;

    int mem_base;
    xmlElementPtr ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDtdPtr dtd; /* pointer to the DTD */
    int n_dtd;
    xmlChar * name; /* the entity name */
    int n_name;
    xmlElementTypeVal type; /* the element type */
    int n_type;
    xmlElementContentPtr content; /* the element content tree or NULL */
    int n_content;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_type = 0;n_type < gen_nb_xmlElementTypeVal;n_type++) {
    for (n_content = 0;n_content < gen_nb_xmlElementContentPtr;n_content++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        dtd = gen_xmlDtdPtr(n_dtd, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        type = gen_xmlElementTypeVal(n_type, 3);
        content = gen_xmlElementContentPtr(n_content, 4);

        ret_val = xmlAddElementDecl(ctxt, dtd, (const xmlChar *)name, type, content);
        desret_xmlElementPtr(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDtdPtr(n_dtd, dtd, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_xmlElementTypeVal(n_type, type, 3);
        des_xmlElementContentPtr(n_content, content, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAddElementDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_dtd);
            printf(" %d", n_name);
            printf(" %d", n_type);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlAddID(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAddNotationDecl(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAddRef(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlCopyAttributeTable(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlCopyDocElementContent(void) {
    int test_ret = 0;

    int mem_base;
    xmlElementContentPtr ret_val;
    xmlDocPtr doc; /* the document owning the element declaration */
    int n_doc;
    xmlElementContentPtr cur; /* An element content pointer. */
    int n_cur;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_cur = 0;n_cur < gen_nb_xmlElementContentPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        cur = gen_xmlElementContentPtr(n_cur, 1);

        ret_val = xmlCopyDocElementContent(doc, cur);
        desret_xmlElementContentPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlElementContentPtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyDocElementContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCopyElementContent(void) {
    int test_ret = 0;

    int mem_base;
    xmlElementContentPtr ret_val;
    xmlElementContentPtr cur; /* An element content pointer. */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_xmlElementContentPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlElementContentPtr(n_cur, 0);

        ret_val = xmlCopyElementContent(cur);
        desret_xmlElementContentPtr(ret_val);
        call_tests++;
        des_xmlElementContentPtr(n_cur, cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyElementContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCopyElementTable(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlCopyEnumeration(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlCopyNotationTable(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlCreateEnumeration(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


#define gen_nb_xmlAttributePtr 1
static xmlAttributePtr gen_xmlAttributePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlAttributePtr(int no ATTRIBUTE_UNUSED, xmlAttributePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlDumpAttributeDecl(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlAttributePtr attr; /* An attribute declaration */
    int n_attr;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttributePtr;n_attr++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        attr = gen_xmlAttributePtr(n_attr, 1);

        xmlDumpAttributeDecl(buf, attr);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlAttributePtr(n_attr, attr, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDumpAttributeDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_attr);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


#define gen_nb_xmlAttributeTablePtr 1
static xmlAttributeTablePtr gen_xmlAttributeTablePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlAttributeTablePtr(int no ATTRIBUTE_UNUSED, xmlAttributeTablePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlDumpAttributeTable(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlAttributeTablePtr table; /* An attribute table */
    int n_table;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_table = 0;n_table < gen_nb_xmlAttributeTablePtr;n_table++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        table = gen_xmlAttributeTablePtr(n_table, 1);

        xmlDumpAttributeTable(buf, table);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlAttributeTablePtr(n_table, table, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDumpAttributeTable",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_table);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


#define gen_nb_xmlElementPtr 1
static xmlElementPtr gen_xmlElementPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlElementPtr(int no ATTRIBUTE_UNUSED, xmlElementPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlDumpElementDecl(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlElementPtr elem; /* An element table */
    int n_elem;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_elem = 0;n_elem < gen_nb_xmlElementPtr;n_elem++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        elem = gen_xmlElementPtr(n_elem, 1);

        xmlDumpElementDecl(buf, elem);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlElementPtr(n_elem, elem, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDumpElementDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


#define gen_nb_xmlElementTablePtr 1
static xmlElementTablePtr gen_xmlElementTablePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlElementTablePtr(int no ATTRIBUTE_UNUSED, xmlElementTablePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlDumpElementTable(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlElementTablePtr table; /* An element table */
    int n_table;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_table = 0;n_table < gen_nb_xmlElementTablePtr;n_table++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        table = gen_xmlElementTablePtr(n_table, 1);

        xmlDumpElementTable(buf, table);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlElementTablePtr(n_table, table, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDumpElementTable",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_table);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


#define gen_nb_xmlNotationPtr 1
static xmlNotationPtr gen_xmlNotationPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlNotationPtr(int no ATTRIBUTE_UNUSED, xmlNotationPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlDumpNotationDecl(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlNotationPtr nota; /* A notation declaration */
    int n_nota;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_nota = 0;n_nota < gen_nb_xmlNotationPtr;n_nota++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        nota = gen_xmlNotationPtr(n_nota, 1);

        xmlDumpNotationDecl(buf, nota);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlNotationPtr(n_nota, nota, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDumpNotationDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_nota);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


#define gen_nb_xmlNotationTablePtr 1
static xmlNotationTablePtr gen_xmlNotationTablePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlNotationTablePtr(int no ATTRIBUTE_UNUSED, xmlNotationTablePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlDumpNotationTable(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlBufferPtr buf; /* the XML buffer output */
    int n_buf;
    xmlNotationTablePtr table; /* A notation table */
    int n_table;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_table = 0;n_table < gen_nb_xmlNotationTablePtr;n_table++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        table = gen_xmlNotationTablePtr(n_table, 1);

        xmlDumpNotationTable(buf, table);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlNotationTablePtr(n_table, table, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlDumpNotationTable",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_table);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlGetDtdAttrDesc(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttributePtr ret_val;
    xmlDtdPtr dtd; /* a pointer to the DtD to search */
    int n_dtd;
    xmlChar * elem; /* the element name */
    int n_elem;
    xmlChar * name; /* the attribute name */
    int n_name;

    for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) {
    for (n_elem = 0;n_elem < gen_nb_const_xmlChar_ptr;n_elem++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        dtd = gen_xmlDtdPtr(n_dtd, 0);
        elem = gen_const_xmlChar_ptr(n_elem, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);

        ret_val = xmlGetDtdAttrDesc(dtd, (const xmlChar *)elem, (const xmlChar *)name);
        desret_xmlAttributePtr(ret_val);
        call_tests++;
        des_xmlDtdPtr(n_dtd, dtd, 0);
        des_const_xmlChar_ptr(n_elem, (const xmlChar *)elem, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetDtdAttrDesc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dtd);
            printf(" %d", n_elem);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetDtdElementDesc(void) {
    int test_ret = 0;

    int mem_base;
    xmlElementPtr ret_val;
    xmlDtdPtr dtd; /* a pointer to the DtD to search */
    int n_dtd;
    xmlChar * name; /* the element name */
    int n_name;

    for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        dtd = gen_xmlDtdPtr(n_dtd, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlGetDtdElementDesc(dtd, (const xmlChar *)name);
        desret_xmlElementPtr(ret_val);
        call_tests++;
        des_xmlDtdPtr(n_dtd, dtd, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetDtdElementDesc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dtd);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetDtdNotationDesc(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlGetDtdQAttrDesc(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttributePtr ret_val;
    xmlDtdPtr dtd; /* a pointer to the DtD to search */
    int n_dtd;
    xmlChar * elem; /* the element name */
    int n_elem;
    xmlChar * name; /* the attribute name */
    int n_name;
    xmlChar * prefix; /* the attribute namespace prefix */
    int n_prefix;

    for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) {
    for (n_elem = 0;n_elem < gen_nb_const_xmlChar_ptr;n_elem++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
        mem_base = xmlMemBlocks();
        dtd = gen_xmlDtdPtr(n_dtd, 0);
        elem = gen_const_xmlChar_ptr(n_elem, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        prefix = gen_const_xmlChar_ptr(n_prefix, 3);

        ret_val = xmlGetDtdQAttrDesc(dtd, (const xmlChar *)elem, (const xmlChar *)name, (const xmlChar *)prefix);
        desret_xmlAttributePtr(ret_val);
        call_tests++;
        des_xmlDtdPtr(n_dtd, dtd, 0);
        des_const_xmlChar_ptr(n_elem, (const xmlChar *)elem, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetDtdQAttrDesc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dtd);
            printf(" %d", n_elem);
            printf(" %d", n_name);
            printf(" %d", n_prefix);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetDtdQElementDesc(void) {
    int test_ret = 0;

    int mem_base;
    xmlElementPtr ret_val;
    xmlDtdPtr dtd; /* a pointer to the DtD to search */
    int n_dtd;
    xmlChar * name; /* the element name */
    int n_name;
    xmlChar * prefix; /* the element namespace prefix */
    int n_prefix;

    for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
        mem_base = xmlMemBlocks();
        dtd = gen_xmlDtdPtr(n_dtd, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        prefix = gen_const_xmlChar_ptr(n_prefix, 2);

        ret_val = xmlGetDtdQElementDesc(dtd, (const xmlChar *)name, (const xmlChar *)prefix);
        desret_xmlElementPtr(ret_val);
        call_tests++;
        des_xmlDtdPtr(n_dtd, dtd, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetDtdQElementDesc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_dtd);
            printf(" %d", n_name);
            printf(" %d", n_prefix);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetID(void) {
    int test_ret = 0;

    int mem_base;
    xmlAttrPtr ret_val;
    xmlDocPtr doc; /* pointer to the document */
    int n_doc;
    xmlChar * ID; /* the ID value */
    int n_ID;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_ID = 0;n_ID < gen_nb_const_xmlChar_ptr;n_ID++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        ID = gen_const_xmlChar_ptr(n_ID, 1);

        ret_val = xmlGetID(doc, (const xmlChar *)ID);
        desret_xmlAttrPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_ID, (const xmlChar *)ID, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetID",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_ID);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetRefs(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlIsID(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr elem; /* the element carrying the attribute */
    int n_elem;
    xmlAttrPtr attr; /* the attribute */
    int n_attr;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        elem = gen_xmlNodePtr(n_elem, 1);
        attr = gen_xmlAttrPtr(n_attr, 2);

        ret_val = xmlIsID(doc, elem, attr);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodePtr(n_elem, elem, 1);
        des_xmlAttrPtr(n_attr, attr, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsID",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf(" %d", n_attr);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsMixedElement(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * name; /* the element name */
    int n_name;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlIsMixedElement(doc, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsMixedElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIsRef(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr elem; /* the element carrying the attribute */
    int n_elem;
    xmlAttrPtr attr; /* the attribute */
    int n_attr;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        elem = gen_xmlNodePtr(n_elem, 1);
        attr = gen_xmlAttrPtr(n_attr, 2);

        ret_val = xmlIsRef(doc, elem, attr);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodePtr(n_elem, elem, 1);
        des_xmlAttrPtr(n_attr, attr, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIsRef",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf(" %d", n_attr);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewDocElementContent(void) {
    int test_ret = 0;

    int mem_base;
    xmlElementContentPtr ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * name; /* the subelement name or NULL */
    int n_name;
    xmlElementContentType type; /* the type of element content decl */
    int n_type;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_type = 0;n_type < gen_nb_xmlElementContentType;n_type++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        type = gen_xmlElementContentType(n_type, 2);

        ret_val = xmlNewDocElementContent(doc, (const xmlChar *)name, type);
        xmlFreeDocElementContent(doc, ret_val); ret_val = NULL;
        desret_xmlElementContentPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_xmlElementContentType(n_type, type, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewDocElementContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_name);
            printf(" %d", n_type);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewElementContent(void) {
    int test_ret = 0;

    int mem_base;
    xmlElementContentPtr ret_val;
    xmlChar * name; /* the subelement name or NULL */
    int n_name;
    xmlElementContentType type; /* the type of element content decl */
    int n_type;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_type = 0;n_type < gen_nb_xmlElementContentType;n_type++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);
        type = gen_xmlElementContentType(n_type, 1);

        ret_val = xmlNewElementContent((const xmlChar *)name, type);
        desret_xmlElementContentPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        des_xmlElementContentType(n_type, type, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewElementContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf(" %d", n_type);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNewValidCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlRemoveID(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlAttrPtr attr; /* the attribute */
    int n_attr;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        attr = gen_xmlAttrPtr(n_attr, 1);

        ret_val = xmlRemoveID(doc, attr);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlAttrPtr(n_attr, attr, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRemoveID",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_attr);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlRemoveRef(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlAttrPtr attr; /* the attribute */
    int n_attr;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        attr = gen_xmlAttrPtr(n_attr, 1);

        ret_val = xmlRemoveRef(doc, attr);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlAttrPtr(n_attr, attr, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRemoveRef",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_attr);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSnprintfElementContent(void) {
    int test_ret = 0;

    int mem_base;
    char * buf; /* an output buffer */
    int n_buf;
    int size; /* the buffer size */
    int n_size;
    xmlElementContentPtr content; /* An element table */
    int n_content;
    int englob; /* 1 if one must print the englobing parenthesis, 0 otherwise */
    int n_englob;

    for (n_buf = 0;n_buf < gen_nb_char_ptr;n_buf++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_content = 0;n_content < gen_nb_xmlElementContentPtr;n_content++) {
    for (n_englob = 0;n_englob < gen_nb_int;n_englob++) {
        mem_base = xmlMemBlocks();
        buf = gen_char_ptr(n_buf, 0);
        size = gen_int(n_size, 1);
        content = gen_xmlElementContentPtr(n_content, 2);
        englob = gen_int(n_englob, 3);

        xmlSnprintfElementContent(buf, size, content, englob);
        call_tests++;
        des_char_ptr(n_buf, buf, 0);
        des_int(n_size, size, 1);
        des_xmlElementContentPtr(n_content, content, 2);
        des_int(n_englob, englob, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSnprintfElementContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_size);
            printf(" %d", n_content);
            printf(" %d", n_englob);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlSprintfElementContent(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
#ifdef LIBXML_OUTPUT_ENABLED
    int mem_base;
    char * buf; /* an output buffer */
    int n_buf;
    xmlElementContentPtr content; /* An element table */
    int n_content;
    int englob; /* 1 if one must print the englobing parenthesis, 0 otherwise */
    int n_englob;

    for (n_buf = 0;n_buf < gen_nb_char_ptr;n_buf++) {
    for (n_content = 0;n_content < gen_nb_xmlElementContentPtr;n_content++) {
    for (n_englob = 0;n_englob < gen_nb_int;n_englob++) {
        mem_base = xmlMemBlocks();
        buf = gen_char_ptr(n_buf, 0);
        content = gen_xmlElementContentPtr(n_content, 1);
        englob = gen_int(n_englob, 2);

        xmlSprintfElementContent(buf, content, englob);
        call_tests++;
        des_char_ptr(n_buf, buf, 0);
        des_xmlElementContentPtr(n_content, content, 1);
        des_int(n_englob, englob, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSprintfElementContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_content);
            printf(" %d", n_englob);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlValidBuildContentModel(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* a validation context */
    int n_ctxt;
    xmlElementPtr elem; /* an element declaration node */
    int n_elem;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_elem = 0;n_elem < gen_nb_xmlElementPtr;n_elem++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        elem = gen_xmlElementPtr(n_elem, 1);

        ret_val = xmlValidBuildContentModel(ctxt, elem);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlElementPtr(n_elem, elem, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidBuildContentModel",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidCtxtNormalizeAttributeValue(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context or NULL */
    int n_ctxt;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr elem; /* the parent */
    int n_elem;
    xmlChar * name; /* the attribute name */
    int n_name;
    xmlChar * value; /* the attribute value */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);
        name = gen_const_xmlChar_ptr(n_name, 3);
        value = gen_const_xmlChar_ptr(n_value, 4);

        ret_val = xmlValidCtxtNormalizeAttributeValue(ctxt, doc, elem, (const xmlChar *)name, (const xmlChar *)value);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 3);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidCtxtNormalizeAttributeValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


#define gen_nb_xmlElementContent_ptr 1
static xmlElementContent * gen_xmlElementContent_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlElementContent_ptr(int no ATTRIBUTE_UNUSED, xmlElementContent * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlValidGetPotentialChildren(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
#ifdef LIBXML_VALID_ENABLED
    int mem_base;
    int ret_val;
    xmlElementContent * ctree; /* an element content tree */
    int n_ctree;
    xmlChar ** names; /* an array to store the list of child names */
    int n_names;
    int * len; /* a pointer to the number of element in the list */
    int n_len;
    int max; /* the size of the array */
    int n_max;

    for (n_ctree = 0;n_ctree < gen_nb_xmlElementContent_ptr;n_ctree++) {
    for (n_names = 0;n_names < gen_nb_const_xmlChar_ptr_ptr;n_names++) {
    for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) {
    for (n_max = 0;n_max < gen_nb_int;n_max++) {
        mem_base = xmlMemBlocks();
        ctree = gen_xmlElementContent_ptr(n_ctree, 0);
        names = gen_const_xmlChar_ptr_ptr(n_names, 1);
        len = gen_int_ptr(n_len, 2);
        max = gen_int(n_max, 3);

        ret_val = xmlValidGetPotentialChildren(ctree, (const xmlChar **)names, len, max);
        desret_int(ret_val);
        call_tests++;
        des_xmlElementContent_ptr(n_ctree, ctree, 0);
        des_const_xmlChar_ptr_ptr(n_names, (const xmlChar **)names, 1);
        des_int_ptr(n_len, len, 2);
        des_int(n_max, max, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidGetPotentialChildren",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctree);
            printf(" %d", n_names);
            printf(" %d", n_len);
            printf(" %d", n_max);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlValidGetValidElements(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
#ifdef LIBXML_VALID_ENABLED
    int mem_base;
    int ret_val;
    xmlNode * prev; /* an element to insert after */
    int n_prev;
    xmlNode * next; /* an element to insert next */
    int n_next;
    xmlChar ** names; /* an array to store the list of child names */
    int n_names;
    int max; /* the size of the array */
    int n_max;

    for (n_prev = 0;n_prev < gen_nb_xmlNodePtr;n_prev++) {
    for (n_next = 0;n_next < gen_nb_xmlNodePtr;n_next++) {
    for (n_names = 0;n_names < gen_nb_const_xmlChar_ptr_ptr;n_names++) {
    for (n_max = 0;n_max < gen_nb_int;n_max++) {
        mem_base = xmlMemBlocks();
        prev = gen_xmlNodePtr(n_prev, 0);
        next = gen_xmlNodePtr(n_next, 1);
        names = gen_const_xmlChar_ptr_ptr(n_names, 2);
        max = gen_int(n_max, 3);

        ret_val = xmlValidGetValidElements(prev, next, (const xmlChar **)names, max);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_prev, prev, 0);
        des_xmlNodePtr(n_next, next, 1);
        des_const_xmlChar_ptr_ptr(n_names, (const xmlChar **)names, 2);
        des_int(n_max, max, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidGetValidElements",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_prev);
            printf(" %d", n_next);
            printf(" %d", n_names);
            printf(" %d", n_max);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlValidNormalizeAttributeValue(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlNodePtr elem; /* the parent */
    int n_elem;
    xmlChar * name; /* the attribute name */
    int n_name;
    xmlChar * value; /* the attribute value */
    int n_value;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        elem = gen_xmlNodePtr(n_elem, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        value = gen_const_xmlChar_ptr(n_value, 3);

        ret_val = xmlValidNormalizeAttributeValue(doc, elem, (const xmlChar *)name, (const xmlChar *)value);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodePtr(n_elem, elem, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidNormalizeAttributeValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateAttributeDecl(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlAttributePtr attr; /* an attribute definition */
    int n_attr;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttributePtr;n_attr++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        attr = gen_xmlAttributePtr(n_attr, 2);

        ret_val = xmlValidateAttributeDecl(ctxt, doc, attr);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlAttributePtr(n_attr, attr, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateAttributeDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_attr);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateAttributeValue(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlAttributeType type; /* an attribute type */
    int n_type;
    xmlChar * value; /* an attribute value */
    int n_value;

    for (n_type = 0;n_type < gen_nb_xmlAttributeType;n_type++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        type = gen_xmlAttributeType(n_type, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);

        ret_val = xmlValidateAttributeValue(type, (const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_xmlAttributeType(n_type, type, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateAttributeValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_type);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateDocument(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        ret_val = xmlValidateDocument(ctxt, doc);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateDocument",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateDocumentFinal(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        ret_val = xmlValidateDocumentFinal(ctxt, doc);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateDocumentFinal",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateDtd(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlDtdPtr dtd; /* a dtd instance */
    int n_dtd;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_dtd = 0;n_dtd < gen_nb_xmlDtdPtr;n_dtd++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        dtd = gen_xmlDtdPtr(n_dtd, 2);

        ret_val = xmlValidateDtd(ctxt, doc, dtd);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlDtdPtr(n_dtd, dtd, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateDtd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_dtd);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateDtdFinal(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        ret_val = xmlValidateDtdFinal(ctxt, doc);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateDtdFinal",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateElement(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNodePtr elem; /* an element instance */
    int n_elem;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);

        ret_val = xmlValidateElement(ctxt, doc, elem);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateElementDecl(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlElementPtr elem; /* an element definition */
    int n_elem;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlElementPtr;n_elem++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlElementPtr(n_elem, 2);

        ret_val = xmlValidateElementDecl(ctxt, doc, elem);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlElementPtr(n_elem, elem, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateElementDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateNameValue(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlChar * value; /* an Name value */
    int n_value;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);

        ret_val = xmlValidateNameValue((const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateNameValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateNamesValue(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlChar * value; /* an Names value */
    int n_value;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);

        ret_val = xmlValidateNamesValue((const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateNamesValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateNmtokenValue(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlChar * value; /* an Nmtoken value */
    int n_value;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);

        ret_val = xmlValidateNmtokenValue((const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateNmtokenValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateNmtokensValue(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlChar * value; /* an Nmtokens value */
    int n_value;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);

        ret_val = xmlValidateNmtokensValue((const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateNmtokensValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateNotationDecl(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNotationPtr nota; /* a notation definition */
    int n_nota;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_nota = 0;n_nota < gen_nb_xmlNotationPtr;n_nota++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        nota = gen_xmlNotationPtr(n_nota, 2);

        ret_val = xmlValidateNotationDecl(ctxt, doc, nota);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNotationPtr(n_nota, nota, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateNotationDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_nota);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateNotationUse(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* the document */
    int n_doc;
    xmlChar * notationName; /* the notation name to check */
    int n_notationName;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_notationName = 0;n_notationName < gen_nb_const_xmlChar_ptr;n_notationName++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        notationName = gen_const_xmlChar_ptr(n_notationName, 2);

        ret_val = xmlValidateNotationUse(ctxt, doc, (const xmlChar *)notationName);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_const_xmlChar_ptr(n_notationName, (const xmlChar *)notationName, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateNotationUse",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_notationName);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateOneAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNodePtr elem; /* an element instance */
    int n_elem;
    xmlAttrPtr attr; /* an attribute instance */
    int n_attr;
    xmlChar * value; /* the attribute value (without entities processing) */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
    for (n_attr = 0;n_attr < gen_nb_xmlAttrPtr;n_attr++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);
        attr = gen_xmlAttrPtr(n_attr, 3);
        value = gen_const_xmlChar_ptr(n_value, 4);

        ret_val = xmlValidateOneAttribute(ctxt, doc, elem, attr, (const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        des_xmlAttrPtr(n_attr, attr, 3);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateOneAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf(" %d", n_attr);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateOneElement(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNodePtr elem; /* an element instance */
    int n_elem;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);

        ret_val = xmlValidateOneElement(ctxt, doc, elem);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateOneElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateOneNamespace(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNodePtr elem; /* an element instance */
    int n_elem;
    xmlChar * prefix; /* the namespace prefix */
    int n_prefix;
    xmlNsPtr ns; /* an namespace declaration instance */
    int n_ns;
    xmlChar * value; /* the attribute value (without entities processing) */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);
        prefix = gen_const_xmlChar_ptr(n_prefix, 3);
        ns = gen_xmlNsPtr(n_ns, 4);
        value = gen_const_xmlChar_ptr(n_value, 5);

        ret_val = xmlValidateOneNamespace(ctxt, doc, elem, (const xmlChar *)prefix, ns, (const xmlChar *)value);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 3);
        des_xmlNsPtr(n_ns, ns, 4);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateOneNamespace",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf(" %d", n_prefix);
            printf(" %d", n_ns);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidatePopElement(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNodePtr elem; /* an element instance */
    int n_elem;
    xmlChar * qname; /* the qualified name as appearing in the serialization */
    int n_qname;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
    for (n_qname = 0;n_qname < gen_nb_const_xmlChar_ptr;n_qname++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);
        qname = gen_const_xmlChar_ptr(n_qname, 3);

        ret_val = xmlValidatePopElement(ctxt, doc, elem, (const xmlChar *)qname);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        des_const_xmlChar_ptr(n_qname, (const xmlChar *)qname, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidatePopElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf(" %d", n_qname);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidatePushCData(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlChar * data; /* some character data read */
    int n_data;
    int len; /* the length of the data */
    int n_len;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_data = 0;n_data < gen_nb_const_xmlChar_ptr;n_data++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        data = gen_const_xmlChar_ptr(n_data, 1);
        len = gen_int(n_len, 2);
        if ((data != NULL) &&
            (len > (int) strlen((const char *) data) + 1))
            continue;

        ret_val = xmlValidatePushCData(ctxt, (const xmlChar *)data, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_data, (const xmlChar *)data, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidatePushCData",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_data);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidatePushElement(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED) && defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;
    xmlNodePtr elem; /* an element instance */
    int n_elem;
    xmlChar * qname; /* the qualified name as appearing in the serialization */
    int n_qname;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
    for (n_qname = 0;n_qname < gen_nb_const_xmlChar_ptr;n_qname++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);
        elem = gen_xmlNodePtr(n_elem, 2);
        qname = gen_const_xmlChar_ptr(n_qname, 3);

        ret_val = xmlValidatePushElement(ctxt, doc, elem, (const xmlChar *)qname);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        des_xmlNodePtr(n_elem, elem, 2);
        des_const_xmlChar_ptr(n_qname, (const xmlChar *)qname, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidatePushElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf(" %d", n_elem);
            printf(" %d", n_qname);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlValidateRoot(void) {
    int test_ret = 0;

#if defined(LIBXML_VALID_ENABLED)
    int mem_base;
    int ret_val;
    xmlValidCtxtPtr ctxt; /* the validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a document instance */
    int n_doc;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        ret_val = xmlValidateRoot(ctxt, doc);
        desret_int(ret_val);
        call_tests++;
        des_xmlValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlValidateRoot",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_valid(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing valid : 50 of 70 functions ...\n");
    test_ret += test_xmlAddAttributeDecl();
    test_ret += test_xmlAddElementDecl();
    test_ret += test_xmlAddID();
    test_ret += test_xmlAddNotationDecl();
    test_ret += test_xmlAddRef();
    test_ret += test_xmlCopyAttributeTable();
    test_ret += test_xmlCopyDocElementContent();
    test_ret += test_xmlCopyElementContent();
    test_ret += test_xmlCopyElementTable();
    test_ret += test_xmlCopyEnumeration();
    test_ret += test_xmlCopyNotationTable();
    test_ret += test_xmlCreateEnumeration();
    test_ret += test_xmlDumpAttributeDecl();
    test_ret += test_xmlDumpAttributeTable();
    test_ret += test_xmlDumpElementDecl();
    test_ret += test_xmlDumpElementTable();
    test_ret += test_xmlDumpNotationDecl();
    test_ret += test_xmlDumpNotationTable();
    test_ret += test_xmlGetDtdAttrDesc();
    test_ret += test_xmlGetDtdElementDesc();
    test_ret += test_xmlGetDtdNotationDesc();
    test_ret += test_xmlGetDtdQAttrDesc();
    test_ret += test_xmlGetDtdQElementDesc();
    test_ret += test_xmlGetID();
    test_ret += test_xmlGetRefs();
    test_ret += test_xmlIsID();
    test_ret += test_xmlIsMixedElement();
    test_ret += test_xmlIsRef();
    test_ret += test_xmlNewDocElementContent();
    test_ret += test_xmlNewElementContent();
    test_ret += test_xmlNewValidCtxt();
    test_ret += test_xmlRemoveID();
    test_ret += test_xmlRemoveRef();
    test_ret += test_xmlSnprintfElementContent();
    test_ret += test_xmlSprintfElementContent();
    test_ret += test_xmlValidBuildContentModel();
    test_ret += test_xmlValidCtxtNormalizeAttributeValue();
    test_ret += test_xmlValidGetPotentialChildren();
    test_ret += test_xmlValidGetValidElements();
    test_ret += test_xmlValidNormalizeAttributeValue();
    test_ret += test_xmlValidateAttributeDecl();
    test_ret += test_xmlValidateAttributeValue();
    test_ret += test_xmlValidateDocument();
    test_ret += test_xmlValidateDocumentFinal();
    test_ret += test_xmlValidateDtd();
    test_ret += test_xmlValidateDtdFinal();
    test_ret += test_xmlValidateElement();
    test_ret += test_xmlValidateElementDecl();
    test_ret += test_xmlValidateNameValue();
    test_ret += test_xmlValidateNamesValue();
    test_ret += test_xmlValidateNmtokenValue();
    test_ret += test_xmlValidateNmtokensValue();
    test_ret += test_xmlValidateNotationDecl();
    test_ret += test_xmlValidateNotationUse();
    test_ret += test_xmlValidateOneAttribute();
    test_ret += test_xmlValidateOneElement();
    test_ret += test_xmlValidateOneNamespace();
    test_ret += test_xmlValidatePopElement();
    test_ret += test_xmlValidatePushCData();
    test_ret += test_xmlValidatePushElement();
    test_ret += test_xmlValidateRoot();

    if (test_ret != 0)
	printf("Module valid: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlXIncludeNewContext(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXIncludeProcess(void) {
    int test_ret = 0;

#if defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* an XML document */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);

        ret_val = xmlXIncludeProcess(doc);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXIncludeProcess",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXIncludeProcessFlags(void) {
    int test_ret = 0;

#if defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* an XML document */
    int n_doc;
    int flags; /* a set of xmlParserOption used for parsing XML includes */
    int n_flags;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_flags = 0;n_flags < gen_nb_int;n_flags++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        flags = gen_int(n_flags, 1);

        ret_val = xmlXIncludeProcessFlags(doc, flags);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_int(n_flags, flags, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXIncludeProcessFlags",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_flags);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXIncludeProcessFlagsData(void) {
    int test_ret = 0;

#if defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    int ret_val;
    xmlDocPtr doc; /* an XML document */
    int n_doc;
    int flags; /* a set of xmlParserOption used for parsing XML includes */
    int n_flags;
    void * data; /* application data that will be passed to the parser context in the _private field of the parser context(s) */
    int n_data;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_flags = 0;n_flags < gen_nb_int;n_flags++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        flags = gen_int(n_flags, 1);
        data = gen_userdata(n_data, 2);

        ret_val = xmlXIncludeProcessFlagsData(doc, flags, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_int(n_flags, flags, 1);
        des_userdata(n_data, data, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXIncludeProcessFlagsData",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_flags);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_XINCLUDE_ENABLED

#define gen_nb_xmlXIncludeCtxtPtr 1
static xmlXIncludeCtxtPtr gen_xmlXIncludeCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlXIncludeCtxtPtr(int no ATTRIBUTE_UNUSED, xmlXIncludeCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlXIncludeProcessNode(void) {
    int test_ret = 0;

#if defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    int ret_val;
    xmlXIncludeCtxtPtr ctxt; /* an existing XInclude context */
    int n_ctxt;
    xmlNodePtr node; /* a node in an XML document */
    int n_node;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXIncludeCtxtPtr;n_ctxt++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXIncludeCtxtPtr(n_ctxt, 0);
        node = gen_xmlNodePtr(n_node, 1);

        ret_val = xmlXIncludeProcessNode(ctxt, node);
        desret_int(ret_val);
        call_tests++;
        des_xmlXIncludeCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_node, node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXIncludeProcessNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXIncludeProcessTree(void) {
    int test_ret = 0;

#if defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodePtr tree; /* a node in an XML document */
    int n_tree;

    for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) {
        mem_base = xmlMemBlocks();
        tree = gen_xmlNodePtr(n_tree, 0);

        ret_val = xmlXIncludeProcessTree(tree);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_tree, tree, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXIncludeProcessTree",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_tree);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXIncludeProcessTreeFlags(void) {
    int test_ret = 0;

#if defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodePtr tree; /* a node in an XML document */
    int n_tree;
    int flags; /* a set of xmlParserOption used for parsing XML includes */
    int n_flags;

    for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) {
    for (n_flags = 0;n_flags < gen_nb_int;n_flags++) {
        mem_base = xmlMemBlocks();
        tree = gen_xmlNodePtr(n_tree, 0);
        flags = gen_int(n_flags, 1);

        ret_val = xmlXIncludeProcessTreeFlags(tree, flags);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_tree, tree, 0);
        des_int(n_flags, flags, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXIncludeProcessTreeFlags",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_tree);
            printf(" %d", n_flags);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXIncludeProcessTreeFlagsData(void) {
    int test_ret = 0;

#if defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodePtr tree; /* an XML node */
    int n_tree;
    int flags; /* a set of xmlParserOption used for parsing XML includes */
    int n_flags;
    void * data; /* application data that will be passed to the parser context in the _private field of the parser context(s) */
    int n_data;

    for (n_tree = 0;n_tree < gen_nb_xmlNodePtr;n_tree++) {
    for (n_flags = 0;n_flags < gen_nb_int;n_flags++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        tree = gen_xmlNodePtr(n_tree, 0);
        flags = gen_int(n_flags, 1);
        data = gen_userdata(n_data, 2);

        ret_val = xmlXIncludeProcessTreeFlagsData(tree, flags, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_tree, tree, 0);
        des_int(n_flags, flags, 1);
        des_userdata(n_data, data, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXIncludeProcessTreeFlagsData",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_tree);
            printf(" %d", n_flags);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXIncludeSetFlags(void) {
    int test_ret = 0;

#if defined(LIBXML_XINCLUDE_ENABLED)
    int mem_base;
    int ret_val;
    xmlXIncludeCtxtPtr ctxt; /* an XInclude processing context */
    int n_ctxt;
    int flags; /* a set of xmlParserOption used for parsing XML includes */
    int n_flags;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXIncludeCtxtPtr;n_ctxt++) {
    for (n_flags = 0;n_flags < gen_nb_int;n_flags++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXIncludeCtxtPtr(n_ctxt, 0);
        flags = gen_int(n_flags, 1);

        ret_val = xmlXIncludeSetFlags(ctxt, flags);
        desret_int(ret_val);
        call_tests++;
        des_xmlXIncludeCtxtPtr(n_ctxt, ctxt, 0);
        des_int(n_flags, flags, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXIncludeSetFlags",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_flags);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xinclude(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xinclude : 8 of 10 functions ...\n");
    test_ret += test_xmlXIncludeNewContext();
    test_ret += test_xmlXIncludeProcess();
    test_ret += test_xmlXIncludeProcessFlags();
    test_ret += test_xmlXIncludeProcessFlagsData();
    test_ret += test_xmlXIncludeProcessNode();
    test_ret += test_xmlXIncludeProcessTree();
    test_ret += test_xmlXIncludeProcessTreeFlags();
    test_ret += test_xmlXIncludeProcessTreeFlagsData();
    test_ret += test_xmlXIncludeSetFlags();

    if (test_ret != 0)
	printf("Module xinclude: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlAllocOutputBuffer(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr ret_val;
    xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */
    int n_encoder;

    for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) {
        mem_base = xmlMemBlocks();
        encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 0);

        ret_val = xmlAllocOutputBuffer(encoder);
        desret_xmlOutputBufferPtr(ret_val);
        call_tests++;
        des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAllocOutputBuffer",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_encoder);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlAllocParserInputBuffer(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputBufferPtr ret_val;
    xmlCharEncoding enc; /* the charset encoding if known */
    int n_enc;

    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        enc = gen_xmlCharEncoding(n_enc, 0);

        ret_val = xmlAllocParserInputBuffer(enc);
        desret_xmlParserInputBufferPtr(ret_val);
        call_tests++;
        des_xmlCharEncoding(n_enc, enc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAllocParserInputBuffer",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCheckFilename(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    char * path; /* the path to check */
    int n_path;

    for (n_path = 0;n_path < gen_nb_const_char_ptr;n_path++) {
        mem_base = xmlMemBlocks();
        path = gen_const_char_ptr(n_path, 0);

        ret_val = xmlCheckFilename((const char *)path);
        desret_int(ret_val);
        call_tests++;
        des_const_char_ptr(n_path, (const char *)path, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCheckFilename",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_path);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCheckHTTPInput(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    xmlParserCtxtPtr ctxt; /* an XML parser context */
    int n_ctxt;
    xmlParserInputPtr ret; /* an XML parser input */
    int n_ret;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_ret = 0;n_ret < gen_nb_xmlParserInputPtr;n_ret++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        ret = gen_xmlParserInputPtr(n_ret, 1);

        ret_val = xmlCheckHTTPInput(ctxt, ret);
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlParserInputPtr(n_ret, ret, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCheckHTTPInput",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_ret);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCleanupInputCallbacks(void) {
    int test_ret = 0;

    int mem_base;

        mem_base = xmlMemBlocks();

        xmlCleanupInputCallbacks();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCleanupInputCallbacks",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCleanupOutputCallbacks(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlCleanupOutputCallbacks();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCleanupOutputCallbacks",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlFileClose(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    void * context; /* the I/O context */
    int n_context;

    for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) {
        mem_base = xmlMemBlocks();
        context = gen_void_ptr(n_context, 0);

        ret_val = xmlFileClose(context);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_context, context, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlFileClose",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_context);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlFileMatch(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    const char * filename; /* the URI for matching */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlFileMatch(filename);
        desret_int(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlFileMatch",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlFileOpen(void) {
    int test_ret = 0;

    int mem_base;
    void * ret_val;
    const char * filename; /* the URI for matching */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlFileOpen(filename);
        desret_void_ptr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlFileOpen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlFileRead(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    void * context; /* the I/O context */
    int n_context;
    char * buffer; /* where to drop data */
    int n_buffer;
    int len; /* number of bytes to write */
    int n_len;

    for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) {
    for (n_buffer = 0;n_buffer < gen_nb_char_ptr;n_buffer++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        context = gen_void_ptr(n_context, 0);
        buffer = gen_char_ptr(n_buffer, 1);
        len = gen_int(n_len, 2);

        ret_val = xmlFileRead(context, buffer, len);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_context, context, 0);
        des_char_ptr(n_buffer, buffer, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlFileRead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_context);
            printf(" %d", n_buffer);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlIOFTPClose(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * context; /* the I/O context */
    int n_context;

    for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) {
        mem_base = xmlMemBlocks();
        context = gen_void_ptr(n_context, 0);

        ret_val = xmlIOFTPClose(context);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_context, context, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIOFTPClose",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_context);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlIOFTPMatch(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    const char * filename; /* the URI for matching */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlIOFTPMatch(filename);
        desret_int(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIOFTPMatch",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlIOFTPOpen(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    void * ret_val;
    const char * filename; /* the URI for matching */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlIOFTPOpen(filename);
        desret_void_ptr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIOFTPOpen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlIOFTPRead(void) {
    int test_ret = 0;

#if defined(LIBXML_FTP_ENABLED)
    int mem_base;
    int ret_val;
    void * context; /* the I/O context */
    int n_context;
    char * buffer; /* where to drop data */
    int n_buffer;
    int len; /* number of bytes to write */
    int n_len;

    for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) {
    for (n_buffer = 0;n_buffer < gen_nb_char_ptr;n_buffer++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        context = gen_void_ptr(n_context, 0);
        buffer = gen_char_ptr(n_buffer, 1);
        len = gen_int(n_len, 2);

        ret_val = xmlIOFTPRead(context, buffer, len);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_context, context, 0);
        des_char_ptr(n_buffer, buffer, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIOFTPRead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_context);
            printf(" %d", n_buffer);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlIOHTTPClose(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    int ret_val;
    void * context; /* the I/O context */
    int n_context;

    for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) {
        mem_base = xmlMemBlocks();
        context = gen_void_ptr(n_context, 0);

        ret_val = xmlIOHTTPClose(context);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_context, context, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIOHTTPClose",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_context);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlIOHTTPMatch(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    int ret_val;
    const char * filename; /* the URI for matching */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlIOHTTPMatch(filename);
        desret_int(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIOHTTPMatch",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlIOHTTPOpen(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    void * ret_val;
    const char * filename; /* the URI for matching */
    int n_filename;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);

        ret_val = xmlIOHTTPOpen(filename);
        desret_xmlNanoHTTPCtxtPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIOHTTPOpen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlIOHTTPRead(void) {
    int test_ret = 0;

#if defined(LIBXML_HTTP_ENABLED)
    int mem_base;
    int ret_val;
    void * context; /* the I/O context */
    int n_context;
    char * buffer; /* where to drop data */
    int n_buffer;
    int len; /* number of bytes to write */
    int n_len;

    for (n_context = 0;n_context < gen_nb_void_ptr;n_context++) {
    for (n_buffer = 0;n_buffer < gen_nb_char_ptr;n_buffer++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        context = gen_void_ptr(n_context, 0);
        buffer = gen_char_ptr(n_buffer, 1);
        len = gen_int(n_len, 2);

        ret_val = xmlIOHTTPRead(context, buffer, len);
        desret_int(ret_val);
        call_tests++;
        des_void_ptr(n_context, context, 0);
        des_char_ptr(n_buffer, buffer, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlIOHTTPRead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_context);
            printf(" %d", n_buffer);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNoNetExternalEntityLoader(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr ret_val;
    const char * URL; /* the URL for the entity to load */
    int n_URL;
    char * ID; /* the System ID for the entity to load */
    int n_ID;
    xmlParserCtxtPtr ctxt; /* the context in which the entity is called or NULL */
    int n_ctxt;

    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_ID = 0;n_ID < gen_nb_const_char_ptr;n_ID++) {
    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        URL = gen_filepath(n_URL, 0);
        ID = gen_const_char_ptr(n_ID, 1);
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 2);

        ret_val = xmlNoNetExternalEntityLoader(URL, (const char *)ID, ctxt);
        desret_xmlParserInputPtr(ret_val);
        call_tests++;
        des_filepath(n_URL, URL, 0);
        des_const_char_ptr(n_ID, (const char *)ID, 1);
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNoNetExternalEntityLoader",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf(" %d", n_ID);
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlNormalizeWindowsPath(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * path; /* the input file path */
    int n_path;

    for (n_path = 0;n_path < gen_nb_const_xmlChar_ptr;n_path++) {
        mem_base = xmlMemBlocks();
        path = gen_const_xmlChar_ptr(n_path, 0);

        ret_val = xmlNormalizeWindowsPath((const xmlChar *)path);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_path, (const xmlChar *)path, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNormalizeWindowsPath",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_path);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlOutputBufferCreateBuffer(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr ret_val;
    xmlBufferPtr buffer; /* a xmlBufferPtr */
    int n_buffer;
    xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */
    int n_encoder;

    for (n_buffer = 0;n_buffer < gen_nb_xmlBufferPtr;n_buffer++) {
    for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) {
        mem_base = xmlMemBlocks();
        buffer = gen_xmlBufferPtr(n_buffer, 0);
        encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 1);

        ret_val = xmlOutputBufferCreateBuffer(buffer, encoder);
        desret_xmlOutputBufferPtr(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buffer, buffer, 0);
        des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlOutputBufferCreateBuffer",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_encoder);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlOutputBufferCreateFd(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr ret_val;
    int fd; /* a file descriptor number */
    int n_fd;
    xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */
    int n_encoder;

    for (n_fd = 0;n_fd < gen_nb_int;n_fd++) {
    for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) {
        mem_base = xmlMemBlocks();
        fd = gen_int(n_fd, 0);
        encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 1);

        ret_val = xmlOutputBufferCreateFd(fd, encoder);
        desret_xmlOutputBufferPtr(ret_val);
        call_tests++;
        des_int(n_fd, fd, 0);
        des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlOutputBufferCreateFd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_fd);
            printf(" %d", n_encoder);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlOutputBufferCreateFile(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr ret_val;
    FILE * file; /* a FILE* */
    int n_file;
    xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */
    int n_encoder;

    for (n_file = 0;n_file < gen_nb_FILE_ptr;n_file++) {
    for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) {
        mem_base = xmlMemBlocks();
        file = gen_FILE_ptr(n_file, 0);
        encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 1);

        ret_val = xmlOutputBufferCreateFile(file, encoder);
        desret_xmlOutputBufferPtr(ret_val);
        call_tests++;
        des_FILE_ptr(n_file, file, 0);
        des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlOutputBufferCreateFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_file);
            printf(" %d", n_encoder);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlOutputBufferCreateFilename(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    xmlOutputBufferPtr ret_val;
    const char * URI; /* a C string containing the URI or filename */
    int n_URI;
    xmlCharEncodingHandlerPtr encoder; /* the encoding converter or NULL */
    int n_encoder;
    int compression; /* the compression ration (0 none, 9 max). */
    int n_compression;

    for (n_URI = 0;n_URI < gen_nb_fileoutput;n_URI++) {
    for (n_encoder = 0;n_encoder < gen_nb_xmlCharEncodingHandlerPtr;n_encoder++) {
    for (n_compression = 0;n_compression < gen_nb_int;n_compression++) {
        mem_base = xmlMemBlocks();
        URI = gen_fileoutput(n_URI, 0);
        encoder = gen_xmlCharEncodingHandlerPtr(n_encoder, 1);
        compression = gen_int(n_compression, 2);

        ret_val = xmlOutputBufferCreateFilename(URI, encoder, compression);
        desret_xmlOutputBufferPtr(ret_val);
        call_tests++;
        des_fileoutput(n_URI, URI, 0);
        des_xmlCharEncodingHandlerPtr(n_encoder, encoder, 1);
        des_int(n_compression, compression, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlOutputBufferCreateFilename",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URI);
            printf(" %d", n_encoder);
            printf(" %d", n_compression);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlOutputBufferFlush(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlOutputBufferPtr out; /* a buffered output */
    int n_out;

    for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) {
        mem_base = xmlMemBlocks();
        out = gen_xmlOutputBufferPtr(n_out, 0);

        ret_val = xmlOutputBufferFlush(out);
        desret_int(ret_val);
        call_tests++;
        des_xmlOutputBufferPtr(n_out, out, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlOutputBufferFlush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlOutputBufferGetContent(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlOutputBufferPtr out; /* an xmlOutputBufferPtr */
    int n_out;

    for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) {
        mem_base = xmlMemBlocks();
        out = gen_xmlOutputBufferPtr(n_out, 0);

        ret_val = xmlOutputBufferGetContent(out);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlOutputBufferPtr(n_out, out, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlOutputBufferGetContent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlOutputBufferGetSize(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlOutputBufferWrite(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlOutputBufferPtr out; /* a buffered parser output */
    int n_out;
    int len; /* the size in bytes of the array. */
    int n_len;
    char * buf; /* an char array */
    int n_buf;

    for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
    for (n_buf = 0;n_buf < gen_nb_const_char_ptr;n_buf++) {
        mem_base = xmlMemBlocks();
        out = gen_xmlOutputBufferPtr(n_out, 0);
        len = gen_int(n_len, 1);
        buf = gen_const_char_ptr(n_buf, 2);
        if ((buf != NULL) &&
            (len > (int) strlen((const char *) buf) + 1))
            continue;

        ret_val = xmlOutputBufferWrite(out, len, (const char *)buf);
        desret_int(ret_val);
        call_tests++;
        des_xmlOutputBufferPtr(n_out, out, 0);
        des_int(n_len, len, 1);
        des_const_char_ptr(n_buf, (const char *)buf, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlOutputBufferWrite",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf(" %d", n_len);
            printf(" %d", n_buf);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlOutputBufferWriteEscape(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlOutputBufferWriteString(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlOutputBufferPtr out; /* a buffered parser output */
    int n_out;
    char * str; /* a zero terminated C string */
    int n_str;

    for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) {
    for (n_str = 0;n_str < gen_nb_const_char_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        out = gen_xmlOutputBufferPtr(n_out, 0);
        str = gen_const_char_ptr(n_str, 1);

        ret_val = xmlOutputBufferWriteString(out, (const char *)str);
        desret_int(ret_val);
        call_tests++;
        des_xmlOutputBufferPtr(n_out, out, 0);
        des_const_char_ptr(n_str, (const char *)str, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlOutputBufferWriteString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlParserGetDirectory(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlParserInputBufferCreateFd(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputBufferPtr ret_val;
    int fd; /* a file descriptor number */
    int n_fd;
    xmlCharEncoding enc; /* the charset encoding if known */
    int n_enc;

    for (n_fd = 0;n_fd < gen_nb_int;n_fd++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        fd = gen_int(n_fd, 0);
        enc = gen_xmlCharEncoding(n_enc, 1);
        if (fd >= 0) fd = -1;

        ret_val = xmlParserInputBufferCreateFd(fd, enc);
        desret_xmlParserInputBufferPtr(ret_val);
        call_tests++;
        des_int(n_fd, fd, 0);
        des_xmlCharEncoding(n_enc, enc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputBufferCreateFd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_fd);
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserInputBufferCreateFile(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputBufferPtr ret_val;
    FILE * file; /* a FILE* */
    int n_file;
    xmlCharEncoding enc; /* the charset encoding if known */
    int n_enc;

    for (n_file = 0;n_file < gen_nb_FILE_ptr;n_file++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        file = gen_FILE_ptr(n_file, 0);
        enc = gen_xmlCharEncoding(n_enc, 1);

        ret_val = xmlParserInputBufferCreateFile(file, enc);
        desret_xmlParserInputBufferPtr(ret_val);
        call_tests++;
        des_FILE_ptr(n_file, file, 0);
        des_xmlCharEncoding(n_enc, enc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputBufferCreateFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_file);
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserInputBufferCreateFilename(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputBufferPtr ret_val;
    const char * URI; /* a C string containing the URI or filename */
    int n_URI;
    xmlCharEncoding enc; /* the charset encoding if known */
    int n_enc;

    for (n_URI = 0;n_URI < gen_nb_fileoutput;n_URI++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        URI = gen_fileoutput(n_URI, 0);
        enc = gen_xmlCharEncoding(n_enc, 1);

        ret_val = xmlParserInputBufferCreateFilename(URI, enc);
        desret_xmlParserInputBufferPtr(ret_val);
        call_tests++;
        des_fileoutput(n_URI, URI, 0);
        des_xmlCharEncoding(n_enc, enc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputBufferCreateFilename",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URI);
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserInputBufferCreateMem(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputBufferPtr ret_val;
    char * mem; /* the memory input */
    int n_mem;
    int size; /* the length of the memory block */
    int n_size;
    xmlCharEncoding enc; /* the charset encoding if known */
    int n_enc;

    for (n_mem = 0;n_mem < gen_nb_const_char_ptr;n_mem++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        mem = gen_const_char_ptr(n_mem, 0);
        size = gen_int(n_size, 1);
        enc = gen_xmlCharEncoding(n_enc, 2);
        if ((mem != NULL) &&
            (size > (int) strlen((const char *) mem) + 1))
            continue;

        ret_val = xmlParserInputBufferCreateMem((const char *)mem, size, enc);
        desret_xmlParserInputBufferPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_mem, (const char *)mem, 0);
        des_int(n_size, size, 1);
        des_xmlCharEncoding(n_enc, enc, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputBufferCreateMem",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_mem);
            printf(" %d", n_size);
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserInputBufferCreateStatic(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputBufferPtr ret_val;
    char * mem; /* the memory input */
    int n_mem;
    int size; /* the length of the memory block */
    int n_size;
    xmlCharEncoding enc; /* the charset encoding if known */
    int n_enc;

    for (n_mem = 0;n_mem < gen_nb_const_char_ptr;n_mem++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
        mem_base = xmlMemBlocks();
        mem = gen_const_char_ptr(n_mem, 0);
        size = gen_int(n_size, 1);
        enc = gen_xmlCharEncoding(n_enc, 2);
        if ((mem != NULL) &&
            (size > (int) strlen((const char *) mem) + 1))
            continue;

        ret_val = xmlParserInputBufferCreateStatic((const char *)mem, size, enc);
        desret_xmlParserInputBufferPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_mem, (const char *)mem, 0);
        des_int(n_size, size, 1);
        des_xmlCharEncoding(n_enc, enc, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputBufferCreateStatic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_mem);
            printf(" %d", n_size);
            printf(" %d", n_enc);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserInputBufferGrow(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserInputBufferPtr in; /* a buffered parser input */
    int n_in;
    int len; /* indicative value of the amount of chars to read */
    int n_len;

    for (n_in = 0;n_in < gen_nb_xmlParserInputBufferPtr;n_in++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        in = gen_xmlParserInputBufferPtr(n_in, 0);
        len = gen_int(n_len, 1);

        ret_val = xmlParserInputBufferGrow(in, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserInputBufferPtr(n_in, in, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputBufferGrow",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_in);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserInputBufferPush(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserInputBufferPtr in; /* a buffered parser input */
    int n_in;
    int len; /* the size in bytes of the array. */
    int n_len;
    char * buf; /* an char array */
    int n_buf;

    for (n_in = 0;n_in < gen_nb_xmlParserInputBufferPtr;n_in++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
    for (n_buf = 0;n_buf < gen_nb_const_char_ptr;n_buf++) {
        mem_base = xmlMemBlocks();
        in = gen_xmlParserInputBufferPtr(n_in, 0);
        len = gen_int(n_len, 1);
        buf = gen_const_char_ptr(n_buf, 2);
        if ((buf != NULL) &&
            (len > (int) strlen((const char *) buf) + 1))
            continue;

        ret_val = xmlParserInputBufferPush(in, len, (const char *)buf);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserInputBufferPtr(n_in, in, 0);
        des_int(n_len, len, 1);
        des_const_char_ptr(n_buf, (const char *)buf, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputBufferPush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_in);
            printf(" %d", n_len);
            printf(" %d", n_buf);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserInputBufferRead(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlParserInputBufferPtr in; /* a buffered parser input */
    int n_in;
    int len; /* indicative value of the amount of chars to read */
    int n_len;

    for (n_in = 0;n_in < gen_nb_xmlParserInputBufferPtr;n_in++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        in = gen_xmlParserInputBufferPtr(n_in, 0);
        len = gen_int(n_len, 1);

        ret_val = xmlParserInputBufferRead(in, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlParserInputBufferPtr(n_in, in, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserInputBufferRead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_in);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlPopInputCallbacks(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;

        mem_base = xmlMemBlocks();

        ret_val = xmlPopInputCallbacks();
        desret_int(ret_val);
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlPopInputCallbacks",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlRegisterDefaultInputCallbacks(void) {
    int test_ret = 0;

    int mem_base;

        mem_base = xmlMemBlocks();

        xmlRegisterDefaultInputCallbacks();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegisterDefaultInputCallbacks",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;

    return(test_ret);
}


static int
test_xmlRegisterDefaultOutputCallbacks(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlRegisterDefaultOutputCallbacks();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegisterDefaultOutputCallbacks",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRegisterHTTPPostCallbacks(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED) && defined(LIBXML_HTTP_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlRegisterHTTPPostCallbacks();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegisterHTTPPostCallbacks",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xmlIO(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlIO : 40 of 50 functions ...\n");
    test_ret += test_xmlAllocOutputBuffer();
    test_ret += test_xmlAllocParserInputBuffer();
    test_ret += test_xmlCheckFilename();
    test_ret += test_xmlCheckHTTPInput();
    test_ret += test_xmlCleanupInputCallbacks();
    test_ret += test_xmlCleanupOutputCallbacks();
    test_ret += test_xmlFileClose();
    test_ret += test_xmlFileMatch();
    test_ret += test_xmlFileOpen();
    test_ret += test_xmlFileRead();
    test_ret += test_xmlIOFTPClose();
    test_ret += test_xmlIOFTPMatch();
    test_ret += test_xmlIOFTPOpen();
    test_ret += test_xmlIOFTPRead();
    test_ret += test_xmlIOHTTPClose();
    test_ret += test_xmlIOHTTPMatch();
    test_ret += test_xmlIOHTTPOpen();
    test_ret += test_xmlIOHTTPRead();
    test_ret += test_xmlNoNetExternalEntityLoader();
    test_ret += test_xmlNormalizeWindowsPath();
    test_ret += test_xmlOutputBufferCreateBuffer();
    test_ret += test_xmlOutputBufferCreateFd();
    test_ret += test_xmlOutputBufferCreateFile();
    test_ret += test_xmlOutputBufferCreateFilename();
    test_ret += test_xmlOutputBufferFlush();
    test_ret += test_xmlOutputBufferGetContent();
    test_ret += test_xmlOutputBufferGetSize();
    test_ret += test_xmlOutputBufferWrite();
    test_ret += test_xmlOutputBufferWriteEscape();
    test_ret += test_xmlOutputBufferWriteString();
    test_ret += test_xmlParserGetDirectory();
    test_ret += test_xmlParserInputBufferCreateFd();
    test_ret += test_xmlParserInputBufferCreateFile();
    test_ret += test_xmlParserInputBufferCreateFilename();
    test_ret += test_xmlParserInputBufferCreateMem();
    test_ret += test_xmlParserInputBufferCreateStatic();
    test_ret += test_xmlParserInputBufferGrow();
    test_ret += test_xmlParserInputBufferPush();
    test_ret += test_xmlParserInputBufferRead();
    test_ret += test_xmlPopInputCallbacks();
    test_ret += test_xmlRegisterDefaultInputCallbacks();
    test_ret += test_xmlRegisterDefaultOutputCallbacks();
    test_ret += test_xmlRegisterHTTPPostCallbacks();

    if (test_ret != 0)
	printf("Module xmlIO: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlAutomataCompile(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataGetInitState(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

#ifdef LIBXML_AUTOMATA_ENABLED

#define gen_nb_xmlAutomataPtr 1
static xmlAutomataPtr gen_xmlAutomataPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlAutomataPtr(int no ATTRIBUTE_UNUSED, xmlAutomataPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlAutomataIsDeterminist(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED)
    int mem_base;
    int ret_val;
    xmlAutomataPtr am; /* an automata */
    int n_am;

    for (n_am = 0;n_am < gen_nb_xmlAutomataPtr;n_am++) {
        mem_base = xmlMemBlocks();
        am = gen_xmlAutomataPtr(n_am, 0);

        ret_val = xmlAutomataIsDeterminist(am);
        desret_int(ret_val);
        call_tests++;
        des_xmlAutomataPtr(n_am, am, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAutomataIsDeterminist",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_am);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlAutomataNewAllTrans(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewCountTrans(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewCountTrans2(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewCountedTrans(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewCounter(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED)
    int mem_base;
    int ret_val;
    xmlAutomataPtr am; /* an automata */
    int n_am;
    int min; /* the minimal value on the counter */
    int n_min;
    int max; /* the maximal value on the counter */
    int n_max;

    for (n_am = 0;n_am < gen_nb_xmlAutomataPtr;n_am++) {
    for (n_min = 0;n_min < gen_nb_int;n_min++) {
    for (n_max = 0;n_max < gen_nb_int;n_max++) {
        mem_base = xmlMemBlocks();
        am = gen_xmlAutomataPtr(n_am, 0);
        min = gen_int(n_min, 1);
        max = gen_int(n_max, 2);

        ret_val = xmlAutomataNewCounter(am, min, max);
        desret_int(ret_val);
        call_tests++;
        des_xmlAutomataPtr(n_am, am, 0);
        des_int(n_min, min, 1);
        des_int(n_max, max, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAutomataNewCounter",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_am);
            printf(" %d", n_min);
            printf(" %d", n_max);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlAutomataNewCounterTrans(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewEpsilon(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewNegTrans(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewOnceTrans(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewOnceTrans2(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewState(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewTransition(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlAutomataNewTransition2(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

#ifdef LIBXML_AUTOMATA_ENABLED

#define gen_nb_xmlAutomataStatePtr 1
static xmlAutomataStatePtr gen_xmlAutomataStatePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlAutomataStatePtr(int no ATTRIBUTE_UNUSED, xmlAutomataStatePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlAutomataSetFinalState(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_AUTOMATA_ENABLED)
    int mem_base;
    int ret_val;
    xmlAutomataPtr am; /* an automata */
    int n_am;
    xmlAutomataStatePtr state; /* a state in this automata */
    int n_state;

    for (n_am = 0;n_am < gen_nb_xmlAutomataPtr;n_am++) {
    for (n_state = 0;n_state < gen_nb_xmlAutomataStatePtr;n_state++) {
        mem_base = xmlMemBlocks();
        am = gen_xmlAutomataPtr(n_am, 0);
        state = gen_xmlAutomataStatePtr(n_state, 1);

        ret_val = xmlAutomataSetFinalState(am, state);
        desret_int(ret_val);
        call_tests++;
        des_xmlAutomataPtr(n_am, am, 0);
        des_xmlAutomataStatePtr(n_state, state, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlAutomataSetFinalState",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_am);
            printf(" %d", n_state);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNewAutomata(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

static int
test_xmlautomata(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlautomata : 3 of 19 functions ...\n");
    test_ret += test_xmlAutomataCompile();
    test_ret += test_xmlAutomataGetInitState();
    test_ret += test_xmlAutomataIsDeterminist();
    test_ret += test_xmlAutomataNewAllTrans();
    test_ret += test_xmlAutomataNewCountTrans();
    test_ret += test_xmlAutomataNewCountTrans2();
    test_ret += test_xmlAutomataNewCountedTrans();
    test_ret += test_xmlAutomataNewCounter();
    test_ret += test_xmlAutomataNewCounterTrans();
    test_ret += test_xmlAutomataNewEpsilon();
    test_ret += test_xmlAutomataNewNegTrans();
    test_ret += test_xmlAutomataNewOnceTrans();
    test_ret += test_xmlAutomataNewOnceTrans2();
    test_ret += test_xmlAutomataNewState();
    test_ret += test_xmlAutomataNewTransition();
    test_ret += test_xmlAutomataNewTransition2();
    test_ret += test_xmlAutomataSetFinalState();
    test_ret += test_xmlNewAutomata();

    if (test_ret != 0)
	printf("Module xmlautomata: %d errors\n", test_ret);
    return(test_ret);
}

#define gen_nb_xmlGenericErrorFunc_ptr 1
static xmlGenericErrorFunc * gen_xmlGenericErrorFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlGenericErrorFunc_ptr(int no ATTRIBUTE_UNUSED, xmlGenericErrorFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_initGenericErrorDefaultFunc(void) {
    int test_ret = 0;

    int mem_base;
    xmlGenericErrorFunc * handler; /* the handler */
    int n_handler;

    for (n_handler = 0;n_handler < gen_nb_xmlGenericErrorFunc_ptr;n_handler++) {
        mem_base = xmlMemBlocks();
        handler = gen_xmlGenericErrorFunc_ptr(n_handler, 0);

        initGenericErrorDefaultFunc(handler);
        call_tests++;
        des_xmlGenericErrorFunc_ptr(n_handler, handler, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in initGenericErrorDefaultFunc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_handler);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


#define gen_nb_xmlErrorPtr 1
static xmlErrorPtr gen_xmlErrorPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlErrorPtr(int no ATTRIBUTE_UNUSED, xmlErrorPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}

static int
test_xmlCopyError(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlErrorPtr from; /* a source error */
    int n_from;
    xmlErrorPtr to; /* a target error */
    int n_to;

    for (n_from = 0;n_from < gen_nb_xmlErrorPtr;n_from++) {
    for (n_to = 0;n_to < gen_nb_xmlErrorPtr;n_to++) {
        mem_base = xmlMemBlocks();
        from = gen_xmlErrorPtr(n_from, 0);
        to = gen_xmlErrorPtr(n_to, 1);

        ret_val = xmlCopyError(from, to);
        desret_int(ret_val);
        call_tests++;
        des_xmlErrorPtr(n_from, from, 0);
        des_xmlErrorPtr(n_to, to, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCopyError",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_from);
            printf(" %d", n_to);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCtxtGetLastError(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlCtxtResetLastError(void) {
    int test_ret = 0;

    int mem_base;
    void * ctx; /* an XML parser context */
    int n_ctx;

    for (n_ctx = 0;n_ctx < gen_nb_void_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctx = gen_void_ptr(n_ctx, 0);

        xmlCtxtResetLastError(ctx);
        call_tests++;
        des_void_ptr(n_ctx, ctx, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCtxtResetLastError",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetLastError(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlParserError(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlParserPrintFileContext(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr input; /* an xmlParserInputPtr input */
    int n_input;

    for (n_input = 0;n_input < gen_nb_xmlParserInputPtr;n_input++) {
        mem_base = xmlMemBlocks();
        input = gen_xmlParserInputPtr(n_input, 0);

        xmlParserPrintFileContext(input);
        call_tests++;
        des_xmlParserInputPtr(n_input, input, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserPrintFileContext",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_input);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserPrintFileInfo(void) {
    int test_ret = 0;

    int mem_base;
    xmlParserInputPtr input; /* an xmlParserInputPtr input */
    int n_input;

    for (n_input = 0;n_input < gen_nb_xmlParserInputPtr;n_input++) {
        mem_base = xmlMemBlocks();
        input = gen_xmlParserInputPtr(n_input, 0);

        xmlParserPrintFileInfo(input);
        call_tests++;
        des_xmlParserInputPtr(n_input, input, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlParserPrintFileInfo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_input);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlParserValidityError(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlParserValidityWarning(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlParserWarning(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlResetError(void) {
    int test_ret = 0;

    int mem_base;
    xmlErrorPtr err; /* pointer to the error. */
    int n_err;

    for (n_err = 0;n_err < gen_nb_xmlErrorPtr;n_err++) {
        mem_base = xmlMemBlocks();
        err = gen_xmlErrorPtr(n_err, 0);

        xmlResetError(err);
        call_tests++;
        des_xmlErrorPtr(n_err, err, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlResetError",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_err);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlResetLastError(void) {
    int test_ret = 0;



        xmlResetLastError();
        call_tests++;
        xmlResetLastError();
    function_tests++;

    return(test_ret);
}


static int
test_xmlSetGenericErrorFunc(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSetStructuredErrorFunc(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

static int
test_xmlerror(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlerror : 7 of 15 functions ...\n");
    test_ret += test_initGenericErrorDefaultFunc();
    test_ret += test_xmlCopyError();
    test_ret += test_xmlCtxtGetLastError();
    test_ret += test_xmlCtxtResetLastError();
    test_ret += test_xmlGetLastError();
    test_ret += test_xmlParserError();
    test_ret += test_xmlParserPrintFileContext();
    test_ret += test_xmlParserPrintFileInfo();
    test_ret += test_xmlParserValidityError();
    test_ret += test_xmlParserValidityWarning();
    test_ret += test_xmlParserWarning();
    test_ret += test_xmlResetError();
    test_ret += test_xmlResetLastError();
    test_ret += test_xmlSetGenericErrorFunc();
    test_ret += test_xmlSetStructuredErrorFunc();

    if (test_ret != 0)
	printf("Module xmlerror: %d errors\n", test_ret);
    return(test_ret);
}
#ifdef LIBXML_MODULES_ENABLED

#define gen_nb_xmlModulePtr 1
static xmlModulePtr gen_xmlModulePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlModulePtr(int no ATTRIBUTE_UNUSED, xmlModulePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlModuleClose(void) {
    int test_ret = 0;

#if defined(LIBXML_MODULES_ENABLED)
    int mem_base;
    int ret_val;
    xmlModulePtr module; /* the module handle */
    int n_module;

    for (n_module = 0;n_module < gen_nb_xmlModulePtr;n_module++) {
        mem_base = xmlMemBlocks();
        module = gen_xmlModulePtr(n_module, 0);

        ret_val = xmlModuleClose(module);
        desret_int(ret_val);
        call_tests++;
        des_xmlModulePtr(n_module, module, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlModuleClose",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_module);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlModuleOpen(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlModuleSymbol(void) {
    int test_ret = 0;

#if defined(LIBXML_MODULES_ENABLED)
    int mem_base;
    int ret_val;
    xmlModulePtr module; /* the module */
    int n_module;
    char * name; /* the name of the symbol */
    int n_name;
    void ** symbol; /* the resulting symbol address */
    int n_symbol;

    for (n_module = 0;n_module < gen_nb_xmlModulePtr;n_module++) {
    for (n_name = 0;n_name < gen_nb_const_char_ptr;n_name++) {
    for (n_symbol = 0;n_symbol < gen_nb_void_ptr_ptr;n_symbol++) {
        mem_base = xmlMemBlocks();
        module = gen_xmlModulePtr(n_module, 0);
        name = gen_const_char_ptr(n_name, 1);
        symbol = gen_void_ptr_ptr(n_symbol, 2);

        ret_val = xmlModuleSymbol(module, (const char *)name, symbol);
        desret_int(ret_val);
        call_tests++;
        des_xmlModulePtr(n_module, module, 0);
        des_const_char_ptr(n_name, (const char *)name, 1);
        des_void_ptr_ptr(n_symbol, symbol, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlModuleSymbol",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_module);
            printf(" %d", n_name);
            printf(" %d", n_symbol);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xmlmodule(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlmodule : 2 of 4 functions ...\n");
    test_ret += test_xmlModuleClose();
    test_ret += test_xmlModuleOpen();
    test_ret += test_xmlModuleSymbol();

    if (test_ret != 0)
	printf("Module xmlmodule: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlNewTextReader(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlTextReaderPtr ret_val;
    xmlParserInputBufferPtr input; /* the xmlParserInputBufferPtr used to read data */
    int n_input;
    const char * URI; /* the URI information for the source if available */
    int n_URI;

    for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) {
    for (n_URI = 0;n_URI < gen_nb_filepath;n_URI++) {
        mem_base = xmlMemBlocks();
        input = gen_xmlParserInputBufferPtr(n_input, 0);
        URI = gen_filepath(n_URI, 1);

        ret_val = xmlNewTextReader(input, URI);
        desret_xmlTextReaderPtr(ret_val);
        call_tests++;
        des_xmlParserInputBufferPtr(n_input, input, 0);
        des_filepath(n_URI, URI, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewTextReader",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_input);
            printf(" %d", n_URI);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNewTextReaderFilename(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlTextReaderPtr ret_val;
    const char * URI; /* the URI of the resource to process */
    int n_URI;

    for (n_URI = 0;n_URI < gen_nb_filepath;n_URI++) {
        mem_base = xmlMemBlocks();
        URI = gen_filepath(n_URI, 0);

        ret_val = xmlNewTextReaderFilename(URI);
        desret_xmlTextReaderPtr(ret_val);
        call_tests++;
        des_filepath(n_URI, URI, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewTextReaderFilename",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URI);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlReaderForDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlTextReaderPtr ret_val;
    xmlChar * cur; /* a pointer to a zero terminated string */
    int n_cur;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);
        URL = gen_filepath(n_URL, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        options = gen_parseroptions(n_options, 3);

        ret_val = xmlReaderForDoc((const xmlChar *)cur, URL, (const char *)encoding, options);
        desret_xmlTextReaderPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        des_filepath(n_URL, URL, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_parseroptions(n_options, options, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReaderForDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlReaderForFile(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlTextReaderPtr ret_val;
    const char * filename; /* a file or URL */
    int n_filename;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        filename = gen_filepath(n_filename, 0);
        encoding = gen_const_char_ptr(n_encoding, 1);
        options = gen_parseroptions(n_options, 2);

        ret_val = xmlReaderForFile(filename, (const char *)encoding, options);
        desret_xmlTextReaderPtr(ret_val);
        call_tests++;
        des_filepath(n_filename, filename, 0);
        des_const_char_ptr(n_encoding, (const char *)encoding, 1);
        des_parseroptions(n_options, options, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReaderForFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_filename);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlReaderForMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlTextReaderPtr ret_val;
    char * buffer; /* a pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        buffer = gen_const_char_ptr(n_buffer, 0);
        size = gen_int(n_size, 1);
        URL = gen_filepath(n_URL, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);
        options = gen_parseroptions(n_options, 4);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlReaderForMemory((const char *)buffer, size, URL, (const char *)encoding, options);
        desret_xmlTextReaderPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_buffer, (const char *)buffer, 0);
        des_int(n_size, size, 1);
        des_filepath(n_URL, URL, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        des_parseroptions(n_options, options, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReaderForMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlReaderNewDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* an XML reader */
    int n_reader;
    xmlChar * cur; /* a pointer to a zero terminated string */
    int n_cur;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        cur = gen_const_xmlChar_ptr(n_cur, 1);
        URL = gen_filepath(n_URL, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);
        options = gen_parseroptions(n_options, 4);

        ret_val = xmlReaderNewDoc(reader, (const xmlChar *)cur, URL, (const char *)encoding, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 1);
        des_filepath(n_URL, URL, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        des_parseroptions(n_options, options, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReaderNewDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_cur);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlReaderNewFile(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* an XML reader */
    int n_reader;
    const char * filename; /* a file or URL */
    int n_filename;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        filename = gen_filepath(n_filename, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        options = gen_parseroptions(n_options, 3);

        ret_val = xmlReaderNewFile(reader, filename, (const char *)encoding, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_filepath(n_filename, filename, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_parseroptions(n_options, options, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReaderNewFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_filename);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlReaderNewMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* an XML reader */
    int n_reader;
    char * buffer; /* a pointer to a char array */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        buffer = gen_const_char_ptr(n_buffer, 1);
        size = gen_int(n_size, 2);
        URL = gen_filepath(n_URL, 3);
        encoding = gen_const_char_ptr(n_encoding, 4);
        options = gen_parseroptions(n_options, 5);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlReaderNewMemory(reader, (const char *)buffer, size, URL, (const char *)encoding, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_char_ptr(n_buffer, (const char *)buffer, 1);
        des_int(n_size, size, 2);
        des_filepath(n_URL, URL, 3);
        des_const_char_ptr(n_encoding, (const char *)encoding, 4);
        des_parseroptions(n_options, options, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReaderNewMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlReaderNewWalker(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* an XML reader */
    int n_reader;
    xmlDocPtr doc; /* a preparsed document */
    int n_doc;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        ret_val = xmlReaderNewWalker(reader, doc);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReaderNewWalker",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlReaderWalker(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlTextReaderPtr ret_val;
    xmlDocPtr doc; /* a preparsed document */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);

        ret_val = xmlReaderWalker(doc);
        desret_xmlTextReaderPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlReaderWalker",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderAttributeCount(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderAttributeCount(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderAttributeCount",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderBaseUri(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderBaseUri(reader);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderBaseUri",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderByteConsumed(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    long ret_val;
    xmlTextReaderPtr reader; /* an XML reader */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderByteConsumed(reader);
        desret_long(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderByteConsumed",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderClose(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderClose(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderClose",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstBaseUri(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderConstBaseUri(reader);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstBaseUri",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstEncoding(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderConstEncoding(reader);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstEncoding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstLocalName(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderConstLocalName(reader);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstLocalName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstName(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderConstName(reader);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstNamespaceUri(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderConstNamespaceUri(reader);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstNamespaceUri",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstPrefix(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderConstPrefix(reader);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstPrefix",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstString(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlChar * str; /* the string to intern. */
    int n_str;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);

        ret_val = xmlTextReaderConstString(reader, (const xmlChar *)str);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstValue(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderConstValue(reader);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstXmlLang(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderConstXmlLang(reader);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstXmlLang",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderConstXmlVersion(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderConstXmlVersion(reader);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderConstXmlVersion",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderCurrentDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlDocPtr ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderCurrentDoc(reader);
        desret_xmlDocPtr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderCurrentDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderCurrentNode(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderCurrentNode(reader);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderCurrentNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderDepth(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderDepth(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderDepth",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderExpand(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderExpand(reader);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderExpand",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderGetAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlChar * name; /* the qualified name of the attribute. */
    int n_name;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlTextReaderGetAttribute(reader, (const xmlChar *)name);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderGetAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderGetAttributeNo(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    int no; /* the zero-based index of the attribute relative to the containing element */
    int n_no;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_no = 0;n_no < gen_nb_int;n_no++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        no = gen_int(n_no, 1);

        ret_val = xmlTextReaderGetAttributeNo(reader, no);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_int(n_no, no, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderGetAttributeNo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_no);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderGetAttributeNs(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlChar * localName; /* the local name of the attribute. */
    int n_localName;
    xmlChar * namespaceURI; /* the namespace URI of the attribute. */
    int n_namespaceURI;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_localName = 0;n_localName < gen_nb_const_xmlChar_ptr;n_localName++) {
    for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        localName = gen_const_xmlChar_ptr(n_localName, 1);
        namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 2);

        ret_val = xmlTextReaderGetAttributeNs(reader, (const xmlChar *)localName, (const xmlChar *)namespaceURI);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_xmlChar_ptr(n_localName, (const xmlChar *)localName, 1);
        des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderGetAttributeNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_localName);
            printf(" %d", n_namespaceURI);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_READER_ENABLED

#define gen_nb_xmlTextReaderErrorFunc_ptr 1
static xmlTextReaderErrorFunc * gen_xmlTextReaderErrorFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlTextReaderErrorFunc_ptr(int no ATTRIBUTE_UNUSED, xmlTextReaderErrorFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlTextReaderGetErrorHandler(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlTextReaderErrorFunc * f; /* the callback function or NULL is no callback has been registered */
    int n_f;
    void ** arg; /* a user argument */
    int n_arg;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_f = 0;n_f < gen_nb_xmlTextReaderErrorFunc_ptr;n_f++) {
    for (n_arg = 0;n_arg < gen_nb_void_ptr_ptr;n_arg++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        f = gen_xmlTextReaderErrorFunc_ptr(n_f, 1);
        arg = gen_void_ptr_ptr(n_arg, 2);

        xmlTextReaderGetErrorHandler(reader, f, arg);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_xmlTextReaderErrorFunc_ptr(n_f, f, 1);
        des_void_ptr_ptr(n_arg, arg, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderGetErrorHandler",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_f);
            printf(" %d", n_arg);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderGetParserColumnNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the user data (XML reader context) */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderGetParserColumnNumber(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderGetParserColumnNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderGetParserLineNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the user data (XML reader context) */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderGetParserLineNumber(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderGetParserLineNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderGetParserProp(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    int prop; /* the xmlParserProperties to get */
    int n_prop;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_prop = 0;n_prop < gen_nb_int;n_prop++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        prop = gen_int(n_prop, 1);

        ret_val = xmlTextReaderGetParserProp(reader, prop);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_int(n_prop, prop, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderGetParserProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_prop);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderGetRemainder(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlParserInputBufferPtr ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderGetRemainder(reader);
        desret_xmlParserInputBufferPtr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderGetRemainder",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderHasAttributes(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderHasAttributes(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderHasAttributes",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderHasValue(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderHasValue(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderHasValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderIsDefault(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderIsDefault(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderIsDefault",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderIsEmptyElement(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderIsEmptyElement(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderIsEmptyElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderIsNamespaceDecl(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderIsNamespaceDecl(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderIsNamespaceDecl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderIsValid(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderIsValid(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderIsValid",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderLocalName(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderLocalName(reader);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderLocalName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_READER_ENABLED

#define gen_nb_xmlTextReaderLocatorPtr 1
static xmlTextReaderLocatorPtr gen_xmlTextReaderLocatorPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlTextReaderLocatorPtr(int no ATTRIBUTE_UNUSED, xmlTextReaderLocatorPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlTextReaderLocatorBaseURI(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderLocatorPtr locator; /* the xmlTextReaderLocatorPtr used */
    int n_locator;

    for (n_locator = 0;n_locator < gen_nb_xmlTextReaderLocatorPtr;n_locator++) {
        mem_base = xmlMemBlocks();
        locator = gen_xmlTextReaderLocatorPtr(n_locator, 0);

        ret_val = xmlTextReaderLocatorBaseURI(locator);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderLocatorPtr(n_locator, locator, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderLocatorBaseURI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_locator);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderLocatorLineNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderLocatorPtr locator; /* the xmlTextReaderLocatorPtr used */
    int n_locator;

    for (n_locator = 0;n_locator < gen_nb_xmlTextReaderLocatorPtr;n_locator++) {
        mem_base = xmlMemBlocks();
        locator = gen_xmlTextReaderLocatorPtr(n_locator, 0);

        ret_val = xmlTextReaderLocatorLineNumber(locator);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderLocatorPtr(n_locator, locator, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderLocatorLineNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_locator);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderLookupNamespace(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlChar * prefix; /* the prefix whose namespace URI is to be resolved. To return the default namespace, specify NULL */
    int n_prefix;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);

        ret_val = xmlTextReaderLookupNamespace(reader, (const xmlChar *)prefix);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderLookupNamespace",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_prefix);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderMoveToAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlChar * name; /* the qualified name of the attribute. */
    int n_name;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlTextReaderMoveToAttribute(reader, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderMoveToAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderMoveToAttributeNo(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    int no; /* the zero-based index of the attribute relative to the containing element. */
    int n_no;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_no = 0;n_no < gen_nb_int;n_no++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        no = gen_int(n_no, 1);

        ret_val = xmlTextReaderMoveToAttributeNo(reader, no);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_int(n_no, no, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderMoveToAttributeNo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_no);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderMoveToAttributeNs(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlChar * localName; /* the local name of the attribute. */
    int n_localName;
    xmlChar * namespaceURI; /* the namespace URI of the attribute. */
    int n_namespaceURI;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_localName = 0;n_localName < gen_nb_const_xmlChar_ptr;n_localName++) {
    for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        localName = gen_const_xmlChar_ptr(n_localName, 1);
        namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 2);

        ret_val = xmlTextReaderMoveToAttributeNs(reader, (const xmlChar *)localName, (const xmlChar *)namespaceURI);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_xmlChar_ptr(n_localName, (const xmlChar *)localName, 1);
        des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderMoveToAttributeNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_localName);
            printf(" %d", n_namespaceURI);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderMoveToElement(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderMoveToElement(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderMoveToElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderMoveToFirstAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderMoveToFirstAttribute(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderMoveToFirstAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderMoveToNextAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderMoveToNextAttribute(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderMoveToNextAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderName(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderName(reader);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderNamespaceUri(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderNamespaceUri(reader);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderNamespaceUri",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderNext(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderNext(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderNext",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderNextSibling(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderNextSibling(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderNextSibling",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderNodeType(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderNodeType(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderNodeType",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderNormalization(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderNormalization(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderNormalization",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderPrefix(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderPrefix(reader);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderPrefix",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderPreserve(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderPreserve(reader);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderPreserve",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderPreservePattern(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED)
#ifdef LIBXML_PATTERN_ENABLED
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlChar * pattern; /* an XPath subset pattern */
    int n_pattern;
    xmlChar ** namespaces; /* the prefix definitions, array of [URI, prefix] or NULL */
    int n_namespaces;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_pattern = 0;n_pattern < gen_nb_const_xmlChar_ptr;n_pattern++) {
    for (n_namespaces = 0;n_namespaces < gen_nb_const_xmlChar_ptr_ptr;n_namespaces++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        pattern = gen_const_xmlChar_ptr(n_pattern, 1);
        namespaces = gen_const_xmlChar_ptr_ptr(n_namespaces, 2);

        ret_val = xmlTextReaderPreservePattern(reader, (const xmlChar *)pattern, (const xmlChar **)namespaces);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_xmlChar_ptr(n_pattern, (const xmlChar *)pattern, 1);
        des_const_xmlChar_ptr_ptr(n_namespaces, (const xmlChar **)namespaces, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderPreservePattern",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_pattern);
            printf(" %d", n_namespaces);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif
#endif

    return(test_ret);
}


static int
test_xmlTextReaderQuoteChar(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderQuoteChar(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderQuoteChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderRead(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderRead(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderRead",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderReadAttributeValue(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderReadAttributeValue(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderReadAttributeValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderReadState(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderReadState(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderReadState",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderRelaxNGSetSchema(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlRelaxNGPtr schema; /* a precompiled RelaxNG schema */
    int n_schema;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_schema = 0;n_schema < gen_nb_xmlRelaxNGPtr;n_schema++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        schema = gen_xmlRelaxNGPtr(n_schema, 1);

        ret_val = xmlTextReaderRelaxNGSetSchema(reader, schema);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_xmlRelaxNGPtr(n_schema, schema, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderRelaxNGSetSchema",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_schema);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderRelaxNGValidate(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    char * rng; /* the path to a RelaxNG schema or NULL */
    int n_rng;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_rng = 0;n_rng < gen_nb_const_char_ptr;n_rng++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        rng = gen_const_char_ptr(n_rng, 1);

        ret_val = xmlTextReaderRelaxNGValidate(reader, (const char *)rng);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_char_ptr(n_rng, (const char *)rng, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderRelaxNGValidate",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_rng);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderRelaxNGValidateCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlRelaxNGValidCtxtPtr ctxt; /* the RelaxNG schema validation context or NULL */
    int n_ctxt;
    int options; /* options (not used yet) */
    int n_options;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 1);
        options = gen_parseroptions(n_options, 2);

        ret_val = xmlTextReaderRelaxNGValidateCtxt(reader, ctxt, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 1);
        des_parseroptions(n_options, options, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderRelaxNGValidateCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_ctxt);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderSchemaValidate(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED)
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    char * xsd; /* the path to a W3C XSD schema or NULL */
    int n_xsd;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_xsd = 0;n_xsd < gen_nb_const_char_ptr;n_xsd++) {
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        xsd = gen_const_char_ptr(n_xsd, 1);

        ret_val = xmlTextReaderSchemaValidate(reader, (const char *)xsd);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_const_char_ptr(n_xsd, (const char *)xsd, 1);
        xmlResetLastError();
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderSchemaValidateCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlSchemaValidCtxtPtr ctxt; /* the XML Schema validation context or NULL */
    int n_ctxt;
    int options; /* options (not used yet) */
    int n_options;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 1);
        options = gen_parseroptions(n_options, 2);

        ret_val = xmlTextReaderSchemaValidateCtxt(reader, ctxt, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 1);
        des_parseroptions(n_options, options, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderSchemaValidateCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_ctxt);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderSetErrorHandler(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextReaderSetParserProp(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    int prop; /* the xmlParserProperties to set */
    int n_prop;
    int value; /* usually 0 or 1 to (de)activate it */
    int n_value;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_prop = 0;n_prop < gen_nb_int;n_prop++) {
    for (n_value = 0;n_value < gen_nb_int;n_value++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        prop = gen_int(n_prop, 1);
        value = gen_int(n_value, 2);

        ret_val = xmlTextReaderSetParserProp(reader, prop, value);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_int(n_prop, prop, 1);
        des_int(n_value, value, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderSetParserProp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_prop);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderSetSchema(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;
    xmlSchemaPtr schema; /* a precompiled Schema schema */
    int n_schema;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_schema = 0;n_schema < gen_nb_xmlSchemaPtr;n_schema++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        schema = gen_xmlSchemaPtr(n_schema, 1);

        ret_val = xmlTextReaderSetSchema(reader, schema);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_xmlSchemaPtr(n_schema, schema, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderSetSchema",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_schema);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderSetStructuredErrorHandler(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextReaderSetup(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* an XML reader */
    int n_reader;
    xmlParserInputBufferPtr input; /* xmlParserInputBufferPtr used to feed the reader, will be destroyed with it. */
    int n_input;
    const char * URL; /* the base URL to use for the document */
    int n_URL;
    char * encoding; /* the document encoding, or NULL */
    int n_encoding;
    int options; /* a combination of xmlParserOption */
    int n_options;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
    for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) {
    for (n_URL = 0;n_URL < gen_nb_filepath;n_URL++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);
        input = gen_xmlParserInputBufferPtr(n_input, 1);
        URL = gen_filepath(n_URL, 2);
        encoding = gen_const_char_ptr(n_encoding, 3);
        options = gen_parseroptions(n_options, 4);

        ret_val = xmlTextReaderSetup(reader, input, URL, (const char *)encoding, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        des_filepath(n_URL, URL, 2);
        des_const_char_ptr(n_encoding, (const char *)encoding, 3);
        des_parseroptions(n_options, options, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderSetup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf(" %d", n_input);
            printf(" %d", n_URL);
            printf(" %d", n_encoding);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderStandalone(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderStandalone(reader);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderStandalone",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderValue(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderValue(reader);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextReaderXmlLang(void) {
    int test_ret = 0;

#if defined(LIBXML_READER_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
    int n_reader;

    for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
        mem_base = xmlMemBlocks();
        reader = gen_xmlTextReaderPtr(n_reader, 0);

        ret_val = xmlTextReaderXmlLang(reader);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlTextReaderPtr(n_reader, reader, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextReaderXmlLang",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_reader);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xmlreader(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlreader : 76 of 86 functions ...\n");
    test_ret += test_xmlNewTextReader();
    test_ret += test_xmlNewTextReaderFilename();
    test_ret += test_xmlReaderForDoc();
    test_ret += test_xmlReaderForFile();
    test_ret += test_xmlReaderForMemory();
    test_ret += test_xmlReaderNewDoc();
    test_ret += test_xmlReaderNewFile();
    test_ret += test_xmlReaderNewMemory();
    test_ret += test_xmlReaderNewWalker();
    test_ret += test_xmlReaderWalker();
    test_ret += test_xmlTextReaderAttributeCount();
    test_ret += test_xmlTextReaderBaseUri();
    test_ret += test_xmlTextReaderByteConsumed();
    test_ret += test_xmlTextReaderClose();
    test_ret += test_xmlTextReaderConstBaseUri();
    test_ret += test_xmlTextReaderConstEncoding();
    test_ret += test_xmlTextReaderConstLocalName();
    test_ret += test_xmlTextReaderConstName();
    test_ret += test_xmlTextReaderConstNamespaceUri();
    test_ret += test_xmlTextReaderConstPrefix();
    test_ret += test_xmlTextReaderConstString();
    test_ret += test_xmlTextReaderConstValue();
    test_ret += test_xmlTextReaderConstXmlLang();
    test_ret += test_xmlTextReaderConstXmlVersion();
    test_ret += test_xmlTextReaderCurrentDoc();
    test_ret += test_xmlTextReaderCurrentNode();
    test_ret += test_xmlTextReaderDepth();
    test_ret += test_xmlTextReaderExpand();
    test_ret += test_xmlTextReaderGetAttribute();
    test_ret += test_xmlTextReaderGetAttributeNo();
    test_ret += test_xmlTextReaderGetAttributeNs();
    test_ret += test_xmlTextReaderGetErrorHandler();
    test_ret += test_xmlTextReaderGetParserColumnNumber();
    test_ret += test_xmlTextReaderGetParserLineNumber();
    test_ret += test_xmlTextReaderGetParserProp();
    test_ret += test_xmlTextReaderGetRemainder();
    test_ret += test_xmlTextReaderHasAttributes();
    test_ret += test_xmlTextReaderHasValue();
    test_ret += test_xmlTextReaderIsDefault();
    test_ret += test_xmlTextReaderIsEmptyElement();
    test_ret += test_xmlTextReaderIsNamespaceDecl();
    test_ret += test_xmlTextReaderIsValid();
    test_ret += test_xmlTextReaderLocalName();
    test_ret += test_xmlTextReaderLocatorBaseURI();
    test_ret += test_xmlTextReaderLocatorLineNumber();
    test_ret += test_xmlTextReaderLookupNamespace();
    test_ret += test_xmlTextReaderMoveToAttribute();
    test_ret += test_xmlTextReaderMoveToAttributeNo();
    test_ret += test_xmlTextReaderMoveToAttributeNs();
    test_ret += test_xmlTextReaderMoveToElement();
    test_ret += test_xmlTextReaderMoveToFirstAttribute();
    test_ret += test_xmlTextReaderMoveToNextAttribute();
    test_ret += test_xmlTextReaderName();
    test_ret += test_xmlTextReaderNamespaceUri();
    test_ret += test_xmlTextReaderNext();
    test_ret += test_xmlTextReaderNextSibling();
    test_ret += test_xmlTextReaderNodeType();
    test_ret += test_xmlTextReaderNormalization();
    test_ret += test_xmlTextReaderPrefix();
    test_ret += test_xmlTextReaderPreserve();
    test_ret += test_xmlTextReaderPreservePattern();
    test_ret += test_xmlTextReaderQuoteChar();
    test_ret += test_xmlTextReaderRead();
    test_ret += test_xmlTextReaderReadAttributeValue();
    test_ret += test_xmlTextReaderReadState();
    test_ret += test_xmlTextReaderRelaxNGSetSchema();
    test_ret += test_xmlTextReaderRelaxNGValidate();
    test_ret += test_xmlTextReaderRelaxNGValidateCtxt();
    test_ret += test_xmlTextReaderSchemaValidate();
    test_ret += test_xmlTextReaderSchemaValidateCtxt();
    test_ret += test_xmlTextReaderSetErrorHandler();
    test_ret += test_xmlTextReaderSetParserProp();
    test_ret += test_xmlTextReaderSetSchema();
    test_ret += test_xmlTextReaderSetStructuredErrorHandler();
    test_ret += test_xmlTextReaderSetup();
    test_ret += test_xmlTextReaderStandalone();
    test_ret += test_xmlTextReaderValue();
    test_ret += test_xmlTextReaderXmlLang();

    if (test_ret != 0)
	printf("Module xmlreader: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlExpCtxtNbCons(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)
    int mem_base;
    int ret_val;
    xmlExpCtxtPtr ctxt; /* an expression context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0);

        ret_val = xmlExpCtxtNbCons(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlExpCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlExpCtxtNbCons",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlExpCtxtNbNodes(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)
    int mem_base;
    int ret_val;
    xmlExpCtxtPtr ctxt; /* an expression context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0);

        ret_val = xmlExpCtxtNbNodes(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlExpCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlExpCtxtNbNodes",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlExpDump(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)
    int mem_base;
    xmlBufferPtr buf; /* a buffer to receive the output */
    int n_buf;
    xmlExpNodePtr expr; /* the compiled expression */
    int n_expr;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_expr = 0;n_expr < gen_nb_xmlExpNodePtr;n_expr++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        expr = gen_xmlExpNodePtr(n_expr, 1);

        xmlExpDump(buf, expr);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_xmlExpNodePtr(n_expr, expr, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlExpDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_expr);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlExpExpDerive(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlExpGetLanguage(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)
    int mem_base;
    int ret_val;
    xmlExpCtxtPtr ctxt; /* the expression context */
    int n_ctxt;
    xmlExpNodePtr exp; /* the expression */
    int n_exp;
    xmlChar ** langList; /* where to store the tokens */
    int n_langList;
    int len; /* the allocated length of @list */
    int n_len;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) {
    for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) {
    for (n_langList = 0;n_langList < gen_nb_const_xmlChar_ptr_ptr;n_langList++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0);
        exp = gen_xmlExpNodePtr(n_exp, 1);
        langList = gen_const_xmlChar_ptr_ptr(n_langList, 2);
        len = gen_int(n_len, 3);

        ret_val = xmlExpGetLanguage(ctxt, exp, (const xmlChar **)langList, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlExpCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlExpNodePtr(n_exp, exp, 1);
        des_const_xmlChar_ptr_ptr(n_langList, (const xmlChar **)langList, 2);
        des_int(n_len, len, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlExpGetLanguage",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_exp);
            printf(" %d", n_langList);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlExpGetStart(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)
    int mem_base;
    int ret_val;
    xmlExpCtxtPtr ctxt; /* the expression context */
    int n_ctxt;
    xmlExpNodePtr exp; /* the expression */
    int n_exp;
    xmlChar ** tokList; /* where to store the tokens */
    int n_tokList;
    int len; /* the allocated length of @list */
    int n_len;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) {
    for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) {
    for (n_tokList = 0;n_tokList < gen_nb_const_xmlChar_ptr_ptr;n_tokList++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0);
        exp = gen_xmlExpNodePtr(n_exp, 1);
        tokList = gen_const_xmlChar_ptr_ptr(n_tokList, 2);
        len = gen_int(n_len, 3);

        ret_val = xmlExpGetStart(ctxt, exp, (const xmlChar **)tokList, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlExpCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlExpNodePtr(n_exp, exp, 1);
        des_const_xmlChar_ptr_ptr(n_tokList, (const xmlChar **)tokList, 2);
        des_int(n_len, len, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlExpGetStart",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_exp);
            printf(" %d", n_tokList);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlExpIsNillable(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)
    int mem_base;
    int ret_val;
    xmlExpNodePtr exp; /* the expression */
    int n_exp;

    for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) {
        mem_base = xmlMemBlocks();
        exp = gen_xmlExpNodePtr(n_exp, 0);

        ret_val = xmlExpIsNillable(exp);
        desret_int(ret_val);
        call_tests++;
        des_xmlExpNodePtr(n_exp, exp, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlExpIsNillable",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_exp);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlExpMaxToken(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)
    int mem_base;
    int ret_val;
    xmlExpNodePtr expr; /* a compiled expression */
    int n_expr;

    for (n_expr = 0;n_expr < gen_nb_xmlExpNodePtr;n_expr++) {
        mem_base = xmlMemBlocks();
        expr = gen_xmlExpNodePtr(n_expr, 0);

        ret_val = xmlExpMaxToken(expr);
        desret_int(ret_val);
        call_tests++;
        des_xmlExpNodePtr(n_expr, expr, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlExpMaxToken",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_expr);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlExpNewAtom(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlExpNewCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlExpNewOr(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlExpNewRange(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlExpNewSeq(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlExpParse(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlExpRef(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)
    int mem_base;
    xmlExpNodePtr exp; /* the expression */
    int n_exp;

    for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) {
        mem_base = xmlMemBlocks();
        exp = gen_xmlExpNodePtr(n_exp, 0);

        xmlExpRef(exp);
        call_tests++;
        des_xmlExpNodePtr(n_exp, exp, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlExpRef",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_exp);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlExpStringDerive(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlExpSubsume(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED) && defined(LIBXML_EXPR_ENABLED)
    int mem_base;
    int ret_val;
    xmlExpCtxtPtr ctxt; /* the expressions context */
    int n_ctxt;
    xmlExpNodePtr exp; /* the englobing expression */
    int n_exp;
    xmlExpNodePtr sub; /* the subexpression */
    int n_sub;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlExpCtxtPtr;n_ctxt++) {
    for (n_exp = 0;n_exp < gen_nb_xmlExpNodePtr;n_exp++) {
    for (n_sub = 0;n_sub < gen_nb_xmlExpNodePtr;n_sub++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlExpCtxtPtr(n_ctxt, 0);
        exp = gen_xmlExpNodePtr(n_exp, 1);
        sub = gen_xmlExpNodePtr(n_sub, 2);

        ret_val = xmlExpSubsume(ctxt, exp, sub);
        desret_int(ret_val);
        call_tests++;
        des_xmlExpCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlExpNodePtr(n_exp, exp, 1);
        des_xmlExpNodePtr(n_sub, sub, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlExpSubsume",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_exp);
            printf(" %d", n_sub);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_REGEXP_ENABLED

#define gen_nb_xmlRegExecCtxtPtr 1
static xmlRegExecCtxtPtr gen_xmlRegExecCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlRegExecCtxtPtr(int no ATTRIBUTE_UNUSED, xmlRegExecCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlRegExecErrInfo(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlRegExecCtxtPtr exec; /* a regexp execution context generating an error */
    int n_exec;
    xmlChar ** string; /* return value for the error string */
    int n_string;
    int * nbval; /* pointer to the number of accepted values IN/OUT */
    int n_nbval;
    int * nbneg; /* return number of negative transitions */
    int n_nbneg;
    xmlChar ** values; /* pointer to the array of acceptable values */
    int n_values;
    int * terminal; /* return value if this was a terminal state */
    int n_terminal;

    for (n_exec = 0;n_exec < gen_nb_xmlRegExecCtxtPtr;n_exec++) {
    for (n_string = 0;n_string < gen_nb_const_xmlChar_ptr_ptr;n_string++) {
    for (n_nbval = 0;n_nbval < gen_nb_int_ptr;n_nbval++) {
    for (n_nbneg = 0;n_nbneg < gen_nb_int_ptr;n_nbneg++) {
    for (n_values = 0;n_values < gen_nb_xmlChar_ptr_ptr;n_values++) {
    for (n_terminal = 0;n_terminal < gen_nb_int_ptr;n_terminal++) {
        mem_base = xmlMemBlocks();
        exec = gen_xmlRegExecCtxtPtr(n_exec, 0);
        string = gen_const_xmlChar_ptr_ptr(n_string, 1);
        nbval = gen_int_ptr(n_nbval, 2);
        nbneg = gen_int_ptr(n_nbneg, 3);
        values = gen_xmlChar_ptr_ptr(n_values, 4);
        terminal = gen_int_ptr(n_terminal, 5);

        ret_val = xmlRegExecErrInfo(exec, (const xmlChar **)string, nbval, nbneg, values, terminal);
        desret_int(ret_val);
        call_tests++;
        des_xmlRegExecCtxtPtr(n_exec, exec, 0);
        des_const_xmlChar_ptr_ptr(n_string, (const xmlChar **)string, 1);
        des_int_ptr(n_nbval, nbval, 2);
        des_int_ptr(n_nbneg, nbneg, 3);
        des_xmlChar_ptr_ptr(n_values, values, 4);
        des_int_ptr(n_terminal, terminal, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegExecErrInfo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_exec);
            printf(" %d", n_string);
            printf(" %d", n_nbval);
            printf(" %d", n_nbneg);
            printf(" %d", n_values);
            printf(" %d", n_terminal);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRegExecNextValues(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlRegExecCtxtPtr exec; /* a regexp execution context */
    int n_exec;
    int * nbval; /* pointer to the number of accepted values IN/OUT */
    int n_nbval;
    int * nbneg; /* return number of negative transitions */
    int n_nbneg;
    xmlChar ** values; /* pointer to the array of acceptable values */
    int n_values;
    int * terminal; /* return value if this was a terminal state */
    int n_terminal;

    for (n_exec = 0;n_exec < gen_nb_xmlRegExecCtxtPtr;n_exec++) {
    for (n_nbval = 0;n_nbval < gen_nb_int_ptr;n_nbval++) {
    for (n_nbneg = 0;n_nbneg < gen_nb_int_ptr;n_nbneg++) {
    for (n_values = 0;n_values < gen_nb_xmlChar_ptr_ptr;n_values++) {
    for (n_terminal = 0;n_terminal < gen_nb_int_ptr;n_terminal++) {
        mem_base = xmlMemBlocks();
        exec = gen_xmlRegExecCtxtPtr(n_exec, 0);
        nbval = gen_int_ptr(n_nbval, 1);
        nbneg = gen_int_ptr(n_nbneg, 2);
        values = gen_xmlChar_ptr_ptr(n_values, 3);
        terminal = gen_int_ptr(n_terminal, 4);

        ret_val = xmlRegExecNextValues(exec, nbval, nbneg, values, terminal);
        desret_int(ret_val);
        call_tests++;
        des_xmlRegExecCtxtPtr(n_exec, exec, 0);
        des_int_ptr(n_nbval, nbval, 1);
        des_int_ptr(n_nbneg, nbneg, 2);
        des_xmlChar_ptr_ptr(n_values, values, 3);
        des_int_ptr(n_terminal, terminal, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegExecNextValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_exec);
            printf(" %d", n_nbval);
            printf(" %d", n_nbneg);
            printf(" %d", n_values);
            printf(" %d", n_terminal);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRegExecPushString(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlRegExecCtxtPtr exec; /* a regexp execution context or NULL to indicate the end */
    int n_exec;
    xmlChar * value; /* a string token input */
    int n_value;
    void * data; /* data associated to the token to reuse in callbacks */
    int n_data;

    for (n_exec = 0;n_exec < gen_nb_xmlRegExecCtxtPtr;n_exec++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        exec = gen_xmlRegExecCtxtPtr(n_exec, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);
        data = gen_userdata(n_data, 2);

        ret_val = xmlRegExecPushString(exec, (const xmlChar *)value, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlRegExecCtxtPtr(n_exec, exec, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        des_userdata(n_data, data, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegExecPushString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_exec);
            printf(" %d", n_value);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRegExecPushString2(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlRegExecCtxtPtr exec; /* a regexp execution context or NULL to indicate the end */
    int n_exec;
    xmlChar * value; /* the first string token input */
    int n_value;
    xmlChar * value2; /* the second string token input */
    int n_value2;
    void * data; /* data associated to the token to reuse in callbacks */
    int n_data;

    for (n_exec = 0;n_exec < gen_nb_xmlRegExecCtxtPtr;n_exec++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_value2 = 0;n_value2 < gen_nb_const_xmlChar_ptr;n_value2++) {
    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
        mem_base = xmlMemBlocks();
        exec = gen_xmlRegExecCtxtPtr(n_exec, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);
        value2 = gen_const_xmlChar_ptr(n_value2, 2);
        data = gen_userdata(n_data, 3);

        ret_val = xmlRegExecPushString2(exec, (const xmlChar *)value, (const xmlChar *)value2, data);
        desret_int(ret_val);
        call_tests++;
        des_xmlRegExecCtxtPtr(n_exec, exec, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        des_const_xmlChar_ptr(n_value2, (const xmlChar *)value2, 2);
        des_userdata(n_data, data, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegExecPushString2",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_exec);
            printf(" %d", n_value);
            printf(" %d", n_value2);
            printf(" %d", n_data);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRegNewExecCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlRegexpCompile(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

#ifdef LIBXML_REGEXP_ENABLED

#define gen_nb_xmlRegexpPtr 1
static xmlRegexpPtr gen_xmlRegexpPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlRegexpPtr(int no ATTRIBUTE_UNUSED, xmlRegexpPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlRegexpExec(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlRegexpPtr comp; /* the compiled regular expression */
    int n_comp;
    xmlChar * content; /* the value to check against the regular expression */
    int n_content;

    for (n_comp = 0;n_comp < gen_nb_xmlRegexpPtr;n_comp++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        comp = gen_xmlRegexpPtr(n_comp, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        ret_val = xmlRegexpExec(comp, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlRegexpPtr(n_comp, comp, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegexpExec",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_comp);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRegexpIsDeterminist(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    int ret_val;
    xmlRegexpPtr comp; /* the compiled regular expression */
    int n_comp;

    for (n_comp = 0;n_comp < gen_nb_xmlRegexpPtr;n_comp++) {
        mem_base = xmlMemBlocks();
        comp = gen_xmlRegexpPtr(n_comp, 0);

        ret_val = xmlRegexpIsDeterminist(comp);
        desret_int(ret_val);
        call_tests++;
        des_xmlRegexpPtr(n_comp, comp, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegexpIsDeterminist",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_comp);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlRegexpPrint(void) {
    int test_ret = 0;

#if defined(LIBXML_REGEXP_ENABLED)
    int mem_base;
    FILE * output; /* the file for the output debug */
    int n_output;
    xmlRegexpPtr regexp; /* the compiled regexp */
    int n_regexp;

    for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) {
    for (n_regexp = 0;n_regexp < gen_nb_xmlRegexpPtr;n_regexp++) {
        mem_base = xmlMemBlocks();
        output = gen_FILE_ptr(n_output, 0);
        regexp = gen_xmlRegexpPtr(n_regexp, 1);

        xmlRegexpPrint(output, regexp);
        call_tests++;
        des_FILE_ptr(n_output, output, 0);
        des_xmlRegexpPtr(n_regexp, regexp, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlRegexpPrint",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_regexp);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xmlregexp(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlregexp : 16 of 30 functions ...\n");
    test_ret += test_xmlExpCtxtNbCons();
    test_ret += test_xmlExpCtxtNbNodes();
    test_ret += test_xmlExpDump();
    test_ret += test_xmlExpExpDerive();
    test_ret += test_xmlExpGetLanguage();
    test_ret += test_xmlExpGetStart();
    test_ret += test_xmlExpIsNillable();
    test_ret += test_xmlExpMaxToken();
    test_ret += test_xmlExpNewAtom();
    test_ret += test_xmlExpNewCtxt();
    test_ret += test_xmlExpNewOr();
    test_ret += test_xmlExpNewRange();
    test_ret += test_xmlExpNewSeq();
    test_ret += test_xmlExpParse();
    test_ret += test_xmlExpRef();
    test_ret += test_xmlExpStringDerive();
    test_ret += test_xmlExpSubsume();
    test_ret += test_xmlRegExecErrInfo();
    test_ret += test_xmlRegExecNextValues();
    test_ret += test_xmlRegExecPushString();
    test_ret += test_xmlRegExecPushString2();
    test_ret += test_xmlRegNewExecCtxt();
    test_ret += test_xmlRegexpCompile();
    test_ret += test_xmlRegexpExec();
    test_ret += test_xmlRegexpIsDeterminist();
    test_ret += test_xmlRegexpPrint();

    if (test_ret != 0)
	printf("Module xmlregexp: %d errors\n", test_ret);
    return(test_ret);
}
#ifdef LIBXML_OUTPUT_ENABLED

#define gen_nb_xmlSaveCtxtPtr 1
static xmlSaveCtxtPtr gen_xmlSaveCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSaveCtxtPtr(int no ATTRIBUTE_UNUSED, xmlSaveCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlSaveClose(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlSaveCtxtPtr ctxt; /* a document saving context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSaveCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSaveCtxtPtr(n_ctxt, 0);

        ret_val = xmlSaveClose(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlSaveCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveClose",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSaveDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    long ret_val;
    xmlSaveCtxtPtr ctxt; /* a document saving context */
    int n_ctxt;
    xmlDocPtr doc; /* a document */
    int n_doc;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSaveCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSaveCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        ret_val = xmlSaveDoc(ctxt, doc);
        desret_long(ret_val);
        call_tests++;
        des_xmlSaveCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSaveFlush(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    int ret_val;
    xmlSaveCtxtPtr ctxt; /* a document saving context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSaveCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSaveCtxtPtr(n_ctxt, 0);

        ret_val = xmlSaveFlush(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlSaveCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveFlush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSaveSetAttrEscape(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSaveSetEscape(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSaveToBuffer(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSaveToFd(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSaveToFilename(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSaveTree(void) {
    int test_ret = 0;

#if defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    long ret_val;
    xmlSaveCtxtPtr ctxt; /* a document saving context */
    int n_ctxt;
    xmlNodePtr node; /* the top node of the subtree to save */
    int n_node;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSaveCtxtPtr;n_ctxt++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSaveCtxtPtr(n_ctxt, 0);
        node = gen_xmlNodePtr(n_node, 1);

        ret_val = xmlSaveTree(ctxt, node);
        desret_long(ret_val);
        call_tests++;
        des_xmlSaveCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_node, node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSaveTree",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xmlsave(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlsave : 4 of 10 functions ...\n");
    test_ret += test_xmlSaveClose();
    test_ret += test_xmlSaveDoc();
    test_ret += test_xmlSaveFlush();
    test_ret += test_xmlSaveSetAttrEscape();
    test_ret += test_xmlSaveSetEscape();
    test_ret += test_xmlSaveToBuffer();
    test_ret += test_xmlSaveToFd();
    test_ret += test_xmlSaveToFilename();
    test_ret += test_xmlSaveTree();

    if (test_ret != 0)
	printf("Module xmlsave: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlSchemaDump(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
    int mem_base;
    FILE * output; /* the file output */
    int n_output;
    xmlSchemaPtr schema; /* a schema structure */
    int n_schema;

    for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) {
    for (n_schema = 0;n_schema < gen_nb_xmlSchemaPtr;n_schema++) {
        mem_base = xmlMemBlocks();
        output = gen_FILE_ptr(n_output, 0);
        schema = gen_xmlSchemaPtr(n_schema, 1);

        xmlSchemaDump(output, schema);
        call_tests++;
        des_FILE_ptr(n_output, output, 0);
        des_xmlSchemaPtr(n_schema, schema, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaDump",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_schema);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlSchemaParserCtxtPtr 1
static xmlSchemaParserCtxtPtr gen_xmlSchemaParserCtxtPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaParserCtxtPtr(int no ATTRIBUTE_UNUSED, xmlSchemaParserCtxtPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlSchemaValidityErrorFunc_ptr 1
static xmlSchemaValidityErrorFunc * gen_xmlSchemaValidityErrorFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaValidityErrorFunc_ptr(int no ATTRIBUTE_UNUSED, xmlSchemaValidityErrorFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlSchemaValidityWarningFunc_ptr 1
static xmlSchemaValidityWarningFunc * gen_xmlSchemaValidityWarningFunc_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaValidityWarningFunc_ptr(int no ATTRIBUTE_UNUSED, xmlSchemaValidityWarningFunc * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlSchemaGetParserErrors(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaParserCtxtPtr ctxt; /* a XMl-Schema parser context */
    int n_ctxt;
    xmlSchemaValidityErrorFunc * err; /* the error callback result */
    int n_err;
    xmlSchemaValidityWarningFunc * warn; /* the warning callback result */
    int n_warn;
    void ** ctx; /* contextual data for the callbacks result */
    int n_ctx;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaParserCtxtPtr;n_ctxt++) {
    for (n_err = 0;n_err < gen_nb_xmlSchemaValidityErrorFunc_ptr;n_err++) {
    for (n_warn = 0;n_warn < gen_nb_xmlSchemaValidityWarningFunc_ptr;n_warn++) {
    for (n_ctx = 0;n_ctx < gen_nb_void_ptr_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaParserCtxtPtr(n_ctxt, 0);
        err = gen_xmlSchemaValidityErrorFunc_ptr(n_err, 1);
        warn = gen_xmlSchemaValidityWarningFunc_ptr(n_warn, 2);
        ctx = gen_void_ptr_ptr(n_ctx, 3);

        ret_val = xmlSchemaGetParserErrors(ctxt, err, warn, ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaParserCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlSchemaValidityErrorFunc_ptr(n_err, err, 1);
        des_xmlSchemaValidityWarningFunc_ptr(n_warn, warn, 2);
        des_void_ptr_ptr(n_ctx, ctx, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaGetParserErrors",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_err);
            printf(" %d", n_warn);
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaGetValidErrors(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValidCtxtPtr ctxt; /* a XML-Schema validation context */
    int n_ctxt;
    xmlSchemaValidityErrorFunc * err; /* the error function result */
    int n_err;
    xmlSchemaValidityWarningFunc * warn; /* the warning function result */
    int n_warn;
    void ** ctx; /* the functions context result */
    int n_ctx;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
    for (n_err = 0;n_err < gen_nb_xmlSchemaValidityErrorFunc_ptr;n_err++) {
    for (n_warn = 0;n_warn < gen_nb_xmlSchemaValidityWarningFunc_ptr;n_warn++) {
    for (n_ctx = 0;n_ctx < gen_nb_void_ptr_ptr;n_ctx++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0);
        err = gen_xmlSchemaValidityErrorFunc_ptr(n_err, 1);
        warn = gen_xmlSchemaValidityWarningFunc_ptr(n_warn, 2);
        ctx = gen_void_ptr_ptr(n_ctx, 3);

        ret_val = xmlSchemaGetValidErrors(ctxt, err, warn, ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlSchemaValidityErrorFunc_ptr(n_err, err, 1);
        des_xmlSchemaValidityWarningFunc_ptr(n_warn, warn, 2);
        des_void_ptr_ptr(n_ctx, ctx, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaGetValidErrors",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_err);
            printf(" %d", n_warn);
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaIsValid(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValidCtxtPtr ctxt; /* the schema validation context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0);

        ret_val = xmlSchemaIsValid(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaIsValid",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaNewDocParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlSchemaParserCtxtPtr ret_val;
    xmlDocPtr doc; /* a preparsed document tree */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);

        ret_val = xmlSchemaNewDocParserCtxt(doc);
        desret_xmlSchemaParserCtxtPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaNewDocParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaNewMemParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlSchemaParserCtxtPtr ret_val;
    char * buffer; /* a pointer to a char array containing the schemas */
    int n_buffer;
    int size; /* the size of the array */
    int n_size;

    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
    for (n_size = 0;n_size < gen_nb_int;n_size++) {
        mem_base = xmlMemBlocks();
        buffer = gen_const_char_ptr(n_buffer, 0);
        size = gen_int(n_size, 1);
        if ((buffer != NULL) &&
            (size > (int) strlen((const char *) buffer) + 1))
            continue;

        ret_val = xmlSchemaNewMemParserCtxt((const char *)buffer, size);
        desret_xmlSchemaParserCtxtPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_buffer, (const char *)buffer, 0);
        des_int(n_size, size, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaNewMemParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buffer);
            printf(" %d", n_size);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaNewParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlSchemaParserCtxtPtr ret_val;
    char * URL; /* the location of the schema */
    int n_URL;

    for (n_URL = 0;n_URL < gen_nb_const_char_ptr;n_URL++) {
        mem_base = xmlMemBlocks();
        URL = gen_const_char_ptr(n_URL, 0);

        ret_val = xmlSchemaNewParserCtxt((const char *)URL);
        desret_xmlSchemaParserCtxtPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_URL, (const char *)URL, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaNewParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_URL);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaNewValidCtxt(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaParse(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaSAXPlug(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlSchemaSAXPlugPtr 1
static xmlSchemaSAXPlugPtr gen_xmlSchemaSAXPlugPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaSAXPlugPtr(int no ATTRIBUTE_UNUSED, xmlSchemaSAXPlugPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlSchemaSAXUnplug(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaSAXPlugPtr plug; /* a data structure returned by xmlSchemaSAXPlug */
    int n_plug;

    for (n_plug = 0;n_plug < gen_nb_xmlSchemaSAXPlugPtr;n_plug++) {
        mem_base = xmlMemBlocks();
        plug = gen_xmlSchemaSAXPlugPtr(n_plug, 0);

        ret_val = xmlSchemaSAXUnplug(plug);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaSAXPlugPtr(n_plug, plug, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaSAXUnplug",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_plug);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaSetParserErrors(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaSetParserStructuredErrors(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaSetValidErrors(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaSetValidOptions(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */
    int n_ctxt;
    int options; /* a combination of xmlSchemaValidOption */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0);
        options = gen_int(n_options, 1);

        ret_val = xmlSchemaSetValidOptions(ctxt, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0);
        des_int(n_options, options, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaSetValidOptions",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaSetValidStructuredErrors(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaValidCtxtGetOptions(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0);

        ret_val = xmlSchemaValidCtxtGetOptions(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidCtxtGetOptions",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidCtxtGetParserCtxt(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlParserCtxtPtr ret_val;
    xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0);

        ret_val = xmlSchemaValidCtxtGetParserCtxt(ctxt);
        desret_xmlParserCtxtPtr(ret_val);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidCtxtGetParserCtxt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateDoc(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */
    int n_ctxt;
    xmlDocPtr doc; /* a parsed document tree */
    int n_doc;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0);
        doc = gen_xmlDocPtr(n_doc, 1);

        ret_val = xmlSchemaValidateDoc(ctxt, doc);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlDocPtr(n_doc, doc, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateDoc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateFile(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */
    int n_ctxt;
    const char * filename; /* the URI of the instance */
    int n_filename;
    int options; /* a future set of options, currently unused */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0);
        filename = gen_filepath(n_filename, 1);
        options = gen_int(n_options, 2);

        ret_val = xmlSchemaValidateFile(ctxt, filename, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0);
        des_filepath(n_filename, filename, 1);
        des_int(n_options, options, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateFile",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_filename);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateOneElement(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */
    int n_ctxt;
    xmlNodePtr elem; /* an element node */
    int n_elem;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
    for (n_elem = 0;n_elem < gen_nb_xmlNodePtr;n_elem++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0);
        elem = gen_xmlNodePtr(n_elem, 1);

        ret_val = xmlSchemaValidateOneElement(ctxt, elem);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_elem, elem, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateOneElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_elem);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateSetFilename(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlSchemaValidCtxtPtr vctxt; /* the schema validation context */
    int n_vctxt;
    const char * filename; /* the file name */
    int n_filename;

    for (n_vctxt = 0;n_vctxt < gen_nb_xmlSchemaValidCtxtPtr;n_vctxt++) {
    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
        mem_base = xmlMemBlocks();
        vctxt = gen_xmlSchemaValidCtxtPtr(n_vctxt, 0);
        filename = gen_filepath(n_filename, 1);

        xmlSchemaValidateSetFilename(vctxt, filename);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_vctxt, vctxt, 0);
        des_filepath(n_filename, filename, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateSetFilename",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_vctxt);
            printf(" %d", n_filename);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateSetLocator(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaValidateStream(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValidCtxtPtr ctxt; /* a schema validation context */
    int n_ctxt;
    xmlParserInputBufferPtr input; /* the input to use for reading the data */
    int n_input;
    xmlCharEncoding enc; /* an optional encoding information */
    int n_enc;
    xmlSAXHandlerPtr sax; /* a SAX handler for the resulting events */
    int n_sax;
    void * user_data; /* the context to provide to the SAX handler. */
    int n_user_data;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlSchemaValidCtxtPtr;n_ctxt++) {
    for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) {
    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlSchemaValidCtxtPtr(n_ctxt, 0);
        input = gen_xmlParserInputBufferPtr(n_input, 1);
        enc = gen_xmlCharEncoding(n_enc, 2);
        sax = gen_xmlSAXHandlerPtr(n_sax, 3);
        user_data = gen_userdata(n_user_data, 4);

        ret_val = xmlSchemaValidateStream(ctxt, input, enc, sax, user_data);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValidCtxtPtr(n_ctxt, ctxt, 0);
        des_xmlParserInputBufferPtr(n_input, input, 1);
        des_xmlCharEncoding(n_enc, enc, 2);
        des_xmlSAXHandlerPtr(n_sax, sax, 3);
        des_userdata(n_user_data, user_data, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateStream",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_input);
            printf(" %d", n_enc);
            printf(" %d", n_sax);
            printf(" %d", n_user_data);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xmlschemas(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlschemas : 16 of 27 functions ...\n");
    test_ret += test_xmlSchemaDump();
    test_ret += test_xmlSchemaGetParserErrors();
    test_ret += test_xmlSchemaGetValidErrors();
    test_ret += test_xmlSchemaIsValid();
    test_ret += test_xmlSchemaNewDocParserCtxt();
    test_ret += test_xmlSchemaNewMemParserCtxt();
    test_ret += test_xmlSchemaNewParserCtxt();
    test_ret += test_xmlSchemaNewValidCtxt();
    test_ret += test_xmlSchemaParse();
    test_ret += test_xmlSchemaSAXPlug();
    test_ret += test_xmlSchemaSAXUnplug();
    test_ret += test_xmlSchemaSetParserErrors();
    test_ret += test_xmlSchemaSetParserStructuredErrors();
    test_ret += test_xmlSchemaSetValidErrors();
    test_ret += test_xmlSchemaSetValidOptions();
    test_ret += test_xmlSchemaSetValidStructuredErrors();
    test_ret += test_xmlSchemaValidCtxtGetOptions();
    test_ret += test_xmlSchemaValidCtxtGetParserCtxt();
    test_ret += test_xmlSchemaValidateDoc();
    test_ret += test_xmlSchemaValidateFile();
    test_ret += test_xmlSchemaValidateOneElement();
    test_ret += test_xmlSchemaValidateSetFilename();
    test_ret += test_xmlSchemaValidateSetLocator();
    test_ret += test_xmlSchemaValidateStream();

    if (test_ret != 0)
	printf("Module xmlschemas: %d errors\n", test_ret);
    return(test_ret);
}
#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlSchemaFacetPtr 1
static xmlSchemaFacetPtr gen_xmlSchemaFacetPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaFacetPtr(int no ATTRIBUTE_UNUSED, xmlSchemaFacetPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlSchemaTypePtr 1
static xmlSchemaTypePtr gen_xmlSchemaTypePtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaTypePtr(int no ATTRIBUTE_UNUSED, xmlSchemaTypePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlSchemaCheckFacet(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaFacetPtr facet; /* the facet */
    int n_facet;
    xmlSchemaTypePtr typeDecl; /* the schema type definition */
    int n_typeDecl;
    xmlSchemaParserCtxtPtr pctxt; /* the schema parser context or NULL */
    int n_pctxt;
    xmlChar * name; /* the optional name of the type */
    int n_name;

    for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) {
    for (n_typeDecl = 0;n_typeDecl < gen_nb_xmlSchemaTypePtr;n_typeDecl++) {
    for (n_pctxt = 0;n_pctxt < gen_nb_xmlSchemaParserCtxtPtr;n_pctxt++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        facet = gen_xmlSchemaFacetPtr(n_facet, 0);
        typeDecl = gen_xmlSchemaTypePtr(n_typeDecl, 1);
        pctxt = gen_xmlSchemaParserCtxtPtr(n_pctxt, 2);
        name = gen_const_xmlChar_ptr(n_name, 3);

        ret_val = xmlSchemaCheckFacet(facet, typeDecl, pctxt, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaFacetPtr(n_facet, facet, 0);
        des_xmlSchemaTypePtr(n_typeDecl, typeDecl, 1);
        des_xmlSchemaParserCtxtPtr(n_pctxt, pctxt, 2);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaCheckFacet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_facet);
            printf(" %d", n_typeDecl);
            printf(" %d", n_pctxt);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaCleanupTypes(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)


        xmlSchemaCleanupTypes();
        call_tests++;
        xmlResetLastError();
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaCollapseString(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlChar * value; /* a value */
    int n_value;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);

        ret_val = xmlSchemaCollapseString((const xmlChar *)value);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaCollapseString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlSchemaValPtr 1
static xmlSchemaValPtr gen_xmlSchemaValPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaValPtr(int no ATTRIBUTE_UNUSED, xmlSchemaValPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlSchemaCompareValues(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValPtr x; /* a first value */
    int n_x;
    xmlSchemaValPtr y; /* a second value */
    int n_y;

    for (n_x = 0;n_x < gen_nb_xmlSchemaValPtr;n_x++) {
    for (n_y = 0;n_y < gen_nb_xmlSchemaValPtr;n_y++) {
        mem_base = xmlMemBlocks();
        x = gen_xmlSchemaValPtr(n_x, 0);
        y = gen_xmlSchemaValPtr(n_y, 1);

        ret_val = xmlSchemaCompareValues(x, y);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValPtr(n_x, x, 0);
        des_xmlSchemaValPtr(n_y, y, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaCompareValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_x);
            printf(" %d", n_y);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaCompareValuesWhtsp(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValPtr x; /* a first value */
    int n_x;
    xmlSchemaWhitespaceValueType xws; /* the whitespace value of x */
    int n_xws;
    xmlSchemaValPtr y; /* a second value */
    int n_y;
    xmlSchemaWhitespaceValueType yws; /* the whitespace value of y */
    int n_yws;

    for (n_x = 0;n_x < gen_nb_xmlSchemaValPtr;n_x++) {
    for (n_xws = 0;n_xws < gen_nb_xmlSchemaWhitespaceValueType;n_xws++) {
    for (n_y = 0;n_y < gen_nb_xmlSchemaValPtr;n_y++) {
    for (n_yws = 0;n_yws < gen_nb_xmlSchemaWhitespaceValueType;n_yws++) {
        mem_base = xmlMemBlocks();
        x = gen_xmlSchemaValPtr(n_x, 0);
        xws = gen_xmlSchemaWhitespaceValueType(n_xws, 1);
        y = gen_xmlSchemaValPtr(n_y, 2);
        yws = gen_xmlSchemaWhitespaceValueType(n_yws, 3);

        ret_val = xmlSchemaCompareValuesWhtsp(x, xws, y, yws);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValPtr(n_x, x, 0);
        des_xmlSchemaWhitespaceValueType(n_xws, xws, 1);
        des_xmlSchemaValPtr(n_y, y, 2);
        des_xmlSchemaWhitespaceValueType(n_yws, yws, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaCompareValuesWhtsp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_x);
            printf(" %d", n_xws);
            printf(" %d", n_y);
            printf(" %d", n_yws);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaCopyValue(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaGetBuiltInListSimpleTypeItemType(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlSchemaTypePtr ret_val;
    xmlSchemaTypePtr type; /* the built-in simple type. */
    int n_type;

    for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) {
        mem_base = xmlMemBlocks();
        type = gen_xmlSchemaTypePtr(n_type, 0);

        ret_val = xmlSchemaGetBuiltInListSimpleTypeItemType(type);
        desret_xmlSchemaTypePtr(ret_val);
        call_tests++;
        des_xmlSchemaTypePtr(n_type, type, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaGetBuiltInListSimpleTypeItemType",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_type);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaGetBuiltInType(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    xmlSchemaTypePtr ret_val;
    xmlSchemaValType type; /* the type of the built in type */
    int n_type;

    for (n_type = 0;n_type < gen_nb_xmlSchemaValType;n_type++) {
        type = gen_xmlSchemaValType(n_type, 0);

        ret_val = xmlSchemaGetBuiltInType(type);
        desret_xmlSchemaTypePtr(ret_val);
        call_tests++;
        des_xmlSchemaValType(n_type, type, 0);
        xmlResetLastError();
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaGetCanonValue(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValPtr val; /* the precomputed value */
    int n_val;
    xmlChar ** retValue; /* the returned value */
    int n_retValue;

    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) {
    for (n_retValue = 0;n_retValue < gen_nb_const_xmlChar_ptr_ptr;n_retValue++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlSchemaValPtr(n_val, 0);
        retValue = gen_const_xmlChar_ptr_ptr(n_retValue, 1);

        ret_val = xmlSchemaGetCanonValue(val, (const xmlChar **)retValue);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValPtr(n_val, val, 0);
        des_const_xmlChar_ptr_ptr(n_retValue, (const xmlChar **)retValue, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaGetCanonValue",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf(" %d", n_retValue);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaGetCanonValueWhtsp(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValPtr val; /* the precomputed value */
    int n_val;
    xmlChar ** retValue; /* the returned value */
    int n_retValue;
    xmlSchemaWhitespaceValueType ws; /* the whitespace type of the value */
    int n_ws;

    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) {
    for (n_retValue = 0;n_retValue < gen_nb_const_xmlChar_ptr_ptr;n_retValue++) {
    for (n_ws = 0;n_ws < gen_nb_xmlSchemaWhitespaceValueType;n_ws++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlSchemaValPtr(n_val, 0);
        retValue = gen_const_xmlChar_ptr_ptr(n_retValue, 1);
        ws = gen_xmlSchemaWhitespaceValueType(n_ws, 2);

        ret_val = xmlSchemaGetCanonValueWhtsp(val, (const xmlChar **)retValue, ws);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValPtr(n_val, val, 0);
        des_const_xmlChar_ptr_ptr(n_retValue, (const xmlChar **)retValue, 1);
        des_xmlSchemaWhitespaceValueType(n_ws, ws, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaGetCanonValueWhtsp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf(" %d", n_retValue);
            printf(" %d", n_ws);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaGetFacetValueAsULong(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    unsigned long ret_val;
    xmlSchemaFacetPtr facet; /* an schemas type facet */
    int n_facet;

    for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) {
        mem_base = xmlMemBlocks();
        facet = gen_xmlSchemaFacetPtr(n_facet, 0);

        ret_val = xmlSchemaGetFacetValueAsULong(facet);
        desret_unsigned_long(ret_val);
        call_tests++;
        des_xmlSchemaFacetPtr(n_facet, facet, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaGetFacetValueAsULong",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_facet);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaGetPredefinedType(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlSchemaTypePtr ret_val;
    xmlChar * name; /* the type name */
    int n_name;
    xmlChar * ns; /* the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" */
    int n_ns;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ns = 0;n_ns < gen_nb_const_xmlChar_ptr;n_ns++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);
        ns = gen_const_xmlChar_ptr(n_ns, 1);

        ret_val = xmlSchemaGetPredefinedType((const xmlChar *)name, (const xmlChar *)ns);
        desret_xmlSchemaTypePtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        des_const_xmlChar_ptr(n_ns, (const xmlChar *)ns, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaGetPredefinedType",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf(" %d", n_ns);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaGetValType(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlSchemaValType ret_val;
    xmlSchemaValPtr val; /* a schemas value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlSchemaValPtr(n_val, 0);

        ret_val = xmlSchemaGetValType(val);
        desret_xmlSchemaValType(ret_val);
        call_tests++;
        des_xmlSchemaValPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaGetValType",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaInitTypes(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)


        xmlSchemaInitTypes();
        call_tests++;
        xmlResetLastError();
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaIsBuiltInTypeFacet(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaTypePtr type; /* the built-in type */
    int n_type;
    int facetType; /* the facet type */
    int n_facetType;

    for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) {
    for (n_facetType = 0;n_facetType < gen_nb_int;n_facetType++) {
        mem_base = xmlMemBlocks();
        type = gen_xmlSchemaTypePtr(n_type, 0);
        facetType = gen_int(n_facetType, 1);

        ret_val = xmlSchemaIsBuiltInTypeFacet(type, facetType);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaTypePtr(n_type, type, 0);
        des_int(n_facetType, facetType, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaIsBuiltInTypeFacet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_type);
            printf(" %d", n_facetType);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaNewFacet(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaNewNOTATIONValue(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaNewQNameValue(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaNewStringValue(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

#ifdef LIBXML_SCHEMAS_ENABLED

#define gen_nb_xmlSchemaValPtr_ptr 1
static xmlSchemaValPtr * gen_xmlSchemaValPtr_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlSchemaValPtr_ptr(int no ATTRIBUTE_UNUSED, xmlSchemaValPtr * val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlSchemaValPredefTypeNode(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaTypePtr type; /* the predefined type */
    int n_type;
    xmlChar * value; /* the value to check */
    int n_value;
    xmlSchemaValPtr * val; /* the return computed value */
    int n_val;
    xmlNodePtr node; /* the node containing the value */
    int n_node;

    for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr_ptr;n_val++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        type = gen_xmlSchemaTypePtr(n_type, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);
        val = gen_xmlSchemaValPtr_ptr(n_val, 2);
        node = gen_xmlNodePtr(n_node, 3);

        ret_val = xmlSchemaValPredefTypeNode(type, (const xmlChar *)value, val, node);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaTypePtr(n_type, type, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        des_xmlSchemaValPtr_ptr(n_val, val, 2);
        des_xmlNodePtr(n_node, node, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValPredefTypeNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_type);
            printf(" %d", n_value);
            printf(" %d", n_val);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValPredefTypeNodeNoNorm(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaTypePtr type; /* the predefined type */
    int n_type;
    xmlChar * value; /* the value to check */
    int n_value;
    xmlSchemaValPtr * val; /* the return computed value */
    int n_val;
    xmlNodePtr node; /* the node containing the value */
    int n_node;

    for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr_ptr;n_val++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        type = gen_xmlSchemaTypePtr(n_type, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);
        val = gen_xmlSchemaValPtr_ptr(n_val, 2);
        node = gen_xmlNodePtr(n_node, 3);

        ret_val = xmlSchemaValPredefTypeNodeNoNorm(type, (const xmlChar *)value, val, node);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaTypePtr(n_type, type, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        des_xmlSchemaValPtr_ptr(n_val, val, 2);
        des_xmlNodePtr(n_node, node, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValPredefTypeNodeNoNorm",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_type);
            printf(" %d", n_value);
            printf(" %d", n_val);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateFacet(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaTypePtr base; /* the base type */
    int n_base;
    xmlSchemaFacetPtr facet; /* the facet to check */
    int n_facet;
    xmlChar * value; /* the lexical repr of the value to validate */
    int n_value;
    xmlSchemaValPtr val; /* the precomputed value */
    int n_val;

    for (n_base = 0;n_base < gen_nb_xmlSchemaTypePtr;n_base++) {
    for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) {
        mem_base = xmlMemBlocks();
        base = gen_xmlSchemaTypePtr(n_base, 0);
        facet = gen_xmlSchemaFacetPtr(n_facet, 1);
        value = gen_const_xmlChar_ptr(n_value, 2);
        val = gen_xmlSchemaValPtr(n_val, 3);

        ret_val = xmlSchemaValidateFacet(base, facet, (const xmlChar *)value, val);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaTypePtr(n_base, base, 0);
        des_xmlSchemaFacetPtr(n_facet, facet, 1);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2);
        des_xmlSchemaValPtr(n_val, val, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateFacet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_base);
            printf(" %d", n_facet);
            printf(" %d", n_value);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateFacetWhtsp(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaFacetPtr facet; /* the facet to check */
    int n_facet;
    xmlSchemaWhitespaceValueType fws; /* the whitespace type of the facet's value */
    int n_fws;
    xmlSchemaValType valType; /* the built-in type of the value */
    int n_valType;
    xmlChar * value; /* the lexical (or normalized for pattern) repr of the value to validate */
    int n_value;
    xmlSchemaValPtr val; /* the precomputed value */
    int n_val;
    xmlSchemaWhitespaceValueType ws; /* the whitespace type of the value */
    int n_ws;

    for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) {
    for (n_fws = 0;n_fws < gen_nb_xmlSchemaWhitespaceValueType;n_fws++) {
    for (n_valType = 0;n_valType < gen_nb_xmlSchemaValType;n_valType++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) {
    for (n_ws = 0;n_ws < gen_nb_xmlSchemaWhitespaceValueType;n_ws++) {
        mem_base = xmlMemBlocks();
        facet = gen_xmlSchemaFacetPtr(n_facet, 0);
        fws = gen_xmlSchemaWhitespaceValueType(n_fws, 1);
        valType = gen_xmlSchemaValType(n_valType, 2);
        value = gen_const_xmlChar_ptr(n_value, 3);
        val = gen_xmlSchemaValPtr(n_val, 4);
        ws = gen_xmlSchemaWhitespaceValueType(n_ws, 5);

        ret_val = xmlSchemaValidateFacetWhtsp(facet, fws, valType, (const xmlChar *)value, val, ws);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaFacetPtr(n_facet, facet, 0);
        des_xmlSchemaWhitespaceValueType(n_fws, fws, 1);
        des_xmlSchemaValType(n_valType, valType, 2);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 3);
        des_xmlSchemaValPtr(n_val, val, 4);
        des_xmlSchemaWhitespaceValueType(n_ws, ws, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateFacetWhtsp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_facet);
            printf(" %d", n_fws);
            printf(" %d", n_valType);
            printf(" %d", n_value);
            printf(" %d", n_val);
            printf(" %d", n_ws);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateLengthFacet(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaTypePtr type; /* the built-in type */
    int n_type;
    xmlSchemaFacetPtr facet; /* the facet to check */
    int n_facet;
    xmlChar * value; /* the lexical repr. of the value to be validated */
    int n_value;
    xmlSchemaValPtr val; /* the precomputed value */
    int n_val;
    unsigned long * length; /* the actual length of the value */
    int n_length;

    for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) {
    for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) {
    for (n_length = 0;n_length < gen_nb_unsigned_long_ptr;n_length++) {
        mem_base = xmlMemBlocks();
        type = gen_xmlSchemaTypePtr(n_type, 0);
        facet = gen_xmlSchemaFacetPtr(n_facet, 1);
        value = gen_const_xmlChar_ptr(n_value, 2);
        val = gen_xmlSchemaValPtr(n_val, 3);
        length = gen_unsigned_long_ptr(n_length, 4);

        ret_val = xmlSchemaValidateLengthFacet(type, facet, (const xmlChar *)value, val, length);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaTypePtr(n_type, type, 0);
        des_xmlSchemaFacetPtr(n_facet, facet, 1);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2);
        des_xmlSchemaValPtr(n_val, val, 3);
        des_unsigned_long_ptr(n_length, length, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateLengthFacet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_type);
            printf(" %d", n_facet);
            printf(" %d", n_value);
            printf(" %d", n_val);
            printf(" %d", n_length);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateLengthFacetWhtsp(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaFacetPtr facet; /* the facet to check */
    int n_facet;
    xmlSchemaValType valType; /* the built-in type */
    int n_valType;
    xmlChar * value; /* the lexical repr. of the value to be validated */
    int n_value;
    xmlSchemaValPtr val; /* the precomputed value */
    int n_val;
    unsigned long * length; /* the actual length of the value */
    int n_length;
    xmlSchemaWhitespaceValueType ws; /* the whitespace type of the value */
    int n_ws;

    for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) {
    for (n_valType = 0;n_valType < gen_nb_xmlSchemaValType;n_valType++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) {
    for (n_length = 0;n_length < gen_nb_unsigned_long_ptr;n_length++) {
    for (n_ws = 0;n_ws < gen_nb_xmlSchemaWhitespaceValueType;n_ws++) {
        mem_base = xmlMemBlocks();
        facet = gen_xmlSchemaFacetPtr(n_facet, 0);
        valType = gen_xmlSchemaValType(n_valType, 1);
        value = gen_const_xmlChar_ptr(n_value, 2);
        val = gen_xmlSchemaValPtr(n_val, 3);
        length = gen_unsigned_long_ptr(n_length, 4);
        ws = gen_xmlSchemaWhitespaceValueType(n_ws, 5);

        ret_val = xmlSchemaValidateLengthFacetWhtsp(facet, valType, (const xmlChar *)value, val, length, ws);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaFacetPtr(n_facet, facet, 0);
        des_xmlSchemaValType(n_valType, valType, 1);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 2);
        des_xmlSchemaValPtr(n_val, val, 3);
        des_unsigned_long_ptr(n_length, length, 4);
        des_xmlSchemaWhitespaceValueType(n_ws, ws, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateLengthFacetWhtsp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_facet);
            printf(" %d", n_valType);
            printf(" %d", n_value);
            printf(" %d", n_val);
            printf(" %d", n_length);
            printf(" %d", n_ws);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidateListSimpleTypeFacet(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaFacetPtr facet; /* the facet to check */
    int n_facet;
    xmlChar * value; /* the lexical repr of the value to validate */
    int n_value;
    unsigned long actualLen; /* the number of list items */
    int n_actualLen;
    unsigned long * expectedLen; /* the resulting expected number of list items */
    int n_expectedLen;

    for (n_facet = 0;n_facet < gen_nb_xmlSchemaFacetPtr;n_facet++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_actualLen = 0;n_actualLen < gen_nb_unsigned_long;n_actualLen++) {
    for (n_expectedLen = 0;n_expectedLen < gen_nb_unsigned_long_ptr;n_expectedLen++) {
        mem_base = xmlMemBlocks();
        facet = gen_xmlSchemaFacetPtr(n_facet, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);
        actualLen = gen_unsigned_long(n_actualLen, 2);
        expectedLen = gen_unsigned_long_ptr(n_expectedLen, 3);

        ret_val = xmlSchemaValidateListSimpleTypeFacet(facet, (const xmlChar *)value, actualLen, expectedLen);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaFacetPtr(n_facet, facet, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        des_unsigned_long(n_actualLen, actualLen, 2);
        des_unsigned_long_ptr(n_expectedLen, expectedLen, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidateListSimpleTypeFacet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_facet);
            printf(" %d", n_value);
            printf(" %d", n_actualLen);
            printf(" %d", n_expectedLen);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValidatePredefinedType(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaTypePtr type; /* the predefined type */
    int n_type;
    xmlChar * value; /* the value to check */
    int n_value;
    xmlSchemaValPtr * val; /* the return computed value */
    int n_val;

    for (n_type = 0;n_type < gen_nb_xmlSchemaTypePtr;n_type++) {
    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr_ptr;n_val++) {
        mem_base = xmlMemBlocks();
        type = gen_xmlSchemaTypePtr(n_type, 0);
        value = gen_const_xmlChar_ptr(n_value, 1);
        val = gen_xmlSchemaValPtr_ptr(n_val, 2);

        ret_val = xmlSchemaValidatePredefinedType(type, (const xmlChar *)value, val);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaTypePtr(n_type, type, 0);
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 1);
        des_xmlSchemaValPtr_ptr(n_val, val, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValidatePredefinedType",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_type);
            printf(" %d", n_value);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValueAppend(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValPtr prev; /* the value */
    int n_prev;
    xmlSchemaValPtr cur; /* the value to be appended */
    int n_cur;

    for (n_prev = 0;n_prev < gen_nb_xmlSchemaValPtr;n_prev++) {
    for (n_cur = 0;n_cur < gen_nb_xmlSchemaValPtr;n_cur++) {
        mem_base = xmlMemBlocks();
        prev = gen_xmlSchemaValPtr(n_prev, 0);
        cur = gen_xmlSchemaValPtr(n_cur, 1);

        ret_val = xmlSchemaValueAppend(prev, cur);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValPtr(n_prev, prev, 0);
        des_xmlSchemaValPtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValueAppend",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_prev);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValueGetAsBoolean(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    xmlSchemaValPtr val; /* the value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlSchemaValPtr(n_val, 0);

        ret_val = xmlSchemaValueGetAsBoolean(val);
        desret_int(ret_val);
        call_tests++;
        des_xmlSchemaValPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValueGetAsBoolean",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValueGetAsString(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlSchemaValPtr val; /* the value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlSchemaValPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlSchemaValPtr(n_val, 0);

        ret_val = xmlSchemaValueGetAsString(val);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlSchemaValPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaValueGetAsString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlSchemaValueGetNext(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlSchemaWhiteSpaceReplace(void) {
    int test_ret = 0;

#if defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlChar * value; /* a value */
    int n_value;

    for (n_value = 0;n_value < gen_nb_const_xmlChar_ptr;n_value++) {
        mem_base = xmlMemBlocks();
        value = gen_const_xmlChar_ptr(n_value, 0);

        ret_val = xmlSchemaWhiteSpaceReplace((const xmlChar *)value);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_value, (const xmlChar *)value, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlSchemaWhiteSpaceReplace",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_value);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xmlschemastypes(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlschemastypes : 26 of 34 functions ...\n");
    test_ret += test_xmlSchemaCheckFacet();
    test_ret += test_xmlSchemaCleanupTypes();
    test_ret += test_xmlSchemaCollapseString();
    test_ret += test_xmlSchemaCompareValues();
    test_ret += test_xmlSchemaCompareValuesWhtsp();
    test_ret += test_xmlSchemaCopyValue();
    test_ret += test_xmlSchemaGetBuiltInListSimpleTypeItemType();
    test_ret += test_xmlSchemaGetBuiltInType();
    test_ret += test_xmlSchemaGetCanonValue();
    test_ret += test_xmlSchemaGetCanonValueWhtsp();
    test_ret += test_xmlSchemaGetFacetValueAsULong();
    test_ret += test_xmlSchemaGetPredefinedType();
    test_ret += test_xmlSchemaGetValType();
    test_ret += test_xmlSchemaInitTypes();
    test_ret += test_xmlSchemaIsBuiltInTypeFacet();
    test_ret += test_xmlSchemaNewFacet();
    test_ret += test_xmlSchemaNewNOTATIONValue();
    test_ret += test_xmlSchemaNewQNameValue();
    test_ret += test_xmlSchemaNewStringValue();
    test_ret += test_xmlSchemaValPredefTypeNode();
    test_ret += test_xmlSchemaValPredefTypeNodeNoNorm();
    test_ret += test_xmlSchemaValidateFacet();
    test_ret += test_xmlSchemaValidateFacetWhtsp();
    test_ret += test_xmlSchemaValidateLengthFacet();
    test_ret += test_xmlSchemaValidateLengthFacetWhtsp();
    test_ret += test_xmlSchemaValidateListSimpleTypeFacet();
    test_ret += test_xmlSchemaValidatePredefinedType();
    test_ret += test_xmlSchemaValueAppend();
    test_ret += test_xmlSchemaValueGetAsBoolean();
    test_ret += test_xmlSchemaValueGetAsString();
    test_ret += test_xmlSchemaValueGetNext();
    test_ret += test_xmlSchemaWhiteSpaceReplace();

    if (test_ret != 0)
	printf("Module xmlschemastypes: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlCharStrdup(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    char * cur; /* the input char * */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_const_char_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_char_ptr(n_cur, 0);

        ret_val = xmlCharStrdup((const char *)cur);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_char_ptr(n_cur, (const char *)cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCharStrdup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCharStrndup(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    char * cur; /* the input char * */
    int n_cur;
    int len; /* the len of @cur */
    int n_len;

    for (n_cur = 0;n_cur < gen_nb_const_char_ptr;n_cur++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_char_ptr(n_cur, 0);
        len = gen_int(n_len, 1);
        if ((cur != NULL) &&
            (len > (int) strlen((const char *) cur) + 1))
            continue;

        ret_val = xmlCharStrndup((const char *)cur, len);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_char_ptr(n_cur, (const char *)cur, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCharStrndup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlCheckUTF8(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned char * utf; /* Pointer to putative UTF-8 encoded string. */
    int n_utf;

    for (n_utf = 0;n_utf < gen_nb_const_unsigned_char_ptr;n_utf++) {
        mem_base = xmlMemBlocks();
        utf = gen_const_unsigned_char_ptr(n_utf, 0);

        ret_val = xmlCheckUTF8((const unsigned char *)utf);
        desret_int(ret_val);
        call_tests++;
        des_const_unsigned_char_ptr(n_utf, (const unsigned char *)utf, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlCheckUTF8",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlGetUTF8Char(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    unsigned char * utf; /* a sequence of UTF-8 encoded bytes */
    int n_utf;
    int * len; /* a pointer to the minimum number of bytes present in the sequence.  This is used to assure the next character is completely contained within the sequence. */
    int n_len;

    for (n_utf = 0;n_utf < gen_nb_const_unsigned_char_ptr;n_utf++) {
    for (n_len = 0;n_len < gen_nb_int_ptr;n_len++) {
        mem_base = xmlMemBlocks();
        utf = gen_const_unsigned_char_ptr(n_utf, 0);
        len = gen_int_ptr(n_len, 1);

        ret_val = xmlGetUTF8Char((const unsigned char *)utf, len);
        desret_int(ret_val);
        call_tests++;
        des_const_unsigned_char_ptr(n_utf, (const unsigned char *)utf, 0);
        des_int_ptr(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlGetUTF8Char",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrEqual(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * str1; /* the first xmlChar * */
    int n_str1;
    xmlChar * str2; /* the second xmlChar * */
    int n_str2;

    for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) {
    for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) {
        mem_base = xmlMemBlocks();
        str1 = gen_const_xmlChar_ptr(n_str1, 0);
        str2 = gen_const_xmlChar_ptr(n_str2, 1);

        ret_val = xmlStrEqual((const xmlChar *)str1, (const xmlChar *)str2);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0);
        des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrEqual",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str1);
            printf(" %d", n_str2);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrPrintf(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlStrQEqual(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * pref; /* the prefix of the QName */
    int n_pref;
    xmlChar * name; /* the localname of the QName */
    int n_name;
    xmlChar * str; /* the second xmlChar * */
    int n_str;

    for (n_pref = 0;n_pref < gen_nb_const_xmlChar_ptr;n_pref++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        pref = gen_const_xmlChar_ptr(n_pref, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        str = gen_const_xmlChar_ptr(n_str, 2);

        ret_val = xmlStrQEqual((const xmlChar *)pref, (const xmlChar *)name, (const xmlChar *)str);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_pref, (const xmlChar *)pref, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrQEqual",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_pref);
            printf(" %d", n_name);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrVPrintf(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlStrcasecmp(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * str1; /* the first xmlChar * */
    int n_str1;
    xmlChar * str2; /* the second xmlChar * */
    int n_str2;

    for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) {
    for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) {
        mem_base = xmlMemBlocks();
        str1 = gen_const_xmlChar_ptr(n_str1, 0);
        str2 = gen_const_xmlChar_ptr(n_str2, 1);

        ret_val = xmlStrcasecmp((const xmlChar *)str1, (const xmlChar *)str2);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0);
        des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrcasecmp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str1);
            printf(" %d", n_str2);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrcasestr(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlChar * str; /* the xmlChar * array (haystack) */
    int n_str;
    xmlChar * val; /* the xmlChar to search (needle) */
    int n_val;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);
        val = gen_const_xmlChar_ptr(n_val, 1);

        ret_val = xmlStrcasestr((const xmlChar *)str, (const xmlChar *)val);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrcasestr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrchr(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlChar * str; /* the xmlChar * array */
    int n_str;
    xmlChar val; /* the xmlChar to search */
    int n_val;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_val = 0;n_val < gen_nb_xmlChar;n_val++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);
        val = gen_xmlChar(n_val, 1);

        ret_val = xmlStrchr((const xmlChar *)str, val);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        des_xmlChar(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrchr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrcmp(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * str1; /* the first xmlChar * */
    int n_str1;
    xmlChar * str2; /* the second xmlChar * */
    int n_str2;

    for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) {
    for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) {
        mem_base = xmlMemBlocks();
        str1 = gen_const_xmlChar_ptr(n_str1, 0);
        str2 = gen_const_xmlChar_ptr(n_str2, 1);

        ret_val = xmlStrcmp((const xmlChar *)str1, (const xmlChar *)str2);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0);
        des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrcmp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str1);
            printf(" %d", n_str2);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrdup(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * cur; /* the input xmlChar * */
    int n_cur;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);

        ret_val = xmlStrdup((const xmlChar *)cur);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrdup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrlen(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * str; /* the xmlChar * array */
    int n_str;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);

        ret_val = xmlStrlen((const xmlChar *)str);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrlen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrncasecmp(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * str1; /* the first xmlChar * */
    int n_str1;
    xmlChar * str2; /* the second xmlChar * */
    int n_str2;
    int len; /* the max comparison length */
    int n_len;

    for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) {
    for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        str1 = gen_const_xmlChar_ptr(n_str1, 0);
        str2 = gen_const_xmlChar_ptr(n_str2, 1);
        len = gen_int(n_len, 2);
        if ((str2 != NULL) &&
            (len > (int) strlen((const char *) str2) + 1))
            continue;

        ret_val = xmlStrncasecmp((const xmlChar *)str1, (const xmlChar *)str2, len);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0);
        des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrncasecmp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str1);
            printf(" %d", n_str2);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrncatNew(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * str1; /* first xmlChar string */
    int n_str1;
    xmlChar * str2; /* second xmlChar string */
    int n_str2;
    int len; /* the len of @str2 or < 0 */
    int n_len;

    for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) {
    for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        str1 = gen_const_xmlChar_ptr(n_str1, 0);
        str2 = gen_const_xmlChar_ptr(n_str2, 1);
        len = gen_int(n_len, 2);
        if ((str2 != NULL) &&
            (len > (int) strlen((const char *) str2) + 1))
            continue;

        ret_val = xmlStrncatNew((const xmlChar *)str1, (const xmlChar *)str2, len);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0);
        des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrncatNew",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str1);
            printf(" %d", n_str2);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrncmp(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * str1; /* the first xmlChar * */
    int n_str1;
    xmlChar * str2; /* the second xmlChar * */
    int n_str2;
    int len; /* the max comparison length */
    int n_len;

    for (n_str1 = 0;n_str1 < gen_nb_const_xmlChar_ptr;n_str1++) {
    for (n_str2 = 0;n_str2 < gen_nb_const_xmlChar_ptr;n_str2++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        str1 = gen_const_xmlChar_ptr(n_str1, 0);
        str2 = gen_const_xmlChar_ptr(n_str2, 1);
        len = gen_int(n_len, 2);
        if ((str2 != NULL) &&
            (len > (int) strlen((const char *) str2) + 1))
            continue;

        ret_val = xmlStrncmp((const xmlChar *)str1, (const xmlChar *)str2, len);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str1, (const xmlChar *)str1, 0);
        des_const_xmlChar_ptr(n_str2, (const xmlChar *)str2, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrncmp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str1);
            printf(" %d", n_str2);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrndup(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * cur; /* the input xmlChar * */
    int n_cur;
    int len; /* the len of @cur */
    int n_len;

    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        cur = gen_const_xmlChar_ptr(n_cur, 0);
        len = gen_int(n_len, 1);
        if ((cur != NULL) &&
            (len > (int) strlen((const char *) cur) + 1))
            continue;

        ret_val = xmlStrndup((const xmlChar *)cur, len);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_cur, (const xmlChar *)cur, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrndup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrstr(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlChar * str; /* the xmlChar * array (haystack) */
    int n_str;
    xmlChar * val; /* the xmlChar to search (needle) */
    int n_val;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);
        val = gen_const_xmlChar_ptr(n_val, 1);

        ret_val = xmlStrstr((const xmlChar *)str, (const xmlChar *)val);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrstr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlStrsub(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * str; /* the xmlChar * array (haystack) */
    int n_str;
    int start; /* the index of the first char (zero based) */
    int n_start;
    int len; /* the length of the substring */
    int n_len;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_start = 0;n_start < gen_nb_int;n_start++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);
        start = gen_int(n_start, 1);
        len = gen_int(n_len, 2);
        if ((str != NULL) &&
            (start > (int) strlen((const char *) str) + 1))
            continue;
        if ((str != NULL) &&
            (len > (int) strlen((const char *) str) + 1))
            continue;

        ret_val = xmlStrsub((const xmlChar *)str, start, len);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        des_int(n_start, start, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlStrsub",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf(" %d", n_start);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlUTF8Charcmp(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * utf1; /* pointer to first UTF8 char */
    int n_utf1;
    xmlChar * utf2; /* pointer to second UTF8 char */
    int n_utf2;

    for (n_utf1 = 0;n_utf1 < gen_nb_const_xmlChar_ptr;n_utf1++) {
    for (n_utf2 = 0;n_utf2 < gen_nb_const_xmlChar_ptr;n_utf2++) {
        mem_base = xmlMemBlocks();
        utf1 = gen_const_xmlChar_ptr(n_utf1, 0);
        utf2 = gen_const_xmlChar_ptr(n_utf2, 1);

        ret_val = xmlUTF8Charcmp((const xmlChar *)utf1, (const xmlChar *)utf2);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_utf1, (const xmlChar *)utf1, 0);
        des_const_xmlChar_ptr(n_utf2, (const xmlChar *)utf2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUTF8Charcmp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf1);
            printf(" %d", n_utf2);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlUTF8Size(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * utf; /* pointer to the UTF8 character */
    int n_utf;

    for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) {
        mem_base = xmlMemBlocks();
        utf = gen_const_xmlChar_ptr(n_utf, 0);

        ret_val = xmlUTF8Size((const xmlChar *)utf);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUTF8Size",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlUTF8Strlen(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * utf; /* a sequence of UTF-8 encoded bytes */
    int n_utf;

    for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) {
        mem_base = xmlMemBlocks();
        utf = gen_const_xmlChar_ptr(n_utf, 0);

        ret_val = xmlUTF8Strlen((const xmlChar *)utf);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUTF8Strlen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf);
            printf("\n");
        }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlUTF8Strloc(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * utf; /* the input UTF8 * */
    int n_utf;
    xmlChar * utfchar; /* the UTF8 character to be found */
    int n_utfchar;

    for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) {
    for (n_utfchar = 0;n_utfchar < gen_nb_const_xmlChar_ptr;n_utfchar++) {
        mem_base = xmlMemBlocks();
        utf = gen_const_xmlChar_ptr(n_utf, 0);
        utfchar = gen_const_xmlChar_ptr(n_utfchar, 1);

        ret_val = xmlUTF8Strloc((const xmlChar *)utf, (const xmlChar *)utfchar);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0);
        des_const_xmlChar_ptr(n_utfchar, (const xmlChar *)utfchar, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUTF8Strloc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf);
            printf(" %d", n_utfchar);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlUTF8Strndup(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * utf; /* the input UTF8 * */
    int n_utf;
    int len; /* the len of @utf (in chars) */
    int n_len;

    for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        utf = gen_const_xmlChar_ptr(n_utf, 0);
        len = gen_int(n_len, 1);
        if ((utf != NULL) &&
            (len > (int) strlen((const char *) utf) + 1))
            continue;

        ret_val = xmlUTF8Strndup((const xmlChar *)utf, len);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUTF8Strndup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlUTF8Strpos(void) {
    int test_ret = 0;

    int mem_base;
    const xmlChar * ret_val;
    xmlChar * utf; /* the input UTF8 * */
    int n_utf;
    int pos; /* the position of the desired UTF8 char (in chars) */
    int n_pos;

    for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) {
    for (n_pos = 0;n_pos < gen_nb_int;n_pos++) {
        mem_base = xmlMemBlocks();
        utf = gen_const_xmlChar_ptr(n_utf, 0);
        pos = gen_int(n_pos, 1);

        ret_val = xmlUTF8Strpos((const xmlChar *)utf, pos);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0);
        des_int(n_pos, pos, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUTF8Strpos",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf);
            printf(" %d", n_pos);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlUTF8Strsize(void) {
    int test_ret = 0;

    int mem_base;
    int ret_val;
    xmlChar * utf; /* a sequence of UTF-8 encoded bytes */
    int n_utf;
    int len; /* the number of characters in the array */
    int n_len;

    for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        utf = gen_const_xmlChar_ptr(n_utf, 0);
        len = gen_int(n_len, 1);
        if ((utf != NULL) &&
            (len > (int) strlen((const char *) utf) + 1))
            continue;

        ret_val = xmlUTF8Strsize((const xmlChar *)utf, len);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0);
        des_int(n_len, len, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUTF8Strsize",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    function_tests++;

    return(test_ret);
}


static int
test_xmlUTF8Strsub(void) {
    int test_ret = 0;

    int mem_base;
    xmlChar * ret_val;
    xmlChar * utf; /* a sequence of UTF-8 encoded bytes */
    int n_utf;
    int start; /* relative pos of first char */
    int n_start;
    int len; /* total number to copy */
    int n_len;

    for (n_utf = 0;n_utf < gen_nb_const_xmlChar_ptr;n_utf++) {
    for (n_start = 0;n_start < gen_nb_int;n_start++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        utf = gen_const_xmlChar_ptr(n_utf, 0);
        start = gen_int(n_start, 1);
        len = gen_int(n_len, 2);
        if ((utf != NULL) &&
            (start > (int) strlen((const char *) utf) + 1))
            continue;
        if ((utf != NULL) &&
            (len > (int) strlen((const char *) utf) + 1))
            continue;

        ret_val = xmlUTF8Strsub((const xmlChar *)utf, start, len);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_utf, (const xmlChar *)utf, 0);
        des_int(n_start, start, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUTF8Strsub",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_utf);
            printf(" %d", n_start);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;

    return(test_ret);
}

static int
test_xmlstring(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlstring : 26 of 30 functions ...\n");
    test_ret += test_xmlCharStrdup();
    test_ret += test_xmlCharStrndup();
    test_ret += test_xmlCheckUTF8();
    test_ret += test_xmlGetUTF8Char();
    test_ret += test_xmlStrEqual();
    test_ret += test_xmlStrPrintf();
    test_ret += test_xmlStrQEqual();
    test_ret += test_xmlStrVPrintf();
    test_ret += test_xmlStrcasecmp();
    test_ret += test_xmlStrcasestr();
    test_ret += test_xmlStrchr();
    test_ret += test_xmlStrcmp();
    test_ret += test_xmlStrdup();
    test_ret += test_xmlStrlen();
    test_ret += test_xmlStrncasecmp();
    test_ret += test_xmlStrncatNew();
    test_ret += test_xmlStrncmp();
    test_ret += test_xmlStrndup();
    test_ret += test_xmlStrstr();
    test_ret += test_xmlStrsub();
    test_ret += test_xmlUTF8Charcmp();
    test_ret += test_xmlUTF8Size();
    test_ret += test_xmlUTF8Strlen();
    test_ret += test_xmlUTF8Strloc();
    test_ret += test_xmlUTF8Strndup();
    test_ret += test_xmlUTF8Strpos();
    test_ret += test_xmlUTF8Strsize();
    test_ret += test_xmlUTF8Strsub();

    if (test_ret != 0)
	printf("Module xmlstring: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlUCSIsAegeanNumbers(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsAegeanNumbers(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsAegeanNumbers",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsAlphabeticPresentationForms(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsAlphabeticPresentationForms(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsAlphabeticPresentationForms",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsArabic(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsArabic(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsArabic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsArabicPresentationFormsA(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsArabicPresentationFormsA(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsArabicPresentationFormsA",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsArabicPresentationFormsB(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsArabicPresentationFormsB(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsArabicPresentationFormsB",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsArmenian(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsArmenian(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsArmenian",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsArrows(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsArrows(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsArrows",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsBasicLatin(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsBasicLatin(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsBasicLatin",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsBengali(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsBengali(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsBengali",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsBlock(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;
    char * block; /* UCS block name */
    int n_block;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
    for (n_block = 0;n_block < gen_nb_const_char_ptr;n_block++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);
        block = gen_const_char_ptr(n_block, 1);

        ret_val = xmlUCSIsBlock(code, (const char *)block);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        des_const_char_ptr(n_block, (const char *)block, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsBlock",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf(" %d", n_block);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsBlockElements(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsBlockElements(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsBlockElements",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsBopomofo(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsBopomofo(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsBopomofo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsBopomofoExtended(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsBopomofoExtended(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsBopomofoExtended",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsBoxDrawing(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsBoxDrawing(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsBoxDrawing",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsBraillePatterns(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsBraillePatterns(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsBraillePatterns",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsBuhid(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsBuhid(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsBuhid",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsByzantineMusicalSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsByzantineMusicalSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsByzantineMusicalSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCJKCompatibility(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCJKCompatibility(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCJKCompatibility",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCJKCompatibilityForms(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCJKCompatibilityForms(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCJKCompatibilityForms",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCJKCompatibilityIdeographs(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCJKCompatibilityIdeographs(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCJKCompatibilityIdeographs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCJKCompatibilityIdeographsSupplement(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCJKCompatibilityIdeographsSupplement(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCJKCompatibilityIdeographsSupplement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCJKRadicalsSupplement(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCJKRadicalsSupplement(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCJKRadicalsSupplement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCJKSymbolsandPunctuation(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCJKSymbolsandPunctuation(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCJKSymbolsandPunctuation",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCJKUnifiedIdeographs(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCJKUnifiedIdeographs(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCJKUnifiedIdeographs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCJKUnifiedIdeographsExtensionA(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCJKUnifiedIdeographsExtensionA(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCJKUnifiedIdeographsExtensionA",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCJKUnifiedIdeographsExtensionB(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCJKUnifiedIdeographsExtensionB(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCJKUnifiedIdeographsExtensionB",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCat(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;
    char * cat; /* UCS Category name */
    int n_cat;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
    for (n_cat = 0;n_cat < gen_nb_const_char_ptr;n_cat++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);
        cat = gen_const_char_ptr(n_cat, 1);

        ret_val = xmlUCSIsCat(code, (const char *)cat);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        des_const_char_ptr(n_cat, (const char *)cat, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCat",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf(" %d", n_cat);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatC(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatC(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatC",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatCc(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatCc(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatCc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatCf(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatCf(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatCf",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatCo(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatCo(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatCo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatCs(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatCs(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatCs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatL(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatL(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatL",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatLl(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatLl(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatLl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatLm(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatLm(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatLm",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatLo(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatLo(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatLo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatLt(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatLt(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatLt",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatLu(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatLu(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatLu",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatM(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatM(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatM",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatMc(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatMc(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatMc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatMe(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatMe(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatMe",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatMn(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatMn(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatMn",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatN(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatN(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatN",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatNd(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatNd(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatNd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatNl(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatNl(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatNl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatNo(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatNo(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatNo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatP(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatP(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatP",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatPc(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatPc(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatPc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatPd(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatPd(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatPd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatPe(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatPe(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatPe",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatPf(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatPf(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatPf",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatPi(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatPi(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatPi",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatPo(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatPo(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatPo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatPs(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatPs(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatPs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatS(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatS(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatS",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatSc(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatSc(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatSc",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatSk(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatSk(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatSk",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatSm(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatSm(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatSm",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatSo(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatSo(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatSo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatZ(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatZ(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatZ",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatZl(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatZl(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatZl",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatZp(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatZp(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatZp",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCatZs(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCatZs(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCatZs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCherokee(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCherokee(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCherokee",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCombiningDiacriticalMarks(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCombiningDiacriticalMarks(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCombiningDiacriticalMarks",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCombiningDiacriticalMarksforSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCombiningDiacriticalMarksforSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCombiningDiacriticalMarksforSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCombiningHalfMarks(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCombiningHalfMarks(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCombiningHalfMarks",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCombiningMarksforSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCombiningMarksforSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCombiningMarksforSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsControlPictures(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsControlPictures(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsControlPictures",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCurrencySymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCurrencySymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCurrencySymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCypriotSyllabary(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCypriotSyllabary(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCypriotSyllabary",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCyrillic(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCyrillic(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCyrillic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsCyrillicSupplement(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsCyrillicSupplement(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsCyrillicSupplement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsDeseret(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsDeseret(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsDeseret",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsDevanagari(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsDevanagari(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsDevanagari",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsDingbats(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsDingbats(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsDingbats",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsEnclosedAlphanumerics(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsEnclosedAlphanumerics(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsEnclosedAlphanumerics",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsEnclosedCJKLettersandMonths(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsEnclosedCJKLettersandMonths(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsEnclosedCJKLettersandMonths",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsEthiopic(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsEthiopic(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsEthiopic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsGeneralPunctuation(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsGeneralPunctuation(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsGeneralPunctuation",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsGeometricShapes(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsGeometricShapes(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsGeometricShapes",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsGeorgian(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsGeorgian(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsGeorgian",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsGothic(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsGothic(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsGothic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsGreek(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsGreek(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsGreek",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsGreekExtended(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsGreekExtended(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsGreekExtended",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsGreekandCoptic(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsGreekandCoptic(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsGreekandCoptic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsGujarati(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsGujarati(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsGujarati",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsGurmukhi(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsGurmukhi(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsGurmukhi",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsHalfwidthandFullwidthForms(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsHalfwidthandFullwidthForms(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsHalfwidthandFullwidthForms",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsHangulCompatibilityJamo(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsHangulCompatibilityJamo(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsHangulCompatibilityJamo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsHangulJamo(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsHangulJamo(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsHangulJamo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsHangulSyllables(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsHangulSyllables(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsHangulSyllables",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsHanunoo(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsHanunoo(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsHanunoo",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsHebrew(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsHebrew(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsHebrew",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsHighPrivateUseSurrogates(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsHighPrivateUseSurrogates(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsHighPrivateUseSurrogates",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsHighSurrogates(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsHighSurrogates(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsHighSurrogates",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsHiragana(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsHiragana(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsHiragana",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsIPAExtensions(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsIPAExtensions(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsIPAExtensions",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsIdeographicDescriptionCharacters(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsIdeographicDescriptionCharacters(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsIdeographicDescriptionCharacters",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsKanbun(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsKanbun(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsKanbun",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsKangxiRadicals(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsKangxiRadicals(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsKangxiRadicals",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsKannada(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsKannada(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsKannada",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsKatakana(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsKatakana(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsKatakana",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsKatakanaPhoneticExtensions(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsKatakanaPhoneticExtensions(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsKatakanaPhoneticExtensions",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsKhmer(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsKhmer(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsKhmer",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsKhmerSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsKhmerSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsKhmerSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLao(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLao(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLao",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLatin1Supplement(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLatin1Supplement(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLatin1Supplement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLatinExtendedA(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLatinExtendedA(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLatinExtendedA",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLatinExtendedAdditional(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLatinExtendedAdditional(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLatinExtendedAdditional",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLatinExtendedB(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLatinExtendedB(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLatinExtendedB",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLetterlikeSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLetterlikeSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLetterlikeSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLimbu(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLimbu(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLimbu",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLinearBIdeograms(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLinearBIdeograms(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLinearBIdeograms",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLinearBSyllabary(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLinearBSyllabary(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLinearBSyllabary",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsLowSurrogates(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsLowSurrogates(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsLowSurrogates",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMalayalam(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMalayalam(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMalayalam",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMathematicalAlphanumericSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMathematicalAlphanumericSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMathematicalAlphanumericSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMathematicalOperators(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMathematicalOperators(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMathematicalOperators",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMiscellaneousMathematicalSymbolsA(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMiscellaneousMathematicalSymbolsA(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMiscellaneousMathematicalSymbolsA",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMiscellaneousMathematicalSymbolsB(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMiscellaneousMathematicalSymbolsB(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMiscellaneousMathematicalSymbolsB",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMiscellaneousSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMiscellaneousSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMiscellaneousSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMiscellaneousSymbolsandArrows(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMiscellaneousSymbolsandArrows(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMiscellaneousSymbolsandArrows",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMiscellaneousTechnical(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMiscellaneousTechnical(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMiscellaneousTechnical",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMongolian(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMongolian(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMongolian",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMusicalSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMusicalSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMusicalSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsMyanmar(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsMyanmar(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsMyanmar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsNumberForms(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsNumberForms(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsNumberForms",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsOgham(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsOgham(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsOgham",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsOldItalic(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsOldItalic(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsOldItalic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsOpticalCharacterRecognition(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsOpticalCharacterRecognition(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsOpticalCharacterRecognition",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsOriya(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsOriya(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsOriya",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsOsmanya(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsOsmanya(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsOsmanya",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsPhoneticExtensions(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsPhoneticExtensions(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsPhoneticExtensions",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsPrivateUse(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsPrivateUse(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsPrivateUse",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsPrivateUseArea(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsPrivateUseArea(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsPrivateUseArea",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsRunic(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsRunic(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsRunic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsShavian(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsShavian(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsShavian",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSinhala(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSinhala(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSinhala",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSmallFormVariants(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSmallFormVariants(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSmallFormVariants",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSpacingModifierLetters(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSpacingModifierLetters(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSpacingModifierLetters",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSpecials(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSpecials(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSpecials",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSuperscriptsandSubscripts(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSuperscriptsandSubscripts(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSuperscriptsandSubscripts",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSupplementalArrowsA(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSupplementalArrowsA(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSupplementalArrowsA",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSupplementalArrowsB(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSupplementalArrowsB(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSupplementalArrowsB",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSupplementalMathematicalOperators(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSupplementalMathematicalOperators(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSupplementalMathematicalOperators",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSupplementaryPrivateUseAreaA(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSupplementaryPrivateUseAreaA(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSupplementaryPrivateUseAreaA",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSupplementaryPrivateUseAreaB(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSupplementaryPrivateUseAreaB(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSupplementaryPrivateUseAreaB",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsSyriac(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsSyriac(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsSyriac",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsTagalog(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsTagalog(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsTagalog",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsTagbanwa(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsTagbanwa(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsTagbanwa",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsTags(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsTags(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsTags",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsTaiLe(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsTaiLe(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsTaiLe",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsTaiXuanJingSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsTaiXuanJingSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsTaiXuanJingSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsTamil(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsTamil(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsTamil",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsTelugu(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsTelugu(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsTelugu",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsThaana(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsThaana(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsThaana",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsThai(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsThai(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsThai",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsTibetan(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsTibetan(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsTibetan",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsUgaritic(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsUgaritic(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsUgaritic",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsUnifiedCanadianAboriginalSyllabics(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsUnifiedCanadianAboriginalSyllabics(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsUnifiedCanadianAboriginalSyllabics",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsVariationSelectors(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsVariationSelectors(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsVariationSelectors",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsVariationSelectorsSupplement(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsVariationSelectorsSupplement(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsVariationSelectorsSupplement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsYiRadicals(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsYiRadicals(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsYiRadicals",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsYiSyllables(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsYiSyllables(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsYiSyllables",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlUCSIsYijingHexagramSymbols(void) {
    int test_ret = 0;

#if defined(LIBXML_UNICODE_ENABLED)
    int mem_base;
    int ret_val;
    int code; /* UCS code point */
    int n_code;

    for (n_code = 0;n_code < gen_nb_int;n_code++) {
        mem_base = xmlMemBlocks();
        code = gen_int(n_code, 0);

        ret_val = xmlUCSIsYijingHexagramSymbols(code);
        desret_int(ret_val);
        call_tests++;
        des_int(n_code, code, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlUCSIsYijingHexagramSymbols",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_code);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xmlunicode(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlunicode : 166 of 166 functions ...\n");
    test_ret += test_xmlUCSIsAegeanNumbers();
    test_ret += test_xmlUCSIsAlphabeticPresentationForms();
    test_ret += test_xmlUCSIsArabic();
    test_ret += test_xmlUCSIsArabicPresentationFormsA();
    test_ret += test_xmlUCSIsArabicPresentationFormsB();
    test_ret += test_xmlUCSIsArmenian();
    test_ret += test_xmlUCSIsArrows();
    test_ret += test_xmlUCSIsBasicLatin();
    test_ret += test_xmlUCSIsBengali();
    test_ret += test_xmlUCSIsBlock();
    test_ret += test_xmlUCSIsBlockElements();
    test_ret += test_xmlUCSIsBopomofo();
    test_ret += test_xmlUCSIsBopomofoExtended();
    test_ret += test_xmlUCSIsBoxDrawing();
    test_ret += test_xmlUCSIsBraillePatterns();
    test_ret += test_xmlUCSIsBuhid();
    test_ret += test_xmlUCSIsByzantineMusicalSymbols();
    test_ret += test_xmlUCSIsCJKCompatibility();
    test_ret += test_xmlUCSIsCJKCompatibilityForms();
    test_ret += test_xmlUCSIsCJKCompatibilityIdeographs();
    test_ret += test_xmlUCSIsCJKCompatibilityIdeographsSupplement();
    test_ret += test_xmlUCSIsCJKRadicalsSupplement();
    test_ret += test_xmlUCSIsCJKSymbolsandPunctuation();
    test_ret += test_xmlUCSIsCJKUnifiedIdeographs();
    test_ret += test_xmlUCSIsCJKUnifiedIdeographsExtensionA();
    test_ret += test_xmlUCSIsCJKUnifiedIdeographsExtensionB();
    test_ret += test_xmlUCSIsCat();
    test_ret += test_xmlUCSIsCatC();
    test_ret += test_xmlUCSIsCatCc();
    test_ret += test_xmlUCSIsCatCf();
    test_ret += test_xmlUCSIsCatCo();
    test_ret += test_xmlUCSIsCatCs();
    test_ret += test_xmlUCSIsCatL();
    test_ret += test_xmlUCSIsCatLl();
    test_ret += test_xmlUCSIsCatLm();
    test_ret += test_xmlUCSIsCatLo();
    test_ret += test_xmlUCSIsCatLt();
    test_ret += test_xmlUCSIsCatLu();
    test_ret += test_xmlUCSIsCatM();
    test_ret += test_xmlUCSIsCatMc();
    test_ret += test_xmlUCSIsCatMe();
    test_ret += test_xmlUCSIsCatMn();
    test_ret += test_xmlUCSIsCatN();
    test_ret += test_xmlUCSIsCatNd();
    test_ret += test_xmlUCSIsCatNl();
    test_ret += test_xmlUCSIsCatNo();
    test_ret += test_xmlUCSIsCatP();
    test_ret += test_xmlUCSIsCatPc();
    test_ret += test_xmlUCSIsCatPd();
    test_ret += test_xmlUCSIsCatPe();
    test_ret += test_xmlUCSIsCatPf();
    test_ret += test_xmlUCSIsCatPi();
    test_ret += test_xmlUCSIsCatPo();
    test_ret += test_xmlUCSIsCatPs();
    test_ret += test_xmlUCSIsCatS();
    test_ret += test_xmlUCSIsCatSc();
    test_ret += test_xmlUCSIsCatSk();
    test_ret += test_xmlUCSIsCatSm();
    test_ret += test_xmlUCSIsCatSo();
    test_ret += test_xmlUCSIsCatZ();
    test_ret += test_xmlUCSIsCatZl();
    test_ret += test_xmlUCSIsCatZp();
    test_ret += test_xmlUCSIsCatZs();
    test_ret += test_xmlUCSIsCherokee();
    test_ret += test_xmlUCSIsCombiningDiacriticalMarks();
    test_ret += test_xmlUCSIsCombiningDiacriticalMarksforSymbols();
    test_ret += test_xmlUCSIsCombiningHalfMarks();
    test_ret += test_xmlUCSIsCombiningMarksforSymbols();
    test_ret += test_xmlUCSIsControlPictures();
    test_ret += test_xmlUCSIsCurrencySymbols();
    test_ret += test_xmlUCSIsCypriotSyllabary();
    test_ret += test_xmlUCSIsCyrillic();
    test_ret += test_xmlUCSIsCyrillicSupplement();
    test_ret += test_xmlUCSIsDeseret();
    test_ret += test_xmlUCSIsDevanagari();
    test_ret += test_xmlUCSIsDingbats();
    test_ret += test_xmlUCSIsEnclosedAlphanumerics();
    test_ret += test_xmlUCSIsEnclosedCJKLettersandMonths();
    test_ret += test_xmlUCSIsEthiopic();
    test_ret += test_xmlUCSIsGeneralPunctuation();
    test_ret += test_xmlUCSIsGeometricShapes();
    test_ret += test_xmlUCSIsGeorgian();
    test_ret += test_xmlUCSIsGothic();
    test_ret += test_xmlUCSIsGreek();
    test_ret += test_xmlUCSIsGreekExtended();
    test_ret += test_xmlUCSIsGreekandCoptic();
    test_ret += test_xmlUCSIsGujarati();
    test_ret += test_xmlUCSIsGurmukhi();
    test_ret += test_xmlUCSIsHalfwidthandFullwidthForms();
    test_ret += test_xmlUCSIsHangulCompatibilityJamo();
    test_ret += test_xmlUCSIsHangulJamo();
    test_ret += test_xmlUCSIsHangulSyllables();
    test_ret += test_xmlUCSIsHanunoo();
    test_ret += test_xmlUCSIsHebrew();
    test_ret += test_xmlUCSIsHighPrivateUseSurrogates();
    test_ret += test_xmlUCSIsHighSurrogates();
    test_ret += test_xmlUCSIsHiragana();
    test_ret += test_xmlUCSIsIPAExtensions();
    test_ret += test_xmlUCSIsIdeographicDescriptionCharacters();
    test_ret += test_xmlUCSIsKanbun();
    test_ret += test_xmlUCSIsKangxiRadicals();
    test_ret += test_xmlUCSIsKannada();
    test_ret += test_xmlUCSIsKatakana();
    test_ret += test_xmlUCSIsKatakanaPhoneticExtensions();
    test_ret += test_xmlUCSIsKhmer();
    test_ret += test_xmlUCSIsKhmerSymbols();
    test_ret += test_xmlUCSIsLao();
    test_ret += test_xmlUCSIsLatin1Supplement();
    test_ret += test_xmlUCSIsLatinExtendedA();
    test_ret += test_xmlUCSIsLatinExtendedAdditional();
    test_ret += test_xmlUCSIsLatinExtendedB();
    test_ret += test_xmlUCSIsLetterlikeSymbols();
    test_ret += test_xmlUCSIsLimbu();
    test_ret += test_xmlUCSIsLinearBIdeograms();
    test_ret += test_xmlUCSIsLinearBSyllabary();
    test_ret += test_xmlUCSIsLowSurrogates();
    test_ret += test_xmlUCSIsMalayalam();
    test_ret += test_xmlUCSIsMathematicalAlphanumericSymbols();
    test_ret += test_xmlUCSIsMathematicalOperators();
    test_ret += test_xmlUCSIsMiscellaneousMathematicalSymbolsA();
    test_ret += test_xmlUCSIsMiscellaneousMathematicalSymbolsB();
    test_ret += test_xmlUCSIsMiscellaneousSymbols();
    test_ret += test_xmlUCSIsMiscellaneousSymbolsandArrows();
    test_ret += test_xmlUCSIsMiscellaneousTechnical();
    test_ret += test_xmlUCSIsMongolian();
    test_ret += test_xmlUCSIsMusicalSymbols();
    test_ret += test_xmlUCSIsMyanmar();
    test_ret += test_xmlUCSIsNumberForms();
    test_ret += test_xmlUCSIsOgham();
    test_ret += test_xmlUCSIsOldItalic();
    test_ret += test_xmlUCSIsOpticalCharacterRecognition();
    test_ret += test_xmlUCSIsOriya();
    test_ret += test_xmlUCSIsOsmanya();
    test_ret += test_xmlUCSIsPhoneticExtensions();
    test_ret += test_xmlUCSIsPrivateUse();
    test_ret += test_xmlUCSIsPrivateUseArea();
    test_ret += test_xmlUCSIsRunic();
    test_ret += test_xmlUCSIsShavian();
    test_ret += test_xmlUCSIsSinhala();
    test_ret += test_xmlUCSIsSmallFormVariants();
    test_ret += test_xmlUCSIsSpacingModifierLetters();
    test_ret += test_xmlUCSIsSpecials();
    test_ret += test_xmlUCSIsSuperscriptsandSubscripts();
    test_ret += test_xmlUCSIsSupplementalArrowsA();
    test_ret += test_xmlUCSIsSupplementalArrowsB();
    test_ret += test_xmlUCSIsSupplementalMathematicalOperators();
    test_ret += test_xmlUCSIsSupplementaryPrivateUseAreaA();
    test_ret += test_xmlUCSIsSupplementaryPrivateUseAreaB();
    test_ret += test_xmlUCSIsSyriac();
    test_ret += test_xmlUCSIsTagalog();
    test_ret += test_xmlUCSIsTagbanwa();
    test_ret += test_xmlUCSIsTags();
    test_ret += test_xmlUCSIsTaiLe();
    test_ret += test_xmlUCSIsTaiXuanJingSymbols();
    test_ret += test_xmlUCSIsTamil();
    test_ret += test_xmlUCSIsTelugu();
    test_ret += test_xmlUCSIsThaana();
    test_ret += test_xmlUCSIsThai();
    test_ret += test_xmlUCSIsTibetan();
    test_ret += test_xmlUCSIsUgaritic();
    test_ret += test_xmlUCSIsUnifiedCanadianAboriginalSyllabics();
    test_ret += test_xmlUCSIsVariationSelectors();
    test_ret += test_xmlUCSIsVariationSelectorsSupplement();
    test_ret += test_xmlUCSIsYiRadicals();
    test_ret += test_xmlUCSIsYiSyllables();
    test_ret += test_xmlUCSIsYijingHexagramSymbols();

    if (test_ret != 0)
	printf("Module xmlunicode: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlNewTextWriter(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    xmlTextWriterPtr ret_val;
    xmlOutputBufferPtr out; /* an xmlOutputBufferPtr */
    int n_out;

    for (n_out = 0;n_out < gen_nb_xmlOutputBufferPtr;n_out++) {
        mem_base = xmlMemBlocks();
        out = gen_xmlOutputBufferPtr(n_out, 0);

        ret_val = xmlNewTextWriter(out);
        if (ret_val != NULL) out = NULL;
        desret_xmlTextWriterPtr(ret_val);
        call_tests++;
        des_xmlOutputBufferPtr(n_out, out, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewTextWriter",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_out);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNewTextWriterFilename(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    xmlTextWriterPtr ret_val;
    const char * uri; /* the URI of the resource for the output */
    int n_uri;
    int compression; /* compress the output? */
    int n_compression;

    for (n_uri = 0;n_uri < gen_nb_fileoutput;n_uri++) {
    for (n_compression = 0;n_compression < gen_nb_int;n_compression++) {
        mem_base = xmlMemBlocks();
        uri = gen_fileoutput(n_uri, 0);
        compression = gen_int(n_compression, 1);

        ret_val = xmlNewTextWriterFilename(uri, compression);
        desret_xmlTextWriterPtr(ret_val);
        call_tests++;
        des_fileoutput(n_uri, uri, 0);
        des_int(n_compression, compression, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewTextWriterFilename",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_uri);
            printf(" %d", n_compression);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNewTextWriterMemory(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    xmlTextWriterPtr ret_val;
    xmlBufferPtr buf; /* xmlBufferPtr */
    int n_buf;
    int compression; /* compress the output? */
    int n_compression;

    for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
    for (n_compression = 0;n_compression < gen_nb_int;n_compression++) {
        mem_base = xmlMemBlocks();
        buf = gen_xmlBufferPtr(n_buf, 0);
        compression = gen_int(n_compression, 1);

        ret_val = xmlNewTextWriterMemory(buf, compression);
        desret_xmlTextWriterPtr(ret_val);
        call_tests++;
        des_xmlBufferPtr(n_buf, buf, 0);
        des_int(n_compression, compression, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewTextWriterMemory",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_buf);
            printf(" %d", n_compression);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNewTextWriterPushParser(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    xmlTextWriterPtr ret_val;
    xmlParserCtxtPtr ctxt; /* xmlParserCtxtPtr to hold the new XML document tree */
    int n_ctxt;
    int compression; /* compress the output? */
    int n_compression;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlParserCtxtPtr;n_ctxt++) {
    for (n_compression = 0;n_compression < gen_nb_int;n_compression++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlParserCtxtPtr(n_ctxt, 0);
        compression = gen_int(n_compression, 1);

        ret_val = xmlNewTextWriterPushParser(ctxt, compression);
        if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} if (ret_val != NULL) ctxt = NULL;
        desret_xmlTextWriterPtr(ret_val);
        call_tests++;
        des_xmlParserCtxtPtr(n_ctxt, ctxt, 0);
        des_int(n_compression, compression, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewTextWriterPushParser",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_compression);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlNewTextWriterTree(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    xmlTextWriterPtr ret_val;
    xmlDocPtr doc; /* xmlDocPtr */
    int n_doc;
    xmlNodePtr node; /* xmlNodePtr or NULL for doc->children */
    int n_node;
    int compression; /* compress the output? */
    int n_compression;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_compression = 0;n_compression < gen_nb_int;n_compression++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);
        node = gen_xmlNodePtr(n_node, 1);
        compression = gen_int(n_compression, 2);

        ret_val = xmlNewTextWriterTree(doc, node, compression);
        desret_xmlTextWriterPtr(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        des_xmlNodePtr(n_node, node, 1);
        des_int(n_compression, compression, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlNewTextWriterTree",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf(" %d", n_node);
            printf(" %d", n_compression);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndAttribute(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndCDATA(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndCDATA(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndCDATA",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndComment(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndComment(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndComment",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndDTD(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndDTD(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndDTD",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndDTDAttlist(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndDTDAttlist(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndDTDAttlist",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndDTDElement(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndDTDElement(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndDTDElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndDTDEntity(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndDTDEntity(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndDTDEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndDocument(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndDocument(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndDocument",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndElement(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndElement(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterEndPI(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterEndPI(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterEndPI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterFlush(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterFlush(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterFlush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterFullEndElement(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterFullEndElement(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterFullEndElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterSetIndent(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    int indent; /* do indentation? */
    int n_indent;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_indent = 0;n_indent < gen_nb_int;n_indent++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        indent = gen_int(n_indent, 1);

        ret_val = xmlTextWriterSetIndent(writer, indent);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_int(n_indent, indent, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterSetIndent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_indent);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterSetIndentString(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * str; /* the xmlChar string */
    int n_str;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);

        ret_val = xmlTextWriterSetIndentString(writer, (const xmlChar *)str);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterSetIndentString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_str);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterSetQuoteChar(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar quotechar; /* the quote character */
    int n_quotechar;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_quotechar = 0;n_quotechar < gen_nb_xmlChar;n_quotechar++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        quotechar = gen_xmlChar(n_quotechar, 1);

        ret_val = xmlTextWriterSetQuoteChar(writer, quotechar);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_xmlChar(n_quotechar, quotechar, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterSetQuoteChar",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_quotechar);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* element name */
    int n_name;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlTextWriterStartAttribute(writer, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartAttributeNS(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * prefix; /* namespace prefix or NULL */
    int n_prefix;
    xmlChar * name; /* element local name */
    int n_name;
    xmlChar * namespaceURI; /* namespace URI or NULL */
    int n_namespaceURI;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 3);

        ret_val = xmlTextWriterStartAttributeNS(writer, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)namespaceURI);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartAttributeNS",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_prefix);
            printf(" %d", n_name);
            printf(" %d", n_namespaceURI);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartCDATA(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterStartCDATA(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartCDATA",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartComment(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);

        ret_val = xmlTextWriterStartComment(writer);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartComment",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartDTD(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* the name of the DTD */
    int n_name;
    xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */
    int n_pubid;
    xmlChar * sysid; /* the system identifier, which is the URI of the DTD */
    int n_sysid;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) {
    for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        pubid = gen_const_xmlChar_ptr(n_pubid, 2);
        sysid = gen_const_xmlChar_ptr(n_sysid, 3);

        ret_val = xmlTextWriterStartDTD(writer, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 2);
        des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartDTD",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf(" %d", n_pubid);
            printf(" %d", n_sysid);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartDTDAttlist(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* the name of the DTD ATTLIST */
    int n_name;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlTextWriterStartDTDAttlist(writer, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartDTDAttlist",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartDTDElement(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* the name of the DTD element */
    int n_name;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlTextWriterStartDTDElement(writer, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartDTDElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartDTDEntity(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    int pe; /* TRUE if this is a parameter entity, FALSE if not */
    int n_pe;
    xmlChar * name; /* the name of the DTD ATTLIST */
    int n_name;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_pe = 0;n_pe < gen_nb_int;n_pe++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        pe = gen_int(n_pe, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);

        ret_val = xmlTextWriterStartDTDEntity(writer, pe, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_int(n_pe, pe, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartDTDEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_pe);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartDocument(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    char * version; /* the xml version ("1.0") or NULL for default ("1.0") */
    int n_version;
    char * encoding; /* the encoding or NULL for default */
    int n_encoding;
    char * standalone; /* "yes" or "no" or NULL for default */
    int n_standalone;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_version = 0;n_version < gen_nb_const_char_ptr;n_version++) {
    for (n_encoding = 0;n_encoding < gen_nb_const_char_ptr;n_encoding++) {
    for (n_standalone = 0;n_standalone < gen_nb_const_char_ptr;n_standalone++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        version = gen_const_char_ptr(n_version, 1);
        encoding = gen_const_char_ptr(n_encoding, 2);
        standalone = gen_const_char_ptr(n_standalone, 3);

        ret_val = xmlTextWriterStartDocument(writer, (const char *)version, (const char *)encoding, (const char *)standalone);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_char_ptr(n_version, (const char *)version, 1);
        des_const_char_ptr(n_encoding, (const char *)encoding, 2);
        des_const_char_ptr(n_standalone, (const char *)standalone, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartDocument",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_version);
            printf(" %d", n_encoding);
            printf(" %d", n_standalone);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartElement(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* element name */
    int n_name;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlTextWriterStartElement(writer, (const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartElementNS(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * prefix; /* namespace prefix or NULL */
    int n_prefix;
    xmlChar * name; /* element local name */
    int n_name;
    xmlChar * namespaceURI; /* namespace URI or NULL */
    int n_namespaceURI;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 3);

        ret_val = xmlTextWriterStartElementNS(writer, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)namespaceURI);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartElementNS",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_prefix);
            printf(" %d", n_name);
            printf(" %d", n_namespaceURI);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterStartPI(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * target; /* PI target */
    int n_target;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_target = 0;n_target < gen_nb_const_xmlChar_ptr;n_target++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        target = gen_const_xmlChar_ptr(n_target, 1);

        ret_val = xmlTextWriterStartPI(writer, (const xmlChar *)target);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_target, (const xmlChar *)target, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterStartPI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_target);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* attribute name */
    int n_name;
    xmlChar * content; /* attribute content */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        content = gen_const_xmlChar_ptr(n_content, 2);

        ret_val = xmlTextWriterWriteAttribute(writer, (const xmlChar *)name, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteAttributeNS(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * prefix; /* namespace prefix */
    int n_prefix;
    xmlChar * name; /* attribute local name */
    int n_name;
    xmlChar * namespaceURI; /* namespace URI */
    int n_namespaceURI;
    xmlChar * content; /* attribute content */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 3);
        content = gen_const_xmlChar_ptr(n_content, 4);

        ret_val = xmlTextWriterWriteAttributeNS(writer, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)namespaceURI, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 3);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteAttributeNS",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_prefix);
            printf(" %d", n_name);
            printf(" %d", n_namespaceURI);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteBase64(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    char * data; /* binary data */
    int n_data;
    int start; /* the position within the data of the first byte to encode */
    int n_start;
    int len; /* the number of bytes to encode */
    int n_len;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_data = 0;n_data < gen_nb_const_char_ptr;n_data++) {
    for (n_start = 0;n_start < gen_nb_int;n_start++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        data = gen_const_char_ptr(n_data, 1);
        start = gen_int(n_start, 2);
        len = gen_int(n_len, 3);
        if ((data != NULL) &&
            (start > (int) strlen((const char *) data) + 1))
            continue;
        if ((data != NULL) &&
            (len > (int) strlen((const char *) data) + 1))
            continue;

        ret_val = xmlTextWriterWriteBase64(writer, (const char *)data, start, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_char_ptr(n_data, (const char *)data, 1);
        des_int(n_start, start, 2);
        des_int(n_len, len, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteBase64",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_data);
            printf(" %d", n_start);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteBinHex(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    char * data; /* binary data */
    int n_data;
    int start; /* the position within the data of the first byte to encode */
    int n_start;
    int len; /* the number of bytes to encode */
    int n_len;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_data = 0;n_data < gen_nb_const_char_ptr;n_data++) {
    for (n_start = 0;n_start < gen_nb_int;n_start++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        data = gen_const_char_ptr(n_data, 1);
        start = gen_int(n_start, 2);
        len = gen_int(n_len, 3);
        if ((data != NULL) &&
            (start > (int) strlen((const char *) data) + 1))
            continue;
        if ((data != NULL) &&
            (len > (int) strlen((const char *) data) + 1))
            continue;

        ret_val = xmlTextWriterWriteBinHex(writer, (const char *)data, start, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_char_ptr(n_data, (const char *)data, 1);
        des_int(n_start, start, 2);
        des_int(n_len, len, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteBinHex",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_data);
            printf(" %d", n_start);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteCDATA(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * content; /* CDATA content */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        ret_val = xmlTextWriterWriteCDATA(writer, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteCDATA",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteComment(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * content; /* comment string */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        ret_val = xmlTextWriterWriteComment(writer, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteComment",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteDTD(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* the name of the DTD */
    int n_name;
    xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */
    int n_pubid;
    xmlChar * sysid; /* the system identifier, which is the URI of the DTD */
    int n_sysid;
    xmlChar * subset; /* string content of the DTD */
    int n_subset;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) {
    for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) {
    for (n_subset = 0;n_subset < gen_nb_const_xmlChar_ptr;n_subset++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        pubid = gen_const_xmlChar_ptr(n_pubid, 2);
        sysid = gen_const_xmlChar_ptr(n_sysid, 3);
        subset = gen_const_xmlChar_ptr(n_subset, 4);

        ret_val = xmlTextWriterWriteDTD(writer, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid, (const xmlChar *)subset);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 2);
        des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 3);
        des_const_xmlChar_ptr(n_subset, (const xmlChar *)subset, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteDTD",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf(" %d", n_pubid);
            printf(" %d", n_sysid);
            printf(" %d", n_subset);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteDTDAttlist(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* the name of the DTD ATTLIST */
    int n_name;
    xmlChar * content; /* content of the ATTLIST */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        content = gen_const_xmlChar_ptr(n_content, 2);

        ret_val = xmlTextWriterWriteDTDAttlist(writer, (const xmlChar *)name, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteDTDAttlist",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteDTDElement(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* the name of the DTD element */
    int n_name;
    xmlChar * content; /* content of the element */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        content = gen_const_xmlChar_ptr(n_content, 2);

        ret_val = xmlTextWriterWriteDTDElement(writer, (const xmlChar *)name, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteDTDElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteDTDEntity(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    int pe; /* TRUE if this is a parameter entity, FALSE if not */
    int n_pe;
    xmlChar * name; /* the name of the DTD entity */
    int n_name;
    xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */
    int n_pubid;
    xmlChar * sysid; /* the system identifier, which is the URI of the DTD */
    int n_sysid;
    xmlChar * ndataid; /* the xml notation name. */
    int n_ndataid;
    xmlChar * content; /* content of the entity */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_pe = 0;n_pe < gen_nb_int;n_pe++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) {
    for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) {
    for (n_ndataid = 0;n_ndataid < gen_nb_const_xmlChar_ptr;n_ndataid++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        pe = gen_int(n_pe, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        pubid = gen_const_xmlChar_ptr(n_pubid, 3);
        sysid = gen_const_xmlChar_ptr(n_sysid, 4);
        ndataid = gen_const_xmlChar_ptr(n_ndataid, 5);
        content = gen_const_xmlChar_ptr(n_content, 6);

        ret_val = xmlTextWriterWriteDTDEntity(writer, pe, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid, (const xmlChar *)ndataid, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_int(n_pe, pe, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 3);
        des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 4);
        des_const_xmlChar_ptr(n_ndataid, (const xmlChar *)ndataid, 5);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 6);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteDTDEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_pe);
            printf(" %d", n_name);
            printf(" %d", n_pubid);
            printf(" %d", n_sysid);
            printf(" %d", n_ndataid);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteDTDExternalEntity(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    int pe; /* TRUE if this is a parameter entity, FALSE if not */
    int n_pe;
    xmlChar * name; /* the name of the DTD entity */
    int n_name;
    xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */
    int n_pubid;
    xmlChar * sysid; /* the system identifier, which is the URI of the DTD */
    int n_sysid;
    xmlChar * ndataid; /* the xml notation name. */
    int n_ndataid;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_pe = 0;n_pe < gen_nb_int;n_pe++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) {
    for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) {
    for (n_ndataid = 0;n_ndataid < gen_nb_const_xmlChar_ptr;n_ndataid++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        pe = gen_int(n_pe, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        pubid = gen_const_xmlChar_ptr(n_pubid, 3);
        sysid = gen_const_xmlChar_ptr(n_sysid, 4);
        ndataid = gen_const_xmlChar_ptr(n_ndataid, 5);

        ret_val = xmlTextWriterWriteDTDExternalEntity(writer, pe, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid, (const xmlChar *)ndataid);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_int(n_pe, pe, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 3);
        des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 4);
        des_const_xmlChar_ptr(n_ndataid, (const xmlChar *)ndataid, 5);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteDTDExternalEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_pe);
            printf(" %d", n_name);
            printf(" %d", n_pubid);
            printf(" %d", n_sysid);
            printf(" %d", n_ndataid);
            printf("\n");
        }
    }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteDTDExternalEntityContents(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */
    int n_pubid;
    xmlChar * sysid; /* the system identifier, which is the URI of the DTD */
    int n_sysid;
    xmlChar * ndataid; /* the xml notation name. */
    int n_ndataid;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) {
    for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) {
    for (n_ndataid = 0;n_ndataid < gen_nb_const_xmlChar_ptr;n_ndataid++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        pubid = gen_const_xmlChar_ptr(n_pubid, 1);
        sysid = gen_const_xmlChar_ptr(n_sysid, 2);
        ndataid = gen_const_xmlChar_ptr(n_ndataid, 3);

        ret_val = xmlTextWriterWriteDTDExternalEntityContents(writer, (const xmlChar *)pubid, (const xmlChar *)sysid, (const xmlChar *)ndataid);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 1);
        des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 2);
        des_const_xmlChar_ptr(n_ndataid, (const xmlChar *)ndataid, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteDTDExternalEntityContents",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_pubid);
            printf(" %d", n_sysid);
            printf(" %d", n_ndataid);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteDTDInternalEntity(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    int pe; /* TRUE if this is a parameter entity, FALSE if not */
    int n_pe;
    xmlChar * name; /* the name of the DTD entity */
    int n_name;
    xmlChar * content; /* content of the entity */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_pe = 0;n_pe < gen_nb_int;n_pe++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        pe = gen_int(n_pe, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        content = gen_const_xmlChar_ptr(n_content, 3);

        ret_val = xmlTextWriterWriteDTDInternalEntity(writer, pe, (const xmlChar *)name, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_int(n_pe, pe, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteDTDInternalEntity",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_pe);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteDTDNotation(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* the name of the xml notation */
    int n_name;
    xmlChar * pubid; /* the public identifier, which is an alternative to the system identifier */
    int n_pubid;
    xmlChar * sysid; /* the system identifier, which is the URI of the DTD */
    int n_sysid;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_pubid = 0;n_pubid < gen_nb_const_xmlChar_ptr;n_pubid++) {
    for (n_sysid = 0;n_sysid < gen_nb_const_xmlChar_ptr;n_sysid++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        pubid = gen_const_xmlChar_ptr(n_pubid, 2);
        sysid = gen_const_xmlChar_ptr(n_sysid, 3);

        ret_val = xmlTextWriterWriteDTDNotation(writer, (const xmlChar *)name, (const xmlChar *)pubid, (const xmlChar *)sysid);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_pubid, (const xmlChar *)pubid, 2);
        des_const_xmlChar_ptr(n_sysid, (const xmlChar *)sysid, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteDTDNotation",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf(" %d", n_pubid);
            printf(" %d", n_sysid);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteElement(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * name; /* element name */
    int n_name;
    xmlChar * content; /* element content */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        content = gen_const_xmlChar_ptr(n_content, 2);

        ret_val = xmlTextWriterWriteElement(writer, (const xmlChar *)name, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteElement",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_name);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteElementNS(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * prefix; /* namespace prefix */
    int n_prefix;
    xmlChar * name; /* element local name */
    int n_name;
    xmlChar * namespaceURI; /* namespace URI */
    int n_namespaceURI;
    xmlChar * content; /* element content */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_namespaceURI = 0;n_namespaceURI < gen_nb_const_xmlChar_ptr;n_namespaceURI++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        name = gen_const_xmlChar_ptr(n_name, 2);
        namespaceURI = gen_const_xmlChar_ptr(n_namespaceURI, 3);
        content = gen_const_xmlChar_ptr(n_content, 4);

        ret_val = xmlTextWriterWriteElementNS(writer, (const xmlChar *)prefix, (const xmlChar *)name, (const xmlChar *)namespaceURI, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 2);
        des_const_xmlChar_ptr(n_namespaceURI, (const xmlChar *)namespaceURI, 3);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 4);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteElementNS",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_prefix);
            printf(" %d", n_name);
            printf(" %d", n_namespaceURI);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatAttribute(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatAttributeNS(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatCDATA(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatComment(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatDTD(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatDTDAttlist(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatDTDElement(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatDTDInternalEntity(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatElement(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatElementNS(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatPI(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatRaw(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteFormatString(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWritePI(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * target; /* PI target */
    int n_target;
    xmlChar * content; /* PI content */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_target = 0;n_target < gen_nb_const_xmlChar_ptr;n_target++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        target = gen_const_xmlChar_ptr(n_target, 1);
        content = gen_const_xmlChar_ptr(n_content, 2);

        ret_val = xmlTextWriterWritePI(writer, (const xmlChar *)target, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_target, (const xmlChar *)target, 1);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWritePI",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_target);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteRaw(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * content; /* text string */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        ret_val = xmlTextWriterWriteRaw(writer, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteRaw",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteRawLen(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * content; /* text string */
    int n_content;
    int len; /* length of the text string */
    int n_len;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
    for (n_len = 0;n_len < gen_nb_int;n_len++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);
        len = gen_int(n_len, 2);
        if ((content != NULL) &&
            (len > (int) strlen((const char *) content) + 1))
            continue;

        ret_val = xmlTextWriterWriteRawLen(writer, (const xmlChar *)content, len);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        des_int(n_len, len, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteRawLen",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_content);
            printf(" %d", n_len);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteString(void) {
    int test_ret = 0;

#if defined(LIBXML_WRITER_ENABLED)
    int mem_base;
    int ret_val;
    xmlTextWriterPtr writer; /* the xmlTextWriterPtr */
    int n_writer;
    xmlChar * content; /* text string */
    int n_content;

    for (n_writer = 0;n_writer < gen_nb_xmlTextWriterPtr;n_writer++) {
    for (n_content = 0;n_content < gen_nb_const_xmlChar_ptr;n_content++) {
        mem_base = xmlMemBlocks();
        writer = gen_xmlTextWriterPtr(n_writer, 0);
        content = gen_const_xmlChar_ptr(n_content, 1);

        ret_val = xmlTextWriterWriteString(writer, (const xmlChar *)content);
        desret_int(ret_val);
        call_tests++;
        des_xmlTextWriterPtr(n_writer, writer, 0);
        des_const_xmlChar_ptr(n_content, (const xmlChar *)content, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlTextWriterWriteString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_writer);
            printf(" %d", n_content);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatAttribute(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatAttributeNS(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatCDATA(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatComment(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatDTD(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatDTDAttlist(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatDTDElement(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatDTDInternalEntity(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatElement(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatElementNS(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatPI(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatRaw(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlTextWriterWriteVFormatString(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

static int
test_xmlwriter(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xmlwriter : 52 of 80 functions ...\n");
    test_ret += test_xmlNewTextWriter();
    test_ret += test_xmlNewTextWriterFilename();
    test_ret += test_xmlNewTextWriterMemory();
    test_ret += test_xmlNewTextWriterPushParser();
    test_ret += test_xmlNewTextWriterTree();
    test_ret += test_xmlTextWriterEndAttribute();
    test_ret += test_xmlTextWriterEndCDATA();
    test_ret += test_xmlTextWriterEndComment();
    test_ret += test_xmlTextWriterEndDTD();
    test_ret += test_xmlTextWriterEndDTDAttlist();
    test_ret += test_xmlTextWriterEndDTDElement();
    test_ret += test_xmlTextWriterEndDTDEntity();
    test_ret += test_xmlTextWriterEndDocument();
    test_ret += test_xmlTextWriterEndElement();
    test_ret += test_xmlTextWriterEndPI();
    test_ret += test_xmlTextWriterFlush();
    test_ret += test_xmlTextWriterFullEndElement();
    test_ret += test_xmlTextWriterSetIndent();
    test_ret += test_xmlTextWriterSetIndentString();
    test_ret += test_xmlTextWriterSetQuoteChar();
    test_ret += test_xmlTextWriterStartAttribute();
    test_ret += test_xmlTextWriterStartAttributeNS();
    test_ret += test_xmlTextWriterStartCDATA();
    test_ret += test_xmlTextWriterStartComment();
    test_ret += test_xmlTextWriterStartDTD();
    test_ret += test_xmlTextWriterStartDTDAttlist();
    test_ret += test_xmlTextWriterStartDTDElement();
    test_ret += test_xmlTextWriterStartDTDEntity();
    test_ret += test_xmlTextWriterStartDocument();
    test_ret += test_xmlTextWriterStartElement();
    test_ret += test_xmlTextWriterStartElementNS();
    test_ret += test_xmlTextWriterStartPI();
    test_ret += test_xmlTextWriterWriteAttribute();
    test_ret += test_xmlTextWriterWriteAttributeNS();
    test_ret += test_xmlTextWriterWriteBase64();
    test_ret += test_xmlTextWriterWriteBinHex();
    test_ret += test_xmlTextWriterWriteCDATA();
    test_ret += test_xmlTextWriterWriteComment();
    test_ret += test_xmlTextWriterWriteDTD();
    test_ret += test_xmlTextWriterWriteDTDAttlist();
    test_ret += test_xmlTextWriterWriteDTDElement();
    test_ret += test_xmlTextWriterWriteDTDEntity();
    test_ret += test_xmlTextWriterWriteDTDExternalEntity();
    test_ret += test_xmlTextWriterWriteDTDExternalEntityContents();
    test_ret += test_xmlTextWriterWriteDTDInternalEntity();
    test_ret += test_xmlTextWriterWriteDTDNotation();
    test_ret += test_xmlTextWriterWriteElement();
    test_ret += test_xmlTextWriterWriteElementNS();
    test_ret += test_xmlTextWriterWriteFormatAttribute();
    test_ret += test_xmlTextWriterWriteFormatAttributeNS();
    test_ret += test_xmlTextWriterWriteFormatCDATA();
    test_ret += test_xmlTextWriterWriteFormatComment();
    test_ret += test_xmlTextWriterWriteFormatDTD();
    test_ret += test_xmlTextWriterWriteFormatDTDAttlist();
    test_ret += test_xmlTextWriterWriteFormatDTDElement();
    test_ret += test_xmlTextWriterWriteFormatDTDInternalEntity();
    test_ret += test_xmlTextWriterWriteFormatElement();
    test_ret += test_xmlTextWriterWriteFormatElementNS();
    test_ret += test_xmlTextWriterWriteFormatPI();
    test_ret += test_xmlTextWriterWriteFormatRaw();
    test_ret += test_xmlTextWriterWriteFormatString();
    test_ret += test_xmlTextWriterWritePI();
    test_ret += test_xmlTextWriterWriteRaw();
    test_ret += test_xmlTextWriterWriteRawLen();
    test_ret += test_xmlTextWriterWriteString();
    test_ret += test_xmlTextWriterWriteVFormatAttribute();
    test_ret += test_xmlTextWriterWriteVFormatAttributeNS();
    test_ret += test_xmlTextWriterWriteVFormatCDATA();
    test_ret += test_xmlTextWriterWriteVFormatComment();
    test_ret += test_xmlTextWriterWriteVFormatDTD();
    test_ret += test_xmlTextWriterWriteVFormatDTDAttlist();
    test_ret += test_xmlTextWriterWriteVFormatDTDElement();
    test_ret += test_xmlTextWriterWriteVFormatDTDInternalEntity();
    test_ret += test_xmlTextWriterWriteVFormatElement();
    test_ret += test_xmlTextWriterWriteVFormatElementNS();
    test_ret += test_xmlTextWriterWriteVFormatPI();
    test_ret += test_xmlTextWriterWriteVFormatRaw();
    test_ret += test_xmlTextWriterWriteVFormatString();

    if (test_ret != 0)
	printf("Module xmlwriter: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlXPathCastBooleanToNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    double ret_val;
    int val; /* a boolean */
    int n_val;

    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_int(n_val, 0);

        ret_val = xmlXPathCastBooleanToNumber(val);
        desret_double(ret_val);
        call_tests++;
        des_int(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastBooleanToNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastBooleanToString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    int val; /* a boolean */
    int n_val;

    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_int(n_val, 0);

        ret_val = xmlXPathCastBooleanToString(val);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_int(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastBooleanToString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastNodeSetToBoolean(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodeSetPtr ns; /* a node-set */
    int n_ns;

    for (n_ns = 0;n_ns < gen_nb_xmlNodeSetPtr;n_ns++) {
        mem_base = xmlMemBlocks();
        ns = gen_xmlNodeSetPtr(n_ns, 0);

        ret_val = xmlXPathCastNodeSetToBoolean(ns);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_ns, ns, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastNodeSetToBoolean",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ns);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastNodeSetToNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    double ret_val;
    xmlNodeSetPtr ns; /* a node-set */
    int n_ns;

    for (n_ns = 0;n_ns < gen_nb_xmlNodeSetPtr;n_ns++) {
        mem_base = xmlMemBlocks();
        ns = gen_xmlNodeSetPtr(n_ns, 0);

        ret_val = xmlXPathCastNodeSetToNumber(ns);
        desret_double(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_ns, ns, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastNodeSetToNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ns);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastNodeSetToString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlNodeSetPtr ns; /* a node-set */
    int n_ns;

    for (n_ns = 0;n_ns < gen_nb_xmlNodeSetPtr;n_ns++) {
        mem_base = xmlMemBlocks();
        ns = gen_xmlNodeSetPtr(n_ns, 0);

        ret_val = xmlXPathCastNodeSetToString(ns);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_ns, ns, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastNodeSetToString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ns);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastNodeToNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    double ret_val;
    xmlNodePtr node; /* a node */
    int n_node;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);

        ret_val = xmlXPathCastNodeToNumber(node);
        desret_double(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastNodeToNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastNodeToString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlNodePtr node; /* a node */
    int n_node;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);

        ret_val = xmlXPathCastNodeToString(node);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastNodeToString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastNumberToBoolean(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    double val; /* a number */
    int n_val;

    for (n_val = 0;n_val < gen_nb_double;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_double(n_val, 0);

        ret_val = xmlXPathCastNumberToBoolean(val);
        desret_int(ret_val);
        call_tests++;
        des_double(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastNumberToBoolean",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastNumberToString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    double val; /* a number */
    int n_val;

    for (n_val = 0;n_val < gen_nb_double;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_double(n_val, 0);

        ret_val = xmlXPathCastNumberToString(val);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_double(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastNumberToString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastStringToBoolean(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlChar * val; /* a string */
    int n_val;

    for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_const_xmlChar_ptr(n_val, 0);

        ret_val = xmlXPathCastStringToBoolean((const xmlChar *)val);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastStringToBoolean",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastStringToNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    double ret_val;
    xmlChar * val; /* a string */
    int n_val;

    for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_const_xmlChar_ptr(n_val, 0);

        ret_val = xmlXPathCastStringToNumber((const xmlChar *)val);
        desret_double(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastStringToNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastToBoolean(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathObjectPtr val; /* an XPath object */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlXPathObjectPtr(n_val, 0);

        ret_val = xmlXPathCastToBoolean(val);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastToBoolean",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastToNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    double ret_val;
    xmlXPathObjectPtr val; /* an XPath object */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlXPathObjectPtr(n_val, 0);

        ret_val = xmlXPathCastToNumber(val);
        desret_double(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastToNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCastToString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlXPathObjectPtr val; /* an XPath object */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlXPathObjectPtr(n_val, 0);

        ret_val = xmlXPathCastToString(val);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCastToString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCmpNodes(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodePtr node1; /* the first node */
    int n_node1;
    xmlNodePtr node2; /* the second node */
    int n_node2;

    for (n_node1 = 0;n_node1 < gen_nb_xmlNodePtr;n_node1++) {
    for (n_node2 = 0;n_node2 < gen_nb_xmlNodePtr;n_node2++) {
        mem_base = xmlMemBlocks();
        node1 = gen_xmlNodePtr(n_node1, 0);
        node2 = gen_xmlNodePtr(n_node2, 1);

        ret_val = xmlXPathCmpNodes(node1, node2);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node1, node1, 0);
        des_xmlNodePtr(n_node2, node2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCmpNodes",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node1);
            printf(" %d", n_node2);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCompile(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}

#ifdef LIBXML_XPATH_ENABLED

#define gen_nb_xmlXPathCompExprPtr 1
static xmlXPathCompExprPtr gen_xmlXPathCompExprPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlXPathCompExprPtr(int no ATTRIBUTE_UNUSED, xmlXPathCompExprPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif

#ifdef LIBXML_XPATH_ENABLED

#define gen_nb_xmlXPathContextPtr 1
static xmlXPathContextPtr gen_xmlXPathContextPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlXPathContextPtr(int no ATTRIBUTE_UNUSED, xmlXPathContextPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlXPathCompiledEval(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathCompExprPtr comp; /* the compiled XPath expression */
    int n_comp;
    xmlXPathContextPtr ctx; /* the XPath context */
    int n_ctx;

    for (n_comp = 0;n_comp < gen_nb_xmlXPathCompExprPtr;n_comp++) {
    for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        comp = gen_xmlXPathCompExprPtr(n_comp, 0);
        ctx = gen_xmlXPathContextPtr(n_ctx, 1);

        ret_val = xmlXPathCompiledEval(comp, ctx);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathCompExprPtr(n_comp, comp, 0);
        des_xmlXPathContextPtr(n_ctx, ctx, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCompiledEval",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_comp);
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCompiledEvalToBoolean(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathCompExprPtr comp; /* the compiled XPath expression */
    int n_comp;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;

    for (n_comp = 0;n_comp < gen_nb_xmlXPathCompExprPtr;n_comp++) {
    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        comp = gen_xmlXPathCompExprPtr(n_comp, 0);
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 1);

        ret_val = xmlXPathCompiledEvalToBoolean(comp, ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathCompExprPtr(n_comp, comp, 0);
        des_xmlXPathContextPtr(n_ctxt, ctxt, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCompiledEvalToBoolean",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_comp);
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathContextSetCache(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;
    int active; /* enables/disables (creates/frees) the cache */
    int n_active;
    int value; /* a value with semantics dependent on @options */
    int n_value;
    int options; /* options (currently only the value 0 is used) */
    int n_options;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
    for (n_active = 0;n_active < gen_nb_int;n_active++) {
    for (n_value = 0;n_value < gen_nb_int;n_value++) {
    for (n_options = 0;n_options < gen_nb_int;n_options++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);
        active = gen_int(n_active, 1);
        value = gen_int(n_value, 2);
        options = gen_int(n_options, 3);

        ret_val = xmlXPathContextSetCache(ctxt, active, value, options);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        des_int(n_active, active, 1);
        des_int(n_value, value, 2);
        des_int(n_options, options, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathContextSetCache",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_active);
            printf(" %d", n_value);
            printf(" %d", n_options);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathConvertBoolean(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathObjectPtr val; /* an XPath object */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlXPathObjectPtr(n_val, 0);

        ret_val = xmlXPathConvertBoolean(val);
        val = NULL;
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathConvertBoolean",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathConvertNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathObjectPtr val; /* an XPath object */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlXPathObjectPtr(n_val, 0);

        ret_val = xmlXPathConvertNumber(val);
        val = NULL;
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathConvertNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathConvertString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathObjectPtr val; /* an XPath object */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlXPathObjectPtr(n_val, 0);

        ret_val = xmlXPathConvertString(val);
        val = NULL;
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathConvertString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCtxtCompile(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPathEval(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlChar * str; /* the XPath expression */
    int n_str;
    xmlXPathContextPtr ctx; /* the XPath context */
    int n_ctx;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);
        ctx = gen_xmlXPathContextPtr(n_ctx, 1);

        ret_val = xmlXPathEval((const xmlChar *)str, ctx);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        des_xmlXPathContextPtr(n_ctx, ctx, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathEval",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathEvalExpression(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlChar * str; /* the XPath expression */
    int n_str;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 1);

        ret_val = xmlXPathEvalExpression((const xmlChar *)str, ctxt);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        des_xmlXPathContextPtr(n_ctxt, ctxt, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathEvalExpression",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathEvalPredicate(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;
    xmlXPathObjectPtr res; /* the Predicate Expression evaluation result */
    int n_res;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
    for (n_res = 0;n_res < gen_nb_xmlXPathObjectPtr;n_res++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);
        res = gen_xmlXPathObjectPtr(n_res, 1);

        ret_val = xmlXPathEvalPredicate(ctxt, res);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        des_xmlXPathObjectPtr(n_res, res, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathEvalPredicate",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_res);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathInit(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;

        mem_base = xmlMemBlocks();

        xmlXPathInit();
        call_tests++;
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathInit",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf("\n");
        }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathIsInf(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    double val; /* a double value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_double;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_double(n_val, 0);

        ret_val = xmlXPathIsInf(val);
        desret_int(ret_val);
        call_tests++;
        des_double(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathIsInf",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathIsNaN(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
    int mem_base;
    int ret_val;
    double val; /* a double value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_double;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_double(n_val, 0);

        ret_val = xmlXPathIsNaN(val);
        desret_int(ret_val);
        call_tests++;
        des_double(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathIsNaN",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNewContext(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPathNodeEval(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodePtr node; /* the node to to use as the context node */
    int n_node;
    xmlChar * str; /* the XPath expression */
    int n_str;
    xmlXPathContextPtr ctx; /* the XPath context */
    int n_ctx;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        str = gen_const_xmlChar_ptr(n_str, 1);
        ctx = gen_xmlXPathContextPtr(n_ctx, 2);

        ret_val = xmlXPathNodeEval(node, (const xmlChar *)str, ctx);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 1);
        des_xmlXPathContextPtr(n_ctx, ctx, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeEval",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_str);
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeSetCreate(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodePtr val; /* an initial xmlNodePtr, or NULL */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlNodePtr(n_val, 0);

        ret_val = xmlXPathNodeSetCreate(val);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeSetCreate",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathObjectCopy(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathObjectPtr val; /* the original object */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlXPathObjectPtr(n_val, 0);

        ret_val = xmlXPathObjectCopy(val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathObjectCopy",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathOrderDocElems(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    long ret_val;
    xmlDocPtr doc; /* an input document */
    int n_doc;

    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
        mem_base = xmlMemBlocks();
        doc = gen_xmlDocPtr(n_doc, 0);

        ret_val = xmlXPathOrderDocElems(doc);
        desret_long(ret_val);
        call_tests++;
        des_xmlDocPtr(n_doc, doc, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathOrderDocElems",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_doc);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathSetContextNode(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodePtr node; /* the node to to use as the context node */
    int n_node;
    xmlXPathContextPtr ctx; /* the XPath context */
    int n_ctx;

    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        node = gen_xmlNodePtr(n_node, 0);
        ctx = gen_xmlXPathContextPtr(n_ctx, 1);

        ret_val = xmlXPathSetContextNode(node, ctx);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodePtr(n_node, node, 0);
        des_xmlXPathContextPtr(n_ctx, ctx, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathSetContextNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_node);
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xpath(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xpath : 32 of 40 functions ...\n");
    test_ret += test_xmlXPathCastBooleanToNumber();
    test_ret += test_xmlXPathCastBooleanToString();
    test_ret += test_xmlXPathCastNodeSetToBoolean();
    test_ret += test_xmlXPathCastNodeSetToNumber();
    test_ret += test_xmlXPathCastNodeSetToString();
    test_ret += test_xmlXPathCastNodeToNumber();
    test_ret += test_xmlXPathCastNodeToString();
    test_ret += test_xmlXPathCastNumberToBoolean();
    test_ret += test_xmlXPathCastNumberToString();
    test_ret += test_xmlXPathCastStringToBoolean();
    test_ret += test_xmlXPathCastStringToNumber();
    test_ret += test_xmlXPathCastToBoolean();
    test_ret += test_xmlXPathCastToNumber();
    test_ret += test_xmlXPathCastToString();
    test_ret += test_xmlXPathCmpNodes();
    test_ret += test_xmlXPathCompile();
    test_ret += test_xmlXPathCompiledEval();
    test_ret += test_xmlXPathCompiledEvalToBoolean();
    test_ret += test_xmlXPathContextSetCache();
    test_ret += test_xmlXPathConvertBoolean();
    test_ret += test_xmlXPathConvertNumber();
    test_ret += test_xmlXPathConvertString();
    test_ret += test_xmlXPathCtxtCompile();
    test_ret += test_xmlXPathEval();
    test_ret += test_xmlXPathEvalExpression();
    test_ret += test_xmlXPathEvalPredicate();
    test_ret += test_xmlXPathInit();
    test_ret += test_xmlXPathIsInf();
    test_ret += test_xmlXPathIsNaN();
    test_ret += test_xmlXPathNewContext();
    test_ret += test_xmlXPathNodeEval();
    test_ret += test_xmlXPathNodeSetCreate();
    test_ret += test_xmlXPathObjectCopy();
    test_ret += test_xmlXPathOrderDocElems();
    test_ret += test_xmlXPathSetContextNode();

    if (test_ret != 0)
	printf("Module xpath: %d errors\n", test_ret);
    return(test_ret);
}
#ifdef LIBXML_XPATH_ENABLED

#define gen_nb_xmlXPathParserContextPtr 1
static xmlXPathParserContextPtr gen_xmlXPathParserContextPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlXPathParserContextPtr(int no ATTRIBUTE_UNUSED, xmlXPathParserContextPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_valuePop(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathParserContextPtr ctxt; /* an XPath evaluation context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = valuePop(ctxt);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in valuePop",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_valuePush(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathParserContextPtr ctxt; /* an XPath evaluation context */
    int n_ctxt;
    xmlXPathObjectPtr value; /* the XPath object */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_value = 0;n_value < gen_nb_xmlXPathObjectPtr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        value = gen_xmlXPathObjectPtr(n_value, 1);

        ret_val = valuePush(ctxt, value);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlXPathObjectPtr(n_value, value, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in valuePush",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathAddValues(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        xmlXPathAddValues(ctxt);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathAddValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathBooleanFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathBooleanFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathBooleanFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCeilingFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathCeilingFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCeilingFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCompareValues(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int inf; /* less than (1) or greater than (0) */
    int n_inf;
    int strict; /* is the comparison strict */
    int n_strict;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_inf = 0;n_inf < gen_nb_int;n_inf++) {
    for (n_strict = 0;n_strict < gen_nb_int;n_strict++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        inf = gen_int(n_inf, 1);
        strict = gen_int(n_strict, 2);

        ret_val = xmlXPathCompareValues(ctxt, inf, strict);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_inf, inf, 1);
        des_int(n_strict, strict, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCompareValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_inf);
            printf(" %d", n_strict);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathConcatFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathConcatFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathConcatFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathContainsFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathContainsFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathContainsFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathCountFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathCountFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathCountFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathDebugDumpCompExpr(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * for the output */
    int n_output;
    xmlXPathCompExprPtr comp; /* the precompiled XPath expression */
    int n_comp;
    int depth; /* the indentation level. */
    int n_depth;

    for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) {
    for (n_comp = 0;n_comp < gen_nb_xmlXPathCompExprPtr;n_comp++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
        mem_base = xmlMemBlocks();
        output = gen_FILE_ptr(n_output, 0);
        comp = gen_xmlXPathCompExprPtr(n_comp, 1);
        depth = gen_int(n_depth, 2);

        xmlXPathDebugDumpCompExpr(output, comp, depth);
        call_tests++;
        des_FILE_ptr(n_output, output, 0);
        des_xmlXPathCompExprPtr(n_comp, comp, 1);
        des_int(n_depth, depth, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathDebugDumpCompExpr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_comp);
            printf(" %d", n_depth);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathDebugDumpObject(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED)
    int mem_base;
    FILE * output; /* the FILE * to dump the output */
    int n_output;
    xmlXPathObjectPtr cur; /* the object to inspect */
    int n_cur;
    int depth; /* indentation level */
    int n_depth;

    for (n_output = 0;n_output < gen_nb_FILE_ptr;n_output++) {
    for (n_cur = 0;n_cur < gen_nb_xmlXPathObjectPtr;n_cur++) {
    for (n_depth = 0;n_depth < gen_nb_int;n_depth++) {
        mem_base = xmlMemBlocks();
        output = gen_FILE_ptr(n_output, 0);
        cur = gen_xmlXPathObjectPtr(n_cur, 1);
        depth = gen_int(n_depth, 2);

        xmlXPathDebugDumpObject(output, cur, depth);
        call_tests++;
        des_FILE_ptr(n_output, output, 0);
        des_xmlXPathObjectPtr(n_cur, cur, 1);
        des_int(n_depth, depth, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathDebugDumpObject",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_output);
            printf(" %d", n_cur);
            printf(" %d", n_depth);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathDifference(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes1; /* a node-set */
    int n_nodes1;
    xmlNodeSetPtr nodes2; /* a node-set */
    int n_nodes2;

    for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) {
    for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) {
        mem_base = xmlMemBlocks();
        nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0);
        nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1);

        ret_val = xmlXPathDifference(nodes1, nodes2);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes1, nodes1, 0);
        des_xmlNodeSetPtr(n_nodes2, nodes2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathDifference",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes1);
            printf(" %d", n_nodes2);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathDistinct(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes; /* a node-set */
    int n_nodes;

    for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) {
        mem_base = xmlMemBlocks();
        nodes = gen_xmlNodeSetPtr(n_nodes, 0);

        ret_val = xmlXPathDistinct(nodes);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes, nodes, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathDistinct",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathDistinctSorted(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes; /* a node-set, sorted by document order */
    int n_nodes;

    for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) {
        mem_base = xmlMemBlocks();
        nodes = gen_xmlNodeSetPtr(n_nodes, 0);

        ret_val = xmlXPathDistinctSorted(nodes);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes, nodes, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathDistinctSorted",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathDivValues(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        xmlXPathDivValues(ctxt);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathDivValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathEqualValues(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = xmlXPathEqualValues(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathEqualValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathErr(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* a XPath parser context */
    int n_ctxt;
    int error; /* the error code */
    int n_error;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_error = 0;n_error < gen_nb_int;n_error++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        error = gen_int(n_error, 1);

        xmlXPathErr(ctxt, error);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_error, error, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathErr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_error);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathEvalExpr(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        xmlXPathEvalExpr(ctxt);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathEvalExpr",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathEvaluatePredicateResult(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlXPathObjectPtr res; /* the Predicate Expression evaluation result */
    int n_res;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_res = 0;n_res < gen_nb_xmlXPathObjectPtr;n_res++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        res = gen_xmlXPathObjectPtr(n_res, 1);

        ret_val = xmlXPathEvaluatePredicateResult(ctxt, res);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlXPathObjectPtr(n_res, res, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathEvaluatePredicateResult",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_res);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathFalseFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathFalseFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathFalseFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathFloorFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathFloorFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathFloorFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathFunctionLookup(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPathFunctionLookupNS(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPathHasSameNodes(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodeSetPtr nodes1; /* a node-set */
    int n_nodes1;
    xmlNodeSetPtr nodes2; /* a node-set */
    int n_nodes2;

    for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) {
    for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) {
        mem_base = xmlMemBlocks();
        nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0);
        nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1);

        ret_val = xmlXPathHasSameNodes(nodes1, nodes2);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes1, nodes1, 0);
        des_xmlNodeSetPtr(n_nodes2, nodes2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathHasSameNodes",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes1);
            printf(" %d", n_nodes2);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathIdFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathIdFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathIdFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathIntersection(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes1; /* a node-set */
    int n_nodes1;
    xmlNodeSetPtr nodes2; /* a node-set */
    int n_nodes2;

    for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) {
    for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) {
        mem_base = xmlMemBlocks();
        nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0);
        nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1);

        ret_val = xmlXPathIntersection(nodes1, nodes2);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes1, nodes1, 0);
        des_xmlNodeSetPtr(n_nodes2, nodes2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathIntersection",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes1);
            printf(" %d", n_nodes2);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathIsNodeType(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlChar * name; /* a name string */
    int n_name;

    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        name = gen_const_xmlChar_ptr(n_name, 0);

        ret_val = xmlXPathIsNodeType((const xmlChar *)name);
        desret_int(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathIsNodeType",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_name);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathLangFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathLangFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathLangFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathLastFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathLastFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathLastFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathLeading(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes1; /* a node-set */
    int n_nodes1;
    xmlNodeSetPtr nodes2; /* a node-set */
    int n_nodes2;

    for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) {
    for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) {
        mem_base = xmlMemBlocks();
        nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0);
        nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1);

        ret_val = xmlXPathLeading(nodes1, nodes2);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes1, nodes1, 0);
        des_xmlNodeSetPtr(n_nodes2, nodes2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathLeading",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes1);
            printf(" %d", n_nodes2);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathLeadingSorted(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes1; /* a node-set, sorted by document order */
    int n_nodes1;
    xmlNodeSetPtr nodes2; /* a node-set, sorted by document order */
    int n_nodes2;

    for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) {
    for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) {
        mem_base = xmlMemBlocks();
        nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0);
        nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1);

        ret_val = xmlXPathLeadingSorted(nodes1, nodes2);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes1, nodes1, 0);
        des_xmlNodeSetPtr(n_nodes2, nodes2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathLeadingSorted",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes1);
            printf(" %d", n_nodes2);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathLocalNameFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathLocalNameFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathLocalNameFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathModValues(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        xmlXPathModValues(ctxt);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathModValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathMultValues(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        xmlXPathMultValues(ctxt);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathMultValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNamespaceURIFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathNamespaceURIFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNamespaceURIFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNewBoolean(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    int val; /* the boolean value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_int(n_val, 0);

        ret_val = xmlXPathNewBoolean(val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_int(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNewBoolean",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNewCString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    char * val; /* the char * value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_const_char_ptr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_const_char_ptr(n_val, 0);

        ret_val = xmlXPathNewCString((const char *)val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_const_char_ptr(n_val, (const char *)val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNewCString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNewFloat(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    double val; /* the double value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_double;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_double(n_val, 0);

        ret_val = xmlXPathNewFloat(val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_double(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNewFloat",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNewNodeSet(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodePtr val; /* the NodePtr value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlNodePtr(n_val, 0);

        ret_val = xmlXPathNewNodeSet(val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNewNodeSet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNewNodeSetList(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodeSetPtr val; /* an existing NodeSet */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlNodeSetPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlNodeSetPtr(n_val, 0);

        ret_val = xmlXPathNewNodeSetList(val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNewNodeSetList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNewParserContext(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPathNewString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlChar * val; /* the xmlChar * value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_const_xmlChar_ptr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_const_xmlChar_ptr(n_val, 0);

        ret_val = xmlXPathNewString((const xmlChar *)val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_val, (const xmlChar *)val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNewString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextAncestor(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextAncestor(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextAncestor",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextAncestorOrSelf(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextAncestorOrSelf(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextAncestorOrSelf",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextAttribute(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current attribute in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextAttribute(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextAttribute",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextChild(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextChild(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextChild",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextDescendant(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextDescendant(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextDescendant",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextDescendantOrSelf(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextDescendantOrSelf(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextDescendantOrSelf",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextFollowing(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextFollowing(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextFollowing",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextFollowingSibling(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextFollowingSibling(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextFollowingSibling",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextNamespace(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current attribute in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextNamespace(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextNamespace",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextParent(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextParent(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextParent",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextPreceding(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextPreceding(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextPreceding",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextPrecedingSibling(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextPrecedingSibling(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextPrecedingSibling",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNextSelf(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    xmlNodePtr cur; /* the current node in the traversal */
    int n_cur;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_cur = 0;n_cur < gen_nb_xmlNodePtr;n_cur++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        cur = gen_xmlNodePtr(n_cur, 1);

        ret_val = xmlXPathNextSelf(ctxt, cur);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_xmlNodePtr(n_cur, cur, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNextSelf",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_cur);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeLeading(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes; /* a node-set */
    int n_nodes;
    xmlNodePtr node; /* a node */
    int n_node;

    for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        nodes = gen_xmlNodeSetPtr(n_nodes, 0);
        node = gen_xmlNodePtr(n_node, 1);

        ret_val = xmlXPathNodeLeading(nodes, node);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes, nodes, 0);
        des_xmlNodePtr(n_node, node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeLeading",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeLeadingSorted(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes; /* a node-set, sorted by document order */
    int n_nodes;
    xmlNodePtr node; /* a node */
    int n_node;

    for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        nodes = gen_xmlNodeSetPtr(n_nodes, 0);
        node = gen_xmlNodePtr(n_node, 1);

        ret_val = xmlXPathNodeLeadingSorted(nodes, node);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes, nodes, 0);
        des_xmlNodePtr(n_node, node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeLeadingSorted",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeSetAdd(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodeSetPtr cur; /* the initial node set */
    int n_cur;
    xmlNodePtr val; /* a new xmlNodePtr */
    int n_val;

    for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) {
    for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodeSetPtr(n_cur, 0);
        val = gen_xmlNodePtr(n_val, 1);

        ret_val = xmlXPathNodeSetAdd(cur, val);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_cur, cur, 0);
        des_xmlNodePtr(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeSetAdd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeSetAddNs(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodeSetPtr cur; /* the initial node set */
    int n_cur;
    xmlNodePtr node; /* the hosting node */
    int n_node;
    xmlNsPtr ns; /* a the namespace node */
    int n_ns;

    for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
    for (n_ns = 0;n_ns < gen_nb_xmlNsPtr;n_ns++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodeSetPtr(n_cur, 0);
        node = gen_xmlNodePtr(n_node, 1);
        ns = gen_xmlNsPtr(n_ns, 2);

        ret_val = xmlXPathNodeSetAddNs(cur, node, ns);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_cur, cur, 0);
        des_xmlNodePtr(n_node, node, 1);
        des_xmlNsPtr(n_ns, ns, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeSetAddNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_node);
            printf(" %d", n_ns);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeSetAddUnique(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodeSetPtr cur; /* the initial node set */
    int n_cur;
    xmlNodePtr val; /* a new xmlNodePtr */
    int n_val;

    for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) {
    for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodeSetPtr(n_cur, 0);
        val = gen_xmlNodePtr(n_val, 1);

        ret_val = xmlXPathNodeSetAddUnique(cur, val);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_cur, cur, 0);
        des_xmlNodePtr(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeSetAddUnique",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeSetContains(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlNodeSetPtr cur; /* the node-set */
    int n_cur;
    xmlNodePtr val; /* the node */
    int n_val;

    for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) {
    for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodeSetPtr(n_cur, 0);
        val = gen_xmlNodePtr(n_val, 1);

        ret_val = xmlXPathNodeSetContains(cur, val);
        desret_int(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_cur, cur, 0);
        des_xmlNodePtr(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeSetContains",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeSetDel(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr cur; /* the initial node set */
    int n_cur;
    xmlNodePtr val; /* an xmlNodePtr */
    int n_val;

    for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) {
    for (n_val = 0;n_val < gen_nb_xmlNodePtr;n_val++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodeSetPtr(n_cur, 0);
        val = gen_xmlNodePtr(n_val, 1);

        xmlXPathNodeSetDel(cur, val);
        call_tests++;
        des_xmlNodeSetPtr(n_cur, cur, 0);
        des_xmlNodePtr(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeSetDel",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeSetMerge(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr val1; /* the first NodeSet or NULL */
    int n_val1;
    xmlNodeSetPtr val2; /* the second NodeSet */
    int n_val2;

    for (n_val1 = 0;n_val1 < gen_nb_xmlNodeSetPtr;n_val1++) {
    for (n_val2 = 0;n_val2 < gen_nb_xmlNodeSetPtr;n_val2++) {
        mem_base = xmlMemBlocks();
        val1 = gen_xmlNodeSetPtr(n_val1, 0);
        val2 = gen_xmlNodeSetPtr(n_val2, 1);

        ret_val = xmlXPathNodeSetMerge(val1, val2);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_val1, val1, 0);
        des_xmlNodeSetPtr(n_val2, val2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeSetMerge",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val1);
            printf(" %d", n_val2);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeSetRemove(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr cur; /* the initial node set */
    int n_cur;
    int val; /* the index to remove */
    int n_val;

    for (n_cur = 0;n_cur < gen_nb_xmlNodeSetPtr;n_cur++) {
    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlNodeSetPtr(n_cur, 0);
        val = gen_int(n_val, 1);

        xmlXPathNodeSetRemove(cur, val);
        call_tests++;
        des_xmlNodeSetPtr(n_cur, cur, 0);
        des_int(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeSetRemove",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeSetSort(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr set; /* the node set */
    int n_set;

    for (n_set = 0;n_set < gen_nb_xmlNodeSetPtr;n_set++) {
        mem_base = xmlMemBlocks();
        set = gen_xmlNodeSetPtr(n_set, 0);

        xmlXPathNodeSetSort(set);
        call_tests++;
        des_xmlNodeSetPtr(n_set, set, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeSetSort",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_set);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeTrailing(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes; /* a node-set */
    int n_nodes;
    xmlNodePtr node; /* a node */
    int n_node;

    for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        nodes = gen_xmlNodeSetPtr(n_nodes, 0);
        node = gen_xmlNodePtr(n_node, 1);

        ret_val = xmlXPathNodeTrailing(nodes, node);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes, nodes, 0);
        des_xmlNodePtr(n_node, node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeTrailing",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNodeTrailingSorted(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes; /* a node-set, sorted by document order */
    int n_nodes;
    xmlNodePtr node; /* a node */
    int n_node;

    for (n_nodes = 0;n_nodes < gen_nb_xmlNodeSetPtr;n_nodes++) {
    for (n_node = 0;n_node < gen_nb_xmlNodePtr;n_node++) {
        mem_base = xmlMemBlocks();
        nodes = gen_xmlNodeSetPtr(n_nodes, 0);
        node = gen_xmlNodePtr(n_node, 1);

        ret_val = xmlXPathNodeTrailingSorted(nodes, node);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes, nodes, 0);
        des_xmlNodePtr(n_node, node, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNodeTrailingSorted",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes);
            printf(" %d", n_node);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNormalizeFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathNormalizeFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNormalizeFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNotEqualValues(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = xmlXPathNotEqualValues(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNotEqualValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNotFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathNotFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNotFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNsLookup(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    const xmlChar * ret_val;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;
    xmlChar * prefix; /* the namespace prefix value */
    int n_prefix;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);

        ret_val = xmlXPathNsLookup(ctxt, (const xmlChar *)prefix);
        desret_const_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNsLookup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_prefix);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathNumberFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathNumberFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathNumberFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathParseNCName(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = xmlXPathParseNCName(ctxt);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathParseNCName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathParseName(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = xmlXPathParseName(ctxt);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathParseName",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathPopBoolean(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathParserContextPtr ctxt; /* an XPath parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = xmlXPathPopBoolean(ctxt);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathPopBoolean",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathPopExternal(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    void * ret_val;
    xmlXPathParserContextPtr ctxt; /* an XPath parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = xmlXPathPopExternal(ctxt);
        desret_void_ptr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathPopExternal",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathPopNodeSet(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlXPathParserContextPtr ctxt; /* an XPath parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = xmlXPathPopNodeSet(ctxt);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathPopNodeSet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathPopNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    double ret_val;
    xmlXPathParserContextPtr ctxt; /* an XPath parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = xmlXPathPopNumber(ctxt);
        desret_double(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathPopNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathPopString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlChar * ret_val;
    xmlXPathParserContextPtr ctxt; /* an XPath parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        ret_val = xmlXPathPopString(ctxt);
        desret_xmlChar_ptr(ret_val);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathPopString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathPositionFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathPositionFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathPositionFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathRegisterAllFunctions(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);

        xmlXPathRegisterAllFunctions(ctxt);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathRegisterAllFunctions",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathRegisterFunc(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPathRegisterFuncLookup(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPathRegisterFuncNS(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPathRegisterNs(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;
    xmlChar * prefix; /* the namespace prefix cannot be NULL or empty string */
    int n_prefix;
    xmlChar * ns_uri; /* the namespace name */
    int n_ns_uri;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
    for (n_prefix = 0;n_prefix < gen_nb_const_xmlChar_ptr;n_prefix++) {
    for (n_ns_uri = 0;n_ns_uri < gen_nb_const_xmlChar_ptr;n_ns_uri++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);
        prefix = gen_const_xmlChar_ptr(n_prefix, 1);
        ns_uri = gen_const_xmlChar_ptr(n_ns_uri, 2);

        ret_val = xmlXPathRegisterNs(ctxt, (const xmlChar *)prefix, (const xmlChar *)ns_uri);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_prefix, (const xmlChar *)prefix, 1);
        des_const_xmlChar_ptr(n_ns_uri, (const xmlChar *)ns_uri, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathRegisterNs",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_prefix);
            printf(" %d", n_ns_uri);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathRegisterVariable(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;
    xmlChar * name; /* the variable name */
    int n_name;
    xmlXPathObjectPtr value; /* the variable value or NULL */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_value = 0;n_value < gen_nb_xmlXPathObjectPtr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        value = gen_xmlXPathObjectPtr(n_value, 2);

        ret_val = xmlXPathRegisterVariable(ctxt, (const xmlChar *)name, value);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_xmlXPathObjectPtr(n_value, value, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathRegisterVariable",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_name);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathRegisterVariableLookup(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPathRegisterVariableNS(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    int ret_val;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;
    xmlChar * name; /* the variable name */
    int n_name;
    xmlChar * ns_uri; /* the variable namespace URI */
    int n_ns_uri;
    xmlXPathObjectPtr value; /* the variable value or NULL */
    int n_value;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ns_uri = 0;n_ns_uri < gen_nb_const_xmlChar_ptr;n_ns_uri++) {
    for (n_value = 0;n_value < gen_nb_xmlXPathObjectPtr;n_value++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        ns_uri = gen_const_xmlChar_ptr(n_ns_uri, 2);
        value = gen_xmlXPathObjectPtr(n_value, 3);

        ret_val = xmlXPathRegisterVariableNS(ctxt, (const xmlChar *)name, (const xmlChar *)ns_uri, value);
        desret_int(ret_val);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_ns_uri, (const xmlChar *)ns_uri, 2);
        des_xmlXPathObjectPtr(n_value, value, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathRegisterVariableNS",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_name);
            printf(" %d", n_ns_uri);
            printf(" %d", n_value);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathRegisteredFuncsCleanup(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);

        xmlXPathRegisteredFuncsCleanup(ctxt);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathRegisteredFuncsCleanup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathRegisteredNsCleanup(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);

        xmlXPathRegisteredNsCleanup(ctxt);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathRegisteredNsCleanup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathRegisteredVariablesCleanup(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);

        xmlXPathRegisteredVariablesCleanup(ctxt);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathRegisteredVariablesCleanup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathRoot(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        xmlXPathRoot(ctxt);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathRoot",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathRoundFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathRoundFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathRoundFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathStartsWithFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathStartsWithFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathStartsWithFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathStringEvalNumber(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    double ret_val;
    xmlChar * str; /* A string to scan */
    int n_str;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);

        ret_val = xmlXPathStringEvalNumber((const xmlChar *)str);
        desret_double(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathStringEvalNumber",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathStringFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathStringFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathStringFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathStringLengthFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathStringLengthFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathStringLengthFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathSubValues(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        xmlXPathSubValues(ctxt);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathSubValues",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathSubstringAfterFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathSubstringAfterFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathSubstringAfterFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathSubstringBeforeFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathSubstringBeforeFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathSubstringBeforeFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathSubstringFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathSubstringFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathSubstringFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathSumFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathSumFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathSumFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathTrailing(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes1; /* a node-set */
    int n_nodes1;
    xmlNodeSetPtr nodes2; /* a node-set */
    int n_nodes2;

    for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) {
    for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) {
        mem_base = xmlMemBlocks();
        nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0);
        nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1);

        ret_val = xmlXPathTrailing(nodes1, nodes2);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes1, nodes1, 0);
        des_xmlNodeSetPtr(n_nodes2, nodes2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathTrailing",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes1);
            printf(" %d", n_nodes2);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathTrailingSorted(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlNodeSetPtr ret_val;
    xmlNodeSetPtr nodes1; /* a node-set, sorted by document order */
    int n_nodes1;
    xmlNodeSetPtr nodes2; /* a node-set, sorted by document order */
    int n_nodes2;

    for (n_nodes1 = 0;n_nodes1 < gen_nb_xmlNodeSetPtr;n_nodes1++) {
    for (n_nodes2 = 0;n_nodes2 < gen_nb_xmlNodeSetPtr;n_nodes2++) {
        mem_base = xmlMemBlocks();
        nodes1 = gen_xmlNodeSetPtr(n_nodes1, 0);
        nodes2 = gen_xmlNodeSetPtr(n_nodes2, 1);

        ret_val = xmlXPathTrailingSorted(nodes1, nodes2);
        desret_xmlNodeSetPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_nodes1, nodes1, 0);
        des_xmlNodeSetPtr(n_nodes2, nodes2, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathTrailingSorted",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_nodes1);
            printf(" %d", n_nodes2);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathTranslateFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathTranslateFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathTranslateFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathTrueFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    int nargs; /* the number of arguments */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPathTrueFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathTrueFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathValueFlipSign(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        xmlXPathValueFlipSign(ctxt);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathValueFlipSign",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathVariableLookup(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;
    xmlChar * name; /* the variable name */
    int n_name;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);

        ret_val = xmlXPathVariableLookup(ctxt, (const xmlChar *)name);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathVariableLookup",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_name);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathVariableLookupNS(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathContextPtr ctxt; /* the XPath context */
    int n_ctxt;
    xmlChar * name; /* the variable name */
    int n_name;
    xmlChar * ns_uri; /* the variable namespace URI */
    int n_ns_uri;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathContextPtr;n_ctxt++) {
    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
    for (n_ns_uri = 0;n_ns_uri < gen_nb_const_xmlChar_ptr;n_ns_uri++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathContextPtr(n_ctxt, 0);
        name = gen_const_xmlChar_ptr(n_name, 1);
        ns_uri = gen_const_xmlChar_ptr(n_ns_uri, 2);

        ret_val = xmlXPathVariableLookupNS(ctxt, (const xmlChar *)name, (const xmlChar *)ns_uri);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathContextPtr(n_ctxt, ctxt, 0);
        des_const_xmlChar_ptr(n_name, (const xmlChar *)name, 1);
        des_const_xmlChar_ptr(n_ns_uri, (const xmlChar *)ns_uri, 2);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathVariableLookupNS",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_name);
            printf(" %d", n_ns_uri);
            printf("\n");
        }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathWrapCString(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    char * val; /* the char * value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_char_ptr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_char_ptr(n_val, 0);

        ret_val = xmlXPathWrapCString(val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_char_ptr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathWrapCString",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathWrapExternal(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    void * val; /* the user data */
    int n_val;

    for (n_val = 0;n_val < gen_nb_void_ptr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_void_ptr(n_val, 0);

        ret_val = xmlXPathWrapExternal(val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_void_ptr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathWrapExternal",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPathWrapNodeSet(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodeSetPtr val; /* the NodePtr value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlNodeSetPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlNodeSetPtr(n_val, 0);

        ret_val = xmlXPathWrapNodeSet(val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPathWrapNodeSet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPatherror(void) {
    int test_ret = 0;

#if defined(LIBXML_XPATH_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPath Parser context */
    int n_ctxt;
    const char * file; /* the file name */
    int n_file;
    int line; /* the line number */
    int n_line;
    int no; /* the error number */
    int n_no;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_file = 0;n_file < gen_nb_filepath;n_file++) {
    for (n_line = 0;n_line < gen_nb_int;n_line++) {
    for (n_no = 0;n_no < gen_nb_int;n_no++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        file = gen_filepath(n_file, 1);
        line = gen_int(n_line, 2);
        no = gen_int(n_no, 3);

        xmlXPatherror(ctxt, file, line, no);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_filepath(n_file, file, 1);
        des_int(n_line, line, 2);
        des_int(n_no, no, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPatherror",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_file);
            printf(" %d", n_line);
            printf(" %d", n_no);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xpathInternals(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xpathInternals : 106 of 117 functions ...\n");
    test_ret += test_valuePop();
    test_ret += test_valuePush();
    test_ret += test_xmlXPathAddValues();
    test_ret += test_xmlXPathBooleanFunction();
    test_ret += test_xmlXPathCeilingFunction();
    test_ret += test_xmlXPathCompareValues();
    test_ret += test_xmlXPathConcatFunction();
    test_ret += test_xmlXPathContainsFunction();
    test_ret += test_xmlXPathCountFunction();
    test_ret += test_xmlXPathDebugDumpCompExpr();
    test_ret += test_xmlXPathDebugDumpObject();
    test_ret += test_xmlXPathDifference();
    test_ret += test_xmlXPathDistinct();
    test_ret += test_xmlXPathDistinctSorted();
    test_ret += test_xmlXPathDivValues();
    test_ret += test_xmlXPathEqualValues();
    test_ret += test_xmlXPathErr();
    test_ret += test_xmlXPathEvalExpr();
    test_ret += test_xmlXPathEvaluatePredicateResult();
    test_ret += test_xmlXPathFalseFunction();
    test_ret += test_xmlXPathFloorFunction();
    test_ret += test_xmlXPathFunctionLookup();
    test_ret += test_xmlXPathFunctionLookupNS();
    test_ret += test_xmlXPathHasSameNodes();
    test_ret += test_xmlXPathIdFunction();
    test_ret += test_xmlXPathIntersection();
    test_ret += test_xmlXPathIsNodeType();
    test_ret += test_xmlXPathLangFunction();
    test_ret += test_xmlXPathLastFunction();
    test_ret += test_xmlXPathLeading();
    test_ret += test_xmlXPathLeadingSorted();
    test_ret += test_xmlXPathLocalNameFunction();
    test_ret += test_xmlXPathModValues();
    test_ret += test_xmlXPathMultValues();
    test_ret += test_xmlXPathNamespaceURIFunction();
    test_ret += test_xmlXPathNewBoolean();
    test_ret += test_xmlXPathNewCString();
    test_ret += test_xmlXPathNewFloat();
    test_ret += test_xmlXPathNewNodeSet();
    test_ret += test_xmlXPathNewNodeSetList();
    test_ret += test_xmlXPathNewParserContext();
    test_ret += test_xmlXPathNewString();
    test_ret += test_xmlXPathNextAncestor();
    test_ret += test_xmlXPathNextAncestorOrSelf();
    test_ret += test_xmlXPathNextAttribute();
    test_ret += test_xmlXPathNextChild();
    test_ret += test_xmlXPathNextDescendant();
    test_ret += test_xmlXPathNextDescendantOrSelf();
    test_ret += test_xmlXPathNextFollowing();
    test_ret += test_xmlXPathNextFollowingSibling();
    test_ret += test_xmlXPathNextNamespace();
    test_ret += test_xmlXPathNextParent();
    test_ret += test_xmlXPathNextPreceding();
    test_ret += test_xmlXPathNextPrecedingSibling();
    test_ret += test_xmlXPathNextSelf();
    test_ret += test_xmlXPathNodeLeading();
    test_ret += test_xmlXPathNodeLeadingSorted();
    test_ret += test_xmlXPathNodeSetAdd();
    test_ret += test_xmlXPathNodeSetAddNs();
    test_ret += test_xmlXPathNodeSetAddUnique();
    test_ret += test_xmlXPathNodeSetContains();
    test_ret += test_xmlXPathNodeSetDel();
    test_ret += test_xmlXPathNodeSetMerge();
    test_ret += test_xmlXPathNodeSetRemove();
    test_ret += test_xmlXPathNodeSetSort();
    test_ret += test_xmlXPathNodeTrailing();
    test_ret += test_xmlXPathNodeTrailingSorted();
    test_ret += test_xmlXPathNormalizeFunction();
    test_ret += test_xmlXPathNotEqualValues();
    test_ret += test_xmlXPathNotFunction();
    test_ret += test_xmlXPathNsLookup();
    test_ret += test_xmlXPathNumberFunction();
    test_ret += test_xmlXPathParseNCName();
    test_ret += test_xmlXPathParseName();
    test_ret += test_xmlXPathPopBoolean();
    test_ret += test_xmlXPathPopExternal();
    test_ret += test_xmlXPathPopNodeSet();
    test_ret += test_xmlXPathPopNumber();
    test_ret += test_xmlXPathPopString();
    test_ret += test_xmlXPathPositionFunction();
    test_ret += test_xmlXPathRegisterAllFunctions();
    test_ret += test_xmlXPathRegisterFunc();
    test_ret += test_xmlXPathRegisterFuncLookup();
    test_ret += test_xmlXPathRegisterFuncNS();
    test_ret += test_xmlXPathRegisterNs();
    test_ret += test_xmlXPathRegisterVariable();
    test_ret += test_xmlXPathRegisterVariableLookup();
    test_ret += test_xmlXPathRegisterVariableNS();
    test_ret += test_xmlXPathRegisteredFuncsCleanup();
    test_ret += test_xmlXPathRegisteredNsCleanup();
    test_ret += test_xmlXPathRegisteredVariablesCleanup();
    test_ret += test_xmlXPathRoot();
    test_ret += test_xmlXPathRoundFunction();
    test_ret += test_xmlXPathStartsWithFunction();
    test_ret += test_xmlXPathStringEvalNumber();
    test_ret += test_xmlXPathStringFunction();
    test_ret += test_xmlXPathStringLengthFunction();
    test_ret += test_xmlXPathSubValues();
    test_ret += test_xmlXPathSubstringAfterFunction();
    test_ret += test_xmlXPathSubstringBeforeFunction();
    test_ret += test_xmlXPathSubstringFunction();
    test_ret += test_xmlXPathSumFunction();
    test_ret += test_xmlXPathTrailing();
    test_ret += test_xmlXPathTrailingSorted();
    test_ret += test_xmlXPathTranslateFunction();
    test_ret += test_xmlXPathTrueFunction();
    test_ret += test_xmlXPathValueFlipSign();
    test_ret += test_xmlXPathVariableLookup();
    test_ret += test_xmlXPathVariableLookupNS();
    test_ret += test_xmlXPathWrapCString();
    test_ret += test_xmlXPathWrapExternal();
    test_ret += test_xmlXPathWrapNodeSet();
    test_ret += test_xmlXPatherror();

    if (test_ret != 0)
	printf("Module xpathInternals: %d errors\n", test_ret);
    return(test_ret);
}

static int
test_xmlXPtrBuildNodeList(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlNodePtr ret_val;
    xmlXPathObjectPtr obj; /* the XPointer result from the evaluation. */
    int n_obj;

    for (n_obj = 0;n_obj < gen_nb_xmlXPathObjectPtr;n_obj++) {
        mem_base = xmlMemBlocks();
        obj = gen_xmlXPathObjectPtr(n_obj, 0);

        ret_val = xmlXPtrBuildNodeList(obj);
        desret_xmlNodePtr(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_obj, obj, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrBuildNodeList",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_obj);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrEval(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlChar * str; /* the XPointer expression */
    int n_str;
    xmlXPathContextPtr ctx; /* the XPointer context */
    int n_ctx;

    for (n_str = 0;n_str < gen_nb_const_xmlChar_ptr;n_str++) {
    for (n_ctx = 0;n_ctx < gen_nb_xmlXPathContextPtr;n_ctx++) {
        mem_base = xmlMemBlocks();
        str = gen_const_xmlChar_ptr(n_str, 0);
        ctx = gen_xmlXPathContextPtr(n_ctx, 1);

        ret_val = xmlXPtrEval((const xmlChar *)str, ctx);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_const_xmlChar_ptr(n_str, (const xmlChar *)str, 0);
        des_xmlXPathContextPtr(n_ctx, ctx, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrEval",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_str);
            printf(" %d", n_ctx);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrEvalRangePredicate(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPointer Parser context */
    int n_ctxt;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);

        xmlXPtrEvalRangePredicate(ctxt);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrEvalRangePredicate",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}

#ifdef LIBXML_XPTR_ENABLED

#define gen_nb_xmlLocationSetPtr 1
static xmlLocationSetPtr gen_xmlLocationSetPtr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
    return(NULL);
}
static void des_xmlLocationSetPtr(int no ATTRIBUTE_UNUSED, xmlLocationSetPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
}
#endif


static int
test_xmlXPtrLocationSetAdd(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlLocationSetPtr cur; /* the initial range set */
    int n_cur;
    xmlXPathObjectPtr val; /* a new xmlXPathObjectPtr */
    int n_val;

    for (n_cur = 0;n_cur < gen_nb_xmlLocationSetPtr;n_cur++) {
    for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlLocationSetPtr(n_cur, 0);
        val = gen_xmlXPathObjectPtr(n_val, 1);

        xmlXPtrLocationSetAdd(cur, val);
        call_tests++;
        des_xmlLocationSetPtr(n_cur, cur, 0);
        des_xmlXPathObjectPtr(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrLocationSetAdd",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrLocationSetCreate(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPtrLocationSetDel(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlLocationSetPtr cur; /* the initial range set */
    int n_cur;
    xmlXPathObjectPtr val; /* an xmlXPathObjectPtr */
    int n_val;

    for (n_cur = 0;n_cur < gen_nb_xmlLocationSetPtr;n_cur++) {
    for (n_val = 0;n_val < gen_nb_xmlXPathObjectPtr;n_val++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlLocationSetPtr(n_cur, 0);
        val = gen_xmlXPathObjectPtr(n_val, 1);

        xmlXPtrLocationSetDel(cur, val);
        call_tests++;
        des_xmlLocationSetPtr(n_cur, cur, 0);
        des_xmlXPathObjectPtr(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrLocationSetDel",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrLocationSetMerge(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPtrLocationSetRemove(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlLocationSetPtr cur; /* the initial range set */
    int n_cur;
    int val; /* the index to remove */
    int n_val;

    for (n_cur = 0;n_cur < gen_nb_xmlLocationSetPtr;n_cur++) {
    for (n_val = 0;n_val < gen_nb_int;n_val++) {
        mem_base = xmlMemBlocks();
        cur = gen_xmlLocationSetPtr(n_cur, 0);
        val = gen_int(n_val, 1);

        xmlXPtrLocationSetRemove(cur, val);
        call_tests++;
        des_xmlLocationSetPtr(n_cur, cur, 0);
        des_int(n_val, val, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrLocationSetRemove",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_cur);
            printf(" %d", n_val);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrNewCollapsedRange(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodePtr start; /* the starting and ending node */
    int n_start;

    for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) {
        mem_base = xmlMemBlocks();
        start = gen_xmlNodePtr(n_start, 0);

        ret_val = xmlXPtrNewCollapsedRange(start);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_start, start, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrNewCollapsedRange",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_start);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrNewContext(void) {
    int test_ret = 0;


    /* missing type support */
    return(test_ret);
}


static int
test_xmlXPtrNewLocationSetNodeSet(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodeSetPtr set; /* a node set */
    int n_set;

    for (n_set = 0;n_set < gen_nb_xmlNodeSetPtr;n_set++) {
        mem_base = xmlMemBlocks();
        set = gen_xmlNodeSetPtr(n_set, 0);

        ret_val = xmlXPtrNewLocationSetNodeSet(set);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodeSetPtr(n_set, set, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrNewLocationSetNodeSet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_set);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrNewLocationSetNodes(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodePtr start; /* the start NodePtr value */
    int n_start;
    xmlNodePtr end; /* the end NodePtr value or NULL */
    int n_end;

    for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) {
    for (n_end = 0;n_end < gen_nb_xmlNodePtr;n_end++) {
        mem_base = xmlMemBlocks();
        start = gen_xmlNodePtr(n_start, 0);
        end = gen_xmlNodePtr(n_end, 1);

        ret_val = xmlXPtrNewLocationSetNodes(start, end);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_start, start, 0);
        des_xmlNodePtr(n_end, end, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrNewLocationSetNodes",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_start);
            printf(" %d", n_end);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrNewRange(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodePtr start; /* the starting node */
    int n_start;
    int startindex; /* the start index */
    int n_startindex;
    xmlNodePtr end; /* the ending point */
    int n_end;
    int endindex; /* the ending index */
    int n_endindex;

    for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) {
    for (n_startindex = 0;n_startindex < gen_nb_int;n_startindex++) {
    for (n_end = 0;n_end < gen_nb_xmlNodePtr;n_end++) {
    for (n_endindex = 0;n_endindex < gen_nb_int;n_endindex++) {
        mem_base = xmlMemBlocks();
        start = gen_xmlNodePtr(n_start, 0);
        startindex = gen_int(n_startindex, 1);
        end = gen_xmlNodePtr(n_end, 2);
        endindex = gen_int(n_endindex, 3);

        ret_val = xmlXPtrNewRange(start, startindex, end, endindex);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_start, start, 0);
        des_int(n_startindex, startindex, 1);
        des_xmlNodePtr(n_end, end, 2);
        des_int(n_endindex, endindex, 3);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrNewRange",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_start);
            printf(" %d", n_startindex);
            printf(" %d", n_end);
            printf(" %d", n_endindex);
            printf("\n");
        }
    }
    }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrNewRangeNodeObject(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodePtr start; /* the starting node */
    int n_start;
    xmlXPathObjectPtr end; /* the ending object */
    int n_end;

    for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) {
    for (n_end = 0;n_end < gen_nb_xmlXPathObjectPtr;n_end++) {
        mem_base = xmlMemBlocks();
        start = gen_xmlNodePtr(n_start, 0);
        end = gen_xmlXPathObjectPtr(n_end, 1);

        ret_val = xmlXPtrNewRangeNodeObject(start, end);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_start, start, 0);
        des_xmlXPathObjectPtr(n_end, end, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrNewRangeNodeObject",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_start);
            printf(" %d", n_end);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrNewRangeNodePoint(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodePtr start; /* the starting node */
    int n_start;
    xmlXPathObjectPtr end; /* the ending point */
    int n_end;

    for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) {
    for (n_end = 0;n_end < gen_nb_xmlXPathObjectPtr;n_end++) {
        mem_base = xmlMemBlocks();
        start = gen_xmlNodePtr(n_start, 0);
        end = gen_xmlXPathObjectPtr(n_end, 1);

        ret_val = xmlXPtrNewRangeNodePoint(start, end);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_start, start, 0);
        des_xmlXPathObjectPtr(n_end, end, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrNewRangeNodePoint",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_start);
            printf(" %d", n_end);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrNewRangeNodes(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlNodePtr start; /* the starting node */
    int n_start;
    xmlNodePtr end; /* the ending node */
    int n_end;

    for (n_start = 0;n_start < gen_nb_xmlNodePtr;n_start++) {
    for (n_end = 0;n_end < gen_nb_xmlNodePtr;n_end++) {
        mem_base = xmlMemBlocks();
        start = gen_xmlNodePtr(n_start, 0);
        end = gen_xmlNodePtr(n_end, 1);

        ret_val = xmlXPtrNewRangeNodes(start, end);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlNodePtr(n_start, start, 0);
        des_xmlNodePtr(n_end, end, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrNewRangeNodes",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_start);
            printf(" %d", n_end);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrNewRangePointNode(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathObjectPtr start; /* the starting point */
    int n_start;
    xmlNodePtr end; /* the ending node */
    int n_end;

    for (n_start = 0;n_start < gen_nb_xmlXPathObjectPtr;n_start++) {
    for (n_end = 0;n_end < gen_nb_xmlNodePtr;n_end++) {
        mem_base = xmlMemBlocks();
        start = gen_xmlXPathObjectPtr(n_start, 0);
        end = gen_xmlNodePtr(n_end, 1);

        ret_val = xmlXPtrNewRangePointNode(start, end);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_start, start, 0);
        des_xmlNodePtr(n_end, end, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrNewRangePointNode",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_start);
            printf(" %d", n_end);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrNewRangePoints(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlXPathObjectPtr start; /* the starting point */
    int n_start;
    xmlXPathObjectPtr end; /* the ending point */
    int n_end;

    for (n_start = 0;n_start < gen_nb_xmlXPathObjectPtr;n_start++) {
    for (n_end = 0;n_end < gen_nb_xmlXPathObjectPtr;n_end++) {
        mem_base = xmlMemBlocks();
        start = gen_xmlXPathObjectPtr(n_start, 0);
        end = gen_xmlXPathObjectPtr(n_end, 1);

        ret_val = xmlXPtrNewRangePoints(start, end);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlXPathObjectPtr(n_start, start, 0);
        des_xmlXPathObjectPtr(n_end, end, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrNewRangePoints",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_start);
            printf(" %d", n_end);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrRangeToFunction(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathParserContextPtr ctxt; /* the XPointer Parser context */
    int n_ctxt;
    int nargs; /* the number of args */
    int n_nargs;

    for (n_ctxt = 0;n_ctxt < gen_nb_xmlXPathParserContextPtr;n_ctxt++) {
    for (n_nargs = 0;n_nargs < gen_nb_int;n_nargs++) {
        mem_base = xmlMemBlocks();
        ctxt = gen_xmlXPathParserContextPtr(n_ctxt, 0);
        nargs = gen_int(n_nargs, 1);

        xmlXPtrRangeToFunction(ctxt, nargs);
        call_tests++;
        des_xmlXPathParserContextPtr(n_ctxt, ctxt, 0);
        des_int(n_nargs, nargs, 1);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrRangeToFunction",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_ctxt);
            printf(" %d", n_nargs);
            printf("\n");
        }
    }
    }
    function_tests++;
#endif

    return(test_ret);
}


static int
test_xmlXPtrWrapLocationSet(void) {
    int test_ret = 0;

#if defined(LIBXML_XPTR_ENABLED)
    int mem_base;
    xmlXPathObjectPtr ret_val;
    xmlLocationSetPtr val; /* the LocationSet value */
    int n_val;

    for (n_val = 0;n_val < gen_nb_xmlLocationSetPtr;n_val++) {
        mem_base = xmlMemBlocks();
        val = gen_xmlLocationSetPtr(n_val, 0);

        ret_val = xmlXPtrWrapLocationSet(val);
        desret_xmlXPathObjectPtr(ret_val);
        call_tests++;
        des_xmlLocationSetPtr(n_val, val, 0);
        xmlResetLastError();
        if (mem_base != xmlMemBlocks()) {
            printf("Leak of %d blocks found in xmlXPtrWrapLocationSet",
	           xmlMemBlocks() - mem_base);
	    test_ret++;
            printf(" %d", n_val);
            printf("\n");
        }
    }
    function_tests++;
#endif

    return(test_ret);
}

static int
test_xpointer(void) {
    int test_ret = 0;

    if (quiet == 0) printf("Testing xpointer : 17 of 21 functions ...\n");
    test_ret += test_xmlXPtrBuildNodeList();
    test_ret += test_xmlXPtrEval();
    test_ret += test_xmlXPtrEvalRangePredicate();
    test_ret += test_xmlXPtrLocationSetAdd();
    test_ret += test_xmlXPtrLocationSetCreate();
    test_ret += test_xmlXPtrLocationSetDel();
    test_ret += test_xmlXPtrLocationSetMerge();
    test_ret += test_xmlXPtrLocationSetRemove();
    test_ret += test_xmlXPtrNewCollapsedRange();
    test_ret += test_xmlXPtrNewContext();
    test_ret += test_xmlXPtrNewLocationSetNodeSet();
    test_ret += test_xmlXPtrNewLocationSetNodes();
    test_ret += test_xmlXPtrNewRange();
    test_ret += test_xmlXPtrNewRangeNodeObject();
    test_ret += test_xmlXPtrNewRangeNodePoint();
    test_ret += test_xmlXPtrNewRangeNodes();
    test_ret += test_xmlXPtrNewRangePointNode();
    test_ret += test_xmlXPtrNewRangePoints();
    test_ret += test_xmlXPtrRangeToFunction();
    test_ret += test_xmlXPtrWrapLocationSet();

    if (test_ret != 0)
	printf("Module xpointer: %d errors\n", test_ret);
    return(test_ret);
}
static int
test_module(const char *module) {
    if (!strcmp(module, "HTMLparser")) return(test_HTMLparser());
    if (!strcmp(module, "HTMLtree")) return(test_HTMLtree());
    if (!strcmp(module, "SAX2")) return(test_SAX2());
    if (!strcmp(module, "c14n")) return(test_c14n());
    if (!strcmp(module, "catalog")) return(test_catalog());
    if (!strcmp(module, "chvalid")) return(test_chvalid());
    if (!strcmp(module, "debugXML")) return(test_debugXML());
    if (!strcmp(module, "dict")) return(test_dict());
    if (!strcmp(module, "encoding")) return(test_encoding());
    if (!strcmp(module, "entities")) return(test_entities());
    if (!strcmp(module, "hash")) return(test_hash());
    if (!strcmp(module, "list")) return(test_list());
    if (!strcmp(module, "nanoftp")) return(test_nanoftp());
    if (!strcmp(module, "nanohttp")) return(test_nanohttp());
    if (!strcmp(module, "parser")) return(test_parser());
    if (!strcmp(module, "parserInternals")) return(test_parserInternals());
    if (!strcmp(module, "pattern")) return(test_pattern());
    if (!strcmp(module, "relaxng")) return(test_relaxng());
    if (!strcmp(module, "schemasInternals")) return(test_schemasInternals());
    if (!strcmp(module, "schematron")) return(test_schematron());
    if (!strcmp(module, "tree")) return(test_tree());
    if (!strcmp(module, "uri")) return(test_uri());
    if (!strcmp(module, "valid")) return(test_valid());
    if (!strcmp(module, "xinclude")) return(test_xinclude());
    if (!strcmp(module, "xmlIO")) return(test_xmlIO());
    if (!strcmp(module, "xmlautomata")) return(test_xmlautomata());
    if (!strcmp(module, "xmlerror")) return(test_xmlerror());
    if (!strcmp(module, "xmlmodule")) return(test_xmlmodule());
    if (!strcmp(module, "xmlreader")) return(test_xmlreader());
    if (!strcmp(module, "xmlregexp")) return(test_xmlregexp());
    if (!strcmp(module, "xmlsave")) return(test_xmlsave());
    if (!strcmp(module, "xmlschemas")) return(test_xmlschemas());
    if (!strcmp(module, "xmlschemastypes")) return(test_xmlschemastypes());
    if (!strcmp(module, "xmlstring")) return(test_xmlstring());
    if (!strcmp(module, "xmlunicode")) return(test_xmlunicode());
    if (!strcmp(module, "xmlwriter")) return(test_xmlwriter());
    if (!strcmp(module, "xpath")) return(test_xpath());
    if (!strcmp(module, "xpathInternals")) return(test_xpathInternals());
    if (!strcmp(module, "xpointer")) return(test_xpointer());
    return(0);
}
