annotate CbC-examples/fact-e.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents ff10c3399912
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
149
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #define __environment _CbC_environment
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 #define __return _CbC_return
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 #include "stdio.h"
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 #include "stdlib.h"
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 struct F { int n; int r; int o; void *env;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 __code (*next)( struct F );
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 __code (*exit)( struct F );
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 };
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 __code factorial(struct F arg)
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 {
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 if (arg.n<0) {
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 printf("#0008:err %d!\n",arg.n);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 exit(1);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 // goto (*exit1)(0,exit1env);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 }
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 if (arg.n==0)
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 goto arg.next(arg);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 else {
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 arg.r *= arg.n;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 arg.n--;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 goto factorial(arg);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 }
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 }
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 __code print(struct F arg);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 int main( int ac, char *av[])
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 {
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 struct F arg;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 arg.n = atoi(av[1]);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 // arg.n = 10;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 arg.r = 1;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 arg.o = 1;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 arg.next = print;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 arg.exit = 0;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 arg.env = 0;
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 goto factorial(arg);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 }
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 __code print(struct F arg)
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 {
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 printf("#0032:%d! = %d\n",arg.o, arg.r);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 exit(0);
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 }
ff10c3399912 add small example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48