blob: 0aa9f0b5bc81871768722a3537315c677d3975a1 [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
Georg Brandl2a531392010-10-16 20:33:11 +000012#if Py_UNICODE_SIZE != SIZEOF_WCHAR_T
Benjamin Petersonb173f782009-05-05 22:31:58 +000013static void pymem_destructor(PyObject *ptr)
14{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000015 void *p = PyCapsule_GetPointer(ptr, CTYPES_CFIELD_CAPSULE_NAME_PYMEM);
16 if (p) {
17 PyMem_Free(p);
18 }
Benjamin Petersonb173f782009-05-05 22:31:58 +000019}
Georg Brandl2a531392010-10-16 20:33:11 +000020#endif
Benjamin Petersonb173f782009-05-05 22:31:58 +000021
22
Thomas Hellerd4c93202006-03-08 19:35:11 +000023/******************************************************************/
24/*
Thomas Heller34596a92009-04-24 20:50:00 +000025 PyCField_Type
Thomas Hellerd4c93202006-03-08 19:35:11 +000026*/
27static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +000028PyCField_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Thomas Hellerd4c93202006-03-08 19:35:11 +000029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 CFieldObject *obj;
31 obj = (CFieldObject *)type->tp_alloc(type, 0);
32 return (PyObject *)obj;
Thomas Hellerd4c93202006-03-08 19:35:11 +000033}
34
35/*
36 * Expects the size, index and offset for the current field in *psize and
37 * *poffset, stores the total size so far in *psize, the offset for the next
38 * field in *poffset, the alignment requirements for the current field in
39 * *palign, and returns a field desriptor for this field.
40 */
41/*
42 * bitfields extension:
43 * bitsize != 0: this is a bit field.
44 * pbitofs points to the current bit offset, this will be updated.
45 * prev_desc points to the type of the previous bitfield, if any.
46 */
47PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +000048PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 Py_ssize_t *pfield_size, int bitsize, int *pbitofs,
50 Py_ssize_t *psize, Py_ssize_t *poffset, Py_ssize_t *palign,
51 int pack, int big_endian)
Thomas Hellerd4c93202006-03-08 19:35:11 +000052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 CFieldObject *self;
54 PyObject *proto;
Brett Cannonb94767f2011-02-22 20:15:44 +000055 Py_ssize_t size, align;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 SETFUNC setfunc = NULL;
57 GETFUNC getfunc = NULL;
58 StgDictObject *dict;
59 int fieldtype;
Thomas Hellerd4c93202006-03-08 19:35:11 +000060#define NO_BITFIELD 0
61#define NEW_BITFIELD 1
62#define CONT_BITFIELD 2
63#define EXPAND_BITFIELD 3
64
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 self = (CFieldObject *)PyObject_CallObject((PyObject *)&PyCField_Type,
66 NULL);
67 if (self == NULL)
68 return NULL;
69 dict = PyType_stgdict(desc);
70 if (!dict) {
71 PyErr_SetString(PyExc_TypeError,
72 "has no _stginfo_");
73 Py_DECREF(self);
74 return NULL;
75 }
76 if (bitsize /* this is a bitfield request */
77 && *pfield_size /* we have a bitfield open */
Thomas Heller28acc6c2008-09-29 20:03:53 +000078#ifdef MS_WIN32
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 /* MSVC, GCC with -mms-bitfields */
80 && dict->size * 8 == *pfield_size
Thomas Hellerd4c93202006-03-08 19:35:11 +000081#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 /* GCC */
83 && dict->size * 8 <= *pfield_size
Thomas Hellerd4c93202006-03-08 19:35:11 +000084#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085 && (*pbitofs + bitsize) <= *pfield_size) {
86 /* continue bit field */
87 fieldtype = CONT_BITFIELD;
Thomas Hellerd4c93202006-03-08 19:35:11 +000088#ifndef MS_WIN32
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 } else if (bitsize /* this is a bitfield request */
90 && *pfield_size /* we have a bitfield open */
91 && dict->size * 8 >= *pfield_size
92 && (*pbitofs + bitsize) <= dict->size * 8) {
93 /* expand bit field */
94 fieldtype = EXPAND_BITFIELD;
Thomas Hellerd4c93202006-03-08 19:35:11 +000095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 } else if (bitsize) {
97 /* start new bitfield */
98 fieldtype = NEW_BITFIELD;
99 *pbitofs = 0;
100 *pfield_size = dict->size * 8;
101 } else {
102 /* not a bit field */
103 fieldtype = NO_BITFIELD;
104 *pbitofs = 0;
105 *pfield_size = 0;
106 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 size = dict->size;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 proto = desc;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 /* Field descriptors for 'c_char * n' are be scpecial cased to
112 return a Python string instead of an Array object instance...
113 */
114 if (PyCArrayTypeObject_Check(proto)) {
115 StgDictObject *adict = PyType_stgdict(proto);
116 StgDictObject *idict;
117 if (adict && adict->proto) {
118 idict = PyType_stgdict(adict->proto);
119 if (!idict) {
120 PyErr_SetString(PyExc_TypeError,
121 "has no _stginfo_");
122 Py_DECREF(self);
123 return NULL;
124 }
125 if (idict->getfunc == _ctypes_get_fielddesc("c")->getfunc) {
126 struct fielddesc *fd = _ctypes_get_fielddesc("s");
127 getfunc = fd->getfunc;
128 setfunc = fd->setfunc;
129 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000130#ifdef CTYPES_UNICODE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 if (idict->getfunc == _ctypes_get_fielddesc("u")->getfunc) {
132 struct fielddesc *fd = _ctypes_get_fielddesc("U");
133 getfunc = fd->getfunc;
134 setfunc = fd->setfunc;
135 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000136#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 }
138 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 self->setfunc = setfunc;
141 self->getfunc = getfunc;
142 self->index = index;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 Py_INCREF(proto);
145 self->proto = proto;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 switch (fieldtype) {
148 case NEW_BITFIELD:
149 if (big_endian)
150 self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
151 else
152 self->size = (bitsize << 16) + *pbitofs;
153 *pbitofs = bitsize;
154 /* fall through */
155 case NO_BITFIELD:
156 if (pack)
157 align = min(pack, dict->align);
158 else
159 align = dict->align;
160 if (align && *poffset % align) {
161 Py_ssize_t delta = align - (*poffset % align);
162 *psize += delta;
163 *poffset += delta;
164 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 if (bitsize == 0)
167 self->size = size;
168 *psize += size;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 self->offset = *poffset;
171 *poffset += size;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 *palign = align;
174 break;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 case EXPAND_BITFIELD:
177 *poffset += dict->size - *pfield_size/8;
178 *psize += dict->size - *pfield_size/8;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 *pfield_size = dict->size * 8;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 if (big_endian)
183 self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
184 else
185 self->size = (bitsize << 16) + *pbitofs;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 self->offset = *poffset - size; /* poffset is already updated for the NEXT field */
188 *pbitofs += bitsize;
189 break;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 case CONT_BITFIELD:
192 if (big_endian)
193 self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
194 else
195 self->size = (bitsize << 16) + *pbitofs;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 self->offset = *poffset - size; /* poffset is already updated for the NEXT field */
198 *pbitofs += bitsize;
199 break;
200 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 return (PyObject *)self;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000203}
204
205static int
Thomas Heller34596a92009-04-24 20:50:00 +0000206PyCField_set(CFieldObject *self, PyObject *inst, PyObject *value)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 CDataObject *dst;
209 char *ptr;
210 assert(CDataObject_Check(inst));
211 dst = (CDataObject *)inst;
212 ptr = dst->b_ptr + self->offset;
213 if (value == NULL) {
214 PyErr_SetString(PyExc_TypeError,
215 "can't delete attribute");
216 return -1;
217 }
218 return PyCData_set(inst, self->proto, self->setfunc, value,
219 self->index, self->size, ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000220}
221
222static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000223PyCField_get(CFieldObject *self, PyObject *inst, PyTypeObject *type)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 CDataObject *src;
226 if (inst == NULL) {
227 Py_INCREF(self);
228 return (PyObject *)self;
229 }
230 assert(CDataObject_Check(inst));
231 src = (CDataObject *)inst;
232 return PyCData_get(self->proto, self->getfunc, inst,
233 self->index, self->size, src->b_ptr + self->offset);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000234}
235
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000236static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000237PyCField_get_offset(PyObject *self, void *data)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 return PyLong_FromSsize_t(((CFieldObject *)self)->offset);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000240}
241
242static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000243PyCField_get_size(PyObject *self, void *data)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 return PyLong_FromSsize_t(((CFieldObject *)self)->size);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000246}
247
Thomas Heller34596a92009-04-24 20:50:00 +0000248static PyGetSetDef PyCField_getset[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 { "offset", PyCField_get_offset, NULL, "offset in bytes of this field" },
250 { "size", PyCField_get_size, NULL, "size in bytes of this field" },
251 { NULL, NULL, NULL, NULL },
Thomas Hellerd4c93202006-03-08 19:35:11 +0000252};
253
254static int
Thomas Heller34596a92009-04-24 20:50:00 +0000255PyCField_traverse(CFieldObject *self, visitproc visit, void *arg)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 Py_VISIT(self->proto);
258 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000259}
260
261static int
Thomas Heller34596a92009-04-24 20:50:00 +0000262PyCField_clear(CFieldObject *self)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 Py_CLEAR(self->proto);
265 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000266}
267
268static void
Thomas Heller34596a92009-04-24 20:50:00 +0000269PyCField_dealloc(PyObject *self)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 PyCField_clear((CFieldObject *)self);
272 self->ob_type->tp_free((PyObject *)self);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000273}
274
275static PyObject *
Thomas Heller34596a92009-04-24 20:50:00 +0000276PyCField_repr(CFieldObject *self)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 PyObject *result;
279 Py_ssize_t bits = self->size >> 16;
280 Py_ssize_t size = self->size & 0xFFFF;
281 const char *name;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 name = ((PyTypeObject *)self->proto)->tp_name;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 if (bits)
286 result = PyUnicode_FromFormat(
287 "<Field type=%s, ofs=%zd:%zd, bits=%zd>",
288 name, self->offset, size, bits);
289 else
290 result = PyUnicode_FromFormat(
291 "<Field type=%s, ofs=%zd, size=%zd>",
292 name, self->offset, size);
293 return result;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000294}
295
Thomas Heller34596a92009-04-24 20:50:00 +0000296PyTypeObject PyCField_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 PyVarObject_HEAD_INIT(NULL, 0)
298 "_ctypes.CField", /* tp_name */
299 sizeof(CFieldObject), /* tp_basicsize */
300 0, /* tp_itemsize */
301 PyCField_dealloc, /* tp_dealloc */
302 0, /* tp_print */
303 0, /* tp_getattr */
304 0, /* tp_setattr */
305 0, /* tp_reserved */
306 (reprfunc)PyCField_repr, /* tp_repr */
307 0, /* tp_as_number */
308 0, /* tp_as_sequence */
309 0, /* tp_as_mapping */
310 0, /* tp_hash */
311 0, /* tp_call */
312 0, /* tp_str */
313 0, /* tp_getattro */
314 0, /* tp_setattro */
315 0, /* tp_as_buffer */
316 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
317 "Structure/Union member", /* tp_doc */
318 (traverseproc)PyCField_traverse, /* tp_traverse */
319 (inquiry)PyCField_clear, /* tp_clear */
320 0, /* tp_richcompare */
321 0, /* tp_weaklistoffset */
322 0, /* tp_iter */
323 0, /* tp_iternext */
324 0, /* tp_methods */
325 0, /* tp_members */
326 PyCField_getset, /* tp_getset */
327 0, /* tp_base */
328 0, /* tp_dict */
329 (descrgetfunc)PyCField_get, /* tp_descr_get */
330 (descrsetfunc)PyCField_set, /* tp_descr_set */
331 0, /* tp_dictoffset */
332 0, /* tp_init */
333 0, /* tp_alloc */
334 PyCField_new, /* tp_new */
335 0, /* tp_free */
Thomas Hellerd4c93202006-03-08 19:35:11 +0000336};
337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338
Thomas Hellerd4c93202006-03-08 19:35:11 +0000339/******************************************************************/
340/*
341 Accessor functions
342*/
343
344/* Derived from Modules/structmodule.c:
345 Helper routine to get a Python integer and raise the appropriate error
346 if it isn't one */
347
348static int
349get_long(PyObject *v, long *p)
350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 long x;
Christian Heimes969fe572008-01-25 11:23:10 +0000352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 if (PyFloat_Check(v)) {
354 PyErr_SetString(PyExc_TypeError,
355 "int expected instead of float");
356 return -1;
357 }
358 x = PyLong_AsUnsignedLongMask(v);
359 if (x == -1 && PyErr_Occurred())
360 return -1;
361 *p = x;
362 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000363}
364
365/* Same, but handling unsigned long */
366
367static int
368get_ulong(PyObject *v, unsigned long *p)
369{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 unsigned long x;
Christian Heimes969fe572008-01-25 11:23:10 +0000371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 if (PyFloat_Check(v)) {
373 PyErr_SetString(PyExc_TypeError,
374 "int expected instead of float");
375 return -1;
376 }
377 x = PyLong_AsUnsignedLongMask(v);
378 if (x == (unsigned long)-1 && PyErr_Occurred())
379 return -1;
380 *p = x;
381 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000382}
383
384#ifdef HAVE_LONG_LONG
385
386/* Same, but handling native long long. */
387
388static int
389get_longlong(PyObject *v, PY_LONG_LONG *p)
390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 PY_LONG_LONG x;
392 if (PyFloat_Check(v)) {
393 PyErr_SetString(PyExc_TypeError,
394 "int expected instead of float");
395 return -1;
396 }
397 x = PyLong_AsUnsignedLongLongMask(v);
398 if (x == -1 && PyErr_Occurred())
399 return -1;
400 *p = x;
401 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000402}
403
404/* Same, but handling native unsigned long long. */
405
406static int
407get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 unsigned PY_LONG_LONG x;
410 if (PyFloat_Check(v)) {
411 PyErr_SetString(PyExc_TypeError,
412 "int expected instead of float");
413 return -1;
414 }
415 x = PyLong_AsUnsignedLongLongMask(v);
416 if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())
417 return -1;
418 *p = x;
419 return 0;
Thomas Hellerd4c93202006-03-08 19:35:11 +0000420}
421
422#endif
423
424/*****************************************************************
425 * Integer fields, with bitfield support
426 */
427
428/* how to decode the size field, for integer get/set functions */
429#define LOW_BIT(x) ((x) & 0xFFFF)
430#define NUM_BITS(x) ((x) >> 16)
431
432/* This seems nore a compiler issue than a Windows/non-Windows one */
433#ifdef MS_WIN32
434# define BIT_MASK(size) ((1 << NUM_BITS(size))-1)
435#else
436# define BIT_MASK(size) ((1LL << NUM_BITS(size))-1)
437#endif
438
439/* This macro CHANGES the first parameter IN PLACE. For proper sign handling,
440 we must first shift left, then right.
441*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442#define GET_BITFIELD(v, size) \
443 if (NUM_BITS(size)) { \
444 v <<= (sizeof(v)*8 - LOW_BIT(size) - NUM_BITS(size)); \
445 v >>= (sizeof(v)*8 - NUM_BITS(size)); \
446 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000447
448/* This macro RETURNS the first parameter with the bit field CHANGED. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449#define SET(x, v, size) \
450 (NUM_BITS(size) ? \
451 ( ( x & ~(BIT_MASK(size) << LOW_BIT(size)) ) | ( (v & BIT_MASK(size)) << LOW_BIT(size) ) ) \
452 : v)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000453
454/* byte swapping macros */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455#define SWAP_2(v) \
456 ( ( (v >> 8) & 0x00FF) | \
457 ( (v << 8) & 0xFF00) )
Thomas Hellerd4c93202006-03-08 19:35:11 +0000458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459#define SWAP_4(v) \
460 ( ( (v & 0x000000FF) << 24 ) | \
461 ( (v & 0x0000FF00) << 8 ) | \
462 ( (v & 0x00FF0000) >> 8 ) | \
463 ( ((v >> 24) & 0xFF)) )
Thomas Hellerd4c93202006-03-08 19:35:11 +0000464
465#ifdef _MSC_VER
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466#define SWAP_8(v) \
467 ( ( (v & 0x00000000000000FFL) << 56 ) | \
468 ( (v & 0x000000000000FF00L) << 40 ) | \
469 ( (v & 0x0000000000FF0000L) << 24 ) | \
470 ( (v & 0x00000000FF000000L) << 8 ) | \
471 ( (v & 0x000000FF00000000L) >> 8 ) | \
472 ( (v & 0x0000FF0000000000L) >> 24 ) | \
473 ( (v & 0x00FF000000000000L) >> 40 ) | \
474 ( ((v >> 56) & 0xFF)) )
Thomas Hellerd4c93202006-03-08 19:35:11 +0000475#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476#define SWAP_8(v) \
477 ( ( (v & 0x00000000000000FFLL) << 56 ) | \
478 ( (v & 0x000000000000FF00LL) << 40 ) | \
479 ( (v & 0x0000000000FF0000LL) << 24 ) | \
480 ( (v & 0x00000000FF000000LL) << 8 ) | \
481 ( (v & 0x000000FF00000000LL) >> 8 ) | \
482 ( (v & 0x0000FF0000000000LL) >> 24 ) | \
483 ( (v & 0x00FF000000000000LL) >> 40 ) | \
484 ( ((v >> 56) & 0xFF)) )
Thomas Hellerd4c93202006-03-08 19:35:11 +0000485#endif
486
487#define SWAP_INT SWAP_4
488
489#if SIZEOF_LONG == 4
490# define SWAP_LONG SWAP_4
491#elif SIZEOF_LONG == 8
492# define SWAP_LONG SWAP_8
493#endif
494/*****************************************************************
495 * The setter methods return an object which must be kept alive, to keep the
496 * data valid which has been stored in the memory block. The ctypes object
497 * instance inserts this object into its 'b_objects' list.
498 *
499 * For simple Python types like integers or characters, there is nothing that
500 * has to been kept alive, so Py_None is returned in these cases. But this
501 * makes inspecting the 'b_objects' list, which is accessible from Python for
502 * debugging, less useful.
503 *
504 * So, defining the _CTYPES_DEBUG_KEEP symbol returns the original value
505 * instead of Py_None.
506 */
507
508#ifdef _CTYPES_DEBUG_KEEP
509#define _RET(x) Py_INCREF(x); return x
510#else
511#define _RET(X) Py_INCREF(Py_None); return Py_None
512#endif
513
514/*****************************************************************
515 * integer accessor methods, supporting bit fields
516 */
517
518static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000519b_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 long val;
522 if (get_long(value, &val) < 0)
523 return NULL;
524 *(signed char *)ptr = (signed char)SET(*(signed char *)ptr, (signed char)val, size);
525 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000526}
527
528
529static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000530b_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 signed char val = *(signed char *)ptr;
533 GET_BITFIELD(val, size);
534 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000535}
536
537static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000538B_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 unsigned long val;
541 if (get_ulong(value, &val) < 0)
542 return NULL;
543 *(unsigned char *)ptr = (unsigned char)SET(*(unsigned char*)ptr,
544 (unsigned short)val, size);
545 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000546}
547
548
549static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000550B_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 unsigned char val = *(unsigned char *)ptr;
553 GET_BITFIELD(val, size);
554 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000555}
556
557static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000558h_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 long val;
561 short x;
562 if (get_long(value, &val) < 0)
563 return NULL;
564 memcpy(&x, ptr, sizeof(x));
565 x = SET(x, (short)val, size);
566 memcpy(ptr, &x, sizeof(x));
567 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000568}
569
570
571static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000572h_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 long val;
575 short field;
576 if (get_long(value, &val) < 0)
577 return NULL;
578 memcpy(&field, ptr, sizeof(field));
579 field = SWAP_2(field);
580 field = SET(field, (short)val, size);
581 field = SWAP_2(field);
582 memcpy(ptr, &field, sizeof(field));
583 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000584}
585
586static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000587h_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 short val;
590 memcpy(&val, ptr, sizeof(val));
591 GET_BITFIELD(val, size);
592 return PyLong_FromLong((long)val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000593}
594
595static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000596h_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 short val;
599 memcpy(&val, ptr, sizeof(val));
600 val = SWAP_2(val);
601 GET_BITFIELD(val, size);
602 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000603}
604
605static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000606H_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 unsigned long val;
609 unsigned short x;
610 if (get_ulong(value, &val) < 0)
611 return NULL;
612 memcpy(&x, ptr, sizeof(x));
613 x = SET(x, (unsigned short)val, size);
614 memcpy(ptr, &x, sizeof(x));
615 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000616}
617
618static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000619H_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 unsigned long val;
622 unsigned short field;
623 if (get_ulong(value, &val) < 0)
624 return NULL;
625 memcpy(&field, ptr, sizeof(field));
626 field = SWAP_2(field);
627 field = SET(field, (unsigned short)val, size);
628 field = SWAP_2(field);
629 memcpy(ptr, &field, sizeof(field));
630 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000631}
632
633
634static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000635H_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 unsigned short val;
638 memcpy(&val, ptr, sizeof(val));
639 GET_BITFIELD(val, size);
640 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000641}
642
643static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000644H_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 unsigned short val;
647 memcpy(&val, ptr, sizeof(val));
648 val = SWAP_2(val);
649 GET_BITFIELD(val, size);
650 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000651}
652
653static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000654i_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000655{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 long val;
657 int x;
658 if (get_long(value, &val) < 0)
659 return NULL;
660 memcpy(&x, ptr, sizeof(x));
661 x = SET(x, (int)val, size);
662 memcpy(ptr, &x, sizeof(x));
663 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000664}
665
666static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000667i_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 long val;
670 int field;
671 if (get_long(value, &val) < 0)
672 return NULL;
673 memcpy(&field, ptr, sizeof(field));
674 field = SWAP_INT(field);
675 field = SET(field, (int)val, size);
676 field = SWAP_INT(field);
677 memcpy(ptr, &field, sizeof(field));
678 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000679}
680
681
682static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000683i_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 int val;
686 memcpy(&val, ptr, sizeof(val));
687 GET_BITFIELD(val, size);
688 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000689}
690
691static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000692i_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 int val;
695 memcpy(&val, ptr, sizeof(val));
696 val = SWAP_INT(val);
697 GET_BITFIELD(val, size);
698 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000699}
700
701#ifdef MS_WIN32
702/* short BOOL - VARIANT_BOOL */
703static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000704vBOOL_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 switch (PyObject_IsTrue(value)) {
707 case -1:
708 return NULL;
709 case 0:
710 *(short int *)ptr = VARIANT_FALSE;
711 _RET(value);
712 default:
713 *(short int *)ptr = VARIANT_TRUE;
714 _RET(value);
715 }
Thomas Hellerd4c93202006-03-08 19:35:11 +0000716}
717
718static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000719vBOOL_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 return PyBool_FromLong((long)*(short int *)ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000722}
723#endif
724
Guido van Rossumd8faa362007-04-27 19:54:29 +0000725#ifdef HAVE_C99_BOOL
726#define BOOL_TYPE _Bool
727#else
728#define BOOL_TYPE char
729#undef SIZEOF__BOOL
730#define SIZEOF__BOOL 1
731#endif
732
733static PyObject *
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000734bool_set(void *ptr, PyObject *value, Py_ssize_t size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 switch (PyObject_IsTrue(value)) {
737 case -1:
738 return NULL;
739 case 0:
740 *(BOOL_TYPE *)ptr = 0;
741 _RET(value);
742 default:
743 *(BOOL_TYPE *)ptr = 1;
744 _RET(value);
745 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000746}
747
748static PyObject *
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000749bool_get(void *ptr, Py_ssize_t size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 return PyBool_FromLong((long)*(BOOL_TYPE *)ptr);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000752}
753
Thomas Hellerd4c93202006-03-08 19:35:11 +0000754static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000755I_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000756{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 unsigned long val;
758 unsigned int x;
759 if (get_ulong(value, &val) < 0)
760 return NULL;
761 memcpy(&x, ptr, sizeof(x));
762 x = SET(x, (unsigned int)val, size);
763 memcpy(ptr, &x, sizeof(x));
764 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000765}
766
767static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000768I_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 unsigned long val;
771 unsigned int field;
772 if (get_ulong(value, &val) < 0)
773 return NULL;
774 memcpy(&field, ptr, sizeof(field));
775 field = (unsigned int)SET(field, (unsigned int)val, size);
776 field = SWAP_INT(field);
777 memcpy(ptr, &field, sizeof(field));
778 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000779}
780
781
782static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000783I_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 unsigned int val;
786 memcpy(&val, ptr, sizeof(val));
787 GET_BITFIELD(val, size);
788 return PyLong_FromUnsignedLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000789}
790
791static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000792I_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 unsigned int val;
795 memcpy(&val, ptr, sizeof(val));
796 val = SWAP_INT(val);
797 GET_BITFIELD(val, size);
798 return PyLong_FromUnsignedLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000799}
800
801static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000802l_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000803{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 long val;
805 long x;
806 if (get_long(value, &val) < 0)
807 return NULL;
808 memcpy(&x, ptr, sizeof(x));
809 x = SET(x, val, size);
810 memcpy(ptr, &x, sizeof(x));
811 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000812}
813
814static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000815l_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 long val;
818 long field;
819 if (get_long(value, &val) < 0)
820 return NULL;
821 memcpy(&field, ptr, sizeof(field));
822 field = SWAP_LONG(field);
823 field = (long)SET(field, val, size);
824 field = SWAP_LONG(field);
825 memcpy(ptr, &field, sizeof(field));
826 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000827}
828
829
830static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000831l_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 long val;
834 memcpy(&val, ptr, sizeof(val));
835 GET_BITFIELD(val, size);
836 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000837}
838
839static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000840l_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 long val;
843 memcpy(&val, ptr, sizeof(val));
844 val = SWAP_LONG(val);
845 GET_BITFIELD(val, size);
846 return PyLong_FromLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000847}
848
849static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000850L_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 unsigned long val;
853 unsigned long x;
854 if (get_ulong(value, &val) < 0)
855 return NULL;
856 memcpy(&x, ptr, sizeof(x));
857 x = SET(x, val, size);
858 memcpy(ptr, &x, sizeof(x));
859 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000860}
861
862static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000863L_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 unsigned long val;
866 unsigned long field;
867 if (get_ulong(value, &val) < 0)
868 return NULL;
869 memcpy(&field, ptr, sizeof(field));
870 field = SWAP_LONG(field);
871 field = (unsigned long)SET(field, val, size);
872 field = SWAP_LONG(field);
873 memcpy(ptr, &field, sizeof(field));
874 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000875}
876
877
878static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000879L_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 unsigned long val;
882 memcpy(&val, ptr, sizeof(val));
883 GET_BITFIELD(val, size);
884 return PyLong_FromUnsignedLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000885}
886
887static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000888L_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000889{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 unsigned long val;
891 memcpy(&val, ptr, sizeof(val));
892 val = SWAP_LONG(val);
893 GET_BITFIELD(val, size);
894 return PyLong_FromUnsignedLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000895}
896
897#ifdef HAVE_LONG_LONG
898static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000899q_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 PY_LONG_LONG val;
902 PY_LONG_LONG x;
903 if (get_longlong(value, &val) < 0)
904 return NULL;
905 memcpy(&x, ptr, sizeof(x));
906 x = SET(x, val, size);
907 memcpy(ptr, &x, sizeof(x));
908 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000909}
910
911static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000912q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 PY_LONG_LONG val;
915 PY_LONG_LONG field;
916 if (get_longlong(value, &val) < 0)
917 return NULL;
918 memcpy(&field, ptr, sizeof(field));
919 field = SWAP_8(field);
920 field = (PY_LONG_LONG)SET(field, val, size);
921 field = SWAP_8(field);
922 memcpy(ptr, &field, sizeof(field));
923 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000924}
925
926static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000927q_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 PY_LONG_LONG val;
930 memcpy(&val, ptr, sizeof(val));
931 GET_BITFIELD(val, size);
932 return PyLong_FromLongLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000933}
934
935static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000936q_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 PY_LONG_LONG val;
939 memcpy(&val, ptr, sizeof(val));
940 val = SWAP_8(val);
941 GET_BITFIELD(val, size);
942 return PyLong_FromLongLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000943}
944
945static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000946Q_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 unsigned PY_LONG_LONG val;
949 unsigned PY_LONG_LONG x;
950 if (get_ulonglong(value, &val) < 0)
951 return NULL;
952 memcpy(&x, ptr, sizeof(x));
953 x = SET(x, val, size);
954 memcpy(ptr, &x, sizeof(x));
955 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000956}
957
958static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000959Q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 unsigned PY_LONG_LONG val;
962 unsigned PY_LONG_LONG field;
963 if (get_ulonglong(value, &val) < 0)
964 return NULL;
965 memcpy(&field, ptr, sizeof(field));
966 field = SWAP_8(field);
967 field = (unsigned PY_LONG_LONG)SET(field, val, size);
968 field = SWAP_8(field);
969 memcpy(ptr, &field, sizeof(field));
970 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000971}
972
973static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000974Q_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 unsigned PY_LONG_LONG val;
977 memcpy(&val, ptr, sizeof(val));
978 GET_BITFIELD(val, size);
979 return PyLong_FromUnsignedLongLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000980}
981
982static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000983Q_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +0000984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 unsigned PY_LONG_LONG val;
986 memcpy(&val, ptr, sizeof(val));
987 val = SWAP_8(val);
988 GET_BITFIELD(val, size);
989 return PyLong_FromUnsignedLongLong(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +0000990}
991#endif
992
993/*****************************************************************
994 * non-integer accessor methods, not supporting bit fields
995 */
996
997
Thomas Wouters89d996e2007-09-08 17:39:28 +0000998static PyObject *
Thomas Hellerff721222008-01-17 18:46:55 +0000999g_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Wouters89d996e2007-09-08 17:39:28 +00001000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 long double x;
Thomas Wouters89d996e2007-09-08 17:39:28 +00001002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 x = PyFloat_AsDouble(value);
1004 if (x == -1 && PyErr_Occurred()) {
1005 PyErr_Format(PyExc_TypeError,
1006 " float expected instead of %s instance",
1007 value->ob_type->tp_name);
1008 return NULL;
1009 }
1010 memcpy(ptr, &x, sizeof(long double));
1011 _RET(value);
Thomas Wouters89d996e2007-09-08 17:39:28 +00001012}
1013
1014static PyObject *
Thomas Hellerff721222008-01-17 18:46:55 +00001015g_get(void *ptr, Py_ssize_t size)
Thomas Wouters89d996e2007-09-08 17:39:28 +00001016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 long double val;
1018 memcpy(&val, ptr, sizeof(long double));
1019 return PyFloat_FromDouble(val);
Thomas Wouters89d996e2007-09-08 17:39:28 +00001020}
Thomas Hellerd4c93202006-03-08 19:35:11 +00001021
1022static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001023d_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 double x;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 x = PyFloat_AsDouble(value);
1028 if (x == -1 && PyErr_Occurred()) {
1029 PyErr_Format(PyExc_TypeError,
1030 " float expected instead of %s instance",
1031 value->ob_type->tp_name);
1032 return NULL;
1033 }
1034 memcpy(ptr, &x, sizeof(double));
1035 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001036}
1037
1038static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001039d_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 double val;
1042 memcpy(&val, ptr, sizeof(val));
1043 return PyFloat_FromDouble(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001044}
1045
1046static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001047d_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 double x;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 x = PyFloat_AsDouble(value);
1052 if (x == -1 && PyErr_Occurred()) {
1053 PyErr_Format(PyExc_TypeError,
1054 " float expected instead of %s instance",
1055 value->ob_type->tp_name);
1056 return NULL;
1057 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001058#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 if (_PyFloat_Pack8(x, (unsigned char *)ptr, 1))
1060 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001061#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 if (_PyFloat_Pack8(x, (unsigned char *)ptr, 0))
1063 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001066}
1067
1068static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001069d_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001070{
1071#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 return PyFloat_FromDouble(_PyFloat_Unpack8(ptr, 1));
Thomas Hellerd4c93202006-03-08 19:35:11 +00001073#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 return PyFloat_FromDouble(_PyFloat_Unpack8(ptr, 0));
Thomas Hellerd4c93202006-03-08 19:35:11 +00001075#endif
1076}
1077
1078static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001079f_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 float x;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 x = (float)PyFloat_AsDouble(value);
1084 if (x == -1 && PyErr_Occurred()) {
1085 PyErr_Format(PyExc_TypeError,
1086 " float expected instead of %s instance",
1087 value->ob_type->tp_name);
1088 return NULL;
1089 }
1090 memcpy(ptr, &x, sizeof(x));
1091 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001092}
1093
1094static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001095f_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 float val;
1098 memcpy(&val, ptr, sizeof(val));
1099 return PyFloat_FromDouble(val);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001100}
1101
1102static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001103f_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 float x;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 x = (float)PyFloat_AsDouble(value);
1108 if (x == -1 && PyErr_Occurred()) {
1109 PyErr_Format(PyExc_TypeError,
1110 " float expected instead of %s instance",
1111 value->ob_type->tp_name);
1112 return NULL;
1113 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001114#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 if (_PyFloat_Pack4(x, (unsigned char *)ptr, 1))
1116 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001117#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 if (_PyFloat_Pack4(x, (unsigned char *)ptr, 0))
1119 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001122}
1123
1124static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001125f_get_sw(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001126{
1127#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 return PyFloat_FromDouble(_PyFloat_Unpack4(ptr, 1));
Thomas Hellerd4c93202006-03-08 19:35:11 +00001129#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 return PyFloat_FromDouble(_PyFloat_Unpack4(ptr, 0));
Thomas Hellerd4c93202006-03-08 19:35:11 +00001131#endif
1132}
1133
1134/*
1135 py_object refcounts:
1136
1137 1. If we have a py_object instance, O_get must Py_INCREF the returned
1138 object, of course. If O_get is called from a function result, no py_object
1139 instance is created - so callproc.c::GetResult has to call Py_DECREF.
1140
1141 2. The memory block in py_object owns a refcount. So, py_object must call
1142 Py_DECREF on destruction. Maybe only when b_needsfree is non-zero.
1143*/
1144static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001145O_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 PyObject *ob = *(PyObject **)ptr;
1148 if (ob == NULL) {
1149 if (!PyErr_Occurred())
1150 /* Set an error if not yet set */
1151 PyErr_SetString(PyExc_ValueError,
1152 "PyObject is NULL");
1153 return NULL;
1154 }
1155 Py_INCREF(ob);
1156 return ob;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001157}
1158
1159static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001160O_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 /* Hm, does the memory block need it's own refcount or not? */
1163 *(PyObject **)ptr = value;
1164 Py_INCREF(value);
1165 return value;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001166}
1167
1168
1169static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001170c_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 if (PyBytes_Check(value) && PyBytes_GET_SIZE(value) == 1) {
1173 *(char *)ptr = PyBytes_AS_STRING(value)[0];
1174 _RET(value);
1175 }
1176 if (PyByteArray_Check(value) && PyByteArray_GET_SIZE(value) == 1) {
1177 *(char *)ptr = PyByteArray_AS_STRING(value)[0];
1178 _RET(value);
1179 }
1180 if (PyLong_Check(value))
1181 {
1182 long longval = PyLong_AS_LONG(value);
1183 if (longval < 0 || longval >= 256)
1184 goto error;
1185 *(char *)ptr = (char)longval;
1186 _RET(value);
1187 }
Thomas Heller19b52542007-07-13 12:52:51 +00001188 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 PyErr_Format(PyExc_TypeError,
1190 "one character string expected");
1191 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001192}
1193
1194
1195static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001196c_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 return PyBytes_FromStringAndSize((char *)ptr, 1);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001199}
1200
1201#ifdef CTYPES_UNICODE
1202/* u - a single wchar_t character */
1203static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001204u_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 Py_ssize_t len;
Victor Stinner749261e2010-10-02 11:25:35 +00001207 wchar_t chars[2];
Victor Stinnercf448832010-07-28 00:15:03 +00001208 if (!PyUnicode_Check(value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 PyErr_Format(PyExc_TypeError,
1210 "unicode string expected instead of %s instance",
1211 value->ob_type->tp_name);
1212 return NULL;
1213 } else
1214 Py_INCREF(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001215
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001216 len = PyUnicode_AsWideChar(value, chars, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 if (len != 1) {
1218 Py_DECREF(value);
1219 PyErr_SetString(PyExc_TypeError,
1220 "one character unicode string expected");
1221 return NULL;
1222 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001223
Victor Stinner749261e2010-10-02 11:25:35 +00001224 *(wchar_t *)ptr = chars[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 Py_DECREF(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001228}
1229
1230
1231static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001232u_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 return PyUnicode_FromWideChar((wchar_t *)ptr, 1);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001235}
1236
1237/* U - a unicode string */
1238static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001239U_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 PyObject *result;
1242 Py_ssize_t len;
1243 Py_UNICODE *p;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 size /= sizeof(wchar_t); /* we count character units here, not bytes */
Thomas Hellerd4c93202006-03-08 19:35:11 +00001246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 result = PyUnicode_FromWideChar((wchar_t *)ptr, size);
1248 if (!result)
1249 return NULL;
1250 /* We need 'result' to be able to count the characters with wcslen,
1251 since ptr may not be NUL terminated. If the length is smaller (if
1252 it was actually NUL terminated, we construct a new one and throw
1253 away the result.
1254 */
1255 /* chop off at the first NUL character, if any. */
1256 p = PyUnicode_AS_UNICODE(result);
1257 for (len = 0; len < size; ++len)
1258 if (!p[len])
1259 break;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 if (len < size) {
1262 PyObject *ob = PyUnicode_FromWideChar((wchar_t *)ptr, len);
1263 Py_DECREF(result);
1264 return ob;
1265 }
1266 return result;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001267}
1268
1269static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001270U_set(void *ptr, PyObject *value, Py_ssize_t length)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001271{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 Py_ssize_t size;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 /* It's easier to calculate in characters than in bytes */
1275 length /= sizeof(wchar_t);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001276
Victor Stinnercf448832010-07-28 00:15:03 +00001277 if (!PyUnicode_Check(value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 PyErr_Format(PyExc_TypeError,
1279 "unicode string expected instead of %s instance",
1280 value->ob_type->tp_name);
1281 return NULL;
1282 } else
1283 Py_INCREF(value);
1284 size = PyUnicode_GET_SIZE(value);
1285 if (size > length) {
1286 PyErr_Format(PyExc_ValueError,
1287 "string too long (%zd, maximum length %zd)",
1288 size, length);
1289 Py_DECREF(value);
1290 return NULL;
1291 } else if (size < length-1)
1292 /* copy terminating NUL character if there is space */
1293 size += 1;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00001294 PyUnicode_AsWideChar(value, (wchar_t *)ptr, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 return value;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001296}
1297
1298#endif
1299
1300static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001301s_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001302{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 Py_ssize_t i;
1304 char *p;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 p = (char *)ptr;
1307 for (i = 0; i < size; ++i) {
1308 if (*p++ == '\0')
1309 break;
1310 }
Thomas Heller19b52542007-07-13 12:52:51 +00001311
Victor Stinnerda0eca42010-06-11 21:50:30 +00001312 return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001313}
1314
1315static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001316s_set(void *ptr, PyObject *value, Py_ssize_t length)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 char *data;
1319 Py_ssize_t size;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001320
Victor Stinnercf448832010-07-28 00:15:03 +00001321 if(PyBytes_Check(value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 Py_INCREF(value);
1323 } else {
1324 PyErr_Format(PyExc_TypeError,
1325 "expected string, %s found",
1326 value->ob_type->tp_name);
1327 return NULL;
1328 }
Thomas Hellere5095e12007-07-13 11:19:35 +00001329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 data = PyBytes_AS_STRING(value);
1331 if (!data)
1332 return NULL;
1333 size = strlen(data); /* XXX Why not Py_SIZE(value)? */
1334 if (size < length) {
1335 /* This will copy the leading NUL character
1336 * if there is space for it.
1337 */
1338 ++size;
1339 } else if (size > length) {
1340 PyErr_Format(PyExc_ValueError,
1341 "string too long (%zd, maximum length %zd)",
1342 size, length);
1343 Py_DECREF(value);
1344 return NULL;
1345 }
1346 /* Also copy the terminating NUL character if there is space */
1347 memcpy((char *)ptr, data, size);
Thomas Hellere5095e12007-07-13 11:19:35 +00001348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 Py_DECREF(value);
1350 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001351}
1352
1353static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001354z_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 if (value == Py_None) {
1357 *(char **)ptr = NULL;
1358 Py_INCREF(value);
1359 return value;
1360 }
1361 if (PyBytes_Check(value)) {
1362 *(char **)ptr = PyBytes_AsString(value);
1363 Py_INCREF(value);
1364 return value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 } else if (PyLong_Check(value)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001366#if SIZEOF_VOID_P == SIZEOF_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 *(char **)ptr = (char *)PyLong_AsUnsignedLongLongMask(value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001368#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 *(char **)ptr = (char *)PyLong_AsUnsignedLongMask(value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 _RET(value);
1372 }
1373 PyErr_Format(PyExc_TypeError,
1374 "string or integer address expected instead of %s instance",
1375 value->ob_type->tp_name);
1376 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001377}
1378
1379static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001380z_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 /* XXX What about invalid pointers ??? */
1383 if (*(void **)ptr) {
Thomas Hellerd4c93202006-03-08 19:35:11 +00001384#if defined(MS_WIN32) && !defined(_WIN32_WCE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 if (IsBadStringPtrA(*(char **)ptr, -1)) {
1386 PyErr_Format(PyExc_ValueError,
1387 "invalid string pointer %p",
1388 *(char **)ptr);
1389 return NULL;
1390 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 return PyBytes_FromStringAndSize(*(char **)ptr,
1393 strlen(*(char **)ptr));
1394 } else {
1395 Py_INCREF(Py_None);
1396 return Py_None;
1397 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001398}
1399
1400#ifdef CTYPES_UNICODE
1401static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001402Z_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 if (value == Py_None) {
1405 *(wchar_t **)ptr = NULL;
1406 Py_INCREF(value);
1407 return value;
1408 }
1409 if (PyLong_Check(value) || PyLong_Check(value)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410#if SIZEOF_VOID_P == SIZEOF_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongLongMask(value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001412#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongMask(value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001414#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 Py_INCREF(Py_None);
1416 return Py_None;
1417 }
Victor Stinnercf448832010-07-28 00:15:03 +00001418 if (!PyUnicode_Check(value)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 PyErr_Format(PyExc_TypeError,
1420 "unicode string or integer address expected instead of %s instance",
1421 value->ob_type->tp_name);
1422 return NULL;
1423 } else
1424 Py_INCREF(value);
Daniel Stutzbach8515eae2010-08-24 21:57:33 +00001425#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T
1426 /* We can copy directly. Hm, are unicode objects always NUL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 terminated in Python, internally?
1428 */
Daniel Stutzbach8515eae2010-08-24 21:57:33 +00001429 *(wchar_t **)ptr = (wchar_t *) PyUnicode_AS_UNICODE(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 return value;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001431#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 {
1433 /* We must create a wchar_t* buffer from the unicode object,
1434 and keep it alive */
1435 PyObject *keep;
1436 wchar_t *buffer;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001437
Victor Stinnerbeb4135b2010-10-07 01:02:42 +00001438 buffer = PyUnicode_AsWideCharString(value, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 if (!buffer) {
1440 Py_DECREF(value);
Victor Stinner4c2e4fa2010-09-29 10:37:16 +00001441 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 keep = PyCapsule_New(buffer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM, pymem_destructor);
1444 if (!keep) {
1445 Py_DECREF(value);
1446 PyMem_Free(buffer);
1447 return NULL;
1448 }
1449 *(wchar_t **)ptr = (wchar_t *)buffer;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 Py_DECREF(value);
1451 return keep;
1452 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001453#endif
1454}
1455
1456static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001457Z_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 wchar_t *p;
1460 p = *(wchar_t **)ptr;
1461 if (p) {
Guido van Rossum360e4b82007-05-14 22:51:27 +00001462#if defined(MS_WIN32) && !defined(_WIN32_WCE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 if (IsBadStringPtrW(*(wchar_t **)ptr, -1)) {
1464 PyErr_Format(PyExc_ValueError,
1465 "invalid string pointer %p",
1466 *(wchar_t **)ptr);
1467 return NULL;
1468 }
Guido van Rossum360e4b82007-05-14 22:51:27 +00001469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 return PyUnicode_FromWideChar(p, wcslen(p));
1471 } else {
1472 Py_INCREF(Py_None);
1473 return Py_None;
1474 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001475}
1476#endif
1477
1478#ifdef MS_WIN32
1479static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001480BSTR_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 BSTR bstr;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 /* convert value into a PyUnicodeObject or NULL */
1485 if (Py_None == value) {
1486 value = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 } else if (PyUnicode_Check(value)) {
1488 Py_INCREF(value); /* for the descref below */
1489 } else {
1490 PyErr_Format(PyExc_TypeError,
1491 "unicode string expected instead of %s instance",
1492 value->ob_type->tp_name);
1493 return NULL;
1494 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 /* create a BSTR from value */
1497 if (value) {
1498 Py_ssize_t size = PyUnicode_GET_SIZE(value);
1499 if ((unsigned) size != size) {
1500 PyErr_SetString(PyExc_ValueError, "String too long for BSTR");
1501 return NULL;
1502 }
1503 bstr = SysAllocStringLen(PyUnicode_AS_UNICODE(value),
1504 (unsigned)size);
1505 Py_DECREF(value);
1506 } else
1507 bstr = NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 /* free the previous contents, if any */
1510 if (*(BSTR *)ptr)
1511 SysFreeString(*(BSTR *)ptr);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 /* and store it */
1514 *(BSTR *)ptr = bstr;
1515
1516 /* We don't need to keep any other object */
1517 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001518}
1519
1520
1521static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001522BSTR_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 BSTR p;
1525 p = *(BSTR *)ptr;
1526 if (p)
1527 return PyUnicode_FromWideChar(p, SysStringLen(p));
1528 else {
1529 /* Hm, it seems NULL pointer and zero length string are the
1530 same in BSTR, see Don Box, p 81
1531 */
1532 Py_INCREF(Py_None);
1533 return Py_None;
1534 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001535}
1536#endif
1537
1538static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001539P_set(void *ptr, PyObject *value, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 void *v;
1542 if (value == Py_None) {
1543 *(void **)ptr = NULL;
1544 _RET(value);
1545 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 if (!PyLong_Check(value) && !PyLong_Check(value)) {
1548 PyErr_SetString(PyExc_TypeError,
1549 "cannot be converted to pointer");
1550 return NULL;
1551 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001552
1553#if SIZEOF_VOID_P <= SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 v = (void *)PyLong_AsUnsignedLongMask(value);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001555#else
1556#ifndef HAVE_LONG_LONG
1557# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
1558#elif SIZEOF_LONG_LONG < SIZEOF_VOID_P
1559# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
1560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 v = (void *)PyLong_AsUnsignedLongLongMask(value);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001562#endif
1563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 if (PyErr_Occurred())
1565 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 *(void **)ptr = v;
1568 _RET(value);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001569}
1570
1571static PyObject *
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001572P_get(void *ptr, Py_ssize_t size)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 if (*(void **)ptr == NULL) {
1575 Py_INCREF(Py_None);
1576 return Py_None;
1577 }
1578 return PyLong_FromVoidPtr(*(void **)ptr);
Thomas Hellerd4c93202006-03-08 19:35:11 +00001579}
1580
1581static struct fielddesc formattable[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 { 's', s_set, s_get, &ffi_type_pointer},
1583 { 'b', b_set, b_get, &ffi_type_schar},
1584 { 'B', B_set, B_get, &ffi_type_uchar},
1585 { 'c', c_set, c_get, &ffi_type_schar},
1586 { 'd', d_set, d_get, &ffi_type_double, d_set_sw, d_get_sw},
1587 { 'g', g_set, g_get, &ffi_type_longdouble},
1588 { 'f', f_set, f_get, &ffi_type_float, f_set_sw, f_get_sw},
1589 { 'h', h_set, h_get, &ffi_type_sshort, h_set_sw, h_get_sw},
1590 { 'H', H_set, H_get, &ffi_type_ushort, H_set_sw, H_get_sw},
1591 { 'i', i_set, i_get, &ffi_type_sint, i_set_sw, i_get_sw},
1592 { 'I', I_set, I_get, &ffi_type_uint, I_set_sw, I_get_sw},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001593/* XXX Hm, sizeof(int) == sizeof(long) doesn't hold on every platform */
1594/* As soon as we can get rid of the type codes, this is no longer a problem */
1595#if SIZEOF_LONG == 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 { 'l', l_set, l_get, &ffi_type_sint32, l_set_sw, l_get_sw},
1597 { 'L', L_set, L_get, &ffi_type_uint32, L_set_sw, L_get_sw},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001598#elif SIZEOF_LONG == 8
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 { 'l', l_set, l_get, &ffi_type_sint64, l_set_sw, l_get_sw},
1600 { 'L', L_set, L_get, &ffi_type_uint64, L_set_sw, L_get_sw},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001601#else
1602# error
1603#endif
1604#ifdef HAVE_LONG_LONG
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001605#if SIZEOF_LONG_LONG == 8
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 { 'q', q_set, q_get, &ffi_type_sint64, q_set_sw, q_get_sw},
1607 { 'Q', Q_set, Q_get, &ffi_type_uint64, Q_set_sw, Q_get_sw},
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001608#else
1609# error
1610#endif
Thomas Hellerd4c93202006-03-08 19:35:11 +00001611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 { 'P', P_set, P_get, &ffi_type_pointer},
1613 { 'z', z_set, z_get, &ffi_type_pointer},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001614#ifdef CTYPES_UNICODE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 { 'u', u_set, u_get, NULL}, /* ffi_type set later */
1616 { 'U', U_set, U_get, &ffi_type_pointer},
1617 { 'Z', Z_set, Z_get, &ffi_type_pointer},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001618#endif
1619#ifdef MS_WIN32
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 { 'X', BSTR_set, BSTR_get, &ffi_type_pointer},
1621 { 'v', vBOOL_set, vBOOL_get, &ffi_type_sshort},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001622#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00001623#if SIZEOF__BOOL == 1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 { '?', bool_set, bool_get, &ffi_type_uchar}, /* Also fallback for no native _Bool support */
Guido van Rossumd8faa362007-04-27 19:54:29 +00001625#elif SIZEOF__BOOL == SIZEOF_SHORT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 { '?', bool_set, bool_get, &ffi_type_ushort},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001627#elif SIZEOF__BOOL == SIZEOF_INT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 { '?', bool_set, bool_get, &ffi_type_uint, I_set_sw, I_get_sw},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001629#elif SIZEOF__BOOL == SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 { '?', bool_set, bool_get, &ffi_type_ulong, L_set_sw, L_get_sw},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001631#elif SIZEOF__BOOL == SIZEOF_LONG_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 { '?', bool_set, bool_get, &ffi_type_ulong, Q_set_sw, Q_get_sw},
Guido van Rossumd8faa362007-04-27 19:54:29 +00001633#endif /* SIZEOF__BOOL */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 { 'O', O_set, O_get, &ffi_type_pointer},
1635 { 0, NULL, NULL, NULL},
Thomas Hellerd4c93202006-03-08 19:35:11 +00001636};
1637
1638/*
1639 Ideas: Implement VARIANT in this table, using 'V' code.
1640 Use '?' as code for BOOL.
1641*/
1642
1643struct fielddesc *
Thomas Heller34596a92009-04-24 20:50:00 +00001644_ctypes_get_fielddesc(const char *fmt)
Thomas Hellerd4c93202006-03-08 19:35:11 +00001645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 static int initialized = 0;
1647 struct fielddesc *table = formattable;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 if (!initialized) {
1650 initialized = 1;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001651#ifdef CTYPES_UNICODE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 if (sizeof(wchar_t) == sizeof(short))
1653 _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sshort;
1654 else if (sizeof(wchar_t) == sizeof(int))
1655 _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sint;
1656 else if (sizeof(wchar_t) == sizeof(long))
1657 _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_slong;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 }
Thomas Hellerd4c93202006-03-08 19:35:11 +00001660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 for (; table->code; ++table) {
1662 if (table->code == fmt[0])
1663 return table;
1664 }
1665 return NULL;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001666}
1667
1668typedef struct { char c; char x; } s_char;
1669typedef struct { char c; short x; } s_short;
1670typedef struct { char c; int x; } s_int;
1671typedef struct { char c; long x; } s_long;
1672typedef struct { char c; float x; } s_float;
1673typedef struct { char c; double x; } s_double;
Thomas Wouters89d996e2007-09-08 17:39:28 +00001674typedef struct { char c; long double x; } s_long_double;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001675typedef struct { char c; char *x; } s_char_p;
1676typedef struct { char c; void *x; } s_void_p;
1677
1678/*
1679#define CHAR_ALIGN (sizeof(s_char) - sizeof(char))
1680#define SHORT_ALIGN (sizeof(s_short) - sizeof(short))
1681#define INT_ALIGN (sizeof(s_int) - sizeof(int))
1682#define LONG_ALIGN (sizeof(s_long) - sizeof(long))
1683*/
1684#define FLOAT_ALIGN (sizeof(s_float) - sizeof(float))
1685#define DOUBLE_ALIGN (sizeof(s_double) - sizeof(double))
Thomas Wouters89d996e2007-09-08 17:39:28 +00001686#define LONGDOUBLE_ALIGN (sizeof(s_long_double) - sizeof(long double))
1687
Thomas Hellerd4c93202006-03-08 19:35:11 +00001688/* #define CHAR_P_ALIGN (sizeof(s_char_p) - sizeof(char*)) */
1689#define VOID_P_ALIGN (sizeof(s_void_p) - sizeof(void*))
1690
1691/*
1692#ifdef HAVE_USABLE_WCHAR_T
1693typedef struct { char c; wchar_t x; } s_wchar;
1694typedef struct { char c; wchar_t *x; } s_wchar_p;
1695
1696#define WCHAR_ALIGN (sizeof(s_wchar) - sizeof(wchar_t))
1697#define WCHAR_P_ALIGN (sizeof(s_wchar_p) - sizeof(wchar_t*))
1698#endif
1699*/
1700
1701#ifdef HAVE_LONG_LONG
1702typedef struct { char c; PY_LONG_LONG x; } s_long_long;
1703#define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(PY_LONG_LONG))
1704#endif
1705
1706/* from ffi.h:
1707typedef struct _ffi_type
1708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 size_t size;
1710 unsigned short alignment;
1711 unsigned short type;
1712 struct _ffi_type **elements;
Thomas Hellerd4c93202006-03-08 19:35:11 +00001713} ffi_type;
1714*/
1715
1716/* align and size are bogus for void, but they must not be zero */
1717ffi_type ffi_type_void = { 1, 1, FFI_TYPE_VOID };
1718
1719ffi_type ffi_type_uint8 = { 1, 1, FFI_TYPE_UINT8 };
1720ffi_type ffi_type_sint8 = { 1, 1, FFI_TYPE_SINT8 };
1721
1722ffi_type ffi_type_uint16 = { 2, 2, FFI_TYPE_UINT16 };
1723ffi_type ffi_type_sint16 = { 2, 2, FFI_TYPE_SINT16 };
1724
1725ffi_type ffi_type_uint32 = { 4, 4, FFI_TYPE_UINT32 };
1726ffi_type ffi_type_sint32 = { 4, 4, FFI_TYPE_SINT32 };
1727
1728ffi_type ffi_type_uint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_UINT64 };
1729ffi_type ffi_type_sint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_SINT64 };
1730
1731ffi_type ffi_type_float = { sizeof(float), FLOAT_ALIGN, FFI_TYPE_FLOAT };
1732ffi_type ffi_type_double = { sizeof(double), DOUBLE_ALIGN, FFI_TYPE_DOUBLE };
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001733
1734#ifdef ffi_type_longdouble
1735#undef ffi_type_longdouble
1736#endif
Georg Brandlfcaf9102008-07-16 02:17:56 +00001737 /* This is already defined on OSX */
Thomas Wouters89d996e2007-09-08 17:39:28 +00001738ffi_type ffi_type_longdouble = { sizeof(long double), LONGDOUBLE_ALIGN,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 FFI_TYPE_LONGDOUBLE };
Thomas Hellerd4c93202006-03-08 19:35:11 +00001740
Thomas Hellerd4c93202006-03-08 19:35:11 +00001741ffi_type ffi_type_pointer = { sizeof(void *), VOID_P_ALIGN, FFI_TYPE_POINTER };
1742
1743/*---------------- EOF ----------------*/