Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/lxml/includes/etree_defs.h @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
comparison
equal
deleted
inserted
replaced
4:79f47841a781 | 5:9b1c78e6ba9c |
---|---|
1 #ifndef HAS_ETREE_DEFS_H | |
2 #define HAS_ETREE_DEFS_H | |
3 | |
4 /* quick check for Python/libxml2/libxslt devel setup */ | |
5 #include "Python.h" | |
6 #ifndef PY_VERSION_HEX | |
7 # error the development package of Python (header files etc.) is not installed correctly | |
8 #else | |
9 # if PY_VERSION_HEX < 0x02070000 || PY_MAJOR_VERSION >= 3 && PY_VERSION_HEX < 0x03050000 | |
10 # error this version of lxml requires Python 2.7, 3.5 or later | |
11 # endif | |
12 #endif | |
13 | |
14 #include "libxml/xmlversion.h" | |
15 #ifndef LIBXML_VERSION | |
16 # error the development package of libxml2 (header files etc.) is not installed correctly | |
17 #else | |
18 #if LIBXML_VERSION < 20700 | |
19 # error minimum required version of libxml2 is 2.7.0 | |
20 #endif | |
21 #endif | |
22 | |
23 #include "libxslt/xsltconfig.h" | |
24 #ifndef LIBXSLT_VERSION | |
25 # error the development package of libxslt (header files etc.) is not installed correctly | |
26 #else | |
27 #if LIBXSLT_VERSION < 10123 | |
28 # error minimum required version of libxslt is 1.1.23 | |
29 #endif | |
30 #endif | |
31 | |
32 | |
33 /* v_arg functions */ | |
34 #define va_int(ap) va_arg(ap, int) | |
35 #define va_charptr(ap) va_arg(ap, char *) | |
36 | |
37 #ifdef PYPY_VERSION | |
38 # define IS_PYPY 1 | |
39 #else | |
40 # define IS_PYPY 0 | |
41 #endif | |
42 | |
43 #if PY_MAJOR_VERSION >= 3 | |
44 # define IS_PYTHON2 0 /* prefer for special casing Python 2.x */ | |
45 # define IS_PYTHON3 1 /* avoid */ | |
46 #else | |
47 # define IS_PYTHON2 1 | |
48 # define IS_PYTHON3 0 | |
49 #endif | |
50 | |
51 #if IS_PYTHON2 | |
52 #ifndef LXML_UNICODE_STRINGS | |
53 #define LXML_UNICODE_STRINGS 0 | |
54 #endif | |
55 #else | |
56 #undef LXML_UNICODE_STRINGS | |
57 #define LXML_UNICODE_STRINGS 1 | |
58 #endif | |
59 | |
60 #if !IS_PYPY | |
61 # define PyWeakref_LockObject(obj) (NULL) | |
62 #endif | |
63 | |
64 /* Threading is not currently supported by PyPy */ | |
65 #if IS_PYPY | |
66 # ifndef WITHOUT_THREADING | |
67 # define WITHOUT_THREADING | |
68 # endif | |
69 #endif | |
70 | |
71 #if IS_PYPY | |
72 # undef PyFile_AsFile | |
73 # define PyFile_AsFile(o) (NULL) | |
74 # undef PyByteArray_Check | |
75 # define PyByteArray_Check(o) (0) | |
76 #elif !IS_PYTHON2 | |
77 /* Python 3+ doesn't have PyFile_*() anymore */ | |
78 # define PyFile_AsFile(o) (NULL) | |
79 #endif | |
80 | |
81 #if PY_VERSION_HEX <= 0x03030000 && !(defined(CYTHON_PEP393_ENABLED) && CYTHON_PEP393_ENABLED) | |
82 #define PyUnicode_IS_READY(op) (0) | |
83 #define PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) | |
84 #define PyUnicode_KIND(u) (sizeof(Py_UNICODE)) | |
85 #define PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) | |
86 #endif | |
87 | |
88 #if IS_PYPY | |
89 # ifndef PyUnicode_FromFormat | |
90 # define PyUnicode_FromFormat PyString_FromFormat | |
91 # endif | |
92 # if !IS_PYTHON2 && !defined(PyBytes_FromFormat) | |
93 # ifdef PyString_FromFormat | |
94 # define PyBytes_FromFormat PyString_FromFormat | |
95 # else | |
96 #include <stdarg.h> | |
97 static PyObject* PyBytes_FromFormat(const char* format, ...) { | |
98 PyObject *string; | |
99 va_list vargs; | |
100 #ifdef HAVE_STDARG_PROTOTYPES | |
101 va_start(vargs, format); | |
102 #else | |
103 va_start(vargs); | |
104 #endif | |
105 string = PyUnicode_FromFormatV(format, vargs); | |
106 va_end(vargs); | |
107 if (string && PyUnicode_Check(string)) { | |
108 PyObject *bstring = PyUnicode_AsUTF8String(string); | |
109 Py_DECREF(string); | |
110 string = bstring; | |
111 } | |
112 if (string && !PyBytes_CheckExact(string)) { | |
113 Py_DECREF(string); | |
114 string = NULL; | |
115 PyErr_SetString(PyExc_TypeError, "String formatting and encoding failed to return bytes object"); | |
116 } | |
117 return string; | |
118 } | |
119 # endif | |
120 # endif | |
121 #endif | |
122 | |
123 /* PySlice_GetIndicesEx() has wrong signature in Py<=3.1 */ | |
124 #if PY_VERSION_HEX >= 0x03020000 | |
125 # define _lx_PySlice_GetIndicesEx(o, l, b, e, s, sl) PySlice_GetIndicesEx(o, l, b, e, s, sl) | |
126 #else | |
127 # define _lx_PySlice_GetIndicesEx(o, l, b, e, s, sl) PySlice_GetIndicesEx(((PySliceObject*)o), l, b, e, s, sl) | |
128 #endif | |
129 | |
130 #ifdef WITHOUT_THREADING | |
131 # undef PyEval_SaveThread | |
132 # define PyEval_SaveThread() (NULL) | |
133 # undef PyEval_RestoreThread | |
134 # define PyEval_RestoreThread(state) if (state); else {} | |
135 # undef PyGILState_Ensure | |
136 # define PyGILState_Ensure() (PyGILState_UNLOCKED) | |
137 # undef PyGILState_Release | |
138 # define PyGILState_Release(state) if (state); else {} | |
139 # undef Py_UNBLOCK_THREADS | |
140 # define Py_UNBLOCK_THREADS _save = NULL; | |
141 # undef Py_BLOCK_THREADS | |
142 # define Py_BLOCK_THREADS if (_save); else {} | |
143 #endif | |
144 | |
145 #ifdef WITHOUT_THREADING | |
146 # define ENABLE_THREADING 0 | |
147 #else | |
148 # define ENABLE_THREADING 1 | |
149 #endif | |
150 | |
151 #if LIBXML_VERSION < 20704 | |
152 /* FIXME: hack to make new error reporting compile in old libxml2 versions */ | |
153 # define xmlStructuredErrorContext NULL | |
154 # define xmlXIncludeProcessTreeFlagsData(n,o,d) xmlXIncludeProcessTreeFlags(n,o) | |
155 #endif | |
156 | |
157 /* schematron was added in libxml2 2.6.21 */ | |
158 #ifdef LIBXML_SCHEMATRON_ENABLED | |
159 # define ENABLE_SCHEMATRON 1 | |
160 #else | |
161 # define ENABLE_SCHEMATRON 0 | |
162 # define XML_SCHEMATRON_OUT_QUIET 0 | |
163 # define XML_SCHEMATRON_OUT_XML 0 | |
164 # define XML_SCHEMATRON_OUT_ERROR 0 | |
165 typedef void xmlSchematron; | |
166 typedef void xmlSchematronParserCtxt; | |
167 typedef void xmlSchematronValidCtxt; | |
168 # define xmlSchematronNewDocParserCtxt(doc) NULL | |
169 # define xmlSchematronNewParserCtxt(file) NULL | |
170 # define xmlSchematronParse(ctxt) NULL | |
171 # define xmlSchematronFreeParserCtxt(ctxt) | |
172 # define xmlSchematronFree(schema) | |
173 # define xmlSchematronNewValidCtxt(schema, options) NULL | |
174 # define xmlSchematronValidateDoc(ctxt, doc) 0 | |
175 # define xmlSchematronFreeValidCtxt(ctxt) | |
176 # define xmlSchematronSetValidStructuredErrors(ctxt, errorfunc, data) | |
177 #endif | |
178 | |
179 #if LIBXML_VERSION < 20708 | |
180 # define HTML_PARSE_NODEFDTD 4 | |
181 #endif | |
182 #if LIBXML_VERSION < 20900 | |
183 # define XML_PARSE_BIG_LINES 4194304 | |
184 #endif | |
185 | |
186 #include "libxml/tree.h" | |
187 #ifndef LIBXML2_NEW_BUFFER | |
188 typedef xmlBuffer xmlBuf; | |
189 # define xmlBufContent(buf) xmlBufferContent(buf) | |
190 # define xmlBufUse(buf) xmlBufferLength(buf) | |
191 #endif | |
192 | |
193 /* libexslt 1.1.25+ support EXSLT functions in XPath */ | |
194 #if LIBXSLT_VERSION < 10125 | |
195 #define exsltDateXpathCtxtRegister(ctxt, prefix) | |
196 #define exsltSetsXpathCtxtRegister(ctxt, prefix) | |
197 #define exsltMathXpathCtxtRegister(ctxt, prefix) | |
198 #define exsltStrXpathCtxtRegister(ctxt, prefix) | |
199 #endif | |
200 | |
201 #define LXML_GET_XSLT_ENCODING(result_var, style) XSLT_GET_IMPORT_PTR(result_var, style, encoding) | |
202 | |
203 /* work around MSDEV 6.0 */ | |
204 #if (_MSC_VER == 1200) && (WINVER < 0x0500) | |
205 long _ftol( double ); //defined by VC6 C libs | |
206 long _ftol2( double dblSource ) { return _ftol( dblSource ); } | |
207 #endif | |
208 | |
209 #ifdef __GNUC__ | |
210 /* Test for GCC > 2.95 */ | |
211 #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) | |
212 #define unlikely_condition(x) __builtin_expect((x), 0) | |
213 #else /* __GNUC__ > 2 ... */ | |
214 #define unlikely_condition(x) (x) | |
215 #endif /* __GNUC__ > 2 ... */ | |
216 #else /* __GNUC__ */ | |
217 #define unlikely_condition(x) (x) | |
218 #endif /* __GNUC__ */ | |
219 | |
220 #ifndef Py_TYPE | |
221 #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) | |
222 #endif | |
223 | |
224 #define PY_NEW(T) \ | |
225 (((PyTypeObject*)(T))->tp_new( \ | |
226 (PyTypeObject*)(T), __pyx_empty_tuple, NULL)) | |
227 | |
228 #define _fqtypename(o) ((Py_TYPE(o))->tp_name) | |
229 | |
230 #define lxml_malloc(count, item_size) \ | |
231 (unlikely_condition((size_t)(count) > (size_t) (PY_SSIZE_T_MAX / item_size)) ? NULL : \ | |
232 (PyMem_Malloc((count) * item_size))) | |
233 | |
234 #define lxml_realloc(mem, count, item_size) \ | |
235 (unlikely_condition((size_t)(count) > (size_t) (PY_SSIZE_T_MAX / item_size)) ? NULL : \ | |
236 (PyMem_Realloc(mem, (count) * item_size))) | |
237 | |
238 #define lxml_free(mem) PyMem_Free(mem) | |
239 | |
240 #if PY_MAJOR_VERSION < 3 | |
241 #define _isString(obj) (PyString_CheckExact(obj) || \ | |
242 PyUnicode_CheckExact(obj) || \ | |
243 PyType_IsSubtype(Py_TYPE(obj), &PyBaseString_Type)) | |
244 #else | |
245 /* builtin subtype type checks are almost as fast as exact checks in Py2.7+ | |
246 * and Unicode is more common in Py3 */ | |
247 #define _isString(obj) (PyUnicode_Check(obj) || PyBytes_Check(obj)) | |
248 #endif | |
249 | |
250 #define _isElement(c_node) \ | |
251 (((c_node)->type == XML_ELEMENT_NODE) || \ | |
252 ((c_node)->type == XML_COMMENT_NODE) || \ | |
253 ((c_node)->type == XML_ENTITY_REF_NODE) || \ | |
254 ((c_node)->type == XML_PI_NODE)) | |
255 | |
256 #define _isElementOrXInclude(c_node) \ | |
257 (_isElement(c_node) || \ | |
258 ((c_node)->type == XML_XINCLUDE_START) || \ | |
259 ((c_node)->type == XML_XINCLUDE_END)) | |
260 | |
261 #define _getNs(c_node) \ | |
262 (((c_node)->ns == 0) ? 0 : ((c_node)->ns->href)) | |
263 | |
264 | |
265 #include "string.h" | |
266 static void* lxml_unpack_xmldoc_capsule(PyObject* capsule, int* is_owned) { | |
267 xmlDoc *c_doc; | |
268 void *context; | |
269 *is_owned = 0; | |
270 if (unlikely_condition(!PyCapsule_IsValid(capsule, (const char*)"libxml2:xmlDoc"))) { | |
271 PyErr_SetString( | |
272 PyExc_TypeError, | |
273 "Not a valid capsule. The capsule argument must be a capsule object with name libxml2:xmlDoc"); | |
274 return NULL; | |
275 } | |
276 c_doc = (xmlDoc*) PyCapsule_GetPointer(capsule, (const char*)"libxml2:xmlDoc"); | |
277 if (unlikely_condition(!c_doc)) return NULL; | |
278 | |
279 if (unlikely_condition(c_doc->type != XML_DOCUMENT_NODE && c_doc->type != XML_HTML_DOCUMENT_NODE)) { | |
280 PyErr_Format( | |
281 PyExc_ValueError, | |
282 "Illegal document provided: expected XML or HTML, found %d", (int)c_doc->type); | |
283 return NULL; | |
284 } | |
285 | |
286 context = PyCapsule_GetContext(capsule); | |
287 if (unlikely_condition(!context && PyErr_Occurred())) return NULL; | |
288 if (context && strcmp((const char*) context, "destructor:xmlFreeDoc") == 0) { | |
289 /* take ownership by setting destructor to NULL */ | |
290 if (PyCapsule_SetDestructor(capsule, NULL) == 0) { | |
291 /* ownership transferred => invalidate capsule by clearing its name */ | |
292 if (unlikely_condition(PyCapsule_SetName(capsule, NULL))) { | |
293 /* this should never happen since everything above succeeded */ | |
294 xmlFreeDoc(c_doc); | |
295 return NULL; | |
296 } | |
297 *is_owned = 1; | |
298 } | |
299 } | |
300 return c_doc; | |
301 } | |
302 | |
303 /* Macro pair implementation of a depth first tree walker | |
304 * | |
305 * Calls the code block between the BEGIN and END macros for all elements | |
306 * below c_tree_top (exclusively), starting at c_node (inclusively iff | |
307 * 'inclusive' is 1). The _ELEMENT_ variants will only stop on nodes | |
308 * that match _isElement(), the normal variant will stop on every node | |
309 * except text nodes. | |
310 * | |
311 * To traverse the node and all of its children and siblings in Pyrex, call | |
312 * cdef xmlNode* some_node | |
313 * BEGIN_FOR_EACH_ELEMENT_FROM(some_node.parent, some_node, 1) | |
314 * # do something with some_node | |
315 * END_FOR_EACH_ELEMENT_FROM(some_node) | |
316 * | |
317 * To traverse only the children and siblings of a node, call | |
318 * cdef xmlNode* some_node | |
319 * BEGIN_FOR_EACH_ELEMENT_FROM(some_node.parent, some_node, 0) | |
320 * # do something with some_node | |
321 * END_FOR_EACH_ELEMENT_FROM(some_node) | |
322 * | |
323 * To traverse only the children, do: | |
324 * cdef xmlNode* some_node | |
325 * some_node = parent_node.children | |
326 * BEGIN_FOR_EACH_ELEMENT_FROM(parent_node, some_node, 1) | |
327 * # do something with some_node | |
328 * END_FOR_EACH_ELEMENT_FROM(some_node) | |
329 * | |
330 * NOTE: 'some_node' MUST be a plain 'xmlNode*' ! | |
331 * | |
332 * NOTE: parent modification during the walk can divert the iterator, but | |
333 * should not segfault ! | |
334 */ | |
335 | |
336 #define _LX__ELEMENT_MATCH(c_node, only_elements) \ | |
337 ((only_elements) ? (_isElement(c_node)) : 1) | |
338 | |
339 #define _LX__ADVANCE_TO_NEXT(c_node, only_elements) \ | |
340 while ((c_node != 0) && (!_LX__ELEMENT_MATCH(c_node, only_elements))) \ | |
341 c_node = c_node->next; | |
342 | |
343 #define _LX__TRAVERSE_TO_NEXT(c_stop_node, c_node, only_elements) \ | |
344 { \ | |
345 /* walk through children first */ \ | |
346 xmlNode* _lx__next = c_node->children; \ | |
347 if (_lx__next != 0) { \ | |
348 if (c_node->type == XML_ENTITY_REF_NODE || c_node->type == XML_DTD_NODE) { \ | |
349 _lx__next = 0; \ | |
350 } else { \ | |
351 _LX__ADVANCE_TO_NEXT(_lx__next, only_elements) \ | |
352 } \ | |
353 } \ | |
354 if ((_lx__next == 0) && (c_node != c_stop_node)) { \ | |
355 /* try siblings */ \ | |
356 _lx__next = c_node->next; \ | |
357 _LX__ADVANCE_TO_NEXT(_lx__next, only_elements) \ | |
358 /* back off through parents */ \ | |
359 while (_lx__next == 0) { \ | |
360 c_node = c_node->parent; \ | |
361 if (c_node == 0) \ | |
362 break; \ | |
363 if (c_node == c_stop_node) \ | |
364 break; \ | |
365 if ((only_elements) && !_isElement(c_node)) \ | |
366 break; \ | |
367 /* we already traversed the parents -> siblings */ \ | |
368 _lx__next = c_node->next; \ | |
369 _LX__ADVANCE_TO_NEXT(_lx__next, only_elements) \ | |
370 } \ | |
371 } \ | |
372 c_node = _lx__next; \ | |
373 } | |
374 | |
375 #define _LX__BEGIN_FOR_EACH_FROM(c_tree_top, c_node, inclusive, only_elements) \ | |
376 { \ | |
377 if (c_node != 0) { \ | |
378 const xmlNode* _lx__tree_top = (c_tree_top); \ | |
379 const int _lx__only_elements = (only_elements); \ | |
380 /* make sure we start at an element */ \ | |
381 if (!_LX__ELEMENT_MATCH(c_node, _lx__only_elements)) { \ | |
382 /* we skip the node, so 'inclusive' is irrelevant */ \ | |
383 if (c_node == _lx__tree_top) \ | |
384 c_node = 0; /* nothing to traverse */ \ | |
385 else { \ | |
386 c_node = c_node->next; \ | |
387 _LX__ADVANCE_TO_NEXT(c_node, _lx__only_elements) \ | |
388 } \ | |
389 } else if (! (inclusive)) { \ | |
390 /* skip the first node */ \ | |
391 _LX__TRAVERSE_TO_NEXT(_lx__tree_top, c_node, _lx__only_elements) \ | |
392 } \ | |
393 \ | |
394 /* now run the user code on the elements we find */ \ | |
395 while (c_node != 0) { \ | |
396 /* here goes the code to be run for each element */ | |
397 | |
398 #define _LX__END_FOR_EACH_FROM(c_node) \ | |
399 _LX__TRAVERSE_TO_NEXT(_lx__tree_top, c_node, _lx__only_elements) \ | |
400 } \ | |
401 } \ | |
402 } | |
403 | |
404 | |
405 #define BEGIN_FOR_EACH_ELEMENT_FROM(c_tree_top, c_node, inclusive) \ | |
406 _LX__BEGIN_FOR_EACH_FROM(c_tree_top, c_node, inclusive, 1) | |
407 | |
408 #define END_FOR_EACH_ELEMENT_FROM(c_node) \ | |
409 _LX__END_FOR_EACH_FROM(c_node) | |
410 | |
411 #define BEGIN_FOR_EACH_FROM(c_tree_top, c_node, inclusive) \ | |
412 _LX__BEGIN_FOR_EACH_FROM(c_tree_top, c_node, inclusive, 0) | |
413 | |
414 #define END_FOR_EACH_FROM(c_node) \ | |
415 _LX__END_FOR_EACH_FROM(c_node) | |
416 | |
417 | |
418 #endif /* HAS_ETREE_DEFS_H */ |