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 */