Ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a25176072e02db9254f0e0c84c805cd)
conversions.c
Go to the documentation of this file.
1#include <fiddle.h>
2
3ffi_type *
5{
6 int signed_p = 1;
7
8 if (type < 0) {
9 type = -1 * type;
10 signed_p = 0;
11 }
12
13#define rb_ffi_type_of(t) (signed_p ? &ffi_type_s##t : &ffi_type_u##t)
14
15 switch (type) {
16 case TYPE_VOID:
17 return &ffi_type_void;
18 case TYPE_VOIDP:
19 return &ffi_type_pointer;
20 case TYPE_CHAR:
21 return rb_ffi_type_of(char);
22 case TYPE_SHORT:
23 return rb_ffi_type_of(short);
24 case TYPE_INT:
25 return rb_ffi_type_of(int);
26 case TYPE_LONG:
27 return rb_ffi_type_of(long);
28#if HAVE_LONG_LONG
29 case TYPE_LONG_LONG:
30 return rb_ffi_type_of(long_long);
31#endif
32 case TYPE_FLOAT:
33 return &ffi_type_float;
34 case TYPE_DOUBLE:
35 return &ffi_type_double;
36 default:
37 rb_raise(rb_eRuntimeError, "unknown type %d", type);
38 }
39 return &ffi_type_pointer;
40}
41
42void
44{
45 switch (type) {
46 case TYPE_VOID:
47 break;
48 case TYPE_VOIDP:
50 break;
51 case TYPE_CHAR:
52 dst->schar = (signed char)NUM2INT(src);
53 break;
54 case -TYPE_CHAR:
55 dst->uchar = (unsigned char)NUM2UINT(src);
56 break;
57 case TYPE_SHORT:
58 dst->sshort = (unsigned short)NUM2INT(src);
59 break;
60 case -TYPE_SHORT:
61 dst->sshort = (signed short)NUM2UINT(src);
62 break;
63 case TYPE_INT:
64 dst->sint = NUM2INT(src);
65 break;
66 case -TYPE_INT:
67 dst->uint = NUM2UINT(src);
68 break;
69 case TYPE_LONG:
70 dst->slong = NUM2LONG(src);
71 break;
72 case -TYPE_LONG:
73 dst->ulong = NUM2ULONG(src);
74 break;
75#if HAVE_LONG_LONG
76 case TYPE_LONG_LONG:
77 dst->slong_long = NUM2LL(src);
78 break;
79 case -TYPE_LONG_LONG:
80 dst->ulong_long = NUM2ULL(src);
81 break;
82#endif
83 case TYPE_FLOAT:
84 dst->ffloat = (float)NUM2DBL(src);
85 break;
86 case TYPE_DOUBLE:
87 dst->ddouble = NUM2DBL(src);
88 break;
89 default:
90 rb_raise(rb_eRuntimeError, "unknown type %d", type);
91 }
92}
93
96{
97 int type = NUM2INT(rettype);
98 VALUE cPointer;
99
100 cPointer = rb_const_get(mFiddle, rb_intern("Pointer"));
101
102 switch (type) {
103 case TYPE_VOID:
104 return Qnil;
105 case TYPE_VOIDP:
106 return rb_funcall(cPointer, rb_intern("[]"), 1,
107 PTR2NUM((void *)retval.pointer));
108 case TYPE_CHAR:
109 return INT2NUM((signed char)retval.fffi_sarg);
110 case -TYPE_CHAR:
111 return INT2NUM((unsigned char)retval.fffi_arg);
112 case TYPE_SHORT:
113 return INT2NUM((signed short)retval.fffi_sarg);
114 case -TYPE_SHORT:
115 return INT2NUM((unsigned short)retval.fffi_arg);
116 case TYPE_INT:
117 return INT2NUM((signed int)retval.fffi_sarg);
118 case -TYPE_INT:
119 return UINT2NUM((unsigned int)retval.fffi_arg);
120 case TYPE_LONG:
121 return LONG2NUM(retval.slong);
122 case -TYPE_LONG:
123 return ULONG2NUM(retval.ulong);
124#if HAVE_LONG_LONG
125 case TYPE_LONG_LONG:
126 return LL2NUM(retval.slong_long);
127 case -TYPE_LONG_LONG:
128 return ULL2NUM(retval.ulong_long);
129#endif
130 case TYPE_FLOAT:
131 return rb_float_new(retval.ffloat);
132 case TYPE_DOUBLE:
133 return rb_float_new(retval.ddouble);
134 default:
135 rb_raise(rb_eRuntimeError, "unknown type %d", type);
136 }
137
139}
140
141/* vim: set noet sw=4 sts=4 */
ffi_type * int_to_ffi_type(int type)
Definition: conversions.c:4
#define rb_ffi_type_of(t)
void value_to_generic(int type, VALUE src, fiddle_generic *dst)
Definition: conversions.c:43
VALUE generic_to_value(VALUE rettype, fiddle_generic retval)
Definition: conversions.c:95
#define NUM2PTR(x)
Definition: conversions.h:37
#define PTR2NUM(x)
Definition: conversions.h:36
VALUE mFiddle
Definition: fiddle.c:3
#define TYPE_FLOAT
Definition: fiddle.h:116
#define TYPE_CHAR
Definition: fiddle.h:109
#define TYPE_VOID
Definition: fiddle.h:107
#define TYPE_INT
Definition: fiddle.h:111
#define TYPE_LONG
Definition: fiddle.h:112
#define TYPE_VOIDP
Definition: fiddle.h:108
#define TYPE_DOUBLE
Definition: fiddle.h:117
#define TYPE_SHORT
Definition: fiddle.h:110
void rb_raise(VALUE exc, const char *fmt,...)
Definition: error.c:2671
VALUE rb_eRuntimeError
Definition: error.c:922
VALUE rb_Integer(VALUE)
Equivalent to Kernel#Integer in Ruby.
Definition: object.c:3106
VALUE type(ANYARGS)
ANYARGS-ed function type.
Definition: cxxanyargs.hpp:39
#define NUM2DBL(x)
#define NUM2ULL(x)
#define ULL2NUM(v)
VALUE rb_const_get(VALUE, ID)
Definition: variable.c:2391
#define NUM2ULONG(x)
#define UINT2NUM(x)
#define UNREACHABLE
unsigned long VALUE
__inline__ const void *__restrict__ src
#define rb_float_new(d)
#define char
#define NUM2UINT(x)
#define INT2NUM(x)
#define LONG2NUM(x)
#define NUM2INT(x)
#define rb_funcall(recv, mid, argc,...)
#define short
#define rb_intern(str)
#define Qnil
#define ULONG2NUM(x)
#define NUM2LL(x)
#define LL2NUM(v)
#define NUM2LONG(x)
const ffi_type ffi_type_void
Definition: types.c:63
void * pointer
Definition: conversions.h:24
unsigned int uint
Definition: conversions.h:14
double ddouble
Definition: conversions.h:19
ffi_sarg fffi_sarg
Definition: conversions.h:9
signed char schar
Definition: conversions.h:11
unsigned char uchar
Definition: conversions.h:10
ffi_arg fffi_arg
Definition: conversions.h:8
signed long slong
Definition: conversions.h:17
unsigned long ulong
Definition: conversions.h:16
signed short sshort
Definition: conversions.h:13
signed int sint
Definition: conversions.h:15