1 #ifndef FIDDLE_CONVERSIONS_H 2 #define FIDDLE_CONVERSIONS_H 3 4 #include <fiddle.h> 5 6 typedef 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 27 ffi_type * int_to_ffi_type(int type); 28 void value_to_generic(int type, VALUE src, fiddle_generic * dst); 29 VALUE 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) (LONG2NUM((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) (LL2NUM((LONG_LONG)(x))) 41 # define NUM2PTR(x) ((void*)(NUM2ULL(x))) 42 #endif 43 44 #endif 45