Mercurial > hg > CbC > CbC_gcc
comparison CbC-examples/return_check/variable_return_type.c @ 42:9e4f9e20b8f1
add some examples.
author | kent@teto.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Mon, 25 Jan 2010 17:13:59 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
41:c816ae4380d7 | 42:9e4f9e20b8f1 |
---|---|
1 #include<stdio.h> | |
2 #include<assert.h> | |
3 | |
4 #define dprint(f, args...) \ | |
5 fprintf(stdout, "in %s\t: "f, __FUNCTION__, ## args) | |
6 | |
7 | |
8 /* for integer. */ | |
9 int goodint = 33; | |
10 int badint = 0; | |
11 typedef void (*RETINT_FUNC)(int, void *); | |
12 void g_int(RETINT_FUNC func) | |
13 { | |
14 func(goodint, NULL); | |
15 } | |
16 int f_int() | |
17 { | |
18 void *ret; | |
19 | |
20 ret = _CbC_return; | |
21 | |
22 dprint("fp = %p\n", __builtin_frame_address(0)); | |
23 dprint("__return_func = %p\n", ret); | |
24 g_int(ret); | |
25 //goto g(ret); | |
26 | |
27 dprint("not good\n"); | |
28 return badint; | |
29 } | |
30 | |
31 | |
32 /* for double. */ | |
33 double gooddouble = 333.3; | |
34 double baddouble = 0.00; | |
35 typedef void (*RETDOUBLE_FUNC)(double, void *); | |
36 void g_double(RETDOUBLE_FUNC func) | |
37 { | |
38 func(gooddouble, NULL); | |
39 } | |
40 double f_double() | |
41 { | |
42 void *ret; | |
43 ret = _CbC_return; | |
44 | |
45 dprint("fp = %p\n", __builtin_frame_address(0)); | |
46 dprint("__return_func = %p\n", ret); | |
47 g_double(ret); | |
48 //goto g_double(ret); | |
49 | |
50 dprint("not good\n"); | |
51 return baddouble; | |
52 } | |
53 | |
54 /* for float. */ | |
55 float goodfloat = 33.3f; | |
56 float badfloat = 0.0f; | |
57 typedef void (*RETFLOAT_FUNC)(float, void *); | |
58 void g_float(RETFLOAT_FUNC func) | |
59 { | |
60 func(goodfloat, NULL); | |
61 } | |
62 float f_float() | |
63 { | |
64 void *ret; | |
65 ret = _CbC_return; | |
66 | |
67 dprint("fp = %p\n", __builtin_frame_address(0)); | |
68 dprint("__return_func = %p\n", ret); | |
69 g_float(ret); | |
70 //goto g_float(ret); | |
71 | |
72 dprint("not good\n"); | |
73 return badfloat; | |
74 } | |
75 | |
76 /* for char. */ | |
77 char goodchar = 33; | |
78 char badchar = 0; | |
79 typedef void (*RETCHAR_FUNC)(char, void *); | |
80 void g_char(RETCHAR_FUNC func) | |
81 { | |
82 func(goodchar, NULL); | |
83 } | |
84 char f_char() | |
85 { | |
86 void *ret; | |
87 | |
88 ret = _CbC_return; | |
89 | |
90 dprint("fp = %p\n", __builtin_frame_address(0)); | |
91 dprint("__return_func = %p\n", ret); | |
92 g_char(ret); | |
93 //goto g(ret); | |
94 | |
95 dprint("not good\n"); | |
96 return badchar; | |
97 } | |
98 | |
99 | |
100 /* for struct. */ | |
101 struct ifid { | |
102 int a; | |
103 float b; | |
104 int c[4]; | |
105 double d; | |
106 }; | |
107 struct ifid goodstruct = {33, 33.3, {4,4,4,4}, 333.333}; | |
108 struct ifid badstruct = {0, 00.0, {0,0,0,0}, 0.0}; | |
109 typedef void (*RETSTRUCT_FUNC)(struct ifid, void *); | |
110 void g_struct(RETSTRUCT_FUNC func) | |
111 { | |
112 func(goodstruct, NULL); | |
113 } | |
114 struct ifid f_struct() | |
115 { | |
116 void *ret; | |
117 | |
118 ret = _CbC_return; | |
119 | |
120 dprint("fp = %p\n", __builtin_frame_address(0)); | |
121 dprint("__return_func = %p\n", ret); | |
122 g_struct(ret); | |
123 //goto g(ret); | |
124 | |
125 dprint("not good\n"); | |
126 return badstruct; | |
127 } | |
128 | |
129 int main(int argc, char **argv) | |
130 { | |
131 void *bptr; | |
132 int rint; | |
133 float rfloat; | |
134 double rdouble; | |
135 char rchar; | |
136 struct ifid rstruct; | |
137 | |
138 bptr = __builtin_frame_address(0); | |
139 | |
140 dprint("before int: fp = %p\n", __builtin_frame_address(0)); | |
141 rint = f_int(); | |
142 dprint("f_int = %d, good=%d,bad=%d\n", rint,goodint,badint); | |
143 | |
144 dprint("before float: fp = %p\n", __builtin_frame_address(0)); | |
145 rfloat = f_float(); | |
146 dprint("f_float = %3.3f, good=%3.3f,bad=%3.3f\n", rfloat,goodfloat,badfloat); | |
147 assert(bptr==__builtin_frame_address(0)); | |
148 | |
149 dprint("before double: fp = %p\n", __builtin_frame_address(0)); | |
150 rdouble = f_double(); | |
151 dprint("f_double = %3.3lf, good=%3.3lf,bad=%3.3lf\n", rdouble,gooddouble,baddouble); | |
152 assert(bptr==__builtin_frame_address(0)); | |
153 | |
154 dprint("before char: fp = %p\n", __builtin_frame_address(0)); | |
155 rchar = f_char(); | |
156 dprint("f_char = %d, good=%d,bad=%d\n", rchar,goodchar,badchar); | |
157 assert(bptr==__builtin_frame_address(0)); | |
158 | |
159 dprint("before struct: fp = %p\n", __builtin_frame_address(0)); | |
160 rstruct = f_struct(); | |
161 dprint( "return value = {\n" | |
162 " a = %d\n" | |
163 " b = %2.3f\n" | |
164 " c = { %d, %d, %d, %d }\n" | |
165 " d = %3.3f\n" | |
166 "}\n", rstruct.a, rstruct.b, | |
167 rstruct.c[0],rstruct.c[1],rstruct.c[2],rstruct.c[3], rstruct.d); | |
168 | |
169 | |
170 | |
171 dprint("end: fp = %p\n", __builtin_frame_address(0)); | |
172 | |
173 if (bptr!=__builtin_frame_address(0)) { | |
174 dprint("CbC_return failure!\n"); | |
175 return 1; | |
176 } | |
177 if ( rint!=goodint | |
178 || rchar!=goodchar | |
179 || (rfloat < goodfloat-0.01 || goodfloat+0.01 < rfloat) | |
180 || (rdouble < gooddouble-0.01 || gooddouble+0.01 < rdouble) | |
181 || rstruct.a!=goodstruct.a | |
182 || (rstruct.b < goodstruct.b-0.01 || goodstruct.b+0.01 < rstruct.b) | |
183 || (rstruct.d < goodstruct.d-0.01 || goodstruct.d+0.01 < rstruct.d) | |
184 || rstruct.c[0]!=goodstruct.c[0] | |
185 || rstruct.c[1]!=goodstruct.c[1] | |
186 || rstruct.c[2]!=goodstruct.c[2] | |
187 || rstruct.c[3]!=goodstruct.c[3] ) { | |
188 dprint("CbC_return failure!\n"); | |
189 return 1; | |
190 } | |
191 | |
192 | |
193 dprint("CbC_return successful!\n"); | |
194 return 0; | |
195 } | |
196 |