Bump to libxml2 2.9.4
[platform/upstream/libxml2.git] / python / types.c
1 /*
2  * types.c: converter functions between the internal representation
3  *          and the Python objects
4  *
5  * See Copyright for the status of this software.
6  *
7  * daniel@veillard.com
8  */
9 #include "libxml_wrap.h"
10 #include <libxml/xpathInternals.h>
11
12 #if PY_MAJOR_VERSION >= 3
13 #define PY_IMPORT_STRING_SIZE PyUnicode_FromStringAndSize
14 #define PY_IMPORT_STRING PyUnicode_FromString
15 #define PY_IMPORT_INT PyLong_FromLong
16 #else
17 #define PY_IMPORT_STRING_SIZE PyString_FromStringAndSize
18 #define PY_IMPORT_STRING PyString_FromString
19 #define PY_IMPORT_INT PyInt_FromLong
20 #endif
21
22 #if PY_MAJOR_VERSION >= 3
23 #include <stdio.h>
24 #include <unistd.h>
25 #include <fcntl.h>
26
27 FILE *
28 libxml_PyFileGet(PyObject *f) {
29     int fd, flags;
30     FILE *res;
31     const char *mode;
32
33     fd = PyObject_AsFileDescriptor(f);
34     if (!_PyVerify_fd(fd))
35         return(NULL);
36     /*
37      * Get the flags on the fd to understand how it was opened
38      */
39     flags = fcntl(fd, F_GETFL, 0);
40     switch (flags & O_ACCMODE) {
41         case O_RDWR:
42             if (flags & O_APPEND)
43                 mode = "a+";
44             else
45                 mode = "rw";
46             break;
47         case O_RDONLY:
48             if (flags & O_APPEND)
49                 mode = "r+";
50             else
51                 mode = "r";
52             break;
53         case O_WRONLY:
54             if (flags & O_APPEND)
55                 mode = "a";
56             else
57                 mode = "w";
58             break;
59         default:
60             return(NULL);
61     }
62
63     /*
64      * the FILE struct gets a new fd, so that it can be closed
65      * independently of the file descriptor given. The risk though is
66      * lack of sync. So at the python level sync must be implemented
67      * before and after a conversion took place. No way around it
68      * in the Python3 infrastructure !
69      * The duplicated fd and FILE * will be released in the subsequent
70      * call to libxml_PyFileRelease() which must be genrated accodingly
71      */
72     fd = dup(fd);
73     if (fd == -1)
74         return(NULL);
75     res = fdopen(fd, mode);
76     if (res == NULL) {
77         close(fd);
78         return(NULL);
79     }
80     return(res);
81 }
82
83 void libxml_PyFileRelease(FILE *f) {
84     if (f != NULL)
85         fclose(f);
86 }
87 #endif
88
89 PyObject *
90 libxml_intWrap(int val)
91 {
92     PyObject *ret;
93
94 #ifdef DEBUG
95     printf("libxml_intWrap: val = %d\n", val);
96 #endif
97     ret = PY_IMPORT_INT((long) val);
98     return (ret);
99 }
100
101 PyObject *
102 libxml_longWrap(long val)
103 {
104     PyObject *ret;
105
106 #ifdef DEBUG
107     printf("libxml_longWrap: val = %ld\n", val);
108 #endif
109     ret = PyLong_FromLong(val);
110     return (ret);
111 }
112
113 PyObject *
114 libxml_doubleWrap(double val)
115 {
116     PyObject *ret;
117
118 #ifdef DEBUG
119     printf("libxml_doubleWrap: val = %f\n", val);
120 #endif
121     ret = PyFloat_FromDouble((double) val);
122     return (ret);
123 }
124
125 PyObject *
126 libxml_charPtrWrap(char *str)
127 {
128     PyObject *ret;
129
130 #ifdef DEBUG
131     printf("libxml_xmlcharPtrWrap: str = %s\n", str);
132 #endif
133     if (str == NULL) {
134         Py_INCREF(Py_None);
135         return (Py_None);
136     }
137     ret = PY_IMPORT_STRING(str);
138     xmlFree(str);
139     return (ret);
140 }
141
142 PyObject *
143 libxml_charPtrConstWrap(const char *str)
144 {
145     PyObject *ret;
146
147 #ifdef DEBUG
148     printf("libxml_xmlcharPtrWrap: str = %s\n", str);
149 #endif
150     if (str == NULL) {
151         Py_INCREF(Py_None);
152         return (Py_None);
153     }
154     ret = PY_IMPORT_STRING(str);
155     return (ret);
156 }
157
158 PyObject *
159 libxml_xmlCharPtrWrap(xmlChar * str)
160 {
161     PyObject *ret;
162
163 #ifdef DEBUG
164     printf("libxml_xmlCharPtrWrap: str = %s\n", str);
165 #endif
166     if (str == NULL) {
167         Py_INCREF(Py_None);
168         return (Py_None);
169     }
170     ret = PY_IMPORT_STRING((char *) str);
171     xmlFree(str);
172     return (ret);
173 }
174
175 PyObject *
176 libxml_xmlCharPtrConstWrap(const xmlChar * str)
177 {
178     PyObject *ret;
179
180 #ifdef DEBUG
181     printf("libxml_xmlCharPtrWrap: str = %s\n", str);
182 #endif
183     if (str == NULL) {
184         Py_INCREF(Py_None);
185         return (Py_None);
186     }
187     ret = PY_IMPORT_STRING((char *) str);
188     return (ret);
189 }
190
191 PyObject *
192 libxml_constcharPtrWrap(const char *str)
193 {
194     PyObject *ret;
195
196 #ifdef DEBUG
197     printf("libxml_xmlcharPtrWrap: str = %s\n", str);
198 #endif
199     if (str == NULL) {
200         Py_INCREF(Py_None);
201         return (Py_None);
202     }
203     ret = PY_IMPORT_STRING(str);
204     return (ret);
205 }
206
207 PyObject *
208 libxml_constxmlCharPtrWrap(const xmlChar * str)
209 {
210     PyObject *ret;
211
212 #ifdef DEBUG
213     printf("libxml_xmlCharPtrWrap: str = %s\n", str);
214 #endif
215     if (str == NULL) {
216         Py_INCREF(Py_None);
217         return (Py_None);
218     }
219     ret = PY_IMPORT_STRING((char *) str);
220     return (ret);
221 }
222
223 PyObject *
224 libxml_xmlDocPtrWrap(xmlDocPtr doc)
225 {
226     PyObject *ret;
227
228 #ifdef DEBUG
229     printf("libxml_xmlDocPtrWrap: doc = %p\n", doc);
230 #endif
231     if (doc == NULL) {
232         Py_INCREF(Py_None);
233         return (Py_None);
234     }
235     /* TODO: look at deallocation */
236     ret = PyCapsule_New((void *) doc, (char *) "xmlDocPtr", NULL);
237     return (ret);
238 }
239
240 PyObject *
241 libxml_xmlNodePtrWrap(xmlNodePtr node)
242 {
243     PyObject *ret;
244
245 #ifdef DEBUG
246     printf("libxml_xmlNodePtrWrap: node = %p\n", node);
247 #endif
248     if (node == NULL) {
249         Py_INCREF(Py_None);
250         return (Py_None);
251     }
252     ret = PyCapsule_New((void *) node, (char *) "xmlNodePtr", NULL);
253     return (ret);
254 }
255
256 PyObject *
257 libxml_xmlURIPtrWrap(xmlURIPtr uri)
258 {
259     PyObject *ret;
260
261 #ifdef DEBUG
262     printf("libxml_xmlURIPtrWrap: uri = %p\n", uri);
263 #endif
264     if (uri == NULL) {
265         Py_INCREF(Py_None);
266         return (Py_None);
267     }
268     ret = PyCapsule_New((void *) uri, (char *) "xmlURIPtr", NULL);
269     return (ret);
270 }
271
272 PyObject *
273 libxml_xmlNsPtrWrap(xmlNsPtr ns)
274 {
275     PyObject *ret;
276
277 #ifdef DEBUG
278     printf("libxml_xmlNsPtrWrap: node = %p\n", ns);
279 #endif
280     if (ns == NULL) {
281         Py_INCREF(Py_None);
282         return (Py_None);
283     }
284     ret = PyCapsule_New((void *) ns, (char *) "xmlNsPtr", NULL);
285     return (ret);
286 }
287
288 PyObject *
289 libxml_xmlAttrPtrWrap(xmlAttrPtr attr)
290 {
291     PyObject *ret;
292
293 #ifdef DEBUG
294     printf("libxml_xmlAttrNodePtrWrap: attr = %p\n", attr);
295 #endif
296     if (attr == NULL) {
297         Py_INCREF(Py_None);
298         return (Py_None);
299     }
300     ret = PyCapsule_New((void *) attr, (char *) "xmlAttrPtr", NULL);
301     return (ret);
302 }
303
304 PyObject *
305 libxml_xmlAttributePtrWrap(xmlAttributePtr attr)
306 {
307     PyObject *ret;
308
309 #ifdef DEBUG
310     printf("libxml_xmlAttributePtrWrap: attr = %p\n", attr);
311 #endif
312     if (attr == NULL) {
313         Py_INCREF(Py_None);
314         return (Py_None);
315     }
316     ret = PyCapsule_New((void *) attr, (char *) "xmlAttributePtr", NULL);
317     return (ret);
318 }
319
320 PyObject *
321 libxml_xmlElementPtrWrap(xmlElementPtr elem)
322 {
323     PyObject *ret;
324
325 #ifdef DEBUG
326     printf("libxml_xmlElementNodePtrWrap: elem = %p\n", elem);
327 #endif
328     if (elem == NULL) {
329         Py_INCREF(Py_None);
330         return (Py_None);
331     }
332     ret = PyCapsule_New((void *) elem, (char *) "xmlElementPtr", NULL);
333     return (ret);
334 }
335
336 PyObject *
337 libxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt)
338 {
339     PyObject *ret;
340
341 #ifdef DEBUG
342     printf("libxml_xmlXPathContextPtrWrap: ctxt = %p\n", ctxt);
343 #endif
344     if (ctxt == NULL) {
345         Py_INCREF(Py_None);
346         return (Py_None);
347     }
348     ret = PyCapsule_New((void *) ctxt, (char *) "xmlXPathContextPtr", NULL);
349     return (ret);
350 }
351
352 PyObject *
353 libxml_xmlXPathParserContextPtrWrap(xmlXPathParserContextPtr ctxt)
354 {
355     PyObject *ret;
356
357 #ifdef DEBUG
358     printf("libxml_xmlXPathParserContextPtrWrap: ctxt = %p\n", ctxt);
359 #endif
360     if (ctxt == NULL) {
361         Py_INCREF(Py_None);
362         return (Py_None);
363     }
364     ret = PyCapsule_New((void *)ctxt, (char *)"xmlXPathParserContextPtr", NULL);
365     return (ret);
366 }
367
368 PyObject *
369 libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt)
370 {
371     PyObject *ret;
372
373 #ifdef DEBUG
374     printf("libxml_xmlParserCtxtPtrWrap: ctxt = %p\n", ctxt);
375 #endif
376     if (ctxt == NULL) {
377         Py_INCREF(Py_None);
378         return (Py_None);
379     }
380
381     ret = PyCapsule_New((void *) ctxt, (char *) "xmlParserCtxtPtr", NULL);
382     return (ret);
383 }
384
385 /**
386  * libxml_xmlXPathDestructNsNode:
387  * cap: xmlNsPtr namespace node capsule object
388  *
389  * This function is called if and when a namespace node returned in
390  * an XPath node set is to be destroyed. That's the only kind of
391  * object returned in node set not directly linked to the original
392  * xmlDoc document, see xmlXPathNodeSetDupNs.
393  */
394 #if PY_VERSION_HEX < 0x02070000
395 static void
396 libxml_xmlXPathDestructNsNode(void *cap, void *desc ATTRIBUTE_UNUSED)
397 #else
398 static void
399 libxml_xmlXPathDestructNsNode(PyObject *cap)
400 #endif
401 {
402 #ifdef DEBUG
403     fprintf(stderr, "libxml_xmlXPathDestructNsNode called %p\n", cap);
404 #endif
405 #if PY_VERSION_HEX < 0x02070000
406     xmlXPathNodeSetFreeNs((xmlNsPtr) cap);
407 #else
408     xmlXPathNodeSetFreeNs((xmlNsPtr) PyCapsule_GetPointer(cap, "xmlNsPtr"));
409 #endif
410 }
411
412 PyObject *
413 libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj)
414 {
415     PyObject *ret;
416
417 #ifdef DEBUG
418     printf("libxml_xmlXPathObjectPtrWrap: ctxt = %p\n", obj);
419 #endif
420     if (obj == NULL) {
421         Py_INCREF(Py_None);
422         return (Py_None);
423     }
424     switch (obj->type) {
425         case XPATH_XSLT_TREE: {
426             if ((obj->nodesetval == NULL) ||
427                 (obj->nodesetval->nodeNr == 0) ||
428                 (obj->nodesetval->nodeTab == NULL)) {
429                 ret = PyList_New(0);
430             } else {
431                 int i, len = 0;
432                 xmlNodePtr node;
433
434                 node = obj->nodesetval->nodeTab[0]->children;
435                 while (node != NULL) {
436                     len++;
437                     node = node->next;
438                 }
439                 ret = PyList_New(len);
440                 node = obj->nodesetval->nodeTab[0]->children;
441                 for (i = 0;i < len;i++) {
442                     PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
443                     node = node->next;
444                 }
445             }
446             /*
447              * Return now, do not free the object passed down
448              */
449             return (ret);
450         }
451         case XPATH_NODESET:
452             if ((obj->nodesetval == NULL)
453                 || (obj->nodesetval->nodeNr == 0)) {
454                 ret = PyList_New(0);
455             } else {
456                 int i;
457                 xmlNodePtr node;
458
459                 ret = PyList_New(obj->nodesetval->nodeNr);
460                 for (i = 0; i < obj->nodesetval->nodeNr; i++) {
461                     node = obj->nodesetval->nodeTab[i];
462                     if (node->type == XML_NAMESPACE_DECL) {
463                         PyObject *ns = PyCapsule_New((void *) node,
464                                      (char *) "xmlNsPtr",
465                                      libxml_xmlXPathDestructNsNode);
466                         PyList_SetItem(ret, i, ns);
467                         /* make sure the xmlNsPtr is not destroyed now */
468                         obj->nodesetval->nodeTab[i] = NULL;
469                     } else {
470                         PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
471                     }
472                 }
473             }
474             break;
475         case XPATH_BOOLEAN:
476             ret = PY_IMPORT_INT((long) obj->boolval);
477             break;
478         case XPATH_NUMBER:
479             ret = PyFloat_FromDouble(obj->floatval);
480             break;
481         case XPATH_STRING:
482             ret = PY_IMPORT_STRING((char *) obj->stringval);
483             break;
484         case XPATH_POINT:
485         {
486             PyObject *node;
487             PyObject *indexIntoNode;
488             PyObject *tuple;
489
490             node = libxml_xmlNodePtrWrap(obj->user);
491             indexIntoNode = PY_IMPORT_INT((long) obj->index);
492
493             tuple = PyTuple_New(2);
494             PyTuple_SetItem(tuple, 0, node);
495             PyTuple_SetItem(tuple, 1, indexIntoNode);
496
497             ret = tuple;
498             break;
499         }
500         case XPATH_RANGE:
501         {
502             unsigned short bCollapsedRange;
503
504             bCollapsedRange = ( (obj->user2 == NULL) ||
505                                 ((obj->user2 == obj->user) && (obj->index == obj->index2)) );
506             if ( bCollapsedRange ) {
507                 PyObject *node;
508                 PyObject *indexIntoNode;
509                 PyObject *tuple;
510                 PyObject *list;
511
512                 list = PyList_New(1);
513
514                 node = libxml_xmlNodePtrWrap(obj->user);
515                 indexIntoNode = PY_IMPORT_INT((long) obj->index);
516
517                 tuple = PyTuple_New(2);
518                 PyTuple_SetItem(tuple, 0, node);
519                 PyTuple_SetItem(tuple, 1, indexIntoNode);
520
521                 PyList_SetItem(list, 0, tuple);
522
523                 ret = list;
524             } else {
525                 PyObject *node;
526                 PyObject *indexIntoNode;
527                 PyObject *tuple;
528                 PyObject *list;
529
530                 list = PyList_New(2);
531
532                 node = libxml_xmlNodePtrWrap(obj->user);
533                 indexIntoNode = PY_IMPORT_INT((long) obj->index);
534
535                 tuple = PyTuple_New(2);
536                 PyTuple_SetItem(tuple, 0, node);
537                 PyTuple_SetItem(tuple, 1, indexIntoNode);
538
539                 PyList_SetItem(list, 0, tuple);
540
541                 node = libxml_xmlNodePtrWrap(obj->user2);
542                 indexIntoNode = PY_IMPORT_INT((long) obj->index2);
543
544                 tuple = PyTuple_New(2);
545                 PyTuple_SetItem(tuple, 0, node);
546                 PyTuple_SetItem(tuple, 1, indexIntoNode);
547
548                 PyList_SetItem(list, 1, tuple);
549
550                 ret = list;
551             }
552             break;
553         }
554         case XPATH_LOCATIONSET:
555         {
556             xmlLocationSetPtr set;
557
558             set = obj->user;
559             if ( set && set->locNr > 0 ) {
560                 int i;
561                 PyObject *list;
562
563                 list = PyList_New(set->locNr);
564
565                 for (i=0; i<set->locNr; i++) {
566                     xmlXPathObjectPtr setobj;
567                     PyObject *pyobj;
568
569                     setobj = set->locTab[i]; /*xmlXPathObjectPtr setobj*/
570
571                     pyobj = libxml_xmlXPathObjectPtrWrap(setobj);
572                     /* xmlXPathFreeObject(setobj) is called */
573                     set->locTab[i] = NULL;
574
575                     PyList_SetItem(list, i, pyobj);
576                 }
577                 set->locNr = 0;
578                 ret = list;
579             } else {
580                 Py_INCREF(Py_None);
581                 ret = Py_None;
582             }
583             break;
584         }
585         default:
586 #ifdef DEBUG
587             printf("Unable to convert XPath object type %d\n", obj->type);
588 #endif
589             Py_INCREF(Py_None);
590             ret = Py_None;
591     }
592     xmlXPathFreeObject(obj);
593     return (ret);
594 }
595
596 xmlXPathObjectPtr
597 libxml_xmlXPathObjectPtrConvert(PyObject *obj)
598 {
599     xmlXPathObjectPtr ret = NULL;
600
601 #ifdef DEBUG
602     printf("libxml_xmlXPathObjectPtrConvert: obj = %p\n", obj);
603 #endif
604     if (obj == NULL) {
605         return (NULL);
606     }
607     if PyFloat_Check (obj) {
608         ret = xmlXPathNewFloat((double) PyFloat_AS_DOUBLE(obj));
609     } else if PyLong_Check(obj) {
610 #ifdef PyLong_AS_LONG
611         ret = xmlXPathNewFloat((double) PyLong_AS_LONG(obj));
612 #else
613         ret = xmlXPathNewFloat((double) PyInt_AS_LONG(obj));
614 #endif
615 #ifdef PyBool_Check
616     } else if PyBool_Check (obj) {
617
618         if (obj == Py_True) {
619           ret = xmlXPathNewBoolean(1);
620         }
621         else {
622           ret = xmlXPathNewBoolean(0);
623         }
624 #endif
625     } else if PyBytes_Check (obj) {
626         xmlChar *str;
627
628         str = xmlStrndup((const xmlChar *) PyBytes_AS_STRING(obj),
629                          PyBytes_GET_SIZE(obj));
630         ret = xmlXPathWrapString(str);
631 #ifdef PyUnicode_Check
632     } else if PyUnicode_Check (obj) {
633 #if PY_VERSION_HEX >= 0x03030000
634         xmlChar *str;
635         const char *tmp;
636         Py_ssize_t size;
637
638         /* tmp doesn't need to be deallocated */
639         tmp = PyUnicode_AsUTF8AndSize(obj, &size);
640         str = xmlStrndup((const xmlChar *) tmp, (int) size);
641         ret = xmlXPathWrapString(str);
642 #else
643         xmlChar *str = NULL;
644         PyObject *b;
645
646         b = PyUnicode_AsUTF8String(obj);
647         if (b != NULL) {
648             str = xmlStrndup((const xmlChar *) PyBytes_AS_STRING(b),
649                              PyBytes_GET_SIZE(b));
650             Py_DECREF(b);
651         }
652         ret = xmlXPathWrapString(str);
653 #endif
654 #endif
655     } else if PyList_Check (obj) {
656         int i;
657         PyObject *node;
658         xmlNodePtr cur;
659         xmlNodeSetPtr set;
660
661         set = xmlXPathNodeSetCreate(NULL);
662
663         for (i = 0; i < PyList_Size(obj); i++) {
664             node = PyList_GetItem(obj, i);
665             if ((node == NULL) || (node->ob_type == NULL))
666                 continue;
667
668             cur = NULL;
669             if (PyCapsule_CheckExact(node)) {
670 #ifdef DEBUG
671                 printf("Got a Capsule\n");
672 #endif
673                 cur = PyxmlNode_Get(node);
674             } else if ((PyObject_HasAttrString(node, (char *) "_o")) &&
675                        (PyObject_HasAttrString(node, (char *) "get_doc"))) {
676                 PyObject *wrapper;
677
678                 wrapper = PyObject_GetAttrString(node, (char *) "_o");
679                 if (wrapper != NULL)
680                     cur = PyxmlNode_Get(wrapper);
681             } else {
682 #ifdef DEBUG
683                 printf("Unknown object in Python return list\n");
684 #endif
685             }
686             if (cur != NULL) {
687                 xmlXPathNodeSetAdd(set, cur);
688             }
689         }
690         ret = xmlXPathWrapNodeSet(set);
691     } else {
692 #ifdef DEBUG
693         printf("Unable to convert Python Object to XPath");
694 #endif
695     }
696     return (ret);
697 }
698
699 PyObject *
700 libxml_xmlValidCtxtPtrWrap(xmlValidCtxtPtr valid)
701 {
702         PyObject *ret;
703
704 #ifdef DEBUG
705         printf("libxml_xmlValidCtxtPtrWrap: valid = %p\n", valid);
706 #endif
707         if (valid == NULL) {
708                 Py_INCREF(Py_None);
709                 return (Py_None);
710         }
711
712         ret = 
713                 PyCapsule_New((void *) valid,
714                                                                          (char *) "xmlValidCtxtPtr", NULL);
715
716         return (ret);
717 }
718
719 PyObject *
720 libxml_xmlCatalogPtrWrap(xmlCatalogPtr catal)
721 {
722     PyObject *ret;
723
724 #ifdef DEBUG
725     printf("libxml_xmlNodePtrWrap: catal = %p\n", catal);
726 #endif
727     if (catal == NULL) {
728         Py_INCREF(Py_None);
729         return (Py_None);
730     }
731     ret =
732         PyCapsule_New((void *) catal,
733                                      (char *) "xmlCatalogPtr", NULL);
734     return (ret);
735 }
736
737 PyObject *
738 libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer)
739 {
740     PyObject *ret;
741
742 #ifdef DEBUG
743     printf("libxml_xmlOutputBufferPtrWrap: buffer = %p\n", buffer);
744 #endif
745     if (buffer == NULL) {
746         Py_INCREF(Py_None);
747         return (Py_None);
748     }
749     ret =
750         PyCapsule_New((void *) buffer,
751                                      (char *) "xmlOutputBufferPtr", NULL);
752     return (ret);
753 }
754
755 PyObject *
756 libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer)
757 {
758     PyObject *ret;
759
760 #ifdef DEBUG
761     printf("libxml_xmlParserInputBufferPtrWrap: buffer = %p\n", buffer);
762 #endif
763     if (buffer == NULL) {
764         Py_INCREF(Py_None);
765         return (Py_None);
766     }
767     ret =
768         PyCapsule_New((void *) buffer,
769                                      (char *) "xmlParserInputBufferPtr", NULL);
770     return (ret);
771 }
772
773 #ifdef LIBXML_REGEXP_ENABLED
774 PyObject *
775 libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp)
776 {
777     PyObject *ret;
778
779 #ifdef DEBUG
780     printf("libxml_xmlRegexpPtrWrap: regexp = %p\n", regexp);
781 #endif
782     if (regexp == NULL) {
783         Py_INCREF(Py_None);
784         return (Py_None);
785     }
786     ret =
787         PyCapsule_New((void *) regexp,
788                                      (char *) "xmlRegexpPtr", NULL);
789     return (ret);
790 }
791 #endif /* LIBXML_REGEXP_ENABLED */
792
793 #ifdef LIBXML_READER_ENABLED
794 PyObject *
795 libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader)
796 {
797     PyObject *ret;
798
799 #ifdef DEBUG
800     printf("libxml_xmlTextReaderPtrWrap: reader = %p\n", reader);
801 #endif
802     if (reader == NULL) {
803         Py_INCREF(Py_None);
804         return (Py_None);
805     }
806     ret =
807         PyCapsule_New((void *) reader,
808                                      (char *) "xmlTextReaderPtr", NULL);
809     return (ret);
810 }
811
812 PyObject *
813 libxml_xmlTextReaderLocatorPtrWrap(xmlTextReaderLocatorPtr locator)
814 {
815     PyObject *ret;
816
817 #ifdef DEBUG
818     printf("libxml_xmlTextReaderLocatorPtrWrap: locator = %p\n", locator);
819 #endif
820     if (locator == NULL) {
821         Py_INCREF(Py_None);
822         return (Py_None);
823     }
824     ret =
825         PyCapsule_New((void *) locator,
826                                      (char *) "xmlTextReaderLocatorPtr", NULL);
827     return (ret);
828 }
829 #endif /* LIBXML_READER_ENABLED */
830
831 #ifdef LIBXML_SCHEMAS_ENABLED
832 PyObject *
833 libxml_xmlRelaxNGPtrWrap(xmlRelaxNGPtr ctxt)
834 {
835     PyObject *ret;
836
837 #ifdef DEBUG
838     printf("libxml_xmlRelaxNGPtrWrap: ctxt = %p\n", ctxt);
839 #endif
840     if (ctxt == NULL) {
841         Py_INCREF(Py_None);
842         return (Py_None);
843     }
844     ret =
845         PyCapsule_New((void *) ctxt,
846                                      (char *) "xmlRelaxNGPtr", NULL);
847     return (ret);
848 }
849
850 PyObject *
851 libxml_xmlRelaxNGParserCtxtPtrWrap(xmlRelaxNGParserCtxtPtr ctxt)
852 {
853     PyObject *ret;
854
855 #ifdef DEBUG
856     printf("libxml_xmlRelaxNGParserCtxtPtrWrap: ctxt = %p\n", ctxt);
857 #endif
858     if (ctxt == NULL) {
859         Py_INCREF(Py_None);
860         return (Py_None);
861     }
862     ret =
863         PyCapsule_New((void *) ctxt,
864                                      (char *) "xmlRelaxNGParserCtxtPtr", NULL);
865     return (ret);
866 }
867 PyObject *
868 libxml_xmlRelaxNGValidCtxtPtrWrap(xmlRelaxNGValidCtxtPtr valid)
869 {
870     PyObject *ret;
871
872 #ifdef DEBUG
873     printf("libxml_xmlRelaxNGValidCtxtPtrWrap: valid = %p\n", valid);
874 #endif
875     if (valid == NULL) {
876         Py_INCREF(Py_None);
877         return (Py_None);
878     }
879     ret =
880         PyCapsule_New((void *) valid,
881                                      (char *) "xmlRelaxNGValidCtxtPtr", NULL);
882     return (ret);
883 }
884
885 PyObject *
886 libxml_xmlSchemaPtrWrap(xmlSchemaPtr ctxt)
887 {
888         PyObject *ret;
889
890 #ifdef DEBUG
891         printf("libxml_xmlSchemaPtrWrap: ctxt = %p\n", ctxt);
892 #endif
893         if (ctxt == NULL) {
894                 Py_INCREF(Py_None);
895                 return (Py_None);
896         }
897         ret =
898                 PyCapsule_New((void *) ctxt,
899                                                                          (char *) "xmlSchemaPtr", NULL);
900         return (ret);
901 }
902
903 PyObject *
904 libxml_xmlSchemaParserCtxtPtrWrap(xmlSchemaParserCtxtPtr ctxt)
905 {
906         PyObject *ret;
907
908 #ifdef DEBUG
909         printf("libxml_xmlSchemaParserCtxtPtrWrap: ctxt = %p\n", ctxt);
910 #endif
911         if (ctxt == NULL) {
912                 Py_INCREF(Py_None);
913                 return (Py_None);
914         }
915         ret = 
916                 PyCapsule_New((void *) ctxt,
917                                                                          (char *) "xmlSchemaParserCtxtPtr", NULL);
918
919         return (ret);
920 }
921
922 PyObject *
923 libxml_xmlSchemaValidCtxtPtrWrap(xmlSchemaValidCtxtPtr valid)
924 {
925         PyObject *ret;
926         
927 #ifdef DEBUG
928         printf("libxml_xmlSchemaValidCtxtPtrWrap: valid = %p\n", valid);
929 #endif
930         if (valid == NULL) {
931                 Py_INCREF(Py_None);
932                 return (Py_None);
933         }
934
935         ret = 
936                 PyCapsule_New((void *) valid,
937                                                                          (char *) "xmlSchemaValidCtxtPtr", NULL);
938
939         return (ret);
940 }
941 #endif /* LIBXML_SCHEMAS_ENABLED */
942
943 PyObject *
944 libxml_xmlErrorPtrWrap(xmlErrorPtr error)
945 {
946     PyObject *ret;
947
948 #ifdef DEBUG
949     printf("libxml_xmlErrorPtrWrap: error = %p\n", error);
950 #endif
951     if (error == NULL) {
952         Py_INCREF(Py_None);
953         return (Py_None);
954     }
955     ret = PyCapsule_New((void *) error, (char *) "xmlErrorPtr", NULL);
956     return (ret);
957 }