1 #include <Python.h> 2 #include <libxml/tree.h> 3 #include <libxml/parser.h> 4 #include <libxml/parserInternals.h> 5 #include <libxml/catalog.h> 6 #include <libxml/threads.h> 7 #include <libxml/nanoftp.h> 8 #include <libxml/nanohttp.h> 9 #include <libxml/uri.h> 10 #include <libxml/xpath.h> 11 #include <libxml/xpathInternals.h> 12 #include <libxml/debugXML.h> 13 #include <libxml/HTMLparser.h> 14 #include <libxml/HTMLtree.h> 15 #include <libxml/xinclude.h> 16 #include <libxml/xpointer.h> 17 #include <libxml/xmlunicode.h> 18 #include <libxml/xmlregexp.h> 19 #include <libxml/xmlautomata.h> 20 #include <libxml/xmlreader.h> 21 #ifdef LIBXML_SCHEMAS_ENABLED 22 #include <libxml/relaxng.h> 23 #include <libxml/xmlschemas.h> 24 #endif 25 26 /* 27 * for older versions of Python, we don't use PyBytes, but keep PyString 28 * and don't use Capsule but CObjects 29 */ 30 #if PY_VERSION_HEX < 0x02070000 31 #ifndef PyBytes_Check 32 #define PyBytes_Check PyString_Check 33 #define PyBytes_Size PyString_Size 34 #define PyBytes_AsString PyString_AsString 35 #define PyBytes_AS_STRING PyString_AS_STRING 36 #define PyBytes_GET_SIZE PyString_GET_SIZE 37 #endif 38 #ifndef PyCapsule_New 39 #define PyCapsule_New PyCObject_FromVoidPtrAndDesc 40 #define PyCapsule_CheckExact PyCObject_Check 41 #define PyCapsule_GetPointer(o, n) PyCObject_GetDesc((o)) 42 #endif 43 #endif 44 45 /** 46 * ATTRIBUTE_UNUSED: 47 * 48 * Macro used to signal to GCC unused function parameters 49 * Repeated here since the definition is not available when 50 * compiled outside the libxml2 build tree. 51 */ 52 #ifdef __GNUC__ 53 #ifdef ATTRIBUTE_UNUSED 54 #undef ATTRIBUTE_UNUSED 55 #endif 56 #ifndef ATTRIBUTE_UNUSED 57 #define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) 58 #endif /* ATTRIBUTE_UNUSED */ 59 #else 60 #define ATTRIBUTE_UNUSED 61 #endif 62 63 #define PyxmlNode_Get(v) (((v) == Py_None) ? NULL : \ 64 (((PyxmlNode_Object *)(v))->obj)) 65 66 typedef struct { 67 PyObject_HEAD 68 xmlNodePtr obj; 69 } PyxmlNode_Object; 70 71 #define PyxmlXPathContext_Get(v) (((v) == Py_None) ? NULL : \ 72 (((PyxmlXPathContext_Object *)(v))->obj)) 73 74 typedef struct { 75 PyObject_HEAD 76 xmlXPathContextPtr obj; 77 } PyxmlXPathContext_Object; 78 79 #define PyxmlXPathParserContext_Get(v) (((v) == Py_None) ? NULL : \ 80 (((PyxmlXPathParserContext_Object *)(v))->obj)) 81 82 typedef struct { 83 PyObject_HEAD 84 xmlXPathParserContextPtr obj; 85 } PyxmlXPathParserContext_Object; 86 87 #define PyparserCtxt_Get(v) (((v) == Py_None) ? NULL : \ 88 (((PyparserCtxt_Object *)(v))->obj)) 89 90 typedef struct { 91 PyObject_HEAD 92 xmlParserCtxtPtr obj; 93 } PyparserCtxt_Object; 94 95 #define PyValidCtxt_Get(v) (((v) == Py_None) ? NULL : \ 96 (((PyValidCtxt_Object *)(v))->obj)) 97 98 typedef struct { 99 PyObject_HEAD 100 xmlValidCtxtPtr obj; 101 } PyValidCtxt_Object; 102 103 #define Pycatalog_Get(v) (((v) == Py_None) ? NULL : \ 104 (((Pycatalog_Object *)(v))->obj)) 105 106 typedef struct { 107 PyObject_HEAD 108 xmlCatalogPtr obj; 109 } Pycatalog_Object; 110 111 #ifdef LIBXML_REGEXP_ENABLED 112 #define PyxmlReg_Get(v) (((v) == Py_None) ? NULL : \ 113 (((PyxmlReg_Object *)(v))->obj)) 114 115 typedef struct { 116 PyObject_HEAD 117 xmlRegexpPtr obj; 118 } PyxmlReg_Object; 119 #endif /* LIBXML_REGEXP_ENABLED */ 120 121 #ifdef LIBXML_READER_ENABLED 122 #define PyxmlTextReader_Get(v) (((v) == Py_None) ? NULL : \ 123 (((PyxmlTextReader_Object *)(v))->obj)) 124 125 typedef struct { 126 PyObject_HEAD 127 xmlTextReaderPtr obj; 128 } PyxmlTextReader_Object; 129 130 #define PyxmlTextReaderLocator_Get(v) (((v) == Py_None) ? NULL : \ 131 (((PyxmlTextReaderLocator_Object *)(v))->obj)) 132 133 typedef struct { 134 PyObject_HEAD 135 xmlTextReaderLocatorPtr obj; 136 } PyxmlTextReaderLocator_Object; 137 #endif 138 139 #define PyURI_Get(v) (((v) == Py_None) ? NULL : \ 140 (((PyURI_Object *)(v))->obj)) 141 142 typedef struct { 143 PyObject_HEAD 144 xmlErrorPtr obj; 145 } PyError_Object; 146 147 #define PyError_Get(v) (((v) == Py_None) ? NULL : \ 148 (((PyError_Object *)(v))->obj)) 149 150 typedef struct { 151 PyObject_HEAD 152 xmlOutputBufferPtr obj; 153 } PyoutputBuffer_Object; 154 155 #define PyoutputBuffer_Get(v) (((v) == Py_None) ? NULL : \ 156 (((PyoutputBuffer_Object *)(v))->obj)) 157 158 typedef struct { 159 PyObject_HEAD 160 xmlParserInputBufferPtr obj; 161 } PyinputBuffer_Object; 162 163 #define PyinputBuffer_Get(v) (((v) == Py_None) ? NULL : \ 164 (((PyinputBuffer_Object *)(v))->obj)) 165 166 typedef struct { 167 PyObject_HEAD 168 xmlURIPtr obj; 169 } PyURI_Object; 170 171 /* FILE * have their own internal representation */ 172 #if PY_MAJOR_VERSION >= 3 173 FILE *libxml_PyFileGet(PyObject *f); 174 void libxml_PyFileRelease(FILE *f); 175 #define PyFile_Get(v) (((v) == Py_None) ? NULL : libxml_PyFileGet(v)) 176 #define PyFile_Release(f) libxml_PyFileRelease(f) 177 #else 178 #define PyFile_Get(v) (((v) == Py_None) ? NULL : \ 179 (PyFile_Check(v) ? (PyFile_AsFile(v)) : stdout)) 180 #define PyFile_Release(f) 181 #endif 182 183 #ifdef LIBXML_SCHEMAS_ENABLED 184 typedef struct { 185 PyObject_HEAD 186 xmlRelaxNGPtr obj; 187 } PyrelaxNgSchema_Object; 188 189 #define PyrelaxNgSchema_Get(v) (((v) == Py_None) ? NULL : \ 190 (((PyrelaxNgSchema_Object *)(v))->obj)) 191 192 typedef struct { 193 PyObject_HEAD 194 xmlRelaxNGParserCtxtPtr obj; 195 } PyrelaxNgParserCtxt_Object; 196 197 #define PyrelaxNgParserCtxt_Get(v) (((v) == Py_None) ? NULL : \ 198 (((PyrelaxNgParserCtxt_Object *)(v))->obj)) 199 200 typedef struct { 201 PyObject_HEAD 202 xmlRelaxNGValidCtxtPtr obj; 203 } PyrelaxNgValidCtxt_Object; 204 205 #define PyrelaxNgValidCtxt_Get(v) (((v) == Py_None) ? NULL : \ 206 (((PyrelaxNgValidCtxt_Object *)(v))->obj)) 207 208 typedef struct { 209 PyObject_HEAD 210 xmlSchemaPtr obj; 211 } PySchema_Object; 212 213 #define PySchema_Get(v) (((v) == Py_None) ? NULL : \ 214 (((PySchema_Object *)(v))->obj)) 215 216 typedef struct { 217 PyObject_HEAD 218 xmlSchemaParserCtxtPtr obj; 219 } PySchemaParserCtxt_Object; 220 221 #define PySchemaParserCtxt_Get(v) (((v) == Py_None) ? NULL : \ 222 (((PySchemaParserCtxt_Object *)(v))->obj)) 223 224 typedef struct { 225 PyObject_HEAD 226 xmlSchemaValidCtxtPtr obj; 227 } PySchemaValidCtxt_Object; 228 229 #define PySchemaValidCtxt_Get(v) (((v) == Py_None) ? NULL : \ 230 (((PySchemaValidCtxt_Object *)(v))->obj)) 231 232 #endif /* LIBXML_SCHEMAS_ENABLED */ 233 234 PyObject * libxml_intWrap(int val); 235 PyObject * libxml_longWrap(long val); 236 PyObject * libxml_xmlCharPtrWrap(xmlChar *str); 237 PyObject * libxml_constxmlCharPtrWrap(const xmlChar *str); 238 PyObject * libxml_charPtrWrap(char *str); 239 PyObject * libxml_constcharPtrWrap(const char *str); 240 PyObject * libxml_charPtrConstWrap(const char *str); 241 PyObject * libxml_xmlCharPtrConstWrap(const xmlChar *str); 242 PyObject * libxml_xmlDocPtrWrap(xmlDocPtr doc); 243 PyObject * libxml_xmlNodePtrWrap(xmlNodePtr node); 244 PyObject * libxml_xmlAttrPtrWrap(xmlAttrPtr attr); 245 PyObject * libxml_xmlNsPtrWrap(xmlNsPtr ns); 246 PyObject * libxml_xmlAttributePtrWrap(xmlAttributePtr ns); 247 PyObject * libxml_xmlElementPtrWrap(xmlElementPtr ns); 248 PyObject * libxml_doubleWrap(double val); 249 PyObject * libxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt); 250 PyObject * libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt); 251 PyObject * libxml_xmlXPathParserContextPtrWrap(xmlXPathParserContextPtr ctxt); 252 PyObject * libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj); 253 PyObject * libxml_xmlValidCtxtPtrWrap(xmlValidCtxtPtr valid); 254 PyObject * libxml_xmlCatalogPtrWrap(xmlCatalogPtr obj); 255 PyObject * libxml_xmlURIPtrWrap(xmlURIPtr uri); 256 PyObject * libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer); 257 PyObject * libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer); 258 #ifdef LIBXML_REGEXP_ENABLED 259 PyObject * libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp); 260 #endif /* LIBXML_REGEXP_ENABLED */ 261 #ifdef LIBXML_READER_ENABLED 262 PyObject * libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader); 263 PyObject * libxml_xmlTextReaderLocatorPtrWrap(xmlTextReaderLocatorPtr locator); 264 #endif 265 266 xmlXPathObjectPtr libxml_xmlXPathObjectPtrConvert(PyObject * obj); 267 #ifdef LIBXML_SCHEMAS_ENABLED 268 PyObject * libxml_xmlRelaxNGPtrWrap(xmlRelaxNGPtr ctxt); 269 PyObject * libxml_xmlRelaxNGParserCtxtPtrWrap(xmlRelaxNGParserCtxtPtr ctxt); 270 PyObject * libxml_xmlRelaxNGValidCtxtPtrWrap(xmlRelaxNGValidCtxtPtr valid); 271 PyObject * libxml_xmlSchemaPtrWrap(xmlSchemaPtr ctxt); 272 PyObject * libxml_xmlSchemaParserCtxtPtrWrap(xmlSchemaParserCtxtPtr ctxt); 273 PyObject * libxml_xmlSchemaValidCtxtPtrWrap(xmlSchemaValidCtxtPtr valid); 274 #endif /* LIBXML_SCHEMAS_ENABLED */ 275 PyObject * libxml_xmlErrorPtrWrap(xmlErrorPtr error); 276 PyObject * libxml_xmlSchemaSetValidErrors(PyObject * self, PyObject * args); 277 PyObject * libxml_xmlRegisterInputCallback(PyObject *self, PyObject *args); 278 PyObject * libxml_xmlUnregisterInputCallback(PyObject *self, PyObject *args); 279 PyObject * libxml_xmlNodeRemoveNsDef(PyObject * self, PyObject * args); 280