1#ifndef FIDDLE_CONVERSIONS_H
2#define FIDDLE_CONVERSIONS_H
3
4#include <fiddle.h>
5
6typedef union
7{
8    ffi_arg  fffi_arg;     /* rvalue smaller than unsigned long */
9    ffi_sarg fffi_sarg;    /* rvalue smaller than signed long */
10    unsigned char uchar;   /* ffi_type_uchar */
11    signed char   schar;   /* ffi_type_schar */
12    unsigned short ushort; /* ffi_type_sshort */
13    signed short sshort;   /* ffi_type_ushort */
14    unsigned int uint;     /* ffi_type_uint */
15    signed int sint;       /* ffi_type_sint */
16    unsigned long ulong;   /* ffi_type_ulong */
17    signed long slong;     /* ffi_type_slong */
18    float ffloat;          /* ffi_type_float */
19    double ddouble;        /* ffi_type_double */
20#if HAVE_LONG_LONG
21    unsigned LONG_LONG ulong_long; /* ffi_type_ulong_long */
22    signed LONG_LONG slong_long; /* ffi_type_ulong_long */
23#endif
24    void * pointer;        /* ffi_type_pointer */
25} fiddle_generic;
26
27ffi_type * int_to_ffi_type(int type);
28void value_to_generic(int type, VALUE src, fiddle_generic * dst);
29VALUE generic_to_value(VALUE rettype, fiddle_generic retval);
30
31#define VALUE2GENERIC(_type, _src, _dst) value_to_generic((_type), (_src), (_dst))
32#define INT2FFI_TYPE(_type) int_to_ffi_type(_type)
33#define GENERIC2VALUE(_type, _retval) generic_to_value((_type), (_retval))
34
35#if SIZEOF_VOIDP == SIZEOF_LONG
36# define PTR2NUM(x)   (ULONG2NUM((unsigned long)(x)))
37# define NUM2PTR(x)   ((void*)(NUM2ULONG(x)))
38#else
39/* # error --->> Ruby/DL2 requires sizeof(void*) == sizeof(long) to be compiled. <<--- */
40# define PTR2NUM(x)   (ULL2NUM((unsigned long long)(x)))
41# define NUM2PTR(x)   ((void*)(NUM2ULL(x)))
42#endif
43
44#endif
45