0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #define __environment _CbC_environment
|
29
|
2 #define __return _CbC_return
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 #include "stdio.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5
|
29
|
6 /*
|
|
7 * This is a first example of CbC, but it is not work on LLVM now
|
|
8 * because of a variadic function
|
|
9 */
|
|
10
|
27
|
11 __code factorial(int n,int result,int orig,__code(*print)(),__code(*exit1)(), void *exit1env)
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 if (n<0) {
|
27
|
14 printf("#0008:err %d!\n",n);
|
|
15 goto (*exit1)(0,exit1env);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 if (n==0)
|
27
|
18 goto (*print)(n,result,orig,print,exit1,exit1env);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 else {
|
27
|
20 result *= n;
|
|
21 n--;
|
|
22 goto factorial(n,result,orig,print,exit1,exit1env);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25
|
27
|
26 __code print(int n,int result,int orig,__code(*print)(),__code (*exit1)(),void*exit1env);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 int main( int ac, char *av[])
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 {
|
27
|
30 int n;
|
|
31 // n = atoi(av[1]);
|
|
32 n = 10;
|
|
33 goto factorial(n,1,n,print,__return,__environment);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35
|
27
|
36 __code print(int n,int result,int orig,__code(*print)(),__code (*exit1)(),void*exit1env)
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 {
|
27
|
38 printf("#0032:%d! = %d\n",orig, result);
|
|
39 goto (*exit1)(0,exit1env);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41
|