mirror of
				https://gitlab.gnome.org/GNOME/libxml2.git
				synced 2025-10-31 21:50:33 +03:00 
			
		
		
		
	It is possible to make xmlIO handle any protocol by means of xmlRegisterInputCallback(). However, that function is currently only available in C API. So, the natural solution seems to be implementing Python bindings for the xmlRegisterInputCallback. * python/generator.py: skip xmlPopInputCallbacks * python/libxml.c python/libxml.py python/libxml_wrap.h: implement the wrappers * python/tests/input_callback.py python/tests/Makefile.am: also add a test case
		
			
				
	
	
		
			252 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			252 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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);
 | |
| PyObject * libxml_xmlRegisterInputCallback(PyObject *self, PyObject *args);
 | |
| PyObject * libxml_xmlUnregisterInputCallback(PyObject *self, PyObject *args);
 |