1 /*
2  * %CopyrightBegin%
3  *
4  * Copyright Ericsson AB and Kjell Winblad 2019. All Rights Reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * %CopyrightEnd%
19  */
20 
21 /*
22  * Description:
23  *
24  * Author: Kjell Winblad
25  *
26  */
27 
28 #include <stdio.h>
29 #include <stdlib.h>
30 
31 #define YCF_YIELD()
32 
33 
fun(char x)34 int fun(char x){
35   YCF_YIELD();
36   if(x == 1){
37     /*empty control statement*/
38   } else {
39     /* another empty*/
40   }
41   if(x == 1){
42 
43   } else {
44 
45   }
46   if(x == 1){
47     int y = 4;
48     YCF_YIELD();
49     printf("s_1 %d %d\n", x, y);
50   }
51   YCF_YIELD();
52   if(x == 1){
53     int y = 4;
54     YCF_YIELD();
55     printf("s_2 %d %d\n", x, y);
56   }else printf("Hej\n");
57   YCF_YIELD();
58   if(x == 1){
59     int y = 4;
60     YCF_YIELD();
61     printf("s_3 %d %d\n", x, y);
62   }else if(x == 1){
63     int y = 4;
64     printf("Hej %d %d\n", x, y);
65   }
66   YCF_YIELD();
67   if(x == 2){
68     int y = 4;
69     printf("Hej %d %d\n", x, y);
70   }else if(x == 1){
71     int y = 4;
72     YCF_YIELD();
73     printf("s_4 %d %d\n", x, y);
74   }
75   YCF_YIELD();
76   if(x == 2){
77     int y = 4;
78     printf("Hej %d %d\n", x, y);
79   }else{
80     int y = 4;
81     YCF_YIELD();
82     printf("s_5 %d %d\n", x, y);
83   }
84   YCF_YIELD();
85   while(x == 1) {
86     int y = 4;
87     x = 2;
88     YCF_YIELD();
89     printf("s_6 %d %d\n", x, y);
90   }
91   YCF_YIELD();
92   x = 1;
93   YCF_YIELD();
94   do x++; while(x == 1);
95   YCF_YIELD();
96   printf("s_7 %d\n", x);
97   YCF_YIELD();
98   x = 1;
99   do {
100     int y = 4;
101     YCF_YIELD();
102     printf("s_8 %d %d\n", x, y);
103     YCF_YIELD();
104     x++;
105   } while(x == 2);
106   YCF_YIELD();
107   x = 1;
108   YCF_YIELD();
109   while(x==1){
110     int y = 4;
111     YCF_YIELD();
112     printf("s_9 %d %d\n", x, y);
113     YCF_YIELD();
114     x++;
115   }
116   YCF_YIELD();
117   x = 2;
118   for(;;){
119     int y = 4;
120     YCF_YIELD();
121     printf("s_10 %d %d\n", x, y);
122     YCF_YIELD();
123     break;
124   }
125   YCF_YIELD();
126   for(x = 0;x < 10;x++){
127     int y = 4;
128     YCF_YIELD();
129     printf("s_11 %d %d\n", x, y);
130   }
131   YCF_YIELD();
132   x = 42;
133   YCF_YIELD();
134   switch(x){
135     int y;
136   case 42:
137     y = 4;
138     YCF_YIELD();
139     printf("s_12 %d %d\n", x, y);
140     YCF_YIELD();
141   }
142   YCF_YIELD();
143   {
144     x = 1;
145     YCF_YIELD();
146     if(x == 1) if(1){
147       int y = 4;
148       YCF_YIELD();
149       printf("s_1 %d %d\n", x, y);
150     }
151     YCF_YIELD();
152     if(x == 1) switch(1){
153         int y;
154       case 1:;
155         y = 4;
156         YCF_YIELD();
157         printf("s_2 %d %d\n", x, y);
158     }else printf("Hej\n");
159     YCF_YIELD();
160     if(x == 1)  switch(1){
161       int y;
162       case 1:;
163         y = 4;
164       YCF_YIELD();
165       printf("s_3 %d %d\n", x, y);
166     }else if(x == 1){
167       int y = 4;
168       printf("Hej %d %d\n", x, y);
169     }
170     YCF_YIELD();
171     if(x == 2){
172       int y = 4;
173       printf("Hej %d %d\n", x, y);
174     }else if(x == 1) if(1){
175       int y = 4;
176       YCF_YIELD();
177       printf("s_4 %d %d\n", x, y);
178     }
179     YCF_YIELD();
180     if(x == 2){
181       int y = 4;
182       printf("Hej %d %d\n", x, y);
183     }else if(1){
184       int y = 4;
185       YCF_YIELD();
186       printf("s_5 %d %d\n", x, y);
187     }
188     YCF_YIELD();
189     while(x == 1) if(1) {
190       int y = 4;
191       x = 2;
192       YCF_YIELD();
193       printf("s_6 %d %d\n", x, y);
194     }
195     YCF_YIELD();
196     x = 1;
197     YCF_YIELD();
198     do if(1) x++; while(x == 1);
199     YCF_YIELD();
200     printf("s_7 %d\n", x);
201     YCF_YIELD();
202     x = 1;
203     do if(1){
204       int y = 4;
205       YCF_YIELD();
206       printf("s_8 %d %d\n", x, y);
207       YCF_YIELD();
208       x++;
209     } while(x == 2);
210     YCF_YIELD();
211     x = 1;
212     YCF_YIELD();
213     while(x==1) if(1){
214       int y = 4;
215       YCF_YIELD();
216       printf("s_9 %d %d\n", x, y);
217       YCF_YIELD();
218       x++;
219     }
220     YCF_YIELD();
221     x = 2;
222     for(;;) if(1){
223       int y = 4;
224       YCF_YIELD();
225       printf("s_10 %d %d\n", x, y);
226       YCF_YIELD();
227       break;
228     }
229     YCF_YIELD();
230     for(x = 0;x < 10;x++) if(1){
231       int y = 4;
232       YCF_YIELD();
233       printf("s_11 %d %d\n", x, y);
234     }
235     YCF_YIELD();
236     x = 42;
237     YCF_YIELD();
238     switch(x){
239       int y;
240     case 42:
241       y = 4;
242       YCF_YIELD();
243       printf("s_12 %d %d\n", x, y);
244       YCF_YIELD();
245     }
246     YCF_YIELD();
247   }
248   return x;
249 }
250 
allocator(size_t size,void * context)251 void* allocator(size_t size, void* context){
252   (void)context;
253   return malloc(size);
254 }
255 
freer(void * data,void * context)256 void freer(void* data, void* context){
257   (void)context;
258   free(data);
259 }
260 
main(int argc,const char * argv[])261 int main( int argc, const char* argv[] )
262 {
263 #ifdef YCF_YIELD_CODE_GENERATED
264   void* wb = NULL;
265 #endif
266   int ret = 0;
267   int nr_of_trapps = 0;
268   long nr_of_reductions = 1;
269 #ifdef YCF_YIELD_CODE_GENERATED
270   do{
271     ret = fun_ycf_gen_yielding(&nr_of_reductions,&wb,NULL,allocator,freer,NULL,0,NULL,1);
272     if(wb != NULL){
273       nr_of_trapps++;
274     }
275   }while(wb != NULL);
276   if(wb != NULL){
277     free(wb);
278   }
279 #else
280   ret = fun(1);
281   nr_of_trapps = 86;
282 #endif
283   printf("RETURNED %d %d\n", ret, nr_of_trapps);
284   if(ret != 42){
285     return 1;
286   }else{
287     return 0;
288   }
289 }
290