Fix accessor struct inlining in GOOPS
[bpt/guile.git] / test-suite / standalone / test-ffi-lib.c
1 /* Copyright (C) 2010, 2011 Free Software Foundation, Inc.
2 *
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public License
5 * as published by the Free Software Foundation; either version 3 of
6 * the License, or (at your option) any later version.
7 *
8 * This library is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 * 02110-1301 USA
17 */
18
19 #ifdef HAVE_CONFIG_H
20 # include <config.h>
21 #endif
22
23 #include <libguile.h>
24
25 void test_ffi_v_ (void);
26 void test_ffi_v_ (void)
27 {
28 return;
29 }
30
31 void test_ffi_v_u8 (scm_t_uint8 a);
32 void test_ffi_v_u8 (scm_t_uint8 a)
33 {
34 return;
35 }
36
37 void test_ffi_v_s64 (scm_t_int64 a);
38 void test_ffi_v_s64 (scm_t_int64 a)
39 {
40 return;
41 }
42
43 scm_t_int8 test_ffi_s8_ (void);
44 scm_t_int8 test_ffi_s8_ (void)
45 {
46 return -100;
47 }
48 scm_t_int8 test_ffi_s8_u8 (scm_t_uint8 a);
49 scm_t_int8 test_ffi_s8_u8 (scm_t_uint8 a)
50 {
51 return -100 + a;
52 }
53
54 scm_t_int8 test_ffi_s8_s64 (scm_t_int64 a);
55 scm_t_int8 test_ffi_s8_s64 (scm_t_int64 a)
56 {
57 return -100 + a;
58 }
59
60 scm_t_uint8 test_ffi_u8_ (void);
61 scm_t_uint8 test_ffi_u8_ (void)
62 {
63 return 200;
64 }
65
66 scm_t_uint8 test_ffi_u8_u8 (scm_t_uint8 a);
67 scm_t_uint8 test_ffi_u8_u8 (scm_t_uint8 a)
68 {
69 return 200 + a;
70 }
71
72 scm_t_uint8 test_ffi_u8_s64 (scm_t_int64 a);
73 scm_t_uint8 test_ffi_u8_s64 (scm_t_int64 a)
74 {
75 return 200 + a;
76 }
77
78 scm_t_int16 test_ffi_s16_ (void);
79 scm_t_int16 test_ffi_s16_ (void)
80 {
81 return -20000;
82 }
83
84 scm_t_int16 test_ffi_s16_u8 (scm_t_uint8 a);
85 scm_t_int16 test_ffi_s16_u8 (scm_t_uint8 a)
86 {
87 return -20000 + a;
88 }
89
90 scm_t_int16 test_ffi_s16_s64 (scm_t_int64 a);
91 scm_t_int16 test_ffi_s16_s64 (scm_t_int64 a)
92 {
93 return -20000 + a;
94 }
95
96 scm_t_uint16 test_ffi_u16_ (void);
97 scm_t_uint16 test_ffi_u16_ (void)
98 {
99 return 40000;
100 }
101
102 scm_t_uint16 test_ffi_u16_u8 (scm_t_uint8 a);
103 scm_t_uint16 test_ffi_u16_u8 (scm_t_uint8 a)
104 {
105 return 40000 + a;
106 }
107
108 scm_t_uint16 test_ffi_u16_s64 (scm_t_int64 a);
109 scm_t_uint16 test_ffi_u16_s64 (scm_t_int64 a)
110 {
111 return 40000 + a;
112 }
113
114 scm_t_int32 test_ffi_s32_ (void);
115 scm_t_int32 test_ffi_s32_ (void)
116 {
117 return -2000000000;
118 }
119
120 scm_t_int32 test_ffi_s32_u8 (scm_t_uint8 a);
121 scm_t_int32 test_ffi_s32_u8 (scm_t_uint8 a)
122 {
123 return -2000000000 + a;
124 }
125
126 scm_t_int32 test_ffi_s32_s64 (scm_t_int64 a);
127 scm_t_int32 test_ffi_s32_s64 (scm_t_int64 a)
128 {
129 return -2000000000 + a;
130 }
131
132 scm_t_uint32 test_ffi_u32_ (void);
133 scm_t_uint32 test_ffi_u32_ (void)
134 {
135 return 4000000000U;
136 }
137
138 scm_t_uint32 test_ffi_u32_u8 (scm_t_uint8 a);
139 scm_t_uint32 test_ffi_u32_u8 (scm_t_uint8 a)
140 {
141 return 4000000000U + a;
142 }
143
144 scm_t_uint32 test_ffi_u32_s64 (scm_t_int64 a);
145 scm_t_uint32 test_ffi_u32_s64 (scm_t_int64 a)
146 {
147 return 4000000000U + a;
148 }
149
150 /* FIXME: use 64-bit literals */
151 scm_t_int64 test_ffi_s64_ (void);
152 scm_t_int64 test_ffi_s64_ (void)
153 {
154 return -2000000000;
155 }
156
157 scm_t_int64 test_ffi_s64_u8 (scm_t_uint8 a);
158 scm_t_int64 test_ffi_s64_u8 (scm_t_uint8 a)
159 {
160 return -2000000000 + a;
161 }
162
163 scm_t_int64 test_ffi_s64_s64 (scm_t_int64 a);
164 scm_t_int64 test_ffi_s64_s64 (scm_t_int64 a)
165 {
166 return -2000000000 + a;
167 }
168
169 scm_t_uint64 test_ffi_u64_ (void);
170 scm_t_uint64 test_ffi_u64_ (void)
171 {
172 return 4000000000UL;
173 }
174
175 scm_t_uint64 test_ffi_u64_u8 (scm_t_uint8 a);
176 scm_t_uint64 test_ffi_u64_u8 (scm_t_uint8 a)
177 {
178 return 4000000000UL + a;
179 }
180
181 scm_t_uint64 test_ffi_u64_s64 (scm_t_int64 a);
182 scm_t_uint64 test_ffi_u64_s64 (scm_t_int64 a)
183 {
184 return 4000000000UL + a;
185 }
186
187
188 scm_t_int64 test_ffi_sum (scm_t_int8 a, scm_t_int16 b,
189 scm_t_int32 c, scm_t_int64 d);
190 scm_t_int64 test_ffi_sum (scm_t_int8 a, scm_t_int16 b,
191 scm_t_int32 c, scm_t_int64 d)
192 {
193 return d + c + b + a;
194 }
195
196
197 scm_t_int64 test_ffi_sum_many (scm_t_uint8 a, scm_t_uint16 b,
198 scm_t_uint32 c, scm_t_uint64 d,
199 scm_t_int8 e, scm_t_int16 f,
200 scm_t_int32 g, scm_t_int64 h,
201 scm_t_int8 i, scm_t_int16 j,
202 scm_t_int32 k, scm_t_int64 l);
203 scm_t_int64 test_ffi_sum_many (scm_t_uint8 a, scm_t_uint16 b,
204 scm_t_uint32 c, scm_t_uint64 d,
205 scm_t_int8 e, scm_t_int16 f,
206 scm_t_int32 g, scm_t_int64 h,
207 scm_t_int8 i, scm_t_int16 j,
208 scm_t_int32 k, scm_t_int64 l)
209 {
210 return l + k + j + i + h + g + f + e + d + c + b + a;
211 }
212
213
214 struct foo
215 {
216 scm_t_int8 a;
217 scm_t_int16 b;
218 scm_t_int32 c;
219 scm_t_int64 d;
220 };
221 scm_t_int64 test_ffi_sum_struct (struct foo foo);
222 scm_t_int64 test_ffi_sum_struct (struct foo foo)
223 {
224 return foo.d + foo.c + foo.b + foo.a;
225 }
226
227
228 void* test_ffi_memcpy (void *dest, void *src, scm_t_int32 n);
229 void* test_ffi_memcpy (void *dest, void *src, scm_t_int32 n)
230 {
231 return memcpy (dest, src, n);
232 }
233
234 int test_ffi_callback_1 (int (*f) (int), int x);
235 int test_ffi_callback_1 (int (*f) (int), int x)
236 {
237 return f (x) + 7;
238 }
239
240 double test_ffi_callback_2 (double (*f) (float, int, double),
241 float x, int y, double z);
242 double test_ffi_callback_2 (double (*f) (float, int, double),
243 float x, int y, double z)
244 {
245 return f (x, y, z);
246 }