Merge branch 'stable-2.0'
[bpt/guile.git] / test-suite / standalone / test-ffi-lib.c
CommitLineData
134fe52a 1/* Copyright (C) 2010, 2011 Free Software Foundation, Inc.
37371ea1
AW
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
eb0ffdd8 19#ifdef HAVE_CONFIG_H
37371ea1
AW
20# include <config.h>
21#endif
22
23#include <libguile.h>
24
25void test_ffi_v_ (void);
26void test_ffi_v_ (void)
27{
28 return;
29}
30
31void test_ffi_v_u8 (scm_t_uint8 a);
32void test_ffi_v_u8 (scm_t_uint8 a)
33{
34 return;
35}
36
37void test_ffi_v_s64 (scm_t_int64 a);
38void test_ffi_v_s64 (scm_t_int64 a)
39{
40 return;
41}
42
43scm_t_int8 test_ffi_s8_ (void);
44scm_t_int8 test_ffi_s8_ (void)
45{
46 return -100;
47}
48scm_t_int8 test_ffi_s8_u8 (scm_t_uint8 a);
49scm_t_int8 test_ffi_s8_u8 (scm_t_uint8 a)
50{
51 return -100 + a;
52}
53
54scm_t_int8 test_ffi_s8_s64 (scm_t_int64 a);
55scm_t_int8 test_ffi_s8_s64 (scm_t_int64 a)
56{
57 return -100 + a;
58}
59
60scm_t_uint8 test_ffi_u8_ (void);
61scm_t_uint8 test_ffi_u8_ (void)
62{
63 return 200;
64}
65
66scm_t_uint8 test_ffi_u8_u8 (scm_t_uint8 a);
67scm_t_uint8 test_ffi_u8_u8 (scm_t_uint8 a)
68{
69 return 200 + a;
70}
71
72scm_t_uint8 test_ffi_u8_s64 (scm_t_int64 a);
73scm_t_uint8 test_ffi_u8_s64 (scm_t_int64 a)
74{
75 return 200 + a;
76}
77
78scm_t_int16 test_ffi_s16_ (void);
79scm_t_int16 test_ffi_s16_ (void)
80{
81 return -20000;
82}
83
84scm_t_int16 test_ffi_s16_u8 (scm_t_uint8 a);
85scm_t_int16 test_ffi_s16_u8 (scm_t_uint8 a)
86{
87 return -20000 + a;
88}
89
90scm_t_int16 test_ffi_s16_s64 (scm_t_int64 a);
91scm_t_int16 test_ffi_s16_s64 (scm_t_int64 a)
92{
93 return -20000 + a;
94}
95
96scm_t_uint16 test_ffi_u16_ (void);
97scm_t_uint16 test_ffi_u16_ (void)
98{
99 return 40000;
100}
101
102scm_t_uint16 test_ffi_u16_u8 (scm_t_uint8 a);
103scm_t_uint16 test_ffi_u16_u8 (scm_t_uint8 a)
104{
105 return 40000 + a;
106}
107
108scm_t_uint16 test_ffi_u16_s64 (scm_t_int64 a);
109scm_t_uint16 test_ffi_u16_s64 (scm_t_int64 a)
110{
111 return 40000 + a;
112}
113
114scm_t_int32 test_ffi_s32_ (void);
115scm_t_int32 test_ffi_s32_ (void)
116{
117 return -2000000000;
118}
119
120scm_t_int32 test_ffi_s32_u8 (scm_t_uint8 a);
121scm_t_int32 test_ffi_s32_u8 (scm_t_uint8 a)
122{
123 return -2000000000 + a;
124}
125
126scm_t_int32 test_ffi_s32_s64 (scm_t_int64 a);
127scm_t_int32 test_ffi_s32_s64 (scm_t_int64 a)
128{
129 return -2000000000 + a;
130}
131
132scm_t_uint32 test_ffi_u32_ (void);
133scm_t_uint32 test_ffi_u32_ (void)
134{
134fe52a 135 return 4000000000U;
37371ea1
AW
136}
137
138scm_t_uint32 test_ffi_u32_u8 (scm_t_uint8 a);
139scm_t_uint32 test_ffi_u32_u8 (scm_t_uint8 a)
140{
134fe52a 141 return 4000000000U + a;
37371ea1
AW
142}
143
144scm_t_uint32 test_ffi_u32_s64 (scm_t_int64 a);
145scm_t_uint32 test_ffi_u32_s64 (scm_t_int64 a)
146{
134fe52a 147 return 4000000000U + a;
37371ea1
AW
148}
149
150/* FIXME: use 64-bit literals */
151scm_t_int64 test_ffi_s64_ (void);
152scm_t_int64 test_ffi_s64_ (void)
153{
154 return -2000000000;
155}
156
157scm_t_int64 test_ffi_s64_u8 (scm_t_uint8 a);
158scm_t_int64 test_ffi_s64_u8 (scm_t_uint8 a)
159{
160 return -2000000000 + a;
161}
162
163scm_t_int64 test_ffi_s64_s64 (scm_t_int64 a);
164scm_t_int64 test_ffi_s64_s64 (scm_t_int64 a)
165{
166 return -2000000000 + a;
167}
168
169scm_t_uint64 test_ffi_u64_ (void);
170scm_t_uint64 test_ffi_u64_ (void)
171{
134fe52a 172 return 4000000000UL;
37371ea1
AW
173}
174
175scm_t_uint64 test_ffi_u64_u8 (scm_t_uint8 a);
176scm_t_uint64 test_ffi_u64_u8 (scm_t_uint8 a)
177{
134fe52a 178 return 4000000000UL + a;
37371ea1
AW
179}
180
181scm_t_uint64 test_ffi_u64_s64 (scm_t_int64 a);
182scm_t_uint64 test_ffi_u64_s64 (scm_t_int64 a)
183{
134fe52a 184 return 4000000000UL + a;
37371ea1
AW
185}
186
187
188scm_t_int64 test_ffi_sum (scm_t_int8 a, scm_t_int16 b,
189 scm_t_int32 c, scm_t_int64 d);
190scm_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}
c612ed59
AW
195
196
5ccc3764
MW
197scm_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);
203scm_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
c612ed59
AW
214struct foo
215{
216 scm_t_int8 a;
217 scm_t_int16 b;
218 scm_t_int32 c;
219 scm_t_int64 d;
220};
221scm_t_int64 test_ffi_sum_struct (struct foo foo);
222scm_t_int64 test_ffi_sum_struct (struct foo foo)
223{
224 return foo.d + foo.c + foo.b + foo.a;
225}
17d819d4
AW
226
227
228void* test_ffi_memcpy (void *dest, void *src, scm_t_int32 n);
229void* test_ffi_memcpy (void *dest, void *src, scm_t_int32 n)
230{
231 return memcpy (dest, src, n);
232}
33186356
LC
233
234int test_ffi_callback_1 (int (*f) (int), int x);
235int test_ffi_callback_1 (int (*f) (int), int x)
236{
237 return f (x) + 7;
238}
239
240double test_ffi_callback_2 (double (*f) (float, int, double),
241 float x, int y, double z);
242double test_ffi_callback_2 (double (*f) (float, int, double),
243 float x, int y, double z)
244{
245 return f (x, y, z);
246}