1 #include "Python.h"
2 #include "pycore_byteswap.h" // _Py_bswap32()
3
4 #include <ffi.h>
5 #ifdef MS_WIN32
6 #include <windows.h>
7 #endif
8 #include "ctypes.h"
9
10
11 #define CTYPES_CFIELD_CAPSULE_NAME_PYMEM "_ctypes/cfield.c pymem"
12
pymem_destructor(PyObject * ptr)13 static void pymem_destructor(PyObject *ptr)
14 {
15 void *p = PyCapsule_GetPointer(ptr, CTYPES_CFIELD_CAPSULE_NAME_PYMEM);
16 if (p) {
17 PyMem_Free(p);
18 }
19 }
20
21
22 /******************************************************************/
23 /*
24 PyCField_Type
25 */
26 static PyObject *
PyCField_new(PyTypeObject * type,PyObject * args,PyObject * kwds)27 PyCField_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28 {
29 CFieldObject *obj;
30 obj = (CFieldObject *)type->tp_alloc(type, 0);
31 return (PyObject *)obj;
32 }
33
34 /*
35 * Expects the size, index and offset for the current field in *psize and
36 * *poffset, stores the total size so far in *psize, the offset for the next
37 * field in *poffset, the alignment requirements for the current field in
38 * *palign, and returns a field desriptor for this field.
39 */
40 /*
41 * bitfields extension:
42 * bitsize != 0: this is a bit field.
43 * pbitofs points to the current bit offset, this will be updated.
44 * prev_desc points to the type of the previous bitfield, if any.
45 */
46 PyObject *
PyCField_FromDesc(PyObject * desc,Py_ssize_t index,Py_ssize_t * pfield_size,int bitsize,int * pbitofs,Py_ssize_t * psize,Py_ssize_t * poffset,Py_ssize_t * palign,int pack,int big_endian)47 PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
48 Py_ssize_t *pfield_size, int bitsize, int *pbitofs,
49 Py_ssize_t *psize, Py_ssize_t *poffset, Py_ssize_t *palign,
50 int pack, int big_endian)
51 {
52 CFieldObject *self;
53 PyObject *proto;
54 Py_ssize_t size, align;
55 SETFUNC setfunc = NULL;
56 GETFUNC getfunc = NULL;
57 StgDictObject *dict;
58 int fieldtype;
59 #define NO_BITFIELD 0
60 #define NEW_BITFIELD 1
61 #define CONT_BITFIELD 2
62 #define EXPAND_BITFIELD 3
63
64 self = (CFieldObject *)_PyObject_CallNoArg((PyObject *)&PyCField_Type);
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 */
76 #ifdef MS_WIN32
77 /* MSVC, GCC with -mms-bitfields */
78 && dict->size * 8 == *pfield_size
79 #else
80 /* GCC */
81 && dict->size * 8 <= *pfield_size
82 #endif
83 && (*pbitofs + bitsize) <= *pfield_size) {
84 /* continue bit field */
85 fieldtype = CONT_BITFIELD;
86 #ifndef MS_WIN32
87 } 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;
93 #endif
94 } 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 }
105
106 size = dict->size;
107 proto = desc;
108
109 /* 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 }
128 #ifdef CTYPES_UNICODE
129 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 }
134 #endif
135 }
136 }
137
138 self->setfunc = setfunc;
139 self->getfunc = getfunc;
140 self->index = index;
141
142 Py_INCREF(proto);
143 self->proto = proto;
144
145 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 }
163
164 if (bitsize == 0)
165 self->size = size;
166 *psize += size;
167
168 self->offset = *poffset;
169 *poffset += size;
170
171 *palign = align;
172 break;
173
174 case EXPAND_BITFIELD:
175 *poffset += dict->size - *pfield_size/8;
176 *psize += dict->size - *pfield_size/8;
177
178 *pfield_size = dict->size * 8;
179
180 if (big_endian)
181 self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
182 else
183 self->size = (bitsize << 16) + *pbitofs;
184
185 self->offset = *poffset - size; /* poffset is already updated for the NEXT field */
186 *pbitofs += bitsize;
187 break;
188
189 case CONT_BITFIELD:
190 if (big_endian)
191 self->size = (bitsize << 16) + *pfield_size - *pbitofs - bitsize;
192 else
193 self->size = (bitsize << 16) + *pbitofs;
194
195 self->offset = *poffset - size; /* poffset is already updated for the NEXT field */
196 *pbitofs += bitsize;
197 break;
198 }
199
200 return (PyObject *)self;
201 }
202
203 static int
PyCField_set(CFieldObject * self,PyObject * inst,PyObject * value)204 PyCField_set(CFieldObject *self, PyObject *inst, PyObject *value)
205 {
206 CDataObject *dst;
207 char *ptr;
208 if (!CDataObject_Check(inst)) {
209 PyErr_SetString(PyExc_TypeError,
210 "not a ctype instance");
211 return -1;
212 }
213 dst = (CDataObject *)inst;
214 ptr = dst->b_ptr + self->offset;
215 if (value == NULL) {
216 PyErr_SetString(PyExc_TypeError,
217 "can't delete attribute");
218 return -1;
219 }
220 return PyCData_set(inst, self->proto, self->setfunc, value,
221 self->index, self->size, ptr);
222 }
223
224 static PyObject *
PyCField_get(CFieldObject * self,PyObject * inst,PyTypeObject * type)225 PyCField_get(CFieldObject *self, PyObject *inst, PyTypeObject *type)
226 {
227 CDataObject *src;
228 if (inst == NULL) {
229 Py_INCREF(self);
230 return (PyObject *)self;
231 }
232 if (!CDataObject_Check(inst)) {
233 PyErr_SetString(PyExc_TypeError,
234 "not a ctype instance");
235 return NULL;
236 }
237 src = (CDataObject *)inst;
238 return PyCData_get(self->proto, self->getfunc, inst,
239 self->index, self->size, src->b_ptr + self->offset);
240 }
241
242 static PyObject *
PyCField_get_offset(PyObject * self,void * data)243 PyCField_get_offset(PyObject *self, void *data)
244 {
245 return PyLong_FromSsize_t(((CFieldObject *)self)->offset);
246 }
247
248 static PyObject *
PyCField_get_size(PyObject * self,void * data)249 PyCField_get_size(PyObject *self, void *data)
250 {
251 return PyLong_FromSsize_t(((CFieldObject *)self)->size);
252 }
253
254 static PyGetSetDef PyCField_getset[] = {
255 { "offset", PyCField_get_offset, NULL, "offset in bytes of this field" },
256 { "size", PyCField_get_size, NULL, "size in bytes of this field" },
257 { NULL, NULL, NULL, NULL },
258 };
259
260 static int
PyCField_traverse(CFieldObject * self,visitproc visit,void * arg)261 PyCField_traverse(CFieldObject *self, visitproc visit, void *arg)
262 {
263 Py_VISIT(self->proto);
264 return 0;
265 }
266
267 static int
PyCField_clear(CFieldObject * self)268 PyCField_clear(CFieldObject *self)
269 {
270 Py_CLEAR(self->proto);
271 return 0;
272 }
273
274 static void
PyCField_dealloc(PyObject * self)275 PyCField_dealloc(PyObject *self)
276 {
277 PyCField_clear((CFieldObject *)self);
278 Py_TYPE(self)->tp_free((PyObject *)self);
279 }
280
281 static PyObject *
PyCField_repr(CFieldObject * self)282 PyCField_repr(CFieldObject *self)
283 {
284 PyObject *result;
285 Py_ssize_t bits = self->size >> 16;
286 Py_ssize_t size = self->size & 0xFFFF;
287 const char *name;
288
289 name = ((PyTypeObject *)self->proto)->tp_name;
290
291 if (bits)
292 result = PyUnicode_FromFormat(
293 "<Field type=%s, ofs=%zd:%zd, bits=%zd>",
294 name, self->offset, size, bits);
295 else
296 result = PyUnicode_FromFormat(
297 "<Field type=%s, ofs=%zd, size=%zd>",
298 name, self->offset, size);
299 return result;
300 }
301
302 PyTypeObject PyCField_Type = {
303 PyVarObject_HEAD_INIT(NULL, 0)
304 "_ctypes.CField", /* tp_name */
305 sizeof(CFieldObject), /* tp_basicsize */
306 0, /* tp_itemsize */
307 PyCField_dealloc, /* tp_dealloc */
308 0, /* tp_vectorcall_offset */
309 0, /* tp_getattr */
310 0, /* tp_setattr */
311 0, /* tp_as_async */
312 (reprfunc)PyCField_repr, /* tp_repr */
313 0, /* tp_as_number */
314 0, /* tp_as_sequence */
315 0, /* tp_as_mapping */
316 0, /* tp_hash */
317 0, /* tp_call */
318 0, /* tp_str */
319 0, /* tp_getattro */
320 0, /* tp_setattro */
321 0, /* tp_as_buffer */
322 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
323 "Structure/Union member", /* tp_doc */
324 (traverseproc)PyCField_traverse, /* tp_traverse */
325 (inquiry)PyCField_clear, /* tp_clear */
326 0, /* tp_richcompare */
327 0, /* tp_weaklistoffset */
328 0, /* tp_iter */
329 0, /* tp_iternext */
330 0, /* tp_methods */
331 0, /* tp_members */
332 PyCField_getset, /* tp_getset */
333 0, /* tp_base */
334 0, /* tp_dict */
335 (descrgetfunc)PyCField_get, /* tp_descr_get */
336 (descrsetfunc)PyCField_set, /* tp_descr_set */
337 0, /* tp_dictoffset */
338 0, /* tp_init */
339 0, /* tp_alloc */
340 PyCField_new, /* tp_new */
341 0, /* tp_free */
342 };
343
344
345 /******************************************************************/
346 /*
347 Accessor functions
348 */
349
350 /* Derived from Modules/structmodule.c:
351 Helper routine to get a Python integer and raise the appropriate error
352 if it isn't one */
353
354 static int
get_long(PyObject * v,long * p)355 get_long(PyObject *v, long *p)
356 {
357 long x;
358
359 if (PyFloat_Check(v)) {
360 PyErr_SetString(PyExc_TypeError,
361 "int expected instead of float");
362 return -1;
363 }
364 x = PyLong_AsUnsignedLongMask(v);
365 if (x == -1 && PyErr_Occurred())
366 return -1;
367 *p = x;
368 return 0;
369 }
370
371 /* Same, but handling unsigned long */
372
373 static int
get_ulong(PyObject * v,unsigned long * p)374 get_ulong(PyObject *v, unsigned long *p)
375 {
376 unsigned long x;
377
378 if (PyFloat_Check(v)) {
379 PyErr_SetString(PyExc_TypeError,
380 "int expected instead of float");
381 return -1;
382 }
383 x = PyLong_AsUnsignedLongMask(v);
384 if (x == (unsigned long)-1 && PyErr_Occurred())
385 return -1;
386 *p = x;
387 return 0;
388 }
389
390 /* Same, but handling native long long. */
391
392 static int
get_longlong(PyObject * v,long long * p)393 get_longlong(PyObject *v, long long *p)
394 {
395 long long x;
396 if (PyFloat_Check(v)) {
397 PyErr_SetString(PyExc_TypeError,
398 "int expected instead of float");
399 return -1;
400 }
401 x = PyLong_AsUnsignedLongLongMask(v);
402 if (x == -1 && PyErr_Occurred())
403 return -1;
404 *p = x;
405 return 0;
406 }
407
408 /* Same, but handling native unsigned long long. */
409
410 static int
get_ulonglong(PyObject * v,unsigned long long * p)411 get_ulonglong(PyObject *v, unsigned long long *p)
412 {
413 unsigned long long x;
414 if (PyFloat_Check(v)) {
415 PyErr_SetString(PyExc_TypeError,
416 "int expected instead of float");
417 return -1;
418 }
419 x = PyLong_AsUnsignedLongLongMask(v);
420 if (x == (unsigned long long)-1 && PyErr_Occurred())
421 return -1;
422 *p = x;
423 return 0;
424 }
425
426 /*****************************************************************
427 * Integer fields, with bitfield support
428 */
429
430 /* how to decode the size field, for integer get/set functions */
431 #define LOW_BIT(x) ((x) & 0xFFFF)
432 #define NUM_BITS(x) ((x) >> 16)
433
434 /* Doesn't work if NUM_BITS(size) == 0, but it never happens in SET() call. */
435 #define BIT_MASK(type, size) (((((type)1 << (NUM_BITS(size) - 1)) - 1) << 1) + 1)
436
437 /* This macro CHANGES the first parameter IN PLACE. For proper sign handling,
438 we must first shift left, then right.
439 */
440 #define GET_BITFIELD(v, size) \
441 if (NUM_BITS(size)) { \
442 v <<= (sizeof(v)*8 - LOW_BIT(size) - NUM_BITS(size)); \
443 v >>= (sizeof(v)*8 - NUM_BITS(size)); \
444 }
445
446 /* This macro RETURNS the first parameter with the bit field CHANGED. */
447 #define SET(type, x, v, size) \
448 (NUM_BITS(size) ? \
449 ( ( (type)x & ~(BIT_MASK(type, size) << LOW_BIT(size)) ) | ( ((type)v & BIT_MASK(type, size)) << LOW_BIT(size) ) ) \
450 : (type)v)
451
452 #if SIZEOF_SHORT == 2
453 # define SWAP_SHORT _Py_bswap16
454 #else
455 # error "unsupported short size"
456 #endif
457
458 #if SIZEOF_INT == 4
459 # define SWAP_INT _Py_bswap32
460 #else
461 # error "unsupported int size"
462 #endif
463
464 #if SIZEOF_LONG == 4
465 # define SWAP_LONG _Py_bswap32
466 #elif SIZEOF_LONG == 8
467 # define SWAP_LONG _Py_bswap64
468 #else
469 # error "unsupported long size"
470 #endif
471
472 #if SIZEOF_LONG_LONG == 8
473 # define SWAP_LONG_LONG _Py_bswap64
474 #else
475 # error "unsupported long long size"
476 #endif
477
478 /*****************************************************************
479 * The setter methods return an object which must be kept alive, to keep the
480 * data valid which has been stored in the memory block. The ctypes object
481 * instance inserts this object into its 'b_objects' list.
482 *
483 * For simple Python types like integers or characters, there is nothing that
484 * has to been kept alive, so Py_None is returned in these cases. But this
485 * makes inspecting the 'b_objects' list, which is accessible from Python for
486 * debugging, less useful.
487 *
488 * So, defining the _CTYPES_DEBUG_KEEP symbol returns the original value
489 * instead of Py_None.
490 */
491
492 #ifdef _CTYPES_DEBUG_KEEP
493 #define _RET(x) Py_INCREF(x); return x
494 #else
495 #define _RET(X) Py_RETURN_NONE
496 #endif
497
498 /*****************************************************************
499 * integer accessor methods, supporting bit fields
500 */
501
502 static PyObject *
b_set(void * ptr,PyObject * value,Py_ssize_t size)503 b_set(void *ptr, PyObject *value, Py_ssize_t size)
504 {
505 long val;
506 if (get_long(value, &val) < 0)
507 return NULL;
508 *(signed char *)ptr = SET(signed char, *(signed char *)ptr, val, size);
509 _RET(value);
510 }
511
512
513 static PyObject *
b_get(void * ptr,Py_ssize_t size)514 b_get(void *ptr, Py_ssize_t size)
515 {
516 signed char val = *(signed char *)ptr;
517 GET_BITFIELD(val, size);
518 return PyLong_FromLong(val);
519 }
520
521 static PyObject *
B_set(void * ptr,PyObject * value,Py_ssize_t size)522 B_set(void *ptr, PyObject *value, Py_ssize_t size)
523 {
524 unsigned long val;
525 if (get_ulong(value, &val) < 0)
526 return NULL;
527 *(unsigned char *)ptr = SET(unsigned char, *(unsigned char*)ptr, val, size);
528 _RET(value);
529 }
530
531
532 static PyObject *
B_get(void * ptr,Py_ssize_t size)533 B_get(void *ptr, Py_ssize_t size)
534 {
535 unsigned char val = *(unsigned char *)ptr;
536 GET_BITFIELD(val, size);
537 return PyLong_FromLong(val);
538 }
539
540 static PyObject *
h_set(void * ptr,PyObject * value,Py_ssize_t size)541 h_set(void *ptr, PyObject *value, Py_ssize_t size)
542 {
543 long val;
544 short x;
545 if (get_long(value, &val) < 0)
546 return NULL;
547 memcpy(&x, ptr, sizeof(x));
548 x = SET(short, x, val, size);
549 memcpy(ptr, &x, sizeof(x));
550 _RET(value);
551 }
552
553
554 static PyObject *
h_set_sw(void * ptr,PyObject * value,Py_ssize_t size)555 h_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
556 {
557 long val;
558 short field;
559 if (get_long(value, &val) < 0) {
560 return NULL;
561 }
562 memcpy(&field, ptr, sizeof(field));
563 field = SWAP_SHORT(field);
564 field = SET(short, field, val, size);
565 field = SWAP_SHORT(field);
566 memcpy(ptr, &field, sizeof(field));
567 _RET(value);
568 }
569
570 static PyObject *
h_get(void * ptr,Py_ssize_t size)571 h_get(void *ptr, Py_ssize_t size)
572 {
573 short val;
574 memcpy(&val, ptr, sizeof(val));
575 GET_BITFIELD(val, size);
576 return PyLong_FromLong((long)val);
577 }
578
579 static PyObject *
h_get_sw(void * ptr,Py_ssize_t size)580 h_get_sw(void *ptr, Py_ssize_t size)
581 {
582 short val;
583 memcpy(&val, ptr, sizeof(val));
584 val = SWAP_SHORT(val);
585 GET_BITFIELD(val, size);
586 return PyLong_FromLong(val);
587 }
588
589 static PyObject *
H_set(void * ptr,PyObject * value,Py_ssize_t size)590 H_set(void *ptr, PyObject *value, Py_ssize_t size)
591 {
592 unsigned long val;
593 unsigned short x;
594 if (get_ulong(value, &val) < 0)
595 return NULL;
596 memcpy(&x, ptr, sizeof(x));
597 x = SET(unsigned short, x, val, size);
598 memcpy(ptr, &x, sizeof(x));
599 _RET(value);
600 }
601
602 static PyObject *
H_set_sw(void * ptr,PyObject * value,Py_ssize_t size)603 H_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
604 {
605 unsigned long val;
606 unsigned short field;
607 if (get_ulong(value, &val) < 0) {
608 return NULL;
609 }
610 memcpy(&field, ptr, sizeof(field));
611 field = SWAP_SHORT(field);
612 field = SET(unsigned short, field, val, size);
613 field = SWAP_SHORT(field);
614 memcpy(ptr, &field, sizeof(field));
615 _RET(value);
616 }
617
618
619 static PyObject *
H_get(void * ptr,Py_ssize_t size)620 H_get(void *ptr, Py_ssize_t size)
621 {
622 unsigned short val;
623 memcpy(&val, ptr, sizeof(val));
624 GET_BITFIELD(val, size);
625 return PyLong_FromLong(val);
626 }
627
628 static PyObject *
H_get_sw(void * ptr,Py_ssize_t size)629 H_get_sw(void *ptr, Py_ssize_t size)
630 {
631 unsigned short val;
632 memcpy(&val, ptr, sizeof(val));
633 val = SWAP_SHORT(val);
634 GET_BITFIELD(val, size);
635 return PyLong_FromLong(val);
636 }
637
638 static PyObject *
i_set(void * ptr,PyObject * value,Py_ssize_t size)639 i_set(void *ptr, PyObject *value, Py_ssize_t size)
640 {
641 long val;
642 int x;
643 if (get_long(value, &val) < 0)
644 return NULL;
645 memcpy(&x, ptr, sizeof(x));
646 x = SET(int, x, val, size);
647 memcpy(ptr, &x, sizeof(x));
648 _RET(value);
649 }
650
651 static PyObject *
i_set_sw(void * ptr,PyObject * value,Py_ssize_t size)652 i_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
653 {
654 long val;
655 int field;
656 if (get_long(value, &val) < 0) {
657 return NULL;
658 }
659 memcpy(&field, ptr, sizeof(field));
660 field = SWAP_INT(field);
661 field = SET(int, field, val, size);
662 field = SWAP_INT(field);
663 memcpy(ptr, &field, sizeof(field));
664 _RET(value);
665 }
666
667
668 static PyObject *
i_get(void * ptr,Py_ssize_t size)669 i_get(void *ptr, Py_ssize_t size)
670 {
671 int val;
672 memcpy(&val, ptr, sizeof(val));
673 GET_BITFIELD(val, size);
674 return PyLong_FromLong(val);
675 }
676
677 static PyObject *
i_get_sw(void * ptr,Py_ssize_t size)678 i_get_sw(void *ptr, Py_ssize_t size)
679 {
680 int val;
681 memcpy(&val, ptr, sizeof(val));
682 val = SWAP_INT(val);
683 GET_BITFIELD(val, size);
684 return PyLong_FromLong(val);
685 }
686
687 #ifndef MS_WIN32
688 /* http://msdn.microsoft.com/en-us/library/cc237864.aspx */
689 #define VARIANT_FALSE 0x0000
690 #define VARIANT_TRUE 0xFFFF
691 #endif
692 /* short BOOL - VARIANT_BOOL */
693 static PyObject *
vBOOL_set(void * ptr,PyObject * value,Py_ssize_t size)694 vBOOL_set(void *ptr, PyObject *value, Py_ssize_t size)
695 {
696 switch (PyObject_IsTrue(value)) {
697 case -1:
698 return NULL;
699 case 0:
700 *(short int *)ptr = VARIANT_FALSE;
701 _RET(value);
702 default:
703 *(short int *)ptr = VARIANT_TRUE;
704 _RET(value);
705 }
706 }
707
708 static PyObject *
vBOOL_get(void * ptr,Py_ssize_t size)709 vBOOL_get(void *ptr, Py_ssize_t size)
710 {
711 return PyBool_FromLong((long)*(short int *)ptr);
712 }
713
714 static PyObject *
bool_set(void * ptr,PyObject * value,Py_ssize_t size)715 bool_set(void *ptr, PyObject *value, Py_ssize_t size)
716 {
717 switch (PyObject_IsTrue(value)) {
718 case -1:
719 return NULL;
720 case 0:
721 *(_Bool *)ptr = 0;
722 _RET(value);
723 default:
724 *(_Bool *)ptr = 1;
725 _RET(value);
726 }
727 }
728
729 static PyObject *
bool_get(void * ptr,Py_ssize_t size)730 bool_get(void *ptr, Py_ssize_t size)
731 {
732 return PyBool_FromLong((long)*(_Bool *)ptr);
733 }
734
735 static PyObject *
I_set(void * ptr,PyObject * value,Py_ssize_t size)736 I_set(void *ptr, PyObject *value, Py_ssize_t size)
737 {
738 unsigned long val;
739 unsigned int x;
740 if (get_ulong(value, &val) < 0)
741 return NULL;
742 memcpy(&x, ptr, sizeof(x));
743 x = SET(unsigned int, x, val, size);
744 memcpy(ptr, &x, sizeof(x));
745 _RET(value);
746 }
747
748 static PyObject *
I_set_sw(void * ptr,PyObject * value,Py_ssize_t size)749 I_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
750 {
751 unsigned long val;
752 unsigned int field;
753 if (get_ulong(value, &val) < 0) {
754 return NULL;
755 }
756 memcpy(&field, ptr, sizeof(field));
757 field = SWAP_INT(field);
758 field = SET(unsigned int, field, (unsigned int)val, size);
759 field = SWAP_INT(field);
760 memcpy(ptr, &field, sizeof(field));
761 _RET(value);
762 }
763
764
765 static PyObject *
I_get(void * ptr,Py_ssize_t size)766 I_get(void *ptr, Py_ssize_t size)
767 {
768 unsigned int val;
769 memcpy(&val, ptr, sizeof(val));
770 GET_BITFIELD(val, size);
771 return PyLong_FromUnsignedLong(val);
772 }
773
774 static PyObject *
I_get_sw(void * ptr,Py_ssize_t size)775 I_get_sw(void *ptr, Py_ssize_t size)
776 {
777 unsigned int val;
778 memcpy(&val, ptr, sizeof(val));
779 val = SWAP_INT(val);
780 GET_BITFIELD(val, size);
781 return PyLong_FromUnsignedLong(val);
782 }
783
784 static PyObject *
l_set(void * ptr,PyObject * value,Py_ssize_t size)785 l_set(void *ptr, PyObject *value, Py_ssize_t size)
786 {
787 long val;
788 long x;
789 if (get_long(value, &val) < 0)
790 return NULL;
791 memcpy(&x, ptr, sizeof(x));
792 x = SET(long, x, val, size);
793 memcpy(ptr, &x, sizeof(x));
794 _RET(value);
795 }
796
797 static PyObject *
l_set_sw(void * ptr,PyObject * value,Py_ssize_t size)798 l_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
799 {
800 long val;
801 long field;
802 if (get_long(value, &val) < 0) {
803 return NULL;
804 }
805 memcpy(&field, ptr, sizeof(field));
806 field = SWAP_LONG(field);
807 field = SET(long, field, val, size);
808 field = SWAP_LONG(field);
809 memcpy(ptr, &field, sizeof(field));
810 _RET(value);
811 }
812
813
814 static PyObject *
l_get(void * ptr,Py_ssize_t size)815 l_get(void *ptr, Py_ssize_t size)
816 {
817 long val;
818 memcpy(&val, ptr, sizeof(val));
819 GET_BITFIELD(val, size);
820 return PyLong_FromLong(val);
821 }
822
823 static PyObject *
l_get_sw(void * ptr,Py_ssize_t size)824 l_get_sw(void *ptr, Py_ssize_t size)
825 {
826 long val;
827 memcpy(&val, ptr, sizeof(val));
828 val = SWAP_LONG(val);
829 GET_BITFIELD(val, size);
830 return PyLong_FromLong(val);
831 }
832
833 static PyObject *
L_set(void * ptr,PyObject * value,Py_ssize_t size)834 L_set(void *ptr, PyObject *value, Py_ssize_t size)
835 {
836 unsigned long val;
837 unsigned long x;
838 if (get_ulong(value, &val) < 0)
839 return NULL;
840 memcpy(&x, ptr, sizeof(x));
841 x = SET(unsigned long, x, val, size);
842 memcpy(ptr, &x, sizeof(x));
843 _RET(value);
844 }
845
846 static PyObject *
L_set_sw(void * ptr,PyObject * value,Py_ssize_t size)847 L_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
848 {
849 unsigned long val;
850 unsigned long field;
851 if (get_ulong(value, &val) < 0) {
852 return NULL;
853 }
854 memcpy(&field, ptr, sizeof(field));
855 field = SWAP_LONG(field);
856 field = SET(unsigned long, field, val, size);
857 field = SWAP_LONG(field);
858 memcpy(ptr, &field, sizeof(field));
859 _RET(value);
860 }
861
862
863 static PyObject *
L_get(void * ptr,Py_ssize_t size)864 L_get(void *ptr, Py_ssize_t size)
865 {
866 unsigned long val;
867 memcpy(&val, ptr, sizeof(val));
868 GET_BITFIELD(val, size);
869 return PyLong_FromUnsignedLong(val);
870 }
871
872 static PyObject *
L_get_sw(void * ptr,Py_ssize_t size)873 L_get_sw(void *ptr, Py_ssize_t size)
874 {
875 unsigned long val;
876 memcpy(&val, ptr, sizeof(val));
877 val = SWAP_LONG(val);
878 GET_BITFIELD(val, size);
879 return PyLong_FromUnsignedLong(val);
880 }
881
882 static PyObject *
q_set(void * ptr,PyObject * value,Py_ssize_t size)883 q_set(void *ptr, PyObject *value, Py_ssize_t size)
884 {
885 long long val;
886 long long x;
887 if (get_longlong(value, &val) < 0)
888 return NULL;
889 memcpy(&x, ptr, sizeof(x));
890 x = SET(long long, x, val, size);
891 memcpy(ptr, &x, sizeof(x));
892 _RET(value);
893 }
894
895 static PyObject *
q_set_sw(void * ptr,PyObject * value,Py_ssize_t size)896 q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
897 {
898 long long val;
899 long long field;
900 if (get_longlong(value, &val) < 0) {
901 return NULL;
902 }
903 memcpy(&field, ptr, sizeof(field));
904 field = SWAP_LONG_LONG(field);
905 field = SET(long long, field, val, size);
906 field = SWAP_LONG_LONG(field);
907 memcpy(ptr, &field, sizeof(field));
908 _RET(value);
909 }
910
911 static PyObject *
q_get(void * ptr,Py_ssize_t size)912 q_get(void *ptr, Py_ssize_t size)
913 {
914 long long val;
915 memcpy(&val, ptr, sizeof(val));
916 GET_BITFIELD(val, size);
917 return PyLong_FromLongLong(val);
918 }
919
920 static PyObject *
q_get_sw(void * ptr,Py_ssize_t size)921 q_get_sw(void *ptr, Py_ssize_t size)
922 {
923 long long val;
924 memcpy(&val, ptr, sizeof(val));
925 val = SWAP_LONG_LONG(val);
926 GET_BITFIELD(val, size);
927 return PyLong_FromLongLong(val);
928 }
929
930 static PyObject *
Q_set(void * ptr,PyObject * value,Py_ssize_t size)931 Q_set(void *ptr, PyObject *value, Py_ssize_t size)
932 {
933 unsigned long long val;
934 unsigned long long x;
935 if (get_ulonglong(value, &val) < 0)
936 return NULL;
937 memcpy(&x, ptr, sizeof(x));
938 x = SET(long long, x, val, size);
939 memcpy(ptr, &x, sizeof(x));
940 _RET(value);
941 }
942
943 static PyObject *
Q_set_sw(void * ptr,PyObject * value,Py_ssize_t size)944 Q_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
945 {
946 unsigned long long val;
947 unsigned long long field;
948 if (get_ulonglong(value, &val) < 0) {
949 return NULL;
950 }
951 memcpy(&field, ptr, sizeof(field));
952 field = SWAP_LONG_LONG(field);
953 field = SET(unsigned long long, field, val, size);
954 field = SWAP_LONG_LONG(field);
955 memcpy(ptr, &field, sizeof(field));
956 _RET(value);
957 }
958
959 static PyObject *
Q_get(void * ptr,Py_ssize_t size)960 Q_get(void *ptr, Py_ssize_t size)
961 {
962 unsigned long long val;
963 memcpy(&val, ptr, sizeof(val));
964 GET_BITFIELD(val, size);
965 return PyLong_FromUnsignedLongLong(val);
966 }
967
968 static PyObject *
Q_get_sw(void * ptr,Py_ssize_t size)969 Q_get_sw(void *ptr, Py_ssize_t size)
970 {
971 unsigned long long val;
972 memcpy(&val, ptr, sizeof(val));
973 val = SWAP_LONG_LONG(val);
974 GET_BITFIELD(val, size);
975 return PyLong_FromUnsignedLongLong(val);
976 }
977
978 /*****************************************************************
979 * non-integer accessor methods, not supporting bit fields
980 */
981
982
983 static PyObject *
g_set(void * ptr,PyObject * value,Py_ssize_t size)984 g_set(void *ptr, PyObject *value, Py_ssize_t size)
985 {
986 long double x;
987
988 x = PyFloat_AsDouble(value);
989 if (x == -1 && PyErr_Occurred())
990 return NULL;
991 memcpy(ptr, &x, sizeof(long double));
992 _RET(value);
993 }
994
995 static PyObject *
g_get(void * ptr,Py_ssize_t size)996 g_get(void *ptr, Py_ssize_t size)
997 {
998 long double val;
999 memcpy(&val, ptr, sizeof(long double));
1000 return PyFloat_FromDouble(val);
1001 }
1002
1003 static PyObject *
d_set(void * ptr,PyObject * value,Py_ssize_t size)1004 d_set(void *ptr, PyObject *value, Py_ssize_t size)
1005 {
1006 double x;
1007
1008 x = PyFloat_AsDouble(value);
1009 if (x == -1 && PyErr_Occurred())
1010 return NULL;
1011 memcpy(ptr, &x, sizeof(double));
1012 _RET(value);
1013 }
1014
1015 static PyObject *
d_get(void * ptr,Py_ssize_t size)1016 d_get(void *ptr, Py_ssize_t size)
1017 {
1018 double val;
1019 memcpy(&val, ptr, sizeof(val));
1020 return PyFloat_FromDouble(val);
1021 }
1022
1023 static PyObject *
d_set_sw(void * ptr,PyObject * value,Py_ssize_t size)1024 d_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
1025 {
1026 double x;
1027
1028 x = PyFloat_AsDouble(value);
1029 if (x == -1 && PyErr_Occurred())
1030 return NULL;
1031 #ifdef WORDS_BIGENDIAN
1032 if (_PyFloat_Pack8(x, (unsigned char *)ptr, 1))
1033 return NULL;
1034 #else
1035 if (_PyFloat_Pack8(x, (unsigned char *)ptr, 0))
1036 return NULL;
1037 #endif
1038 _RET(value);
1039 }
1040
1041 static PyObject *
d_get_sw(void * ptr,Py_ssize_t size)1042 d_get_sw(void *ptr, Py_ssize_t size)
1043 {
1044 #ifdef WORDS_BIGENDIAN
1045 return PyFloat_FromDouble(_PyFloat_Unpack8(ptr, 1));
1046 #else
1047 return PyFloat_FromDouble(_PyFloat_Unpack8(ptr, 0));
1048 #endif
1049 }
1050
1051 static PyObject *
f_set(void * ptr,PyObject * value,Py_ssize_t size)1052 f_set(void *ptr, PyObject *value, Py_ssize_t size)
1053 {
1054 float x;
1055
1056 x = (float)PyFloat_AsDouble(value);
1057 if (x == -1 && PyErr_Occurred())
1058 return NULL;
1059 memcpy(ptr, &x, sizeof(x));
1060 _RET(value);
1061 }
1062
1063 static PyObject *
f_get(void * ptr,Py_ssize_t size)1064 f_get(void *ptr, Py_ssize_t size)
1065 {
1066 float val;
1067 memcpy(&val, ptr, sizeof(val));
1068 return PyFloat_FromDouble(val);
1069 }
1070
1071 static PyObject *
f_set_sw(void * ptr,PyObject * value,Py_ssize_t size)1072 f_set_sw(void *ptr, PyObject *value, Py_ssize_t size)
1073 {
1074 float x;
1075
1076 x = (float)PyFloat_AsDouble(value);
1077 if (x == -1 && PyErr_Occurred())
1078 return NULL;
1079 #ifdef WORDS_BIGENDIAN
1080 if (_PyFloat_Pack4(x, (unsigned char *)ptr, 1))
1081 return NULL;
1082 #else
1083 if (_PyFloat_Pack4(x, (unsigned char *)ptr, 0))
1084 return NULL;
1085 #endif
1086 _RET(value);
1087 }
1088
1089 static PyObject *
f_get_sw(void * ptr,Py_ssize_t size)1090 f_get_sw(void *ptr, Py_ssize_t size)
1091 {
1092 #ifdef WORDS_BIGENDIAN
1093 return PyFloat_FromDouble(_PyFloat_Unpack4(ptr, 1));
1094 #else
1095 return PyFloat_FromDouble(_PyFloat_Unpack4(ptr, 0));
1096 #endif
1097 }
1098
1099 /*
1100 py_object refcounts:
1101
1102 1. If we have a py_object instance, O_get must Py_INCREF the returned
1103 object, of course. If O_get is called from a function result, no py_object
1104 instance is created - so callproc.c::GetResult has to call Py_DECREF.
1105
1106 2. The memory block in py_object owns a refcount. So, py_object must call
1107 Py_DECREF on destruction. Maybe only when b_needsfree is non-zero.
1108 */
1109 static PyObject *
O_get(void * ptr,Py_ssize_t size)1110 O_get(void *ptr, Py_ssize_t size)
1111 {
1112 PyObject *ob = *(PyObject **)ptr;
1113 if (ob == NULL) {
1114 if (!PyErr_Occurred())
1115 /* Set an error if not yet set */
1116 PyErr_SetString(PyExc_ValueError,
1117 "PyObject is NULL");
1118 return NULL;
1119 }
1120 Py_INCREF(ob);
1121 return ob;
1122 }
1123
1124 static PyObject *
O_set(void * ptr,PyObject * value,Py_ssize_t size)1125 O_set(void *ptr, PyObject *value, Py_ssize_t size)
1126 {
1127 /* Hm, does the memory block need it's own refcount or not? */
1128 *(PyObject **)ptr = value;
1129 Py_INCREF(value);
1130 return value;
1131 }
1132
1133
1134 static PyObject *
c_set(void * ptr,PyObject * value,Py_ssize_t size)1135 c_set(void *ptr, PyObject *value, Py_ssize_t size)
1136 {
1137 if (PyBytes_Check(value) && PyBytes_GET_SIZE(value) == 1) {
1138 *(char *)ptr = PyBytes_AS_STRING(value)[0];
1139 _RET(value);
1140 }
1141 if (PyByteArray_Check(value) && PyByteArray_GET_SIZE(value) == 1) {
1142 *(char *)ptr = PyByteArray_AS_STRING(value)[0];
1143 _RET(value);
1144 }
1145 if (PyLong_Check(value))
1146 {
1147 long longval = PyLong_AsLong(value);
1148 if (longval < 0 || longval >= 256)
1149 goto error;
1150 *(char *)ptr = (char)longval;
1151 _RET(value);
1152 }
1153 error:
1154 PyErr_Format(PyExc_TypeError,
1155 "one character bytes, bytearray or integer expected");
1156 return NULL;
1157 }
1158
1159
1160 static PyObject *
c_get(void * ptr,Py_ssize_t size)1161 c_get(void *ptr, Py_ssize_t size)
1162 {
1163 return PyBytes_FromStringAndSize((char *)ptr, 1);
1164 }
1165
1166 #ifdef CTYPES_UNICODE
1167 /* u - a single wchar_t character */
1168 static PyObject *
u_set(void * ptr,PyObject * value,Py_ssize_t size)1169 u_set(void *ptr, PyObject *value, Py_ssize_t size)
1170 {
1171 Py_ssize_t len;
1172 wchar_t chars[2];
1173 if (!PyUnicode_Check(value)) {
1174 PyErr_Format(PyExc_TypeError,
1175 "unicode string expected instead of %s instance",
1176 Py_TYPE(value)->tp_name);
1177 return NULL;
1178 } else
1179 Py_INCREF(value);
1180
1181 len = PyUnicode_AsWideChar(value, chars, 2);
1182 if (len != 1) {
1183 Py_DECREF(value);
1184 PyErr_SetString(PyExc_TypeError,
1185 "one character unicode string expected");
1186 return NULL;
1187 }
1188
1189 *(wchar_t *)ptr = chars[0];
1190 Py_DECREF(value);
1191
1192 _RET(value);
1193 }
1194
1195
1196 static PyObject *
u_get(void * ptr,Py_ssize_t size)1197 u_get(void *ptr, Py_ssize_t size)
1198 {
1199 return PyUnicode_FromWideChar((wchar_t *)ptr, 1);
1200 }
1201
1202 /* U - a unicode string */
1203 static PyObject *
U_get(void * ptr,Py_ssize_t size)1204 U_get(void *ptr, Py_ssize_t size)
1205 {
1206 Py_ssize_t len;
1207 wchar_t *p;
1208
1209 size /= sizeof(wchar_t); /* we count character units here, not bytes */
1210
1211 /* We need 'result' to be able to count the characters with wcslen,
1212 since ptr may not be NUL terminated. If the length is smaller (if
1213 it was actually NUL terminated, we construct a new one and throw
1214 away the result.
1215 */
1216 /* chop off at the first NUL character, if any. */
1217 p = (wchar_t*)ptr;
1218 for (len = 0; len < size; ++len) {
1219 if (!p[len])
1220 break;
1221 }
1222
1223 return PyUnicode_FromWideChar((wchar_t *)ptr, len);
1224 }
1225
1226 static PyObject *
U_set(void * ptr,PyObject * value,Py_ssize_t length)1227 U_set(void *ptr, PyObject *value, Py_ssize_t length)
1228 {
1229 /* It's easier to calculate in characters than in bytes */
1230 length /= sizeof(wchar_t);
1231
1232 if (!PyUnicode_Check(value)) {
1233 PyErr_Format(PyExc_TypeError,
1234 "unicode string expected instead of %s instance",
1235 Py_TYPE(value)->tp_name);
1236 return NULL;
1237 }
1238
1239 Py_ssize_t size = PyUnicode_AsWideChar(value, NULL, 0);
1240 if (size < 0) {
1241 return NULL;
1242 }
1243 // PyUnicode_AsWideChar() returns number of wchars including trailing null byte,
1244 // when it is called with NULL.
1245 size--;
1246 assert(size >= 0);
1247 if (size > length) {
1248 PyErr_Format(PyExc_ValueError,
1249 "string too long (%zd, maximum length %zd)",
1250 size, length);
1251 return NULL;
1252 } else if (size < length-1)
1253 /* copy terminating NUL character if there is space */
1254 size += 1;
1255
1256 if (PyUnicode_AsWideChar(value, (wchar_t *)ptr, size) == -1) {
1257 return NULL;
1258 }
1259
1260 Py_INCREF(value);
1261 return value;
1262 }
1263
1264 #endif
1265
1266 static PyObject *
s_get(void * ptr,Py_ssize_t size)1267 s_get(void *ptr, Py_ssize_t size)
1268 {
1269 Py_ssize_t i;
1270 char *p;
1271
1272 p = (char *)ptr;
1273 for (i = 0; i < size; ++i) {
1274 if (*p++ == '\0')
1275 break;
1276 }
1277
1278 return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
1279 }
1280
1281 static PyObject *
s_set(void * ptr,PyObject * value,Py_ssize_t length)1282 s_set(void *ptr, PyObject *value, Py_ssize_t length)
1283 {
1284 const char *data;
1285 Py_ssize_t size;
1286
1287 if(!PyBytes_Check(value)) {
1288 PyErr_Format(PyExc_TypeError,
1289 "expected bytes, %s found",
1290 Py_TYPE(value)->tp_name);
1291 return NULL;
1292 }
1293
1294 data = PyBytes_AS_STRING(value);
1295 size = strlen(data); /* XXX Why not Py_SIZE(value)? */
1296 if (size < length) {
1297 /* This will copy the terminating NUL character
1298 * if there is space for it.
1299 */
1300 ++size;
1301 } else if (size > length) {
1302 PyErr_Format(PyExc_ValueError,
1303 "bytes too long (%zd, maximum length %zd)",
1304 size, length);
1305 return NULL;
1306 }
1307 /* Also copy the terminating NUL character if there is space */
1308 memcpy((char *)ptr, data, size);
1309
1310 _RET(value);
1311 }
1312
1313 static PyObject *
z_set(void * ptr,PyObject * value,Py_ssize_t size)1314 z_set(void *ptr, PyObject *value, Py_ssize_t size)
1315 {
1316 if (value == Py_None) {
1317 *(char **)ptr = NULL;
1318 Py_INCREF(value);
1319 return value;
1320 }
1321 if (PyBytes_Check(value)) {
1322 *(const char **)ptr = PyBytes_AsString(value);
1323 Py_INCREF(value);
1324 return value;
1325 } else if (PyLong_Check(value)) {
1326 #if SIZEOF_VOID_P == SIZEOF_LONG_LONG
1327 *(char **)ptr = (char *)PyLong_AsUnsignedLongLongMask(value);
1328 #else
1329 *(char **)ptr = (char *)PyLong_AsUnsignedLongMask(value);
1330 #endif
1331 _RET(value);
1332 }
1333 PyErr_Format(PyExc_TypeError,
1334 "bytes or integer address expected instead of %s instance",
1335 Py_TYPE(value)->tp_name);
1336 return NULL;
1337 }
1338
1339 static PyObject *
z_get(void * ptr,Py_ssize_t size)1340 z_get(void *ptr, Py_ssize_t size)
1341 {
1342 /* XXX What about invalid pointers ??? */
1343 if (*(void **)ptr) {
1344 return PyBytes_FromStringAndSize(*(char **)ptr,
1345 strlen(*(char **)ptr));
1346 } else {
1347 Py_RETURN_NONE;
1348 }
1349 }
1350
1351 #ifdef CTYPES_UNICODE
1352 static PyObject *
Z_set(void * ptr,PyObject * value,Py_ssize_t size)1353 Z_set(void *ptr, PyObject *value, Py_ssize_t size)
1354 {
1355 PyObject *keep;
1356 wchar_t *buffer;
1357
1358 if (value == Py_None) {
1359 *(wchar_t **)ptr = NULL;
1360 Py_INCREF(value);
1361 return value;
1362 }
1363 if (PyLong_Check(value)) {
1364 #if SIZEOF_VOID_P == SIZEOF_LONG_LONG
1365 *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongLongMask(value);
1366 #else
1367 *(wchar_t **)ptr = (wchar_t *)PyLong_AsUnsignedLongMask(value);
1368 #endif
1369 Py_RETURN_NONE;
1370 }
1371 if (!PyUnicode_Check(value)) {
1372 PyErr_Format(PyExc_TypeError,
1373 "unicode string or integer address expected instead of %s instance",
1374 Py_TYPE(value)->tp_name);
1375 return NULL;
1376 }
1377
1378 /* We must create a wchar_t* buffer from the unicode object,
1379 and keep it alive */
1380 buffer = PyUnicode_AsWideCharString(value, NULL);
1381 if (!buffer)
1382 return NULL;
1383 keep = PyCapsule_New(buffer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM, pymem_destructor);
1384 if (!keep) {
1385 PyMem_Free(buffer);
1386 return NULL;
1387 }
1388 *(wchar_t **)ptr = buffer;
1389 return keep;
1390 }
1391
1392 static PyObject *
Z_get(void * ptr,Py_ssize_t size)1393 Z_get(void *ptr, Py_ssize_t size)
1394 {
1395 wchar_t *p;
1396 p = *(wchar_t **)ptr;
1397 if (p) {
1398 return PyUnicode_FromWideChar(p, wcslen(p));
1399 } else {
1400 Py_RETURN_NONE;
1401 }
1402 }
1403 #endif
1404
1405 #ifdef MS_WIN32
1406 static PyObject *
BSTR_set(void * ptr,PyObject * value,Py_ssize_t size)1407 BSTR_set(void *ptr, PyObject *value, Py_ssize_t size)
1408 {
1409 BSTR bstr;
1410
1411 /* convert value into a PyUnicodeObject or NULL */
1412 if (Py_None == value) {
1413 value = NULL;
1414 } else if (!PyUnicode_Check(value)) {
1415 PyErr_Format(PyExc_TypeError,
1416 "unicode string expected instead of %s instance",
1417 Py_TYPE(value)->tp_name);
1418 return NULL;
1419 }
1420
1421 /* create a BSTR from value */
1422 if (value) {
1423 Py_ssize_t wsize;
1424 wchar_t *wvalue = PyUnicode_AsWideCharString(value, &wsize);
1425 if (wvalue == NULL) {
1426 return NULL;
1427 }
1428 if ((unsigned) wsize != wsize) {
1429 PyErr_SetString(PyExc_ValueError, "String too long for BSTR");
1430 PyMem_Free(wvalue);
1431 return NULL;
1432 }
1433 bstr = SysAllocStringLen(wvalue, (unsigned)wsize);
1434 PyMem_Free(wvalue);
1435 } else
1436 bstr = NULL;
1437
1438 /* free the previous contents, if any */
1439 if (*(BSTR *)ptr)
1440 SysFreeString(*(BSTR *)ptr);
1441
1442 /* and store it */
1443 *(BSTR *)ptr = bstr;
1444
1445 /* We don't need to keep any other object */
1446 _RET(value);
1447 }
1448
1449
1450 static PyObject *
BSTR_get(void * ptr,Py_ssize_t size)1451 BSTR_get(void *ptr, Py_ssize_t size)
1452 {
1453 BSTR p;
1454 p = *(BSTR *)ptr;
1455 if (p)
1456 return PyUnicode_FromWideChar(p, SysStringLen(p));
1457 else {
1458 /* Hm, it seems NULL pointer and zero length string are the
1459 same in BSTR, see Don Box, p 81
1460 */
1461 Py_RETURN_NONE;
1462 }
1463 }
1464 #endif
1465
1466 static PyObject *
P_set(void * ptr,PyObject * value,Py_ssize_t size)1467 P_set(void *ptr, PyObject *value, Py_ssize_t size)
1468 {
1469 void *v;
1470 if (value == Py_None) {
1471 *(void **)ptr = NULL;
1472 _RET(value);
1473 }
1474
1475 if (!PyLong_Check(value)) {
1476 PyErr_SetString(PyExc_TypeError,
1477 "cannot be converted to pointer");
1478 return NULL;
1479 }
1480
1481 #if SIZEOF_VOID_P <= SIZEOF_LONG
1482 v = (void *)PyLong_AsUnsignedLongMask(value);
1483 #else
1484 #if SIZEOF_LONG_LONG < SIZEOF_VOID_P
1485 # error "PyLong_AsVoidPtr: sizeof(long long) < sizeof(void*)"
1486 #endif
1487 v = (void *)PyLong_AsUnsignedLongLongMask(value);
1488 #endif
1489
1490 if (PyErr_Occurred())
1491 return NULL;
1492
1493 *(void **)ptr = v;
1494 _RET(value);
1495 }
1496
1497 static PyObject *
P_get(void * ptr,Py_ssize_t size)1498 P_get(void *ptr, Py_ssize_t size)
1499 {
1500 if (*(void **)ptr == NULL) {
1501 Py_RETURN_NONE;
1502 }
1503 return PyLong_FromVoidPtr(*(void **)ptr);
1504 }
1505
1506 static struct fielddesc formattable[] = {
1507 { 's', s_set, s_get, &ffi_type_pointer},
1508 { 'b', b_set, b_get, &ffi_type_schar},
1509 { 'B', B_set, B_get, &ffi_type_uchar},
1510 { 'c', c_set, c_get, &ffi_type_schar},
1511 { 'd', d_set, d_get, &ffi_type_double, d_set_sw, d_get_sw},
1512 { 'g', g_set, g_get, &ffi_type_longdouble},
1513 { 'f', f_set, f_get, &ffi_type_float, f_set_sw, f_get_sw},
1514 { 'h', h_set, h_get, &ffi_type_sshort, h_set_sw, h_get_sw},
1515 { 'H', H_set, H_get, &ffi_type_ushort, H_set_sw, H_get_sw},
1516 { 'i', i_set, i_get, &ffi_type_sint, i_set_sw, i_get_sw},
1517 { 'I', I_set, I_get, &ffi_type_uint, I_set_sw, I_get_sw},
1518 /* XXX Hm, sizeof(int) == sizeof(long) doesn't hold on every platform */
1519 /* As soon as we can get rid of the type codes, this is no longer a problem */
1520 #if SIZEOF_LONG == 4
1521 { 'l', l_set, l_get, &ffi_type_sint32, l_set_sw, l_get_sw},
1522 { 'L', L_set, L_get, &ffi_type_uint32, L_set_sw, L_get_sw},
1523 #elif SIZEOF_LONG == 8
1524 { 'l', l_set, l_get, &ffi_type_sint64, l_set_sw, l_get_sw},
1525 { 'L', L_set, L_get, &ffi_type_uint64, L_set_sw, L_get_sw},
1526 #else
1527 # error
1528 #endif
1529 #if SIZEOF_LONG_LONG == 8
1530 { 'q', q_set, q_get, &ffi_type_sint64, q_set_sw, q_get_sw},
1531 { 'Q', Q_set, Q_get, &ffi_type_uint64, Q_set_sw, Q_get_sw},
1532 #else
1533 # error
1534 #endif
1535 { 'P', P_set, P_get, &ffi_type_pointer},
1536 { 'z', z_set, z_get, &ffi_type_pointer},
1537 #ifdef CTYPES_UNICODE
1538 { 'u', u_set, u_get, NULL}, /* ffi_type set later */
1539 { 'U', U_set, U_get, &ffi_type_pointer},
1540 { 'Z', Z_set, Z_get, &ffi_type_pointer},
1541 #endif
1542 #ifdef MS_WIN32
1543 { 'X', BSTR_set, BSTR_get, &ffi_type_pointer},
1544 #endif
1545 { 'v', vBOOL_set, vBOOL_get, &ffi_type_sshort},
1546 #if SIZEOF__BOOL == 1
1547 { '?', bool_set, bool_get, &ffi_type_uchar}, /* Also fallback for no native _Bool support */
1548 #elif SIZEOF__BOOL == SIZEOF_SHORT
1549 { '?', bool_set, bool_get, &ffi_type_ushort},
1550 #elif SIZEOF__BOOL == SIZEOF_INT
1551 { '?', bool_set, bool_get, &ffi_type_uint, I_set_sw, I_get_sw},
1552 #elif SIZEOF__BOOL == SIZEOF_LONG
1553 { '?', bool_set, bool_get, &ffi_type_ulong, L_set_sw, L_get_sw},
1554 #elif SIZEOF__BOOL == SIZEOF_LONG_LONG
1555 { '?', bool_set, bool_get, &ffi_type_ulong, Q_set_sw, Q_get_sw},
1556 #endif /* SIZEOF__BOOL */
1557 { 'O', O_set, O_get, &ffi_type_pointer},
1558 { 0, NULL, NULL, NULL},
1559 };
1560
1561 /*
1562 Ideas: Implement VARIANT in this table, using 'V' code.
1563 Use '?' as code for BOOL.
1564 */
1565
1566 struct fielddesc *
_ctypes_get_fielddesc(const char * fmt)1567 _ctypes_get_fielddesc(const char *fmt)
1568 {
1569 static int initialized = 0;
1570 struct fielddesc *table = formattable;
1571
1572 if (!initialized) {
1573 initialized = 1;
1574 #ifdef CTYPES_UNICODE
1575 if (sizeof(wchar_t) == sizeof(short))
1576 _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sshort;
1577 else if (sizeof(wchar_t) == sizeof(int))
1578 _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sint;
1579 else if (sizeof(wchar_t) == sizeof(long))
1580 _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_slong;
1581 #endif
1582 }
1583
1584 for (; table->code; ++table) {
1585 if (table->code == fmt[0])
1586 return table;
1587 }
1588 return NULL;
1589 }
1590
1591 typedef struct { char c; char x; } s_char;
1592 typedef struct { char c; short x; } s_short;
1593 typedef struct { char c; int x; } s_int;
1594 typedef struct { char c; long x; } s_long;
1595 typedef struct { char c; float x; } s_float;
1596 typedef struct { char c; double x; } s_double;
1597 typedef struct { char c; long double x; } s_long_double;
1598 typedef struct { char c; char *x; } s_char_p;
1599 typedef struct { char c; void *x; } s_void_p;
1600
1601 /*
1602 #define CHAR_ALIGN (sizeof(s_char) - sizeof(char))
1603 #define SHORT_ALIGN (sizeof(s_short) - sizeof(short))
1604 #define LONG_ALIGN (sizeof(s_long) - sizeof(long))
1605 */
1606 #define INT_ALIGN (sizeof(s_int) - sizeof(int))
1607 #define FLOAT_ALIGN (sizeof(s_float) - sizeof(float))
1608 #define DOUBLE_ALIGN (sizeof(s_double) - sizeof(double))
1609 #define LONGDOUBLE_ALIGN (sizeof(s_long_double) - sizeof(long double))
1610
1611 /* #define CHAR_P_ALIGN (sizeof(s_char_p) - sizeof(char*)) */
1612 #define VOID_P_ALIGN (sizeof(s_void_p) - sizeof(void*))
1613
1614 /*
1615 #ifdef HAVE_USABLE_WCHAR_T
1616 typedef struct { char c; wchar_t x; } s_wchar;
1617 typedef struct { char c; wchar_t *x; } s_wchar_p;
1618
1619 #define WCHAR_ALIGN (sizeof(s_wchar) - sizeof(wchar_t))
1620 #define WCHAR_P_ALIGN (sizeof(s_wchar_p) - sizeof(wchar_t*))
1621 #endif
1622 */
1623
1624 typedef struct { char c; long long x; } s_long_long;
1625 #define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(long long))
1626
1627 /* from ffi.h:
1628 typedef struct _ffi_type
1629 {
1630 size_t size;
1631 unsigned short alignment;
1632 unsigned short type;
1633 struct _ffi_type **elements;
1634 } ffi_type;
1635 */
1636
1637 /* align and size are bogus for void, but they must not be zero */
1638 ffi_type ffi_type_void = { 1, 1, FFI_TYPE_VOID };
1639
1640 ffi_type ffi_type_uint8 = { 1, 1, FFI_TYPE_UINT8 };
1641 ffi_type ffi_type_sint8 = { 1, 1, FFI_TYPE_SINT8 };
1642
1643 ffi_type ffi_type_uint16 = { 2, 2, FFI_TYPE_UINT16 };
1644 ffi_type ffi_type_sint16 = { 2, 2, FFI_TYPE_SINT16 };
1645
1646 ffi_type ffi_type_uint32 = { 4, INT_ALIGN, FFI_TYPE_UINT32 };
1647 ffi_type ffi_type_sint32 = { 4, INT_ALIGN, FFI_TYPE_SINT32 };
1648
1649 ffi_type ffi_type_uint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_UINT64 };
1650 ffi_type ffi_type_sint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_SINT64 };
1651
1652 ffi_type ffi_type_float = { sizeof(float), FLOAT_ALIGN, FFI_TYPE_FLOAT };
1653 ffi_type ffi_type_double = { sizeof(double), DOUBLE_ALIGN, FFI_TYPE_DOUBLE };
1654
1655 #ifdef ffi_type_longdouble
1656 #undef ffi_type_longdouble
1657 #endif
1658 /* This is already defined on OSX */
1659 ffi_type ffi_type_longdouble = { sizeof(long double), LONGDOUBLE_ALIGN,
1660 FFI_TYPE_LONGDOUBLE };
1661
1662 ffi_type ffi_type_pointer = { sizeof(void *), VOID_P_ALIGN, FFI_TYPE_POINTER };
1663
1664 /*---------------- EOF ----------------*/
1665