Ruby
1.9.3p551(2014-11-13revision48407)
Main Page
Modules
Data Structures
Files
File List
Globals
ext
fiddle
conversions.c
Go to the documentation of this file.
1
#include <
fiddle.h
>
2
3
ffi_type *
4
int_to_ffi_type
(
int
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
42
void
43
value_to_generic
(
int
type
,
VALUE
src,
fiddle_generic
* dst)
44
{
45
switch
(type) {
46
case
TYPE_VOID
:
47
break
;
48
case
TYPE_VOIDP
:
49
dst->
pointer
=
NUM2PTR
(
rb_Integer
(src));
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
94
VALUE
95
generic_to_value
(
VALUE
rettype,
fiddle_generic
retval)
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
}
138
139
/* vim: set noet sw=4 sts=4 */
140
Generated on Fri Nov 14 2014 16:03:56 for Ruby by
1.8.3