LCOV - code coverage report
Current view: top level - libreoffice/workdir/unxlngi6.pro/UnpackedTarball/python3/Modules/_ctypes - cfield.c (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 606 0.0 %
Date: 2012-12-17 Functions: 0 80 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10