blob: 12562450342be6d973aa489f4f6731366a34a93f [file] [log] [blame]
Daniel Veillard3ce52572002-02-03 15:08:05 +00001/*
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
11PyObject *
12libxml_intWrap(int val) {
13 PyObject *ret;
14
15#ifdef DEBUG
16 printf("libxml_intWrap: val = %d\n", val);
17#endif
18 ret = PyInt_FromLong((long) val);
19 return(ret);
20}
21
22PyObject *
Daniel Veillard4e1b26c2002-02-03 20:13:06 +000023libxml_longWrap(long val) {
24 PyObject *ret;
25
26#ifdef DEBUG
27 printf("libxml_longWrap: val = %ld\n", val);
28#endif
29 ret = PyInt_FromLong(val);
30 return(ret);
31}
32
33PyObject *
Daniel Veillard3ce52572002-02-03 15:08:05 +000034libxml_doubleWrap(double val) {
35 PyObject *ret;
36
37#ifdef DEBUG
38 printf("libxml_doubleWrap: val = %f\n", val);
39#endif
40 ret = PyFloat_FromDouble((double) val);
41 return(ret);
42}
43
44PyObject *
45libxml_charPtrWrap(char *str) {
46 PyObject *ret;
47
48#ifdef DEBUG
49 printf("libxml_xmlcharPtrWrap: str = %s\n", str);
50#endif
51 if (str == NULL) {
52 Py_INCREF(Py_None);
53 return(Py_None);
54 }
55 /* TODO: look at deallocation */
56 ret = PyString_FromString(str);
57 xmlFree(str);
58 return(ret);
59}
60
61PyObject *
Daniel Veillardc575b992002-02-08 13:28:40 +000062libxml_charPtrConstWrap(const char *str) {
63 PyObject *ret;
64
65#ifdef DEBUG
66 printf("libxml_xmlcharPtrWrap: str = %s\n", str);
67#endif
68 if (str == NULL) {
69 Py_INCREF(Py_None);
70 return(Py_None);
71 }
72 /* TODO: look at deallocation */
73 ret = PyString_FromString(str);
74 return(ret);
75}
76
77PyObject *
Daniel Veillard3ce52572002-02-03 15:08:05 +000078libxml_xmlCharPtrWrap(xmlChar *str) {
79 PyObject *ret;
80
81#ifdef DEBUG
82 printf("libxml_xmlCharPtrWrap: str = %s\n", str);
83#endif
84 if (str == NULL) {
85 Py_INCREF(Py_None);
86 return(Py_None);
87 }
88 /* TODO: look at deallocation */
89 ret = PyString_FromString(str);
90 xmlFree(str);
91 return(ret);
92}
93
94PyObject *
Daniel Veillardc575b992002-02-08 13:28:40 +000095libxml_xmlCharPtrConstWrap(const xmlChar *str) {
96 PyObject *ret;
97
98#ifdef DEBUG
99 printf("libxml_xmlCharPtrWrap: str = %s\n", str);
100#endif
101 if (str == NULL) {
102 Py_INCREF(Py_None);
103 return(Py_None);
104 }
105 /* TODO: look at deallocation */
106 ret = PyString_FromString(str);
107 return(ret);
108}
109
110PyObject *
Daniel Veillard3ce52572002-02-03 15:08:05 +0000111libxml_constcharPtrWrap(const char *str) {
112 PyObject *ret;
113
114#ifdef DEBUG
115 printf("libxml_xmlcharPtrWrap: str = %s\n", str);
116#endif
117 if (str == NULL) {
118 Py_INCREF(Py_None);
119 return(Py_None);
120 }
121 /* TODO: look at deallocation */
122 ret = PyString_FromString(str);
123 return(ret);
124}
125
126PyObject *
127libxml_constxmlCharPtrWrap(const xmlChar *str) {
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 /* TODO: look at deallocation */
138 ret = PyString_FromString(str);
139 return(ret);
140}
141
142PyObject *
143libxml_xmlDocPtrWrap(xmlDocPtr doc) {
144 PyObject *ret;
145
146#ifdef DEBUG
147 printf("libxml_xmlDocPtrWrap: doc = %p\n", doc);
148#endif
149 if (doc == NULL) {
150 Py_INCREF(Py_None);
151 return(Py_None);
152 }
153 /* TODO: look at deallocation */
154 ret = PyCObject_FromVoidPtrAndDesc((void *) doc, "xmlDocPtr", NULL);
155 return(ret);
156}
157
158PyObject *
159libxml_xmlNodePtrWrap(xmlNodePtr node) {
160 PyObject *ret;
161
162#ifdef DEBUG
163 printf("libxml_xmlNodePtrWrap: node = %p\n", node);
164#endif
165 if (node == NULL) {
166 Py_INCREF(Py_None);
167 return(Py_None);
168 }
169 ret = PyCObject_FromVoidPtrAndDesc((void *) node, "xmlNodePtr", NULL);
170 return(ret);
171}
172
173PyObject *
Daniel Veillard6361da02002-02-23 10:10:33 +0000174libxml_xmlURIPtrWrap(xmlURIPtr uri) {
175 PyObject *ret;
176
177#ifdef DEBUG
178 printf("libxml_xmlURIPtrWrap: uri = %p\n", uri);
179#endif
180 if (uri == NULL) {
181 Py_INCREF(Py_None);
182 return(Py_None);
183 }
184 ret = PyCObject_FromVoidPtrAndDesc((void *) uri, "xmlURIPtr", NULL);
185 return(ret);
186}
187
188PyObject *
Daniel Veillard3ce52572002-02-03 15:08:05 +0000189libxml_xmlNsPtrWrap(xmlNsPtr ns) {
190 PyObject *ret;
191
192#ifdef DEBUG
193 printf("libxml_xmlNsPtrWrap: node = %p\n", ns);
194#endif
195 if (ns == NULL) {
196 Py_INCREF(Py_None);
197 return(Py_None);
198 }
199 ret = PyCObject_FromVoidPtrAndDesc((void *) ns, "xmlNsPtr", NULL);
200 return(ret);
201}
202
203PyObject *
204libxml_xmlAttrPtrWrap(xmlAttrPtr attr) {
205 PyObject *ret;
206
207#ifdef DEBUG
208 printf("libxml_xmlAttrNodePtrWrap: attr = %p\n", attr);
209#endif
210 if (attr == NULL) {
211 Py_INCREF(Py_None);
212 return(Py_None);
213 }
214 ret = PyCObject_FromVoidPtrAndDesc((void *) attr, "xmlAttrPtr", NULL);
215 return(ret);
216}
217
218PyObject *
219libxml_xmlAttributePtrWrap(xmlAttributePtr attr) {
220 PyObject *ret;
221
222#ifdef DEBUG
223 printf("libxml_xmlAttributePtrWrap: attr = %p\n", attr);
224#endif
225 if (attr == NULL) {
226 Py_INCREF(Py_None);
227 return(Py_None);
228 }
229 ret = PyCObject_FromVoidPtrAndDesc((void *) attr, "xmlAttributePtr", NULL);
230 return(ret);
231}
232
233PyObject *
234libxml_xmlElementPtrWrap(xmlElementPtr elem) {
235 PyObject *ret;
236
237#ifdef DEBUG
238 printf("libxml_xmlElementNodePtrWrap: elem = %p\n", elem);
239#endif
240 if (elem == NULL) {
241 Py_INCREF(Py_None);
242 return(Py_None);
243 }
244 ret = PyCObject_FromVoidPtrAndDesc((void *) elem, "xmlElementPtr", NULL);
245 return(ret);
246}
247
248PyObject *
249libxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt) {
250 PyObject *ret;
251
252#ifdef DEBUG
253 printf("libxml_xmlXPathContextPtrWrap: ctxt = %p\n", ctxt);
254#endif
255 if (ctxt == NULL) {
256 Py_INCREF(Py_None);
257 return(Py_None);
258 }
259 ret = PyCObject_FromVoidPtrAndDesc((void *) ctxt, "xmlXPathContextPtr",
260 NULL);
261 return(ret);
262}
263
264PyObject *
Daniel Veillard7db38712002-02-07 16:39:11 +0000265libxml_xmlXPathParserContextPtrWrap(xmlXPathParserContextPtr ctxt)
266{
267 PyObject *ret;
268
269#ifdef DEBUG
270 printf("libxml_xmlXPathParserContextPtrWrap: ctxt = %p\n", ctxt);
271#endif
272 if (ctxt == NULL) {
273 Py_INCREF(Py_None);
274 return (Py_None);
275 }
276 ret = PyCObject_FromVoidPtrAndDesc((void *) ctxt,
277 "xmlXPathParserContextPtr", NULL);
278 return (ret);
279}
280
281PyObject *
Daniel Veillard3ce52572002-02-03 15:08:05 +0000282libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt) {
283 PyObject *ret;
284
285#ifdef DEBUG
286 printf("libxml_xmlParserCtxtPtrWrap: ctxt = %p\n", ctxt);
287#endif
288 if (ctxt == NULL) {
289 Py_INCREF(Py_None);
290 return(Py_None);
291 }
292 ret = PyCObject_FromVoidPtrAndDesc((void *) ctxt, "xmlParserCtxtPtr",
293 NULL);
294 return(ret);
295}
296
297PyObject *
298libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj) {
299 PyObject *ret;
300
301#ifdef DEBUG
302 printf("libxml_xmlXPathObjectPtrWrap: ctxt = %p\n", obj);
303#endif
304 if (obj == NULL) {
305 Py_INCREF(Py_None);
306 return(Py_None);
307 }
308 switch(obj->type) {
309 case XPATH_XSLT_TREE:
310 /* TODO !!!! Allocation problems */
311 case XPATH_NODESET:
312 if ((obj->nodesetval == NULL) || (obj->nodesetval->nodeNr == 0))
313 ret = PyList_New(0);
314 else {
315 int i;
316 xmlNodePtr node;
317
318 ret = PyList_New(obj->nodesetval->nodeNr);
319 for (i = 0;i < obj->nodesetval->nodeNr;i++) {
320 node = obj->nodesetval->nodeTab[i];
321 /* TODO: try to cast directly to the proper node type */
322 PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
323 }
324 }
325 break;
326 case XPATH_BOOLEAN:
327 ret = PyInt_FromLong((long) obj->boolval);
328 break;
329 case XPATH_NUMBER:
330 ret = PyFloat_FromDouble(obj->floatval);
331 break;
332 case XPATH_STRING:
333 ret = PyString_FromString(obj->stringval);
334 break;
335 case XPATH_POINT:
336 case XPATH_RANGE:
337 case XPATH_LOCATIONSET:
338 default:
339 printf("Unable to convert XPath object type %d\n", obj->type);
340 Py_INCREF(Py_None);
341 ret = Py_None;
342 }
343 xmlXPathFreeObject(obj);
344 return(ret);
345}
346
347xmlXPathObjectPtr
348libxml_xmlXPathObjectPtrConvert(PyObject * obj) {
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000349 xmlXPathObjectPtr ret = NULL;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000350
351#ifdef DEBUG
352 printf("libxml_xmlXPathObjectPtrConvert: obj = %p\n", obj);
353#endif
354 if (obj == NULL) {
355 return(NULL);
356 }
357 if PyFloat_Check(obj) {
358 ret = xmlXPathNewFloat((double) PyFloat_AS_DOUBLE(obj));
359 } else if PyString_Check(obj) {
360 xmlChar *str;
361
362 str = xmlStrndup((const xmlChar *)PyString_AS_STRING(obj),
363 PyString_GET_SIZE(obj));
364 ret = xmlXPathWrapString(str);
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000365 } else if PyList_Check(obj) {
366 int i;
367 PyObject *node;
368 xmlNodePtr cur;
369 xmlNodeSetPtr set;
370
371 set = xmlXPathNodeSetCreate(NULL);
372
373 for (i = 0;i < PyList_Size(obj);i++) {
374 node = PyList_GetItem(obj, i);
Daniel Veillard79426f22002-03-01 16:14:17 +0000375 if ((node == NULL) || (node->ob_type == NULL))
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000376 continue;
Daniel Veillard79426f22002-03-01 16:14:17 +0000377
378 cur = NULL;
379 if (PyCObject_Check(node)) {
380 printf("Got a CObject\n");
381 cur = PyxmlNode_Get(node);
382 } else if (PyInstance_Check(node)) {
383 PyInstanceObject *inst = (PyInstanceObject *) node;
384 PyObject *name = inst->in_class->cl_name;
385 if PyString_Check(name) {
386 char *type = PyString_AS_STRING(name);
387 PyObject *wrapper;
388
389 if (!strcmp(type, "xmlNode")) {
390 wrapper = PyObject_GetAttrString(node, "_o");
391 if (wrapper != NULL) {
392 cur = PyxmlNode_Get(wrapper);
393 }
394 }
395 }
396 } else {
397 printf("Unknown object in Python return list\n");
398 }
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000399 if (cur != NULL) {
400 xmlXPathNodeSetAdd(set, cur);
401 }
402 }
403 ret = xmlXPathWrapNodeSet(set);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000404 } else {
405 printf("Unable to convert Python Object to XPath");
406 }
407 Py_DECREF(obj);
408 return(ret);
409}
410
Daniel Veillard7db38712002-02-07 16:39:11 +0000411PyObject *
412libxml_xmlCatalogPtrWrap(xmlCatalogPtr catal) {
413 PyObject *ret;
414
415#ifdef DEBUG
416 printf("libxml_xmlNodePtrWrap: catal = %p\n", catal);
417#endif
418 if (catal == NULL) {
419 Py_INCREF(Py_None);
420 return(Py_None);
421 }
422 ret = PyCObject_FromVoidPtrAndDesc((void *) catal, "xmlCatalogPtr", NULL);
423 return(ret);
424}
425
Daniel Veillard3ce52572002-02-03 15:08:05 +0000426