1 /*****************************************************************
2 This file should be kept compatible with Python 2.3, see PEP 291.
3 *****************************************************************/
13 /******************************************************************/
18 CField_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
21 obj
= (CFieldObject
*)type
->tp_alloc(type
, 0);
22 return (PyObject
*)obj
;
26 * Expects the size, index and offset for the current field in *psize and
27 * *poffset, stores the total size so far in *psize, the offset for the next
28 * field in *poffset, the alignment requirements for the current field in
29 * *palign, and returns a field desriptor for this field.
32 * bitfields extension:
33 * bitsize != 0: this is a bit field.
34 * pbitofs points to the current bit offset, this will be updated.
35 * prev_desc points to the type of the previous bitfield, if any.
38 CField_FromDesc(PyObject
*desc
, Py_ssize_t index
,
39 Py_ssize_t
*pfield_size
, int bitsize
, int *pbitofs
,
40 Py_ssize_t
*psize
, Py_ssize_t
*poffset
, Py_ssize_t
*palign
,
41 int pack
, int big_endian
)
45 Py_ssize_t size
, align
, length
;
46 SETFUNC setfunc
= NULL
;
47 GETFUNC getfunc
= NULL
;
51 #define NEW_BITFIELD 1
52 #define CONT_BITFIELD 2
53 #define EXPAND_BITFIELD 3
55 self
= (CFieldObject
*)PyObject_CallObject((PyObject
*)&CField_Type
,
59 dict
= PyType_stgdict(desc
);
61 PyErr_SetString(PyExc_TypeError
,
66 if (bitsize
/* this is a bitfield request */
67 && *pfield_size
/* we have a bitfield open */
68 #if defined(MS_WIN32) && !defined(__MINGW32__)
69 && dict
->size
* 8 == *pfield_size
/* MSVC */
71 && dict
->size
* 8 <= *pfield_size
/* GCC, MINGW */
73 && (*pbitofs
+ bitsize
) <= *pfield_size
) {
74 /* continue bit field */
75 fieldtype
= CONT_BITFIELD
;
77 } else if (bitsize
/* this is a bitfield request */
78 && *pfield_size
/* we have a bitfield open */
79 && dict
->size
* 8 >= *pfield_size
80 && (*pbitofs
+ bitsize
) <= dict
->size
* 8) {
81 /* expand bit field */
82 fieldtype
= EXPAND_BITFIELD
;
85 /* start new bitfield */
86 fieldtype
= NEW_BITFIELD
;
88 *pfield_size
= dict
->size
* 8;
91 fieldtype
= NO_BITFIELD
;
97 length
= dict
->length
;
100 /* Field descriptors for 'c_char * n' are be scpecial cased to
101 return a Python string instead of an Array object instance...
103 if (ArrayTypeObject_Check(proto
)) {
104 StgDictObject
*adict
= PyType_stgdict(proto
);
105 StgDictObject
*idict
;
106 if (adict
&& adict
->proto
) {
107 idict
= PyType_stgdict(adict
->proto
);
109 PyErr_SetString(PyExc_TypeError
,
114 if (idict
->getfunc
== getentry("c")->getfunc
) {
115 struct fielddesc
*fd
= getentry("s");
116 getfunc
= fd
->getfunc
;
117 setfunc
= fd
->setfunc
;
119 #ifdef CTYPES_UNICODE
120 if (idict
->getfunc
== getentry("u")->getfunc
) {
121 struct fielddesc
*fd
= getentry("U");
122 getfunc
= fd
->getfunc
;
123 setfunc
= fd
->setfunc
;
129 self
->setfunc
= setfunc
;
130 self
->getfunc
= getfunc
;
139 self
->size
= (bitsize
<< 16) + *pfield_size
- *pbitofs
- bitsize
;
141 self
->size
= (bitsize
<< 16) + *pbitofs
;
146 align
= min(pack
, dict
->align
);
149 if (align
&& *poffset
% align
) {
150 Py_ssize_t delta
= align
- (*poffset
% align
);
159 self
->offset
= *poffset
;
165 case EXPAND_BITFIELD
:
167 *psize
+= dict
->size
- *pfield_size
/8;
169 *pfield_size
= dict
->size
* 8;
172 self
->size
= (bitsize
<< 16) + *pfield_size
- *pbitofs
- bitsize
;
174 self
->size
= (bitsize
<< 16) + *pbitofs
;
176 self
->offset
= *poffset
- size
; /* poffset is already updated for the NEXT field */
182 self
->size
= (bitsize
<< 16) + *pfield_size
- *pbitofs
- bitsize
;
184 self
->size
= (bitsize
<< 16) + *pbitofs
;
186 self
->offset
= *poffset
- size
; /* poffset is already updated for the NEXT field */
191 return (PyObject
*)self
;
195 CField_set(CFieldObject
*self
, PyObject
*inst
, PyObject
*value
)
199 assert(CDataObject_Check(inst
));
200 dst
= (CDataObject
*)inst
;
201 ptr
= dst
->b_ptr
+ self
->offset
;
203 PyErr_SetString(PyExc_TypeError
,
204 "can't delete attribute");
207 return CData_set(inst
, self
->proto
, self
->setfunc
, value
,
208 self
->index
, self
->size
, ptr
);
212 CField_get(CFieldObject
*self
, PyObject
*inst
, PyTypeObject
*type
)
217 return (PyObject
*)self
;
219 assert(CDataObject_Check(inst
));
220 src
= (CDataObject
*)inst
;
221 return CData_get(self
->proto
, self
->getfunc
, inst
,
222 self
->index
, self
->size
, src
->b_ptr
+ self
->offset
);
226 CField_get_offset(PyObject
*self
, void *data
)
228 return PyInt_FromSsize_t(((CFieldObject
*)self
)->offset
);
232 CField_get_size(PyObject
*self
, void *data
)
234 return PyInt_FromSsize_t(((CFieldObject
*)self
)->size
);
237 static PyGetSetDef CField_getset
[] = {
238 { "offset", CField_get_offset
, NULL
, "offset in bytes of this field" },
239 { "size", CField_get_size
, NULL
, "size in bytes of this field" },
240 { NULL
, NULL
, NULL
, NULL
},
244 CField_traverse(CFieldObject
*self
, visitproc visit
, void *arg
)
246 Py_VISIT(self
->proto
);
251 CField_clear(CFieldObject
*self
)
253 Py_CLEAR(self
->proto
);
258 CField_dealloc(PyObject
*self
)
260 CField_clear((CFieldObject
*)self
);
261 self
->ob_type
->tp_free((PyObject
*)self
);
265 CField_repr(CFieldObject
*self
)
268 Py_ssize_t bits
= self
->size
>> 16;
269 Py_ssize_t size
= self
->size
& 0xFFFF;
272 name
= ((PyTypeObject
*)self
->proto
)->tp_name
;
275 result
= PyString_FromFormat(
276 #if (PY_VERSION_HEX < 0x02050000)
277 "<Field type=%s, ofs=%d:%d, bits=%d>",
279 "<Field type=%s, ofs=%zd:%zd, bits=%zd>",
281 name
, self
->offset
, size
, bits
);
283 result
= PyString_FromFormat(
284 #if (PY_VERSION_HEX < 0x02050000)
285 "<Field type=%s, ofs=%d, size=%d>",
287 "<Field type=%s, ofs=%zd, size=%zd>",
289 name
, self
->offset
, size
);
293 PyTypeObject CField_Type
= {
294 PyVarObject_HEAD_INIT(NULL
, 0)
295 "_ctypes.CField", /* tp_name */
296 sizeof(CFieldObject
), /* tp_basicsize */
298 CField_dealloc
, /* tp_dealloc */
303 (reprfunc
)CField_repr
, /* tp_repr */
304 0, /* tp_as_number */
305 0, /* tp_as_sequence */
306 0, /* tp_as_mapping */
312 0, /* tp_as_buffer */
313 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
, /* tp_flags */
314 "Structure/Union member", /* tp_doc */
315 (traverseproc
)CField_traverse
, /* tp_traverse */
316 (inquiry
)CField_clear
, /* tp_clear */
317 0, /* tp_richcompare */
318 0, /* tp_weaklistoffset */
323 CField_getset
, /* tp_getset */
326 (descrgetfunc
)CField_get
, /* tp_descr_get */
327 (descrsetfunc
)CField_set
, /* tp_descr_set */
328 0, /* tp_dictoffset */
331 CField_new
, /* tp_new */
336 /******************************************************************/
341 /* Derived from Modules/structmodule.c:
342 Helper routine to get a Python integer and raise the appropriate error
346 get_long(PyObject
*v
, long *p
)
349 if (PyFloat_Check(v
)) {
350 PyErr_SetString(PyExc_TypeError
,
351 "int expected instead of float");
354 x
= PyInt_AsUnsignedLongMask(v
);
355 if (x
== -1 && PyErr_Occurred())
361 /* Same, but handling unsigned long */
364 get_ulong(PyObject
*v
, unsigned long *p
)
367 if (PyFloat_Check(v
)) {
368 PyErr_SetString(PyExc_TypeError
,
369 "int expected instead of float");
372 x
= PyInt_AsUnsignedLongMask(v
);
373 if (x
== -1 && PyErr_Occurred())
379 #ifdef HAVE_LONG_LONG
381 /* Same, but handling native long long. */
384 get_longlong(PyObject
*v
, PY_LONG_LONG
*p
)
387 if (PyFloat_Check(v
)) {
388 PyErr_SetString(PyExc_TypeError
,
389 "int expected instead of float");
392 x
= PyInt_AsUnsignedLongLongMask(v
);
393 if (x
== -1 && PyErr_Occurred())
399 /* Same, but handling native unsigned long long. */
402 get_ulonglong(PyObject
*v
, unsigned PY_LONG_LONG
*p
)
404 unsigned PY_LONG_LONG x
;
405 if (PyFloat_Check(v
)) {
406 PyErr_SetString(PyExc_TypeError
,
407 "int expected instead of float");
410 x
= PyInt_AsUnsignedLongLongMask(v
);
411 if (x
== -1 && PyErr_Occurred())
419 /*****************************************************************
420 * Integer fields, with bitfield support
423 /* how to decode the size field, for integer get/set functions */
424 #define LOW_BIT(x) ((x) & 0xFFFF)
425 #define NUM_BITS(x) ((x) >> 16)
427 /* This seems nore a compiler issue than a Windows/non-Windows one */
429 # define BIT_MASK(size) ((1 << NUM_BITS(size))-1)
431 # define BIT_MASK(size) ((1LL << NUM_BITS(size))-1)
434 /* This macro CHANGES the first parameter IN PLACE. For proper sign handling,
435 we must first shift left, then right.
437 #define GET_BITFIELD(v, size) \
438 if (NUM_BITS(size)) { \
439 v <<= (sizeof(v)*8 - LOW_BIT(size) - NUM_BITS(size)); \
440 v >>= (sizeof(v)*8 - NUM_BITS(size)); \
443 /* This macro RETURNS the first parameter with the bit field CHANGED. */
444 #define SET(x, v, size) \
446 ( ( x & ~(BIT_MASK(size) << LOW_BIT(size)) ) | ( (v & BIT_MASK(size)) << LOW_BIT(size) ) ) \
449 /* byte swapping macros */
451 ( ( (v >> 8) & 0x00FF) | \
452 ( (v << 8) & 0xFF00) )
455 ( ( (v & 0x000000FF) << 24 ) | \
456 ( (v & 0x0000FF00) << 8 ) | \
457 ( (v & 0x00FF0000) >> 8 ) | \
458 ( ((v >> 24) & 0xFF)) )
462 ( ( (v & 0x00000000000000FFL) << 56 ) | \
463 ( (v & 0x000000000000FF00L) << 40 ) | \
464 ( (v & 0x0000000000FF0000L) << 24 ) | \
465 ( (v & 0x00000000FF000000L) << 8 ) | \
466 ( (v & 0x000000FF00000000L) >> 8 ) | \
467 ( (v & 0x0000FF0000000000L) >> 24 ) | \
468 ( (v & 0x00FF000000000000L) >> 40 ) | \
469 ( ((v >> 56) & 0xFF)) )
472 ( ( (v & 0x00000000000000FFLL) << 56 ) | \
473 ( (v & 0x000000000000FF00LL) << 40 ) | \
474 ( (v & 0x0000000000FF0000LL) << 24 ) | \
475 ( (v & 0x00000000FF000000LL) << 8 ) | \
476 ( (v & 0x000000FF00000000LL) >> 8 ) | \
477 ( (v & 0x0000FF0000000000LL) >> 24 ) | \
478 ( (v & 0x00FF000000000000LL) >> 40 ) | \
479 ( ((v >> 56) & 0xFF)) )
482 #define SWAP_INT SWAP_4
485 # define SWAP_LONG SWAP_4
486 #elif SIZEOF_LONG == 8
487 # define SWAP_LONG SWAP_8
489 /*****************************************************************
490 * The setter methods return an object which must be kept alive, to keep the
491 * data valid which has been stored in the memory block. The ctypes object
492 * instance inserts this object into its 'b_objects' list.
494 * For simple Python types like integers or characters, there is nothing that
495 * has to been kept alive, so Py_None is returned in these cases. But this
496 * makes inspecting the 'b_objects' list, which is accessible from Python for
497 * debugging, less useful.
499 * So, defining the _CTYPES_DEBUG_KEEP symbol returns the original value
500 * instead of Py_None.
503 #ifdef _CTYPES_DEBUG_KEEP
504 #define _RET(x) Py_INCREF(x); return x
506 #define _RET(X) Py_INCREF(Py_None); return Py_None
509 /*****************************************************************
510 * integer accessor methods, supporting bit fields
514 b_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
517 if (get_long(value
, &val
) < 0)
519 *(signed char *)ptr
= (signed char)SET(*(signed char *)ptr
, (signed char)val
, size
);
525 b_get(void *ptr
, Py_ssize_t size
)
527 signed char val
= *(signed char *)ptr
;
528 GET_BITFIELD(val
, size
);
529 return PyInt_FromLong(val
);
533 B_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
536 if (get_ulong(value
, &val
) < 0)
538 *(unsigned char *)ptr
= (unsigned char)SET(*(unsigned char*)ptr
,
539 (unsigned short)val
, size
);
545 B_get(void *ptr
, Py_ssize_t size
)
547 unsigned char val
= *(unsigned char *)ptr
;
548 GET_BITFIELD(val
, size
);
549 return PyInt_FromLong(val
);
553 h_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
557 if (get_long(value
, &val
) < 0)
559 memcpy(&x
, ptr
, sizeof(x
));
560 x
= SET(x
, (short)val
, size
);
561 memcpy(ptr
, &x
, sizeof(x
));
567 h_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
571 if (get_long(value
, &val
) < 0)
573 memcpy(&field
, ptr
, sizeof(field
));
574 field
= SWAP_2(field
);
575 field
= SET(field
, (short)val
, size
);
576 field
= SWAP_2(field
);
577 memcpy(ptr
, &field
, sizeof(field
));
582 h_get(void *ptr
, Py_ssize_t size
)
585 memcpy(&val
, ptr
, sizeof(val
));
586 GET_BITFIELD(val
, size
);
587 return PyInt_FromLong((long)val
);
591 h_get_sw(void *ptr
, Py_ssize_t size
)
594 memcpy(&val
, ptr
, sizeof(val
));
596 GET_BITFIELD(val
, size
);
597 return PyInt_FromLong(val
);
601 H_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
605 if (get_ulong(value
, &val
) < 0)
607 memcpy(&x
, ptr
, sizeof(x
));
608 x
= SET(x
, (unsigned short)val
, size
);
609 memcpy(ptr
, &x
, sizeof(x
));
614 H_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
617 unsigned short field
;
618 if (get_ulong(value
, &val
) < 0)
620 memcpy(&field
, ptr
, sizeof(field
));
621 field
= SWAP_2(field
);
622 field
= SET(field
, (unsigned short)val
, size
);
623 field
= SWAP_2(field
);
624 memcpy(ptr
, &field
, sizeof(field
));
630 H_get(void *ptr
, Py_ssize_t size
)
633 memcpy(&val
, ptr
, sizeof(val
));
634 GET_BITFIELD(val
, size
);
635 return PyInt_FromLong(val
);
639 H_get_sw(void *ptr
, Py_ssize_t size
)
642 memcpy(&val
, ptr
, sizeof(val
));
644 GET_BITFIELD(val
, size
);
645 return PyInt_FromLong(val
);
649 i_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
653 if (get_long(value
, &val
) < 0)
655 memcpy(&x
, ptr
, sizeof(x
));
656 x
= SET(x
, (int)val
, size
);
657 memcpy(ptr
, &x
, sizeof(x
));
662 i_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
666 if (get_long(value
, &val
) < 0)
668 memcpy(&field
, ptr
, sizeof(field
));
669 field
= SWAP_INT(field
);
670 field
= SET(field
, (int)val
, size
);
671 field
= SWAP_INT(field
);
672 memcpy(ptr
, &field
, sizeof(field
));
678 i_get(void *ptr
, Py_ssize_t size
)
681 memcpy(&val
, ptr
, sizeof(val
));
682 GET_BITFIELD(val
, size
);
683 return PyInt_FromLong(val
);
687 i_get_sw(void *ptr
, Py_ssize_t size
)
690 memcpy(&val
, ptr
, sizeof(val
));
692 GET_BITFIELD(val
, size
);
693 return PyInt_FromLong(val
);
697 /* short BOOL - VARIANT_BOOL */
699 vBOOL_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
701 switch (PyObject_IsTrue(value
)) {
705 *(short int *)ptr
= VARIANT_FALSE
;
708 *(short int *)ptr
= VARIANT_TRUE
;
714 vBOOL_get(void *ptr
, Py_ssize_t size
)
716 return PyBool_FromLong((long)*(short int *)ptr
);
721 #define BOOL_TYPE _Bool
723 #define BOOL_TYPE char
725 #define SIZEOF__BOOL 1
729 bool_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
731 switch (PyObject_IsTrue(value
)) {
735 *(BOOL_TYPE
*)ptr
= 0;
738 *(BOOL_TYPE
*)ptr
= 1;
744 bool_get(void *ptr
, Py_ssize_t size
)
746 return PyBool_FromLong((long)*(BOOL_TYPE
*)ptr
);
750 I_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
754 if (get_ulong(value
, &val
) < 0)
756 memcpy(&x
, ptr
, sizeof(x
));
757 x
= SET(x
, (unsigned int)val
, size
);
758 memcpy(ptr
, &x
, sizeof(x
));
763 I_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
767 if (get_ulong(value
, &val
) < 0)
769 memcpy(&field
, ptr
, sizeof(field
));
770 field
= (unsigned int)SET(field
, (unsigned int)val
, size
);
771 field
= SWAP_INT(field
);
772 memcpy(ptr
, &field
, sizeof(field
));
778 I_get(void *ptr
, Py_ssize_t size
)
781 memcpy(&val
, ptr
, sizeof(val
));
782 GET_BITFIELD(val
, size
);
783 return PyLong_FromUnsignedLong(val
);
787 I_get_sw(void *ptr
, Py_ssize_t size
)
790 memcpy(&val
, ptr
, sizeof(val
));
792 GET_BITFIELD(val
, size
);
793 return PyLong_FromUnsignedLong(val
);
797 l_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
801 if (get_long(value
, &val
) < 0)
803 memcpy(&x
, ptr
, sizeof(x
));
804 x
= SET(x
, val
, size
);
805 memcpy(ptr
, &x
, sizeof(x
));
810 l_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
814 if (get_long(value
, &val
) < 0)
816 memcpy(&field
, ptr
, sizeof(field
));
817 field
= SWAP_LONG(field
);
818 field
= (long)SET(field
, val
, size
);
819 field
= SWAP_LONG(field
);
820 memcpy(ptr
, &field
, sizeof(field
));
826 l_get(void *ptr
, Py_ssize_t size
)
829 memcpy(&val
, ptr
, sizeof(val
));
830 GET_BITFIELD(val
, size
);
831 return PyInt_FromLong(val
);
835 l_get_sw(void *ptr
, Py_ssize_t size
)
838 memcpy(&val
, ptr
, sizeof(val
));
839 val
= SWAP_LONG(val
);
840 GET_BITFIELD(val
, size
);
841 return PyInt_FromLong(val
);
845 L_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
849 if (get_ulong(value
, &val
) < 0)
851 memcpy(&x
, ptr
, sizeof(x
));
852 x
= SET(x
, val
, size
);
853 memcpy(ptr
, &x
, sizeof(x
));
858 L_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
862 if (get_ulong(value
, &val
) < 0)
864 memcpy(&field
, ptr
, sizeof(field
));
865 field
= SWAP_LONG(field
);
866 field
= (unsigned long)SET(field
, val
, size
);
867 field
= SWAP_LONG(field
);
868 memcpy(ptr
, &field
, sizeof(field
));
874 L_get(void *ptr
, Py_ssize_t size
)
877 memcpy(&val
, ptr
, sizeof(val
));
878 GET_BITFIELD(val
, size
);
879 return PyLong_FromUnsignedLong(val
);
883 L_get_sw(void *ptr
, Py_ssize_t size
)
886 memcpy(&val
, ptr
, sizeof(val
));
887 val
= SWAP_LONG(val
);
888 GET_BITFIELD(val
, size
);
889 return PyLong_FromUnsignedLong(val
);
892 #ifdef HAVE_LONG_LONG
894 q_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
898 if (get_longlong(value
, &val
) < 0)
900 memcpy(&x
, ptr
, sizeof(x
));
901 x
= SET(x
, val
, size
);
902 memcpy(ptr
, &x
, sizeof(x
));
907 q_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
911 if (get_longlong(value
, &val
) < 0)
913 memcpy(&field
, ptr
, sizeof(field
));
914 field
= SWAP_8(field
);
915 field
= (PY_LONG_LONG
)SET(field
, val
, size
);
916 field
= SWAP_8(field
);
917 memcpy(ptr
, &field
, sizeof(field
));
922 q_get(void *ptr
, Py_ssize_t size
)
925 memcpy(&val
, ptr
, sizeof(val
));
926 GET_BITFIELD(val
, size
);
927 return PyLong_FromLongLong(val
);
931 q_get_sw(void *ptr
, Py_ssize_t size
)
934 memcpy(&val
, ptr
, sizeof(val
));
936 GET_BITFIELD(val
, size
);
937 return PyLong_FromLongLong(val
);
941 Q_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
943 unsigned PY_LONG_LONG val
;
944 unsigned PY_LONG_LONG x
;
945 if (get_ulonglong(value
, &val
) < 0)
947 memcpy(&x
, ptr
, sizeof(x
));
948 x
= SET(x
, val
, size
);
949 memcpy(ptr
, &x
, sizeof(x
));
954 Q_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
956 unsigned PY_LONG_LONG val
;
957 unsigned PY_LONG_LONG field
;
958 if (get_ulonglong(value
, &val
) < 0)
960 memcpy(&field
, ptr
, sizeof(field
));
961 field
= SWAP_8(field
);
962 field
= (unsigned PY_LONG_LONG
)SET(field
, val
, size
);
963 field
= SWAP_8(field
);
964 memcpy(ptr
, &field
, sizeof(field
));
969 Q_get(void *ptr
, Py_ssize_t size
)
971 unsigned PY_LONG_LONG val
;
972 memcpy(&val
, ptr
, sizeof(val
));
973 GET_BITFIELD(val
, size
);
974 return PyLong_FromUnsignedLongLong(val
);
978 Q_get_sw(void *ptr
, Py_ssize_t size
)
980 unsigned PY_LONG_LONG val
;
981 memcpy(&val
, ptr
, sizeof(val
));
983 GET_BITFIELD(val
, size
);
984 return PyLong_FromUnsignedLongLong(val
);
988 /*****************************************************************
989 * non-integer accessor methods, not supporting bit fields
994 g_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
998 x
= PyFloat_AsDouble(value
);
999 if (x
== -1 && PyErr_Occurred()) {
1000 PyErr_Format(PyExc_TypeError
,
1001 " float expected instead of %s instance",
1002 value
->ob_type
->tp_name
);
1005 memcpy(ptr
, &x
, sizeof(long double));
1010 g_get(void *ptr
, Py_ssize_t size
)
1013 memcpy(&val
, ptr
, sizeof(long double));
1014 return PyFloat_FromDouble(val
);
1018 d_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1022 x
= PyFloat_AsDouble(value
);
1023 if (x
== -1 && PyErr_Occurred()) {
1024 PyErr_Format(PyExc_TypeError
,
1025 " float expected instead of %s instance",
1026 value
->ob_type
->tp_name
);
1029 memcpy(ptr
, &x
, sizeof(double));
1034 d_get(void *ptr
, Py_ssize_t size
)
1037 memcpy(&val
, ptr
, sizeof(val
));
1038 return PyFloat_FromDouble(val
);
1042 d_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1046 x
= PyFloat_AsDouble(value
);
1047 if (x
== -1 && PyErr_Occurred()) {
1048 PyErr_Format(PyExc_TypeError
,
1049 " float expected instead of %s instance",
1050 value
->ob_type
->tp_name
);
1053 #ifdef WORDS_BIGENDIAN
1054 if (_PyFloat_Pack8(x
, (unsigned char *)ptr
, 1))
1057 if (_PyFloat_Pack8(x
, (unsigned char *)ptr
, 0))
1064 d_get_sw(void *ptr
, Py_ssize_t size
)
1066 #ifdef WORDS_BIGENDIAN
1067 return PyFloat_FromDouble(_PyFloat_Unpack8(ptr
, 1));
1069 return PyFloat_FromDouble(_PyFloat_Unpack8(ptr
, 0));
1074 f_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1078 x
= (float)PyFloat_AsDouble(value
);
1079 if (x
== -1 && PyErr_Occurred()) {
1080 PyErr_Format(PyExc_TypeError
,
1081 " float expected instead of %s instance",
1082 value
->ob_type
->tp_name
);
1085 memcpy(ptr
, &x
, sizeof(x
));
1090 f_get(void *ptr
, Py_ssize_t size
)
1093 memcpy(&val
, ptr
, sizeof(val
));
1094 return PyFloat_FromDouble(val
);
1098 f_set_sw(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1102 x
= (float)PyFloat_AsDouble(value
);
1103 if (x
== -1 && PyErr_Occurred()) {
1104 PyErr_Format(PyExc_TypeError
,
1105 " float expected instead of %s instance",
1106 value
->ob_type
->tp_name
);
1109 #ifdef WORDS_BIGENDIAN
1110 if (_PyFloat_Pack4(x
, (unsigned char *)ptr
, 1))
1113 if (_PyFloat_Pack4(x
, (unsigned char *)ptr
, 0))
1120 f_get_sw(void *ptr
, Py_ssize_t size
)
1122 #ifdef WORDS_BIGENDIAN
1123 return PyFloat_FromDouble(_PyFloat_Unpack4(ptr
, 1));
1125 return PyFloat_FromDouble(_PyFloat_Unpack4(ptr
, 0));
1130 py_object refcounts:
1132 1. If we have a py_object instance, O_get must Py_INCREF the returned
1133 object, of course. If O_get is called from a function result, no py_object
1134 instance is created - so callproc.c::GetResult has to call Py_DECREF.
1136 2. The memory block in py_object owns a refcount. So, py_object must call
1137 Py_DECREF on destruction. Maybe only when b_needsfree is non-zero.
1140 O_get(void *ptr
, Py_ssize_t size
)
1142 PyObject
*ob
= *(PyObject
**)ptr
;
1144 if (!PyErr_Occurred())
1145 /* Set an error if not yet set */
1146 PyErr_SetString(PyExc_ValueError
,
1147 "PyObject is NULL");
1155 O_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1157 /* Hm, does the memory block need it's own refcount or not? */
1158 *(PyObject
**)ptr
= value
;
1165 c_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1167 if (!PyString_Check(value
) || (1 != PyString_Size(value
))) {
1168 PyErr_Format(PyExc_TypeError
,
1169 "one character string expected");
1172 *(char *)ptr
= PyString_AS_STRING(value
)[0];
1178 c_get(void *ptr
, Py_ssize_t size
)
1180 return PyString_FromStringAndSize((char *)ptr
, 1);
1183 #ifdef CTYPES_UNICODE
1184 /* u - a single wchar_t character */
1186 u_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1190 if (PyString_Check(value
)) {
1191 value
= PyUnicode_FromEncodedObject(value
,
1192 conversion_mode_encoding
,
1193 conversion_mode_errors
);
1196 } else if (!PyUnicode_Check(value
)) {
1197 PyErr_Format(PyExc_TypeError
,
1198 "unicode string expected instead of %s instance",
1199 value
->ob_type
->tp_name
);
1204 len
= PyUnicode_GET_SIZE(value
);
1207 PyErr_SetString(PyExc_TypeError
,
1208 "one character unicode string expected");
1212 *(wchar_t *)ptr
= PyUnicode_AS_UNICODE(value
)[0];
1220 u_get(void *ptr
, Py_ssize_t size
)
1222 return PyUnicode_FromWideChar((wchar_t *)ptr
, 1);
1225 /* U - a unicode string */
1227 U_get(void *ptr
, Py_ssize_t size
)
1233 size
/= sizeof(wchar_t); /* we count character units here, not bytes */
1235 result
= PyUnicode_FromWideChar((wchar_t *)ptr
, size
);
1238 /* We need 'result' to be able to count the characters with wcslen,
1239 since ptr may not be NUL terminated. If the length is smaller (if
1240 it was actually NUL terminated, we construct a new one and throw
1243 /* chop off at the first NUL character, if any. */
1244 p
= PyUnicode_AS_UNICODE(result
);
1245 for (len
= 0; len
< size
; ++len
)
1250 PyObject
*ob
= PyUnicode_FromWideChar((wchar_t *)ptr
, len
);
1258 U_set(void *ptr
, PyObject
*value
, Py_ssize_t length
)
1262 /* It's easier to calculate in characters than in bytes */
1263 length
/= sizeof(wchar_t);
1265 if (PyString_Check(value
)) {
1266 value
= PyUnicode_FromEncodedObject(value
,
1267 conversion_mode_encoding
,
1268 conversion_mode_errors
);
1271 } else if (!PyUnicode_Check(value
)) {
1272 PyErr_Format(PyExc_TypeError
,
1273 "unicode string expected instead of %s instance",
1274 value
->ob_type
->tp_name
);
1278 size
= PyUnicode_GET_SIZE(value
);
1279 if (size
> length
) {
1280 PyErr_Format(PyExc_ValueError
,
1281 #if (PY_VERSION_HEX < 0x02050000)
1282 "string too long (%d, maximum length %d)",
1284 "string too long (%zd, maximum length %zd)",
1289 } else if (size
< length
-1)
1290 /* copy terminating NUL character if there is space */
1292 PyUnicode_AsWideChar((PyUnicodeObject
*)value
, (wchar_t *)ptr
, size
);
1299 s_get(void *ptr
, Py_ssize_t size
)
1304 result
= PyString_FromString((char *)ptr
);
1307 /* chop off at the first NUL character, if any.
1308 * On error, result will be deallocated and set to NULL.
1310 slen
= strlen(PyString_AS_STRING(result
));
1311 size
= min(size
, (Py_ssize_t
)slen
);
1312 if (result
->ob_refcnt
== 1) {
1313 /* shorten the result */
1314 _PyString_Resize(&result
, size
);
1317 /* cannot shorten the result */
1318 return PyString_FromStringAndSize(ptr
, size
);
1322 s_set(void *ptr
, PyObject
*value
, Py_ssize_t length
)
1327 data
= PyString_AsString(value
);
1330 size
= strlen(data
);
1331 if (size
< length
) {
1332 /* This will copy the leading NUL character
1333 * if there is space for it.
1336 } else if (size
> length
) {
1337 PyErr_Format(PyExc_ValueError
,
1338 #if (PY_VERSION_HEX < 0x02050000)
1339 "string too long (%d, maximum length %d)",
1341 "string too long (%zd, maximum length %zd)",
1346 /* Also copy the terminating NUL character if there is space */
1347 memcpy((char *)ptr
, data
, size
);
1352 z_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1354 if (value
== Py_None
) {
1355 *(char **)ptr
= NULL
;
1359 if (PyString_Check(value
)) {
1360 *(char **)ptr
= PyString_AS_STRING(value
);
1363 } else if (PyUnicode_Check(value
)) {
1364 PyObject
*str
= PyUnicode_AsEncodedString(value
,
1365 conversion_mode_encoding
,
1366 conversion_mode_errors
);
1369 *(char **)ptr
= PyString_AS_STRING(str
);
1371 } else if (PyInt_Check(value
) || PyLong_Check(value
)) {
1372 #if SIZEOF_VOID_P == SIZEOF_LONG_LONG
1373 *(char **)ptr
= (char *)PyInt_AsUnsignedLongLongMask(value
);
1375 *(char **)ptr
= (char *)PyInt_AsUnsignedLongMask(value
);
1379 PyErr_Format(PyExc_TypeError
,
1380 "string or integer address expected instead of %s instance",
1381 value
->ob_type
->tp_name
);
1386 z_get(void *ptr
, Py_ssize_t size
)
1388 /* XXX What about invalid pointers ??? */
1389 if (*(void **)ptr
) {
1390 #if defined(MS_WIN32) && !defined(_WIN32_WCE)
1391 if (IsBadStringPtrA(*(char **)ptr
, -1)) {
1392 PyErr_Format(PyExc_ValueError
,
1393 "invalid string pointer %p",
1398 return PyString_FromString(*(char **)ptr
);
1405 #ifdef CTYPES_UNICODE
1407 Z_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1409 if (value
== Py_None
) {
1410 *(wchar_t **)ptr
= NULL
;
1414 if (PyString_Check(value
)) {
1415 value
= PyUnicode_FromEncodedObject(value
,
1416 conversion_mode_encoding
,
1417 conversion_mode_errors
);
1420 } else if (PyInt_Check(value
) || PyLong_Check(value
)) {
1421 #if SIZEOF_VOID_P == SIZEOF_LONG_LONG
1422 *(wchar_t **)ptr
= (wchar_t *)PyInt_AsUnsignedLongLongMask(value
);
1424 *(wchar_t **)ptr
= (wchar_t *)PyInt_AsUnsignedLongMask(value
);
1428 } else if (!PyUnicode_Check(value
)) {
1429 PyErr_Format(PyExc_TypeError
,
1430 "unicode string or integer address expected instead of %s instance",
1431 value
->ob_type
->tp_name
);
1435 #ifdef HAVE_USABLE_WCHAR_T
1436 /* HAVE_USABLE_WCHAR_T means that Py_UNICODE and wchar_t is the same
1437 type. So we can copy directly. Hm, are unicode objects always NUL
1438 terminated in Python, internally?
1440 *(wchar_t **)ptr
= PyUnicode_AS_UNICODE(value
);
1444 /* We must create a wchar_t* buffer from the unicode object,
1445 and keep it alive */
1449 int size
= PyUnicode_GET_SIZE(value
);
1450 size
+= 1; /* terminating NUL */
1451 size
*= sizeof(wchar_t);
1452 buffer
= (wchar_t *)PyMem_Malloc(size
);
1454 return PyErr_NoMemory();
1455 memset(buffer
, 0, size
);
1456 keep
= PyCObject_FromVoidPtr(buffer
, PyMem_Free
);
1461 *(wchar_t **)ptr
= (wchar_t *)buffer
;
1462 if (-1 == PyUnicode_AsWideChar((PyUnicodeObject
*)value
,
1463 buffer
, PyUnicode_GET_SIZE(value
))) {
1475 Z_get(void *ptr
, Py_ssize_t size
)
1478 p
= *(wchar_t **)ptr
;
1480 #if defined(MS_WIN32) && !defined(_WIN32_WCE)
1481 if (IsBadStringPtrW(*(wchar_t **)ptr
, -1)) {
1482 PyErr_Format(PyExc_ValueError
,
1483 "invalid string pointer %p",
1488 return PyUnicode_FromWideChar(p
, wcslen(p
));
1498 BSTR_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1502 /* convert value into a PyUnicodeObject or NULL */
1503 if (Py_None
== value
) {
1505 } else if (PyString_Check(value
)) {
1506 value
= PyUnicode_FromEncodedObject(value
,
1507 conversion_mode_encoding
,
1508 conversion_mode_errors
);
1511 } else if (PyUnicode_Check(value
)) {
1512 Py_INCREF(value
); /* for the descref below */
1514 PyErr_Format(PyExc_TypeError
,
1515 "unicode string expected instead of %s instance",
1516 value
->ob_type
->tp_name
);
1520 /* create a BSTR from value */
1522 Py_ssize_t size
= PyUnicode_GET_SIZE(value
);
1523 if ((unsigned) size
!= size
) {
1524 PyErr_SetString(PyExc_ValueError
, "String too long for BSTR");
1527 bstr
= SysAllocStringLen(PyUnicode_AS_UNICODE(value
),
1533 /* free the previous contents, if any */
1535 SysFreeString(*(BSTR
*)ptr
);
1538 *(BSTR
*)ptr
= bstr
;
1540 /* We don't need to keep any other object */
1546 BSTR_get(void *ptr
, Py_ssize_t size
)
1551 return PyUnicode_FromWideChar(p
, SysStringLen(p
));
1553 /* Hm, it seems NULL pointer and zero length string are the
1554 same in BSTR, see Don Box, p 81
1563 P_set(void *ptr
, PyObject
*value
, Py_ssize_t size
)
1566 if (value
== Py_None
) {
1567 *(void **)ptr
= NULL
;
1571 if (!PyInt_Check(value
) && !PyLong_Check(value
)) {
1572 PyErr_SetString(PyExc_TypeError
,
1573 "cannot be converted to pointer");
1577 #if SIZEOF_VOID_P <= SIZEOF_LONG
1578 v
= (void *)PyInt_AsUnsignedLongMask(value
);
1580 #ifndef HAVE_LONG_LONG
1581 # error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
1582 #elif SIZEOF_LONG_LONG < SIZEOF_VOID_P
1583 # error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
1585 v
= (void *)PyInt_AsUnsignedLongLongMask(value
);
1588 if (PyErr_Occurred())
1596 P_get(void *ptr
, Py_ssize_t size
)
1598 if (*(void **)ptr
== NULL
) {
1602 return PyLong_FromVoidPtr(*(void **)ptr
);
1605 static struct fielddesc formattable
[] = {
1606 { 's', s_set
, s_get
, &ffi_type_pointer
},
1607 { 'b', b_set
, b_get
, &ffi_type_schar
},
1608 { 'B', B_set
, B_get
, &ffi_type_uchar
},
1609 { 'c', c_set
, c_get
, &ffi_type_schar
},
1610 { 'd', d_set
, d_get
, &ffi_type_double
, d_set_sw
, d_get_sw
},
1611 { 'g', g_set
, g_get
, &ffi_type_longdouble
},
1612 { 'f', f_set
, f_get
, &ffi_type_float
, f_set_sw
, f_get_sw
},
1613 { 'h', h_set
, h_get
, &ffi_type_sshort
, h_set_sw
, h_get_sw
},
1614 { 'H', H_set
, H_get
, &ffi_type_ushort
, H_set_sw
, H_get_sw
},
1615 { 'i', i_set
, i_get
, &ffi_type_sint
, i_set_sw
, i_get_sw
},
1616 { 'I', I_set
, I_get
, &ffi_type_uint
, I_set_sw
, I_get_sw
},
1617 /* XXX Hm, sizeof(int) == sizeof(long) doesn't hold on every platform */
1618 /* As soon as we can get rid of the type codes, this is no longer a problem */
1619 #if SIZEOF_LONG == 4
1620 { 'l', l_set
, l_get
, &ffi_type_sint32
, l_set_sw
, l_get_sw
},
1621 { 'L', L_set
, L_get
, &ffi_type_uint32
, L_set_sw
, L_get_sw
},
1622 #elif SIZEOF_LONG == 8
1623 { 'l', l_set
, l_get
, &ffi_type_sint64
, l_set_sw
, l_get_sw
},
1624 { 'L', L_set
, L_get
, &ffi_type_uint64
, L_set_sw
, L_get_sw
},
1628 #ifdef HAVE_LONG_LONG
1629 #if SIZEOF_LONG_LONG == 8
1630 { 'q', q_set
, q_get
, &ffi_type_sint64
, q_set_sw
, q_get_sw
},
1631 { 'Q', Q_set
, Q_get
, &ffi_type_uint64
, Q_set_sw
, Q_get_sw
},
1636 { 'P', P_set
, P_get
, &ffi_type_pointer
},
1637 { 'z', z_set
, z_get
, &ffi_type_pointer
},
1638 #ifdef CTYPES_UNICODE
1639 { 'u', u_set
, u_get
, NULL
}, /* ffi_type set later */
1640 { 'U', U_set
, U_get
, &ffi_type_pointer
},
1641 { 'Z', Z_set
, Z_get
, &ffi_type_pointer
},
1644 { 'X', BSTR_set
, BSTR_get
, &ffi_type_pointer
},
1645 { 'v', vBOOL_set
, vBOOL_get
, &ffi_type_sshort
},
1647 #if SIZEOF__BOOL == 1
1648 { '?', bool_set
, bool_get
, &ffi_type_uchar
}, /* Also fallback for no native _Bool support */
1649 #elif SIZEOF__BOOL == SIZEOF_SHORT
1650 { '?', bool_set
, bool_get
, &ffi_type_ushort
},
1651 #elif SIZEOF__BOOL == SIZEOF_INT
1652 { '?', bool_set
, bool_get
, &ffi_type_uint
, I_set_sw
, I_get_sw
},
1653 #elif SIZEOF__BOOL == SIZEOF_LONG
1654 { '?', bool_set
, bool_get
, &ffi_type_ulong
, L_set_sw
, L_get_sw
},
1655 #elif SIZEOF__BOOL == SIZEOF_LONG_LONG
1656 { '?', bool_set
, bool_get
, &ffi_type_ulong
, Q_set_sw
, Q_get_sw
},
1657 #endif /* SIZEOF__BOOL */
1658 { 'O', O_set
, O_get
, &ffi_type_pointer
},
1659 { 0, NULL
, NULL
, NULL
},
1663 Ideas: Implement VARIANT in this table, using 'V' code.
1664 Use '?' as code for BOOL.
1670 static int initialized
= 0;
1671 struct fielddesc
*table
= formattable
;
1675 #ifdef CTYPES_UNICODE
1676 if (sizeof(wchar_t) == sizeof(short))
1677 getentry("u")->pffi_type
= &ffi_type_sshort
;
1678 else if (sizeof(wchar_t) == sizeof(int))
1679 getentry("u")->pffi_type
= &ffi_type_sint
;
1680 else if (sizeof(wchar_t) == sizeof(long))
1681 getentry("u")->pffi_type
= &ffi_type_slong
;
1685 for (; table
->code
; ++table
) {
1686 if (table
->code
== fmt
[0])
1692 typedef struct { char c
; char x
; } s_char
;
1693 typedef struct { char c
; short x
; } s_short
;
1694 typedef struct { char c
; int x
; } s_int
;
1695 typedef struct { char c
; long x
; } s_long
;
1696 typedef struct { char c
; float x
; } s_float
;
1697 typedef struct { char c
; double x
; } s_double
;
1698 typedef struct { char c
; long double x
; } s_long_double
;
1699 typedef struct { char c
; char *x
; } s_char_p
;
1700 typedef struct { char c
; void *x
; } s_void_p
;
1703 #define CHAR_ALIGN (sizeof(s_char) - sizeof(char))
1704 #define SHORT_ALIGN (sizeof(s_short) - sizeof(short))
1705 #define INT_ALIGN (sizeof(s_int) - sizeof(int))
1706 #define LONG_ALIGN (sizeof(s_long) - sizeof(long))
1708 #define FLOAT_ALIGN (sizeof(s_float) - sizeof(float))
1709 #define DOUBLE_ALIGN (sizeof(s_double) - sizeof(double))
1710 #define LONGDOUBLE_ALIGN (sizeof(s_long_double) - sizeof(long double))
1712 /* #define CHAR_P_ALIGN (sizeof(s_char_p) - sizeof(char*)) */
1713 #define VOID_P_ALIGN (sizeof(s_void_p) - sizeof(void*))
1716 #ifdef HAVE_USABLE_WCHAR_T
1717 typedef struct { char c; wchar_t x; } s_wchar;
1718 typedef struct { char c; wchar_t *x; } s_wchar_p;
1720 #define WCHAR_ALIGN (sizeof(s_wchar) - sizeof(wchar_t))
1721 #define WCHAR_P_ALIGN (sizeof(s_wchar_p) - sizeof(wchar_t*))
1725 #ifdef HAVE_LONG_LONG
1726 typedef struct { char c
; PY_LONG_LONG x
; } s_long_long
;
1727 #define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(PY_LONG_LONG))
1731 typedef struct _ffi_type
1734 unsigned short alignment;
1735 unsigned short type;
1736 struct _ffi_type **elements;
1740 /* align and size are bogus for void, but they must not be zero */
1741 ffi_type ffi_type_void
= { 1, 1, FFI_TYPE_VOID
};
1743 ffi_type ffi_type_uint8
= { 1, 1, FFI_TYPE_UINT8
};
1744 ffi_type ffi_type_sint8
= { 1, 1, FFI_TYPE_SINT8
};
1746 ffi_type ffi_type_uint16
= { 2, 2, FFI_TYPE_UINT16
};
1747 ffi_type ffi_type_sint16
= { 2, 2, FFI_TYPE_SINT16
};
1749 ffi_type ffi_type_uint32
= { 4, 4, FFI_TYPE_UINT32
};
1750 ffi_type ffi_type_sint32
= { 4, 4, FFI_TYPE_SINT32
};
1752 ffi_type ffi_type_uint64
= { 8, LONG_LONG_ALIGN
, FFI_TYPE_UINT64
};
1753 ffi_type ffi_type_sint64
= { 8, LONG_LONG_ALIGN
, FFI_TYPE_SINT64
};
1755 ffi_type ffi_type_float
= { sizeof(float), FLOAT_ALIGN
, FFI_TYPE_FLOAT
};
1756 ffi_type ffi_type_double
= { sizeof(double), DOUBLE_ALIGN
, FFI_TYPE_DOUBLE
};
1758 #ifdef ffi_type_longdouble
1759 #undef ffi_type_longdouble
1761 ffi_type ffi_type_longdouble
= { sizeof(long double), LONGDOUBLE_ALIGN
,
1762 FFI_TYPE_LONGDOUBLE
};
1764 ffi_type ffi_type_pointer
= { sizeof(void *), VOID_P_ALIGN
, FFI_TYPE_POINTER
};
1766 /*---------------- EOF ----------------*/