• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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