blob: f6f8e4236b125455b78de3c83b28ec2475c49f65 [file] [log] [blame]
Thomas Hellerd4c93202006-03-08 19:35:11 +00001#include "Python.h"
Thomas Hellerd4c93202006-03-08 19:35:11 +00002
3#include <ffi.h>
4#ifdef MS_WIN32
5#include <windows.h>
6#endif
7#include "ctypes.h"
8
Benjamin Petersonb173f782009-05-05 22:31:58 +00009
10#define CTYPES_CFIELD_CAPSULE_NAME_PYMEM "_ctypes/cfield.c pymem"
11
12static void pymem_destructor(PyObject *ptr)
13{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000014 void *p = PyCapsule_GetPointer(ptr, CTYPES_CFIELD_CAPSULE_NAME_PYMEM);
15 if (p) {
16 PyMem_Free(p);
17 }
Benjamin Petersonb173f782009-05-05 22:31:58 +000018}
19
20
Thomas Hellerd4c93202006-03-08 19:35:11 +000021/******************************************************************/
22/*
Thomas Heller34596a92009-04-24 20:50:00 +000023 PyCField_Type
Thomas Hellerd4c93202006-03-08 19:35:11 +000024*/
25static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +000026PyCField_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Thomas Hellerd4c93202006-03-08 19:35:11 +000027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000028 CFieldObject *obj;
29 obj = (CFieldObject *)type->tp_alloc(type, 0);
30 return (PyObject *)obj;
Thomas Hellerd4c93202006-03-08 19:35:11 +000031}
32
33/*
34 * Expects the size, index and offset for the current field in *psize and
35 * *poffset, stores the total size so far in *psize, the offset for the next
36 * field in *poffset, the alignment requirements for the current field in
37 * *palign, and returns a field desriptor for this field.
38 */
39/*
40 * bitfields extension:
41 * bitsize != 0: this is a bit field.
42 * pbitofs points to the current bit offset, this will be updated.
43 * prev_desc points to the type of the previous bitfield, if any.
44 */
45PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +000046PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 Py_ssize_t *pfield_size, int bitsize, int *pbitofs,
48 Py_ssize_t *psize, Py_ssize_t *poffset, Py_ssize_t *palign,
49 int pack, int big_endian)
Thomas Hellerd4c93202006-03-08 19:35:11 +000050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 CFieldObject *self;
52 PyObject *proto;
Brett Cannonb94767f2011-02-22 20:15:44 +000053 Py_ssize_t size, align;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 SETFUNC setfunc = NULL;
55 GETFUNC getfunc = NULL;
56 StgDictObject *dict;
57 int fieldtype;
Thomas Hellerd4c93202006-03-08 19:35:11 +000058#define NO_BITFIELD 0
59#define NEW_BITFIELD 1
60#define CONT_BITFIELD 2
61#define EXPAND_BITFIELD 3
62
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 self = (CFieldObject *)PyObject_CallObject((PyObject *)&PyCField_Type,
64 NULL);
65 if (self == NULL)
66 return NULL;
67 dict = PyType_stgdict(desc);
68 if (!dict) {
69 PyErr_SetString(PyExc_TypeError,
70 "has no _stginfo_");
71 Py_DECREF(self);
72 return NULL;
73 }
74 if (bitsize /* this is a bitfield request */
75 && *pfield_size /* we have a bitfield open */
Thomas Heller28acc6c2008-09-29 20:03:53 +000076#ifdef MS_WIN32
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 /* MSVC, GCC with -mms-bitfields */
78 && dict->size * 8 == *pfield_size
Thomas Hellerd4c93202006-03-08 19:35:11 +000079#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 /* GCC */
81 && dict->size * 8 <= *pfield_size
Thomas Hellerd4c93202006-03-08 19:35:11 +000082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 && (*pbitofs + bitsize) <= *pfield_size) {
84 /* continue bit field */
85 fieldtype = CONT_BITFIELD;
Thomas Hellerd4c93202006-03-08 19:35:11 +000086#ifndef MS_WIN32
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 } else if (bitsize /* this is a bitfield request */
88 && *pfield_size /* we have a bitfield open */
89 && dict->size * 8 >= *pfield_size
90 && (*pbitofs + bitsize) <= dict->size * 8) {
91 /* expand bit field */
92 fieldtype = EXPAND_BITFIELD;
Thomas Hellerd4c93202006-03-08 19:35:11 +000093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 } else if (bitsize) {
95 /* start new bitfield */
96 fieldtype = NEW_BITFIELD;
97 *pbitofs = 0;
98 *pfield_size = dict->size * 8;
99 } else {
100 /* not a bit field */
101 fieldtype = NO_BITFIELD;
102 *pbitofs = 0;
103 *pfield_size = 0;
104 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 size = dict->size;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 proto = desc;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 /* Field descriptors for 'c_char * n' are be scpecial cased to
110 return a Python string instead of an Array object instance...
111 */
112 if (PyCArrayTypeObject_Check(proto)) {
113 StgDictObject *adict = PyType_stgdict(proto);
114 StgDictObject *idict;
115 if (adict && adict->proto) {
116 idict = PyType_stgdict(adict->proto);
117 if (!idict) {
118 PyErr_SetString(PyExc_TypeError,
119 "has no _stginfo_");
120 Py_DECREF(self);
121 return NULL;
122 }
123 if (idict->getfunc == _ctypes_get_fielddesc("c")->getfunc) {
124 struct fielddesc *fd = _ctypes_get_fielddesc("s");
125 getfunc = fd->getfunc;
126 setfunc = fd->setfunc;
127 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000128#ifdef CTYPES_UNICODE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 if (idict->getfunc == _ctypes_get_fielddesc("u")->getfunc) {
130 struct fielddesc *fd = _ctypes_get_fielddesc("U");
131 getfunc = fd->getfunc;
132 setfunc = fd->setfunc;
133 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 }
136 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 self->setfunc = setfunc;
139 self->getfunc = getfunc;
140 self->index = index;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 Py_INCREF(proto);
143 self->proto = proto;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 switch (fieldtype) {
146 case NEW_BITFIELD:
147 if (big_endian)
148 self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
149 else
150 self->size = (bitsize << 16) + *pbitofs;
151 *pbitofs = bitsize;
152 /* fall through */
153 case NO_BITFIELD:
154 if (pack)
155 align = min(pack, dict->align);
156 else
157 align = dict->align;
158 if (align && *poffset % align) {
159 Py_ssize_t delta = align - (*poffset % align);
160 *psize += delta;
161 *poffset += delta;
162 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 if (bitsize == 0)
165 self->size = size;
166 *psize += size;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 self->offset = *poffset;
169 *poffset += size;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 *palign = align;
172 break;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 case EXPAND_BITFIELD:
175 *poffset += dict->size - *pfield_size/8;
176 *psize += dict->size - *pfield_size/8;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 *pfield_size = dict->size * 8;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 if (big_endian)
181 self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
182 else
183 self->size = (bitsize << 16) + *pbitofs;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 self->offset = *poffset - size; /* poffset is already updated for the NEXT field */
186 *pbitofs += bitsize;
187 break;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 case CONT_BITFIELD:
190 if (big_endian)
191 self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
192 else
193 self->size = (bitsize << 16) + *pbitofs;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 self->offset = *poffset - size; /* poffset is already updated for the NEXT field */
196 *pbitofs += bitsize;
197 break;
198 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 return (PyObject *)self;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000201}
202
203static int
Thomas Heller34596a92009-04-24 20:50:00 +0000204PyCField_set(CFieldObject *self, PyObject *inst, PyObject *value)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 CDataObject *dst;
207 char *ptr;
208 assert(CDataObject_Check(inst));
209 dst = (CDataObject *)inst;
210 ptr = dst->b_ptr + self->offset;
211 if (value == NULL) {
212 PyErr_SetString(PyExc_TypeError,
213 "can't delete attribute");
214 return -1;
215 }
216 return PyCData_set(inst, self->proto, self->setfunc, value,
217 self->index, self->size, ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000218}
219
220static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000221PyCField_get(CFieldObject *self, PyObject *inst, PyTypeObject *type)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 CDataObject *src;
224 if (inst == NULL) {
225 Py_INCREF(self);
226 return (PyObject *)self;
227 }
228 assert(CDataObject_Check(inst));
229 src = (CDataObject *)inst;
230 return PyCData_get(self->proto, self->getfunc, inst,
231 self->index, self->size, src->b_ptr + self->offset);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000232}
233
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000234static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000235PyCField_get_offset(PyObject *self, void *data)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 return PyLong_FromSsize_t(((CFieldObject *)self)->offset);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000238}
239
240static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000241PyCField_get_size(PyObject *self, void *data)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 return PyLong_FromSsize_t(((CFieldObject *)self)->size);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000244}
245
Thomas Heller34596a92009-04-24 20:50:00 +0000246static PyGetSetDef PyCField_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 { "offset", PyCField_get_offset, NULL, "offset in bytes of this field" },
248 { "size", PyCField_get_size, NULL, "size in bytes of this field" },
249 { NULL, NULL, NULL, NULL },
Thomas Hellerd4c93202006-03-08 19:35:11 +0000250};
251
252static int
Thomas Heller34596a92009-04-24 20:50:00 +0000253PyCField_traverse(CFieldObject *self, visitproc visit, void *arg)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000254{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 Py_VISIT(self->proto);
256 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000257}
258
259static int
Thomas Heller34596a92009-04-24 20:50:00 +0000260PyCField_clear(CFieldObject *self)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 Py_CLEAR(self->proto);
263 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000264}
265
266static void
Thomas Heller34596a92009-04-24 20:50:00 +0000267PyCField_dealloc(PyObject *self)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 PyCField_clear((CFieldObject *)self);
270 self->ob_type->tp_free((PyObject *)self);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000271}
272
273static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000274PyCField_repr(CFieldObject *self)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 PyObject *result;
277 Py_ssize_t bits = self->size >> 16;
278 Py_ssize_t size = self->size & 0xFFFF;
279 const char *name;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 name = ((PyTypeObject *)self->proto)->tp_name;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 if (bits)
284 result = PyUnicode_FromFormat(
285 "<Field type=%s, ofs=%zd:%zd, bits=%zd>",
286 name, self->offset, size, bits);
287 else
288 result = PyUnicode_FromFormat(
289 "<Field type=%s, ofs=%zd, size=%zd>",
290 name, self->offset, size);
291 return result;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000292}
293
Thomas Heller34596a92009-04-24 20:50:00 +0000294PyTypeObject PyCField_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 PyVarObject_HEAD_INIT(NULL, 0)
296 "_ctypes.CField", /* tp_name */
297 sizeof(CFieldObject), /* tp_basicsize */
298 0, /* tp_itemsize */
299 PyCField_dealloc, /* tp_dealloc */
300 0, /* tp_print */
301 0, /* tp_getattr */
302 0, /* tp_setattr */
303 0, /* tp_reserved */
304 (reprfunc)PyCField_repr, /* tp_repr */
305 0, /* tp_as_number */
306 0, /* tp_as_sequence */
307 0, /* tp_as_mapping */
308 0, /* tp_hash */
309 0, /* tp_call */
310 0, /* tp_str */
311 0, /* tp_getattro */
312 0, /* tp_setattro */
313 0, /* tp_as_buffer */
314 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
315 "Structure/Union member", /* tp_doc */
316 (traverseproc)PyCField_traverse, /* tp_traverse */
317 (inquiry)PyCField_clear, /* tp_clear */
318 0, /* tp_richcompare */
319 0, /* tp_weaklistoffset */
320 0, /* tp_iter */
321 0, /* tp_iternext */
322 0, /* tp_methods */
323 0, /* tp_members */
324 PyCField_getset, /* tp_getset */
325 0, /* tp_base */
326 0, /* tp_dict */
327 (descrgetfunc)PyCField_get, /* tp_descr_get */
328 (descrsetfunc)PyCField_set, /* tp_descr_set */
329 0, /* tp_dictoffset */
330 0, /* tp_init */
331 0, /* tp_alloc */
332 PyCField_new, /* tp_new */
333 0, /* tp_free */
Thomas Hellerd4c93202006-03-08 19:35:11 +0000334};
335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336
Thomas Hellerd4c93202006-03-08 19:35:11 +0000337/******************************************************************/
338/*
339 Accessor functions
340*/
341
342/* Derived from Modules/structmodule.c:
343 Helper routine to get a Python integer and raise the appropriate error
344 if it isn't one */
345
346static int
347get_long(PyObject *v, long *p)
348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 long x;
Christian Heimes969fe572008-01-25 11:23:10 +0000350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 if (PyFloat_Check(v)) {
352 PyErr_SetString(PyExc_TypeError,
353 "int expected instead of float");
354 return -1;
355 }
356 x = PyLong_AsUnsignedLongMask(v);
357 if (x == -1 && PyErr_Occurred())
358 return -1;
359 *p = x;
360 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000361}
362
363/* Same, but handling unsigned long */
364
365static int
366get_ulong(PyObject *v, unsigned long *p)
367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 unsigned long x;
Christian Heimes969fe572008-01-25 11:23:10 +0000369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 if (PyFloat_Check(v)) {
371 PyErr_SetString(PyExc_TypeError,
372 "int expected instead of float");
373 return -1;
374 }
375 x = PyLong_AsUnsignedLongMask(v);
376 if (x == (unsigned long)-1 && PyErr_Occurred())
377 return -1;
378 *p = x;
379 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000380}
381
382#ifdef HAVE_LONG_LONG
383
384/* Same, but handling native long long. */
385
386static int
387get_longlong(PyObject *v, PY_LONG_LONG *p)
388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 PY_LONG_LONG x;
390 if (PyFloat_Check(v)) {
391 PyErr_SetString(PyExc_TypeError,
392 "int expected instead of float");
393 return -1;
394 }
395 x = PyLong_AsUnsignedLongLongMask(v);
396 if (x == -1 && PyErr_Occurred())
397 return -1;
398 *p = x;
399 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000400}
401
402/* Same, but handling native unsigned long long. */
403
404static int
405get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 unsigned PY_LONG_LONG x;
408 if (PyFloat_Check(v)) {
409 PyErr_SetString(PyExc_TypeError,
410 "int expected instead of float");
411 return -1;
412 }
413 x = PyLong_AsUnsignedLongLongMask(v);
414 if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())
415 return -1;
416 *p = x;
417 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000418}
419
420#endif
421
422/*****************************************************************
423 * Integer fields, with bitfield support
424 */
425
426/* how to decode the size field, for integer get/set functions */
427#define LOW_BIT(x) ((x) & 0xFFFF)
428#define NUM_BITS(x) ((x) >> 16)
429
Meador Inge60c22662012-07-19 00:01:22 -0500430/* Doesn't work if NUM_BITS(size) == 0, but it never happens in SET() call. */
431#define BIT_MASK(type, size) (((((type)1 << (NUM_BITS(size) - 1)) - 1) << 1) + 1)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000432
433/* This macro CHANGES the first parameter IN PLACE. For proper sign handling,
434 we must first shift left, then right.
435*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436#define GET_BITFIELD(v, size) \
437 if (NUM_BITS(size)) { \
438 v <<= (sizeof(v)*8 - LOW_BIT(size) - NUM_BITS(size)); \
439 v >>= (sizeof(v)*8 - NUM_BITS(size)); \
440 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000441
442/* This macro RETURNS the first parameter with the bit field CHANGED. */
Meador Inge60c22662012-07-19 00:01:22 -0500443#define SET(type, x, v, size) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 (NUM_BITS(size) ? \
Meador Inge60c22662012-07-19 00:01:22 -0500445 ( ( (type)x & ~(BIT_MASK(type, size) << LOW_BIT(size)) ) | ( ((type)v & BIT_MASK(type, size)) << LOW_BIT(size) ) ) \
446 : (type)v)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000447
448/* byte swapping macros */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449#define SWAP_2(v) \
450 ( ( (v >> 8) & 0x00FF) | \
451 ( (v << 8) & 0xFF00) )
Thomas Hellerd4c93202006-03-08 19:35:11 +0000452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453#define SWAP_4(v) \
454 ( ( (v & 0x000000FF) << 24 ) | \
455 ( (v & 0x0000FF00) << 8 ) | \
456 ( (v & 0x00FF0000) >> 8 ) | \
457 ( ((v >> 24) & 0xFF)) )
Thomas Hellerd4c93202006-03-08 19:35:11 +0000458
459#ifdef _MSC_VER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460#define SWAP_8(v) \
461 ( ( (v & 0x00000000000000FFL) << 56 ) | \
462 ( (v & 0x000000000000FF00L) << 40 ) | \
463 ( (v & 0x0000000000FF0000L) << 24 ) | \
464 ( (v & 0x00000000FF000000L) << 8 ) | \
465 ( (v & 0x000000FF00000000L) >> 8 ) | \
466 ( (v & 0x0000FF0000000000L) >> 24 ) | \
467 ( (v & 0x00FF000000000000L) >> 40 ) | \
468 ( ((v >> 56) & 0xFF)) )
Thomas Hellerd4c93202006-03-08 19:35:11 +0000469#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470#define SWAP_8(v) \
471 ( ( (v & 0x00000000000000FFLL) << 56 ) | \
472 ( (v & 0x000000000000FF00LL) << 40 ) | \
473 ( (v & 0x0000000000FF0000LL) << 24 ) | \
474 ( (v & 0x00000000FF000000LL) << 8 ) | \
475 ( (v & 0x000000FF00000000LL) >> 8 ) | \
476 ( (v & 0x0000FF0000000000LL) >> 24 ) | \
477 ( (v & 0x00FF000000000000LL) >> 40 ) | \
478 ( ((v >> 56) & 0xFF)) )
Thomas Hellerd4c93202006-03-08 19:35:11 +0000479#endif
480
481#define SWAP_INT SWAP_4
482
483#if SIZEOF_LONG == 4
484# define SWAP_LONG SWAP_4
485#elif SIZEOF_LONG == 8
486# define SWAP_LONG SWAP_8
487#endif
488/*****************************************************************
489 * The setter methods return an object which must be kept alive, to keep the
490 * data valid which has been stored in the memory block. The ctypes object
491 * instance inserts this object into its 'b_objects' list.
492 *
493 * For simple Python types like integers or characters, there is nothing that
494 * has to been kept alive, so Py_None is returned in these cases. But this
495 * makes inspecting the 'b_objects' list, which is accessible from Python for
496 * debugging, less useful.
497 *
498 * So, defining the _CTYPES_DEBUG_KEEP symbol returns the original value
499 * instead of Py_None.
500 */
501
502#ifdef _CTYPES_DEBUG_KEEP
503#define _RET(x) Py_INCREF(x); return x
504#else
505#define _RET(X) Py_INCREF(Py_None); return Py_None
506#endif
507
508/*****************************************************************
509 * integer accessor methods, supporting bit fields
510 */
511
512static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000513b_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 long val;
516 if (get_long(value, &val) < 0)
517 return NULL;
Meador Inge60c22662012-07-19 00:01:22 -0500518 *(signed char *)ptr = SET(signed char, *(signed char *)ptr, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000520}
521
522
523static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000524b_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 signed char val = *(signed char *)ptr;
527 GET_BITFIELD(val, size);
528 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000529}
530
531static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000532B_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 unsigned long val;
535 if (get_ulong(value, &val) < 0)
536 return NULL;
Meador Inge60c22662012-07-19 00:01:22 -0500537 *(unsigned char *)ptr = SET(unsigned char, *(unsigned char*)ptr, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000539}
540
541
542static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000543B_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 unsigned char val = *(unsigned char *)ptr;
546 GET_BITFIELD(val, size);
547 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000548}
549
550static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000551h_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 long val;
554 short x;
555 if (get_long(value, &val) < 0)
556 return NULL;
557 memcpy(&x, ptr, sizeof(x));
Meador Inge60c22662012-07-19 00:01:22 -0500558 x = SET(short, x, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 memcpy(ptr, &x, sizeof(x));
560 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000561}
562
563
564static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000565h_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000566{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 long val;
568 short field;
569 if (get_long(value, &val) < 0)
570 return NULL;
571 memcpy(&field, ptr, sizeof(field));
572 field = SWAP_2(field);
Meador Inge60c22662012-07-19 00:01:22 -0500573 field = SET(short, field, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 field = SWAP_2(field);
575 memcpy(ptr, &field, sizeof(field));
576 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000577}
578
579static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000580h_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 short val;
583 memcpy(&val, ptr, sizeof(val));
584 GET_BITFIELD(val, size);
585 return PyLong_FromLong((long)val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000586}
587
588static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000589h_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 short val;
592 memcpy(&val, ptr, sizeof(val));
593 val = SWAP_2(val);
594 GET_BITFIELD(val, size);
595 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000596}
597
598static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000599H_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 unsigned long val;
602 unsigned short x;
603 if (get_ulong(value, &val) < 0)
604 return NULL;
605 memcpy(&x, ptr, sizeof(x));
Meador Inge60c22662012-07-19 00:01:22 -0500606 x = SET(unsigned short, x, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 memcpy(ptr, &x, sizeof(x));
608 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000609}
610
611static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000612H_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 unsigned long val;
615 unsigned short field;
616 if (get_ulong(value, &val) < 0)
617 return NULL;
618 memcpy(&field, ptr, sizeof(field));
619 field = SWAP_2(field);
Meador Inge60c22662012-07-19 00:01:22 -0500620 field = SET(unsigned short, field, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 field = SWAP_2(field);
622 memcpy(ptr, &field, sizeof(field));
623 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000624}
625
626
627static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000628H_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 unsigned short val;
631 memcpy(&val, ptr, sizeof(val));
632 GET_BITFIELD(val, size);
633 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000634}
635
636static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000637H_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 unsigned short val;
640 memcpy(&val, ptr, sizeof(val));
641 val = SWAP_2(val);
642 GET_BITFIELD(val, size);
643 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000644}
645
646static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000647i_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 long val;
650 int x;
651 if (get_long(value, &val) < 0)
652 return NULL;
653 memcpy(&x, ptr, sizeof(x));
Meador Inge60c22662012-07-19 00:01:22 -0500654 x = SET(int, x, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 memcpy(ptr, &x, sizeof(x));
656 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000657}
658
659static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000660i_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 long val;
663 int field;
664 if (get_long(value, &val) < 0)
665 return NULL;
666 memcpy(&field, ptr, sizeof(field));
667 field = SWAP_INT(field);
Meador Inge60c22662012-07-19 00:01:22 -0500668 field = SET(int, field, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 field = SWAP_INT(field);
670 memcpy(ptr, &field, sizeof(field));
671 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000672}
673
674
675static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000676i_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 int val;
679 memcpy(&val, ptr, sizeof(val));
680 GET_BITFIELD(val, size);
681 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000682}
683
684static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000685i_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 int val;
688 memcpy(&val, ptr, sizeof(val));
689 val = SWAP_INT(val);
690 GET_BITFIELD(val, size);
691 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000692}
693
694#ifdef MS_WIN32
695/* short BOOL - VARIANT_BOOL */
696static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000697vBOOL_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 switch (PyObject_IsTrue(value)) {
700 case -1:
701 return NULL;
702 case 0:
703 *(short int *)ptr = VARIANT_FALSE;
704 _RET(value);
705 default:
706 *(short int *)ptr = VARIANT_TRUE;
707 _RET(value);
708 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000709}
710
711static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000712vBOOL_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 return PyBool_FromLong((long)*(short int *)ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000715}
716#endif
717
Guido van Rossumd8faa362007-04-27 19:54:29 +0000718#ifdef HAVE_C99_BOOL
719#define BOOL_TYPE _Bool
720#else
721#define BOOL_TYPE char
722#undef SIZEOF__BOOL
723#define SIZEOF__BOOL 1
724#endif
725
726static PyObject *
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000727bool_set(void *ptr, PyObject *value, Py_ssize_t size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 switch (PyObject_IsTrue(value)) {
730 case -1:
731 return NULL;
732 case 0:
733 *(BOOL_TYPE *)ptr = 0;
734 _RET(value);
735 default:
736 *(BOOL_TYPE *)ptr = 1;
737 _RET(value);
738 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000739}
740
741static PyObject *
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000742bool_get(void *ptr, Py_ssize_t size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 return PyBool_FromLong((long)*(BOOL_TYPE *)ptr);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000745}
746
Thomas Hellerd4c93202006-03-08 19:35:11 +0000747static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000748I_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 unsigned long val;
751 unsigned int x;
752 if (get_ulong(value, &val) < 0)
753 return NULL;
754 memcpy(&x, ptr, sizeof(x));
Meador Inge60c22662012-07-19 00:01:22 -0500755 x = SET(unsigned int, x, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 memcpy(ptr, &x, sizeof(x));
757 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000758}
759
760static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000761I_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 unsigned long val;
764 unsigned int field;
765 if (get_ulong(value, &val) < 0)
766 return NULL;
767 memcpy(&field, ptr, sizeof(field));
Meador Inge60c22662012-07-19 00:01:22 -0500768 field = SET(unsigned int, field, (unsigned int)val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 field = SWAP_INT(field);
770 memcpy(ptr, &field, sizeof(field));
771 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000772}
773
774
775static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000776I_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 unsigned int val;
779 memcpy(&val, ptr, sizeof(val));
780 GET_BITFIELD(val, size);
781 return PyLong_FromUnsignedLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000782}
783
784static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000785I_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 unsigned int val;
788 memcpy(&val, ptr, sizeof(val));
789 val = SWAP_INT(val);
790 GET_BITFIELD(val, size);
791 return PyLong_FromUnsignedLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000792}
793
794static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000795l_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 long val;
798 long x;
799 if (get_long(value, &val) < 0)
800 return NULL;
801 memcpy(&x, ptr, sizeof(x));
Meador Inge60c22662012-07-19 00:01:22 -0500802 x = SET(long, x, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 memcpy(ptr, &x, sizeof(x));
804 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000805}
806
807static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000808l_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 long val;
811 long field;
812 if (get_long(value, &val) < 0)
813 return NULL;
814 memcpy(&field, ptr, sizeof(field));
815 field = SWAP_LONG(field);
Meador Inge60c22662012-07-19 00:01:22 -0500816 field = SET(long, field, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 field = SWAP_LONG(field);
818 memcpy(ptr, &field, sizeof(field));
819 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000820}
821
822
823static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000824l_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000825{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 long val;
827 memcpy(&val, ptr, sizeof(val));
828 GET_BITFIELD(val, size);
829 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000830}
831
832static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000833l_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 long val;
836 memcpy(&val, ptr, sizeof(val));
837 val = SWAP_LONG(val);
838 GET_BITFIELD(val, size);
839 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000840}
841
842static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000843L_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 unsigned long val;
846 unsigned long x;
847 if (get_ulong(value, &val) < 0)
848 return NULL;
849 memcpy(&x, ptr, sizeof(x));
Meador Inge60c22662012-07-19 00:01:22 -0500850 x = SET(unsigned long, x, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 memcpy(ptr, &x, sizeof(x));
852 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000853}
854
855static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000856L_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 unsigned long val;
859 unsigned long field;
860 if (get_ulong(value, &val) < 0)
861 return NULL;
862 memcpy(&field, ptr, sizeof(field));
863 field = SWAP_LONG(field);
Meador Inge60c22662012-07-19 00:01:22 -0500864 field = SET(unsigned long, field, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 field = SWAP_LONG(field);
866 memcpy(ptr, &field, sizeof(field));
867 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000868}
869
870
871static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000872L_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 unsigned long val;
875 memcpy(&val, ptr, sizeof(val));
876 GET_BITFIELD(val, size);
877 return PyLong_FromUnsignedLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000878}
879
880static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000881L_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 unsigned long val;
884 memcpy(&val, ptr, sizeof(val));
885 val = SWAP_LONG(val);
886 GET_BITFIELD(val, size);
887 return PyLong_FromUnsignedLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000888}
889
890#ifdef HAVE_LONG_LONG
891static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000892q_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000893{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 PY_LONG_LONG val;
895 PY_LONG_LONG x;
896 if (get_longlong(value, &val) < 0)
897 return NULL;
898 memcpy(&x, ptr, sizeof(x));
Meador Inge60c22662012-07-19 00:01:22 -0500899 x = SET(PY_LONG_LONG, x, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 memcpy(ptr, &x, sizeof(x));
901 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000902}
903
904static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000905q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 PY_LONG_LONG val;
908 PY_LONG_LONG field;
909 if (get_longlong(value, &val) < 0)
910 return NULL;
911 memcpy(&field, ptr, sizeof(field));
912 field = SWAP_8(field);
Meador Inge60c22662012-07-19 00:01:22 -0500913 field = SET(PY_LONG_LONG, field, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 field = SWAP_8(field);
915 memcpy(ptr, &field, sizeof(field));
916 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000917}
918
919static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000920q_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 PY_LONG_LONG val;
923 memcpy(&val, ptr, sizeof(val));
924 GET_BITFIELD(val, size);
925 return PyLong_FromLongLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000926}
927
928static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000929q_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 PY_LONG_LONG val;
932 memcpy(&val, ptr, sizeof(val));
933 val = SWAP_8(val);
934 GET_BITFIELD(val, size);
935 return PyLong_FromLongLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000936}
937
938static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000939Q_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 unsigned PY_LONG_LONG val;
942 unsigned PY_LONG_LONG x;
943 if (get_ulonglong(value, &val) < 0)
944 return NULL;
945 memcpy(&x, ptr, sizeof(x));
Meador Inge60c22662012-07-19 00:01:22 -0500946 x = SET(PY_LONG_LONG, x, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 memcpy(ptr, &x, sizeof(x));
948 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000949}
950
951static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000952Q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 unsigned PY_LONG_LONG val;
955 unsigned PY_LONG_LONG field;
956 if (get_ulonglong(value, &val) < 0)
957 return NULL;
958 memcpy(&field, ptr, sizeof(field));
959 field = SWAP_8(field);
Meador Inge60c22662012-07-19 00:01:22 -0500960 field = SET(unsigned PY_LONG_LONG, field, val, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 field = SWAP_8(field);
962 memcpy(ptr, &field, sizeof(field));
963 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000964}
965
966static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000967Q_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 unsigned PY_LONG_LONG val;
970 memcpy(&val, ptr, sizeof(val));
971 GET_BITFIELD(val, size);
972 return PyLong_FromUnsignedLongLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000973}
974
975static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000976Q_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 unsigned PY_LONG_LONG val;
979 memcpy(&val, ptr, sizeof(val));
980 val = SWAP_8(val);
981 GET_BITFIELD(val, size);
982 return PyLong_FromUnsignedLongLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000983}
984#endif
985
986/*****************************************************************
987 * non-integer accessor methods, not supporting bit fields
988 */
989
990
Thomas Wouters89d996e2007-09-08 17:39:28 +0000991static PyObject *
Thomas Hellerff721222008-01-17 18:46:55 +0000992g_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Wouters89d996e2007-09-08 17:39:28 +0000993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 long double x;
Thomas Wouters89d996e2007-09-08 17:39:28 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 x = PyFloat_AsDouble(value);
Meador Inge031e25b2012-05-28 14:21:16 -0500997 if (x == -1 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 memcpy(ptr, &x, sizeof(long double));
1000 _RET(value);
Thomas Wouters89d996e2007-09-08 17:39:28 +00001001}
1002
1003static PyObject *
Thomas Hellerff721222008-01-17 18:46:55 +00001004g_get(void *ptr, Py_ssize_t size)
Thomas Wouters89d996e2007-09-08 17:39:28 +00001005{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 long double val;
1007 memcpy(&val, ptr, sizeof(long double));
1008 return PyFloat_FromDouble(val);
Thomas Wouters89d996e2007-09-08 17:39:28 +00001009}
Thomas Hellerd4c93202006-03-08 19:35:11 +00001010
1011static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001012d_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 double x;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 x = PyFloat_AsDouble(value);
Meador Inge031e25b2012-05-28 14:21:16 -05001017 if (x == -1 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 memcpy(ptr, &x, sizeof(double));
1020 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001021}
1022
1023static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001024d_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 double val;
1027 memcpy(&val, ptr, sizeof(val));
1028 return PyFloat_FromDouble(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001029}
1030
1031static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001032d_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 double x;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 x = PyFloat_AsDouble(value);
Meador Inge031e25b2012-05-28 14:21:16 -05001037 if (x == -1 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001039#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 if (_PyFloat_Pack8(x, (unsigned char *)ptr, 1))
1041 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001042#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 if (_PyFloat_Pack8(x, (unsigned char *)ptr, 0))
1044 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001047}
1048
1049static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001050d_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001051{
1052#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 return PyFloat_FromDouble(_PyFloat_Unpack8(ptr, 1));
Thomas Hellerd4c93202006-03-08 19:35:11 +00001054#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 return PyFloat_FromDouble(_PyFloat_Unpack8(ptr, 0));
Thomas Hellerd4c93202006-03-08 19:35:11 +00001056#endif
1057}
1058
1059static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001060f_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 float x;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 x = (float)PyFloat_AsDouble(value);
Meador Inge031e25b2012-05-28 14:21:16 -05001065 if (x == -1 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 memcpy(ptr, &x, sizeof(x));
1068 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001069}
1070
1071static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001072f_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 float val;
1075 memcpy(&val, ptr, sizeof(val));
1076 return PyFloat_FromDouble(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001077}
1078
1079static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001080f_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 float x;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 x = (float)PyFloat_AsDouble(value);
Meador Inge031e25b2012-05-28 14:21:16 -05001085 if (x == -1 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001087#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 if (_PyFloat_Pack4(x, (unsigned char *)ptr, 1))
1089 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001090#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 if (_PyFloat_Pack4(x, (unsigned char *)ptr, 0))
1092 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001095}
1096
1097static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001098f_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001099{
1100#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 return PyFloat_FromDouble(_PyFloat_Unpack4(ptr, 1));
Thomas Hellerd4c93202006-03-08 19:35:11 +00001102#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 return PyFloat_FromDouble(_PyFloat_Unpack4(ptr, 0));
Thomas Hellerd4c93202006-03-08 19:35:11 +00001104#endif
1105}
1106
1107/*
1108 py_object refcounts:
1109
1110 1. If we have a py_object instance, O_get must Py_INCREF the returned
1111 object, of course. If O_get is called from a function result, no py_object
1112 instance is created - so callproc.c::GetResult has to call Py_DECREF.
1113
1114 2. The memory block in py_object owns a refcount. So, py_object must call
1115 Py_DECREF on destruction. Maybe only when b_needsfree is non-zero.
1116*/
1117static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001118O_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 PyObject *ob = *(PyObject **)ptr;
1121 if (ob == NULL) {
1122 if (!PyErr_Occurred())
1123 /* Set an error if not yet set */
1124 PyErr_SetString(PyExc_ValueError,
1125 "PyObject is NULL");
1126 return NULL;
1127 }
1128 Py_INCREF(ob);
1129 return ob;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001130}
1131
1132static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001133O_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 /* Hm, does the memory block need it's own refcount or not? */
1136 *(PyObject **)ptr = value;
1137 Py_INCREF(value);
1138 return value;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001139}
1140
1141
1142static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001143c_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 if (PyBytes_Check(value) && PyBytes_GET_SIZE(value) == 1) {
1146 *(char *)ptr = PyBytes_AS_STRING(value)[0];
1147 _RET(value);
1148 }
1149 if (PyByteArray_Check(value) && PyByteArray_GET_SIZE(value) == 1) {
1150 *(char *)ptr = PyByteArray_AS_STRING(value)[0];
1151 _RET(value);
1152 }
1153 if (PyLong_Check(value))
1154 {
1155 long longval = PyLong_AS_LONG(value);
1156 if (longval < 0 || longval >= 256)
1157 goto error;
1158 *(char *)ptr = (char)longval;
1159 _RET(value);
1160 }
Thomas Heller19b52542007-07-13 12:52:51 +00001161 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 PyErr_Format(PyExc_TypeError,
1163 "one character string expected");
1164 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001165}
1166
1167
1168static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001169c_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 return PyBytes_FromStringAndSize((char *)ptr, 1);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001172}
1173
1174#ifdef CTYPES_UNICODE
1175/* u - a single wchar_t character */
1176static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001177u_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 Py_ssize_t len;
Victor Stinner749261e2010-10-02 11:25:35 +00001180 wchar_t chars[2];
Victor Stinnercf448832010-07-28 00:15:03 +00001181 if (!PyUnicode_Check(value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 PyErr_Format(PyExc_TypeError,
1183 "unicode string expected instead of %s instance",
1184 value->ob_type->tp_name);
1185 return NULL;
1186 } else
1187 Py_INCREF(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001188
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001189 len = PyUnicode_AsWideChar(value, chars, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 if (len != 1) {
1191 Py_DECREF(value);
1192 PyErr_SetString(PyExc_TypeError,
1193 "one character unicode string expected");
1194 return NULL;
1195 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001196
Victor Stinner749261e2010-10-02 11:25:35 +00001197 *(wchar_t *)ptr = chars[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 Py_DECREF(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001201}
1202
1203
1204static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001205u_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 return PyUnicode_FromWideChar((wchar_t *)ptr, 1);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001208}
1209
1210/* U - a unicode string */
1211static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001212U_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 Py_ssize_t len;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001215 wchar_t *p;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 size /= sizeof(wchar_t); /* we count character units here, not bytes */
Thomas Hellerd4c93202006-03-08 19:35:11 +00001218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 /* We need 'result' to be able to count the characters with wcslen,
1220 since ptr may not be NUL terminated. If the length is smaller (if
1221 it was actually NUL terminated, we construct a new one and throw
1222 away the result.
1223 */
1224 /* chop off at the first NUL character, if any. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001225 p = (wchar_t*)ptr;
1226 for (len = 0; len < size; ++len) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 if (!p[len])
1228 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001230
1231 return PyUnicode_FromWideChar((wchar_t *)ptr, len);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001232}
1233
1234static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001235U_set(void *ptr, PyObject *value, Py_ssize_t length)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001236{
Victor Stinnerea90e0f2011-11-21 02:11:26 +01001237 Py_UNICODE *wstr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 Py_ssize_t size;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 /* It's easier to calculate in characters than in bytes */
1241 length /= sizeof(wchar_t);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001242
Victor Stinnercf448832010-07-28 00:15:03 +00001243 if (!PyUnicode_Check(value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 PyErr_Format(PyExc_TypeError,
1245 "unicode string expected instead of %s instance",
1246 value->ob_type->tp_name);
1247 return NULL;
1248 } else
1249 Py_INCREF(value);
Victor Stinnerea90e0f2011-11-21 02:11:26 +01001250
1251 wstr = PyUnicode_AsUnicodeAndSize(value, &size);
1252 if (wstr == NULL)
1253 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 if (size > length) {
1255 PyErr_Format(PyExc_ValueError,
1256 "string too long (%zd, maximum length %zd)",
1257 size, length);
1258 Py_DECREF(value);
1259 return NULL;
1260 } else if (size < length-1)
1261 /* copy terminating NUL character if there is space */
1262 size += 1;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001263 PyUnicode_AsWideChar(value, (wchar_t *)ptr, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 return value;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001265}
1266
1267#endif
1268
1269static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001270s_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001271{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 Py_ssize_t i;
1273 char *p;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 p = (char *)ptr;
1276 for (i = 0; i < size; ++i) {
1277 if (*p++ == '\0')
1278 break;
1279 }
Thomas Heller19b52542007-07-13 12:52:51 +00001280
Victor Stinnerda0eca42010-06-11 21:50:30 +00001281 return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001282}
1283
1284static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001285s_set(void *ptr, PyObject *value, Py_ssize_t length)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 char *data;
1288 Py_ssize_t size;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001289
Victor Stinnercf448832010-07-28 00:15:03 +00001290 if(PyBytes_Check(value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 Py_INCREF(value);
1292 } else {
1293 PyErr_Format(PyExc_TypeError,
1294 "expected string, %s found",
1295 value->ob_type->tp_name);
1296 return NULL;
1297 }
Thomas Hellere5095e12007-07-13 11:19:35 +00001298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 data = PyBytes_AS_STRING(value);
1300 if (!data)
1301 return NULL;
1302 size = strlen(data); /* XXX Why not Py_SIZE(value)? */
1303 if (size < length) {
1304 /* This will copy the leading NUL character
1305 * if there is space for it.
1306 */
1307 ++size;
1308 } else if (size > length) {
1309 PyErr_Format(PyExc_ValueError,
1310 "string too long (%zd, maximum length %zd)",
1311 size, length);
1312 Py_DECREF(value);
1313 return NULL;
1314 }
1315 /* Also copy the terminating NUL character if there is space */
1316 memcpy((char *)ptr, data, size);
Thomas Hellere5095e12007-07-13 11:19:35 +00001317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 Py_DECREF(value);
1319 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001320}
1321
1322static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001323z_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 if (value == Py_None) {
1326 *(char **)ptr = NULL;
1327 Py_INCREF(value);
1328 return value;
1329 }
1330 if (PyBytes_Check(value)) {
1331 *(char **)ptr = PyBytes_AsString(value);
1332 Py_INCREF(value);
1333 return value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 } else if (PyLong_Check(value)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001335#if SIZEOF_VOID_P == SIZEOF_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 *(char **)ptr = (char *)PyLong_AsUnsignedLongLongMask(value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001337#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 *(char **)ptr = (char *)PyLong_AsUnsignedLongMask(value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 _RET(value);
1341 }
1342 PyErr_Format(PyExc_TypeError,
Ezio Melottiacd5f7b2012-01-18 05:42:39 +02001343 "bytes or integer address expected instead of %s instance",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 value->ob_type->tp_name);
1345 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001346}
1347
1348static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001349z_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 /* XXX What about invalid pointers ??? */
1352 if (*(void **)ptr) {
Thomas Hellerd4c93202006-03-08 19:35:11 +00001353#if defined(MS_WIN32) && !defined(_WIN32_WCE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 if (IsBadStringPtrA(*(char **)ptr, -1)) {
1355 PyErr_Format(PyExc_ValueError,
1356 "invalid string pointer %p",
1357 *(char **)ptr);
1358 return NULL;
1359 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001360#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 return PyBytes_FromStringAndSize(*(char **)ptr,
1362 strlen(*(char **)ptr));
1363 } else {
1364 Py_INCREF(Py_None);
1365 return Py_None;
1366 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001367}
1368
1369#ifdef CTYPES_UNICODE
1370static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001371Z_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001372{
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001373 PyObject *keep;
1374 wchar_t *buffer;
1375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 if (value == Py_None) {
1377 *(wchar_t **)ptr = NULL;
1378 Py_INCREF(value);
1379 return value;
1380 }
1381 if (PyLong_Check(value) || PyLong_Check(value)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382#if SIZEOF_VOID_P == SIZEOF_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongLongMask(value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001384#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongMask(value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 Py_INCREF(Py_None);
1388 return Py_None;
1389 }
Victor Stinnercf448832010-07-28 00:15:03 +00001390 if (!PyUnicode_Check(value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 PyErr_Format(PyExc_TypeError,
1392 "unicode string or integer address expected instead of %s instance",
1393 value->ob_type->tp_name);
1394 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001396
1397 /* We must create a wchar_t* buffer from the unicode object,
1398 and keep it alive */
1399 buffer = PyUnicode_AsWideCharString(value, NULL);
1400 if (!buffer)
1401 return NULL;
1402 keep = PyCapsule_New(buffer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM, pymem_destructor);
1403 if (!keep) {
1404 PyMem_Free(buffer);
1405 return NULL;
1406 }
1407 *(wchar_t **)ptr = buffer;
1408 return keep;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001409}
1410
1411static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001412Z_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 wchar_t *p;
1415 p = *(wchar_t **)ptr;
1416 if (p) {
Guido van Rossum360e4b82007-05-14 22:51:27 +00001417#if defined(MS_WIN32) && !defined(_WIN32_WCE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 if (IsBadStringPtrW(*(wchar_t **)ptr, -1)) {
1419 PyErr_Format(PyExc_ValueError,
1420 "invalid string pointer %p",
1421 *(wchar_t **)ptr);
1422 return NULL;
1423 }
Guido van Rossum360e4b82007-05-14 22:51:27 +00001424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 return PyUnicode_FromWideChar(p, wcslen(p));
1426 } else {
1427 Py_INCREF(Py_None);
1428 return Py_None;
1429 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001430}
1431#endif
1432
1433#ifdef MS_WIN32
1434static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001435BSTR_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 BSTR bstr;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 /* convert value into a PyUnicodeObject or NULL */
1440 if (Py_None == value) {
1441 value = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 } else if (PyUnicode_Check(value)) {
1443 Py_INCREF(value); /* for the descref below */
1444 } else {
1445 PyErr_Format(PyExc_TypeError,
1446 "unicode string expected instead of %s instance",
1447 value->ob_type->tp_name);
1448 return NULL;
1449 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 /* create a BSTR from value */
1452 if (value) {
Victor Stinner33354472011-11-21 02:01:41 +01001453 wchar_t* wvalue;
Victor Stinnerea90e0f2011-11-21 02:11:26 +01001454 Py_ssize_t size;
1455 wvalue = PyUnicode_AsUnicodeAndSize(value, &size);
1456 if (wvalue == NULL)
1457 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 if ((unsigned) size != size) {
1459 PyErr_SetString(PyExc_ValueError, "String too long for BSTR");
1460 return NULL;
1461 }
Victor Stinner33354472011-11-21 02:01:41 +01001462 bstr = SysAllocStringLen(wvalue, (unsigned)size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 Py_DECREF(value);
1464 } else
1465 bstr = NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 /* free the previous contents, if any */
1468 if (*(BSTR *)ptr)
1469 SysFreeString(*(BSTR *)ptr);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 /* and store it */
1472 *(BSTR *)ptr = bstr;
1473
1474 /* We don't need to keep any other object */
1475 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001476}
1477
1478
1479static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001480BSTR_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 BSTR p;
1483 p = *(BSTR *)ptr;
1484 if (p)
1485 return PyUnicode_FromWideChar(p, SysStringLen(p));
1486 else {
1487 /* Hm, it seems NULL pointer and zero length string are the
1488 same in BSTR, see Don Box, p 81
1489 */
1490 Py_INCREF(Py_None);
1491 return Py_None;
1492 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001493}
1494#endif
1495
1496static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001497P_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 void *v;
1500 if (value == Py_None) {
1501 *(void **)ptr = NULL;
1502 _RET(value);
1503 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 if (!PyLong_Check(value) && !PyLong_Check(value)) {
1506 PyErr_SetString(PyExc_TypeError,
1507 "cannot be converted to pointer");
1508 return NULL;
1509 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001510
1511#if SIZEOF_VOID_P <= SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 v = (void *)PyLong_AsUnsignedLongMask(value);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001513#else
1514#ifndef HAVE_LONG_LONG
1515# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
1516#elif SIZEOF_LONG_LONG < SIZEOF_VOID_P
1517# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
1518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 v = (void *)PyLong_AsUnsignedLongLongMask(value);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001520#endif
1521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 if (PyErr_Occurred())
1523 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 *(void **)ptr = v;
1526 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001527}
1528
1529static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001530P_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 if (*(void **)ptr == NULL) {
1533 Py_INCREF(Py_None);
1534 return Py_None;
1535 }
1536 return PyLong_FromVoidPtr(*(void **)ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001537}
1538
1539static struct fielddesc formattable[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 { 's', s_set, s_get, &ffi_type_pointer},
1541 { 'b', b_set, b_get, &ffi_type_schar},
1542 { 'B', B_set, B_get, &ffi_type_uchar},
1543 { 'c', c_set, c_get, &ffi_type_schar},
1544 { 'd', d_set, d_get, &ffi_type_double, d_set_sw, d_get_sw},
1545 { 'g', g_set, g_get, &ffi_type_longdouble},
1546 { 'f', f_set, f_get, &ffi_type_float, f_set_sw, f_get_sw},
1547 { 'h', h_set, h_get, &ffi_type_sshort, h_set_sw, h_get_sw},
1548 { 'H', H_set, H_get, &ffi_type_ushort, H_set_sw, H_get_sw},
1549 { 'i', i_set, i_get, &ffi_type_sint, i_set_sw, i_get_sw},
1550 { 'I', I_set, I_get, &ffi_type_uint, I_set_sw, I_get_sw},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001551/* XXX Hm, sizeof(int) == sizeof(long) doesn't hold on every platform */
1552/* As soon as we can get rid of the type codes, this is no longer a problem */
1553#if SIZEOF_LONG == 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 { 'l', l_set, l_get, &ffi_type_sint32, l_set_sw, l_get_sw},
1555 { 'L', L_set, L_get, &ffi_type_uint32, L_set_sw, L_get_sw},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001556#elif SIZEOF_LONG == 8
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 { 'l', l_set, l_get, &ffi_type_sint64, l_set_sw, l_get_sw},
1558 { 'L', L_set, L_get, &ffi_type_uint64, L_set_sw, L_get_sw},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001559#else
1560# error
1561#endif
1562#ifdef HAVE_LONG_LONG
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001563#if SIZEOF_LONG_LONG == 8
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 { 'q', q_set, q_get, &ffi_type_sint64, q_set_sw, q_get_sw},
1565 { 'Q', Q_set, Q_get, &ffi_type_uint64, Q_set_sw, Q_get_sw},
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001566#else
1567# error
1568#endif
Thomas Hellerd4c93202006-03-08 19:35:11 +00001569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 { 'P', P_set, P_get, &ffi_type_pointer},
1571 { 'z', z_set, z_get, &ffi_type_pointer},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001572#ifdef CTYPES_UNICODE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 { 'u', u_set, u_get, NULL}, /* ffi_type set later */
1574 { 'U', U_set, U_get, &ffi_type_pointer},
1575 { 'Z', Z_set, Z_get, &ffi_type_pointer},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001576#endif
1577#ifdef MS_WIN32
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 { 'X', BSTR_set, BSTR_get, &ffi_type_pointer},
1579 { 'v', vBOOL_set, vBOOL_get, &ffi_type_sshort},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001580#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00001581#if SIZEOF__BOOL == 1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 { '?', bool_set, bool_get, &ffi_type_uchar}, /* Also fallback for no native _Bool support */
Guido van Rossumd8faa362007-04-27 19:54:29 +00001583#elif SIZEOF__BOOL == SIZEOF_SHORT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 { '?', bool_set, bool_get, &ffi_type_ushort},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001585#elif SIZEOF__BOOL == SIZEOF_INT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 { '?', bool_set, bool_get, &ffi_type_uint, I_set_sw, I_get_sw},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001587#elif SIZEOF__BOOL == SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 { '?', bool_set, bool_get, &ffi_type_ulong, L_set_sw, L_get_sw},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001589#elif SIZEOF__BOOL == SIZEOF_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 { '?', bool_set, bool_get, &ffi_type_ulong, Q_set_sw, Q_get_sw},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001591#endif /* SIZEOF__BOOL */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 { 'O', O_set, O_get, &ffi_type_pointer},
1593 { 0, NULL, NULL, NULL},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001594};
1595
1596/*
1597 Ideas: Implement VARIANT in this table, using 'V' code.
1598 Use '?' as code for BOOL.
1599*/
1600
1601struct fielddesc *
Thomas Heller34596a92009-04-24 20:50:00 +00001602_ctypes_get_fielddesc(const char *fmt)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 static int initialized = 0;
1605 struct fielddesc *table = formattable;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 if (!initialized) {
1608 initialized = 1;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001609#ifdef CTYPES_UNICODE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 if (sizeof(wchar_t) == sizeof(short))
1611 _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sshort;
1612 else if (sizeof(wchar_t) == sizeof(int))
1613 _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sint;
1614 else if (sizeof(wchar_t) == sizeof(long))
1615 _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_slong;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 for (; table->code; ++table) {
1620 if (table->code == fmt[0])
1621 return table;
1622 }
1623 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001624}
1625
1626typedef struct { char c; char x; } s_char;
1627typedef struct { char c; short x; } s_short;
1628typedef struct { char c; int x; } s_int;
1629typedef struct { char c; long x; } s_long;
1630typedef struct { char c; float x; } s_float;
1631typedef struct { char c; double x; } s_double;
Thomas Wouters89d996e2007-09-08 17:39:28 +00001632typedef struct { char c; long double x; } s_long_double;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001633typedef struct { char c; char *x; } s_char_p;
1634typedef struct { char c; void *x; } s_void_p;
1635
1636/*
1637#define CHAR_ALIGN (sizeof(s_char) - sizeof(char))
1638#define SHORT_ALIGN (sizeof(s_short) - sizeof(short))
1639#define INT_ALIGN (sizeof(s_int) - sizeof(int))
1640#define LONG_ALIGN (sizeof(s_long) - sizeof(long))
1641*/
1642#define FLOAT_ALIGN (sizeof(s_float) - sizeof(float))
1643#define DOUBLE_ALIGN (sizeof(s_double) - sizeof(double))
Thomas Wouters89d996e2007-09-08 17:39:28 +00001644#define LONGDOUBLE_ALIGN (sizeof(s_long_double) - sizeof(long double))
1645
Thomas Hellerd4c93202006-03-08 19:35:11 +00001646/* #define CHAR_P_ALIGN (sizeof(s_char_p) - sizeof(char*)) */
1647#define VOID_P_ALIGN (sizeof(s_void_p) - sizeof(void*))
1648
1649/*
1650#ifdef HAVE_USABLE_WCHAR_T
1651typedef struct { char c; wchar_t x; } s_wchar;
1652typedef struct { char c; wchar_t *x; } s_wchar_p;
1653
1654#define WCHAR_ALIGN (sizeof(s_wchar) - sizeof(wchar_t))
1655#define WCHAR_P_ALIGN (sizeof(s_wchar_p) - sizeof(wchar_t*))
1656#endif
1657*/
1658
1659#ifdef HAVE_LONG_LONG
1660typedef struct { char c; PY_LONG_LONG x; } s_long_long;
1661#define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(PY_LONG_LONG))
1662#endif
1663
1664/* from ffi.h:
1665typedef struct _ffi_type
1666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 size_t size;
1668 unsigned short alignment;
1669 unsigned short type;
1670 struct _ffi_type **elements;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001671} ffi_type;
1672*/
1673
1674/* align and size are bogus for void, but they must not be zero */
1675ffi_type ffi_type_void = { 1, 1, FFI_TYPE_VOID };
1676
1677ffi_type ffi_type_uint8 = { 1, 1, FFI_TYPE_UINT8 };
1678ffi_type ffi_type_sint8 = { 1, 1, FFI_TYPE_SINT8 };
1679
1680ffi_type ffi_type_uint16 = { 2, 2, FFI_TYPE_UINT16 };
1681ffi_type ffi_type_sint16 = { 2, 2, FFI_TYPE_SINT16 };
1682
1683ffi_type ffi_type_uint32 = { 4, 4, FFI_TYPE_UINT32 };
1684ffi_type ffi_type_sint32 = { 4, 4, FFI_TYPE_SINT32 };
1685
1686ffi_type ffi_type_uint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_UINT64 };
1687ffi_type ffi_type_sint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_SINT64 };
1688
1689ffi_type ffi_type_float = { sizeof(float), FLOAT_ALIGN, FFI_TYPE_FLOAT };
1690ffi_type ffi_type_double = { sizeof(double), DOUBLE_ALIGN, FFI_TYPE_DOUBLE };
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001691
1692#ifdef ffi_type_longdouble
1693#undef ffi_type_longdouble
1694#endif
Georg Brandlfcaf9102008-07-16 02:17:56 +00001695 /* This is already defined on OSX */
Thomas Wouters89d996e2007-09-08 17:39:28 +00001696ffi_type ffi_type_longdouble = { sizeof(long double), LONGDOUBLE_ALIGN,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 FFI_TYPE_LONGDOUBLE };
Thomas Hellerd4c93202006-03-08 19:35:11 +00001698
Thomas Hellerd4c93202006-03-08 19:35:11 +00001699ffi_type ffi_type_pointer = { sizeof(void *), VOID_P_ALIGN, FFI_TYPE_POINTER };
1700
1701/*---------------- EOF ----------------*/