2002-12-31 Martin Baulig <martin@ximian.com>
[mono.git] / mono / tests / libtest.c
1 #include <stdio.h>
2 #include <string.h>
3
4 int mono_test_many_int_arguments (int a, int b, int c, int d, int e,
5                                   int f, int g, int h, int i, int j);
6 short mono_test_many_short_arguments (short a, short b, short c, short d, short e,
7                                       short f, short g, short h, short i, short j);
8 char mono_test_many_char_arguments (char a, char b, char c, char d, char e,
9                                     char f, char g, char h, char i, char j);
10
11 int
12 mono_test_many_int_arguments (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j)
13 {
14         return a + b + c + d + e + f + g + h + i + j;
15 }
16
17 short
18 mono_test_many_short_arguments (short a, short b, short c, short d, short e, short f, short g, short h, short i, short j)
19 {
20         return a + b + c + d + e + f + g + h + i + j;
21 }
22
23 char
24 mono_test_many_byte_arguments (char a, char b, char c, char d, char e, char f, char g, char h, char i, char j)
25 {
26         return a + b + c + d + e + f + g + h + i + j;
27 }
28
29 int
30 mono_test_puts_static (char *s)
31 {
32         printf ("TEST %s\n", s);
33         return 1;
34 }
35
36 typedef int (*SimpleDelegate3) (int a, int b);
37
38 int
39 mono_invoke_delegate (SimpleDelegate3 delegate)
40 {
41         int res;
42
43         printf ("start invoke %p\n", delegate);
44
45         res = delegate (2, 3);
46
47         printf ("end invoke\n");
48
49         return res;
50 }
51
52 int 
53 mono_test_marshal_char (short a1)
54 {
55         if (a1 = 'a')
56                 return 0;
57         
58         return 1;
59 }
60
61 int 
62 mono_test_marshal_array (int *a1)
63 {
64         int i, sum = 0;
65
66         for (i = 0; i < 50; i++)
67                 sum += a1 [i];
68         
69         return sum;
70 }
71
72 typedef struct {
73         int a;
74         int b;
75         int c;
76         char *d;
77 } simplestruct;
78
79 simplestruct
80 mono_test_return_vtype ()
81 {
82         simplestruct res;
83
84         res.a = 0;
85         res.b = 1;
86         res.c = 0;
87         res.d = "TEST";
88         printf ("mono_test_return_vtype\n");
89         return res;
90 }
91
92 void
93 mono_test_delegate_struct ()
94 {
95         printf ("TEST\n");
96 }
97
98 typedef simplestruct (*ReturnVTypeDelegate) (simplestruct ss);
99
100 simplestruct
101 mono_test_return_vtype2 (ReturnVTypeDelegate func)
102 {
103         simplestruct res;
104         simplestruct res1;
105
106         res.a = 1;
107         res.b = 0;
108         res.c = 1;
109         res.d = "TEST";
110         printf ("mono_test_return_vtype2\n");
111
112         res1 = func (res);
113
114         printf ("UA: %d\n", res1.a);
115         printf ("UB: %d\n", res1.b);
116         printf ("UC: %d\n", res1.c);
117         printf ("UD: %s\n", res1.d);
118
119         return res1;
120 }
121
122 typedef char* (*ReturnStringDelegate) (char *s);
123
124 char *
125 mono_test_return_string (ReturnStringDelegate func)
126 {
127         char *res;
128
129         printf ("mono_test_return_string\n");
130
131         res = func ("TEST");
132
133         printf ("got string: %s\n", res);
134         return res;
135 }
136
137 typedef int (*RefVTypeDelegate) (int a, simplestruct *ss, int b);
138
139 int
140 mono_test_ref_vtype (int a, simplestruct *ss, int b, RefVTypeDelegate func)
141 {
142         if (a == 1 && b == 2 && ss->a == 0 && ss->b == 1 && ss->c == 0 &&
143             !strcmp (ss->d, "TEST1")) {
144                 ss->a = 1;
145                 ss->b = 0;
146                 ss->c = 1;
147                 ss->d = "TEST2";
148         
149                 return func (a, ss, b);
150         }
151
152         return 1;
153 }
154
155 typedef struct {
156         int a;
157         int (*func) (int);
158 } DelegateStruct;
159
160 int 
161 mono_test_marshal_delegate_struct (DelegateStruct ds)
162 {
163         return ds.func (ds.a);
164 }
165
166 int 
167 mono_test_marshal_struct (simplestruct ss)
168 {
169         if (ss.a == 0 && ss.b == 1 && ss.c == 0 &&
170             !strcmp (ss.d, "TEST"))
171                 return 0;
172
173         return 1;
174 }
175
176
177 typedef int (*SimpleDelegate) (int a);
178
179 int
180 mono_test_marshal_delegate (SimpleDelegate delegate)
181 {
182         return delegate (2);
183 }
184
185 typedef int (*SimpleDelegate2) (simplestruct ss);
186
187 int
188 mono_test_marshal_delegate2 (SimpleDelegate2 delegate)
189 {
190         simplestruct ss;
191         int res;
192
193         ss.a = 0;
194         ss.b = 1;
195         ss.c = 0;
196         ss.d = "TEST";
197
198         printf ("Calling delegate from unmanaged code\n");
199         res = delegate (ss);
200         printf ("GOT %d\n", res);
201
202         return res;
203 }
204
205 int 
206 mono_test_marshal_stringbuilder (char *s, int n)
207 {
208         const char m[] = "This is my message.  Isn't it nice?";
209         strncpy(s, m, n);
210         return 0;
211 }
212
213 typedef struct {
214 } EmptyStruct;
215
216 /* this does not work on Redhat gcc 2.96 */
217 #if 0
218 int 
219 mono_test_empty_struct (int a, EmptyStruct es, int b)
220 {
221         if (a == 1 && b == 2)
222                 return 0;
223         return 1;
224 }
225 #endif