/*
 *  Copyright (C) 1998-2003 Daniel Veillard.  All Rights Reserved.
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is fur-
 *  nished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
 *  NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 *  DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 *  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
 *  NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 *  Except as contained in this notice, the name of Daniel Veillard shall not
 *  be used in advertising or otherwise to promote the sale, use or other deal-
 *  ings in this Software without prior written authorization from him.
 *
 *
 *  This include file is taken from the libxml2 source tree, to provide the needed
 *  declarations to implement usage of libxml2xml.so
 *                                    (David Sommerseth <davids@redhat.com>, 2009)
 *
 */

#include <Python.h>
#include <libxml/tree.h>
#include <libxml/parser.h>
#include <libxml/parserInternals.h>
#include <libxml/catalog.h>
#include <libxml/threads.h>
#include <libxml/nanoftp.h>
#include <libxml/nanohttp.h>
#include <libxml/uri.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <libxml/debugXML.h>
#include <libxml/HTMLparser.h>
#include <libxml/HTMLtree.h>
#include <libxml/xinclude.h>
#include <libxml/xpointer.h>
#include <libxml/xmlunicode.h>
#include <libxml/xmlregexp.h>
#include <libxml/xmlautomata.h>
#include <libxml/xmlreader.h>
#ifdef LIBXML_SCHEMAS_ENABLED
#include <libxml/relaxng.h>
#include <libxml/xmlschemas.h>
#endif

/**
 * ATTRIBUTE_UNUSED:
 *
 * Macro used to signal to GCC unused function parameters
 * Repeated here since the definition is not available when
 * compiled outside the libxml2 build tree.
 */
#ifdef __GNUC__
#ifdef ATTRIBUTE_UNUSED
#undef ATTRIBUTE_UNUSED
#endif
#ifndef ATTRIBUTE_UNUSED
#define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
#endif /* ATTRIBUTE_UNUSED */
#else
#define ATTRIBUTE_UNUSED
#endif

#define PyxmlNode_Get(v) (((v) == Py_None) ? NULL : \
	(((PyxmlNode_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlNodePtr obj;
} PyxmlNode_Object;

#define PyxmlXPathContext_Get(v) (((v) == Py_None) ? NULL : \
	(((PyxmlXPathContext_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlXPathContextPtr obj;
} PyxmlXPathContext_Object;

#define PyxmlXPathParserContext_Get(v) (((v) == Py_None) ? NULL : \
	(((PyxmlXPathParserContext_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlXPathParserContextPtr obj;
} PyxmlXPathParserContext_Object;

#define PyparserCtxt_Get(v) (((v) == Py_None) ? NULL : \
        (((PyparserCtxt_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlParserCtxtPtr obj;
} PyparserCtxt_Object;

#define PyValidCtxt_Get(v) (((v) == Py_None) ? NULL : \
	(((PyValidCtxt_Object *)(v))->obj))

typedef struct {
	PyObject_HEAD
	xmlValidCtxtPtr obj;
} PyValidCtxt_Object;

#define Pycatalog_Get(v) (((v) == Py_None) ? NULL : \
        (((Pycatalog_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlCatalogPtr obj;
} Pycatalog_Object;

#ifdef LIBXML_REGEXP_ENABLED
#define PyxmlReg_Get(v) (((v) == Py_None) ? NULL : \
        (((PyxmlReg_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlRegexpPtr obj;
} PyxmlReg_Object;
#endif /* LIBXML_REGEXP_ENABLED */

#ifdef LIBXML_READER_ENABLED
#define PyxmlTextReader_Get(v) (((v) == Py_None) ? NULL : \
        (((PyxmlTextReader_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlTextReaderPtr obj;
} PyxmlTextReader_Object;

#define PyxmlTextReaderLocator_Get(v) (((v) == Py_None) ? NULL : \
        (((PyxmlTextReaderLocator_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlTextReaderLocatorPtr obj;
} PyxmlTextReaderLocator_Object;
#endif

#define PyURI_Get(v) (((v) == Py_None) ? NULL : \
	(((PyURI_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlErrorPtr obj;
} PyError_Object;

#define PyError_Get(v) (((v) == Py_None) ? NULL : \
	(((PyError_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlOutputBufferPtr obj;
} PyoutputBuffer_Object;

#define PyoutputBuffer_Get(v) (((v) == Py_None) ? NULL : \
	(((PyoutputBuffer_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlParserInputBufferPtr obj;
} PyinputBuffer_Object;

#define PyinputBuffer_Get(v) (((v) == Py_None) ? NULL : \
	(((PyinputBuffer_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlURIPtr obj;
} PyURI_Object;

/* FILE * have their own internal representation */
#define PyFile_Get(v) (((v) == Py_None) ? NULL : \
	(PyFile_Check(v) ? (PyFile_AsFile(v)) : stdout))

#ifdef LIBXML_SCHEMAS_ENABLED
typedef struct {
    PyObject_HEAD
    xmlRelaxNGPtr obj;
} PyrelaxNgSchema_Object;

#define PyrelaxNgSchema_Get(v) (((v) == Py_None) ? NULL : \
	(((PyrelaxNgSchema_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlRelaxNGParserCtxtPtr obj;
} PyrelaxNgParserCtxt_Object;

#define PyrelaxNgParserCtxt_Get(v) (((v) == Py_None) ? NULL : \
	(((PyrelaxNgParserCtxt_Object *)(v))->obj))

typedef struct {
    PyObject_HEAD
    xmlRelaxNGValidCtxtPtr obj;
} PyrelaxNgValidCtxt_Object;

#define PyrelaxNgValidCtxt_Get(v) (((v) == Py_None) ? NULL : \
	(((PyrelaxNgValidCtxt_Object *)(v))->obj))

typedef struct {
	PyObject_HEAD
	xmlSchemaPtr obj;
} PySchema_Object;

#define PySchema_Get(v) (((v) == Py_None) ? NULL : \
	(((PySchema_Object *)(v))->obj))

typedef struct {
	PyObject_HEAD
	xmlSchemaParserCtxtPtr obj;
} PySchemaParserCtxt_Object;

#define PySchemaParserCtxt_Get(v) (((v) == Py_None) ? NULL : \
	(((PySchemaParserCtxt_Object *)(v))->obj))

typedef struct {
	PyObject_HEAD
	xmlSchemaValidCtxtPtr obj;
} PySchemaValidCtxt_Object;

#define PySchemaValidCtxt_Get(v) (((v) == Py_None) ? NULL : \
	(((PySchemaValidCtxt_Object *)(v))->obj))

#endif /* LIBXML_SCHEMAS_ENABLED */

PyObject * libxml_intWrap(int val);
PyObject * libxml_longWrap(long val);
PyObject * libxml_xmlCharPtrWrap(xmlChar *str);
PyObject * libxml_constxmlCharPtrWrap(const xmlChar *str);
PyObject * libxml_charPtrWrap(char *str);
PyObject * libxml_constcharPtrWrap(const char *str);
PyObject * libxml_charPtrConstWrap(const char *str);
PyObject * libxml_xmlCharPtrConstWrap(const xmlChar *str);
PyObject * libxml_xmlDocPtrWrap(xmlDocPtr doc);
PyObject * libxml_xmlNodePtrWrap(xmlNodePtr node);
PyObject * libxml_xmlAttrPtrWrap(xmlAttrPtr attr);
PyObject * libxml_xmlNsPtrWrap(xmlNsPtr ns);
PyObject * libxml_xmlAttributePtrWrap(xmlAttributePtr ns);
PyObject * libxml_xmlElementPtrWrap(xmlElementPtr ns);
PyObject * libxml_doubleWrap(double val);
PyObject * libxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt);
PyObject * libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt);
PyObject * libxml_xmlXPathParserContextPtrWrap(xmlXPathParserContextPtr ctxt);
PyObject * libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj);
PyObject * libxml_xmlValidCtxtPtrWrap(xmlValidCtxtPtr valid);
PyObject * libxml_xmlCatalogPtrWrap(xmlCatalogPtr obj);
PyObject * libxml_xmlURIPtrWrap(xmlURIPtr uri);
PyObject * libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer);
PyObject * libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer);
#ifdef LIBXML_REGEXP_ENABLED
PyObject * libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp);
#endif /* LIBXML_REGEXP_ENABLED */
#ifdef LIBXML_READER_ENABLED
PyObject * libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader);
PyObject * libxml_xmlTextReaderLocatorPtrWrap(xmlTextReaderLocatorPtr locator);
#endif

xmlXPathObjectPtr libxml_xmlXPathObjectPtrConvert(PyObject * obj);
#ifdef LIBXML_SCHEMAS_ENABLED
PyObject * libxml_xmlRelaxNGPtrWrap(xmlRelaxNGPtr ctxt);
PyObject * libxml_xmlRelaxNGParserCtxtPtrWrap(xmlRelaxNGParserCtxtPtr ctxt);
PyObject * libxml_xmlRelaxNGValidCtxtPtrWrap(xmlRelaxNGValidCtxtPtr valid);
PyObject * libxml_xmlSchemaPtrWrap(xmlSchemaPtr ctxt);
PyObject * libxml_xmlSchemaParserCtxtPtrWrap(xmlSchemaParserCtxtPtr ctxt);
PyObject * libxml_xmlSchemaValidCtxtPtrWrap(xmlSchemaValidCtxtPtr valid);
#endif /* LIBXML_SCHEMAS_ENABLED */
PyObject * libxml_xmlErrorPtrWrap(xmlErrorPtr error);
PyObject * libxml_xmlSchemaSetValidErrors(PyObject * self, PyObject * args);
