Mercurial > hg > CbC > CbC_gcc
diff CbC-examples/goto.c @ 78:365b84b6fe04
more examples
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 20 Sep 2011 17:32:20 +0900 |
parents | |
children | 5d30d517ebed |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC-examples/goto.c Tue Sep 20 17:32:20 2011 +0900 @@ -0,0 +1,96 @@ +#define __environment _CbC_environment +#define __return _CbC_return + +extern int printf(const char *,...); + +__code (*conv)(int,__code (*)()); +__code a2(int i,__code conv()); +__code a3(int i,__code conv()); +__code a4(int i,__code conv()); +__code a5(int i,__code conv()); +__code a6(); +__code a7(); +__code a8(); +__code a9(); + +char* print_conv(__code conv()); + +__code (*exit0)(int,void*); +void *env; + +__code +a2(int i,__code conv()) +{ + printf("#0023:a2 %d %s\n",i,print_conv(conv)); + goto conv(i+1,a4); +} + +__code +a3(int i,__code (*conv)()) +{ + printf("#0030:a3 %d %s\n",i,print_conv(conv)); + goto conv(i+1,a5); +} + +__code +a4(int i,__code conv()) +{ + printf("#0037:a4 %d %s\n",i,print_conv(conv)); + goto (*conv)(i+1,a6); +} + +__code +a5(int i,__code (*conv)()) +{ + printf("#0044:a5 %d %s\n",i,print_conv(conv)); + goto (*conv)(i+1,i+2,i+3,a7); +} + +__code +a6(int i,int j,int k,__code conv()) +{ + printf("#0051:a6 %d %s\n",i,print_conv(conv)); + goto conv(i+1,j,k,a8); +} + +__code +a7(int i,int j,int k,__code (*conv)()) +{ + printf("#0058:a7 %d %s\n",i,print_conv(conv)); + goto conv(i+1,j,k,a9); +} + +__code +a8(int i,int j,int k,__code conv()) +{ + printf("#0065:a8 %d %s\n",i,print_conv(conv)); + goto (*conv)(i+1,j,k,exit0); +} + +__code +a9(int i,int j,int k,__code (*conv)()) +{ + printf("#0072:a9 %d %s\n",i,print_conv(conv)); + goto (*conv)(0,env); +} + +main(int ac,char *av[]) { + exit0 = __return; + env = __environment; + conv = a2; + goto conv(1,a3); +} + +char* +print_conv(__code conv()) +{ + if(conv==a2) return "a2"; + if(conv==a3) return "a3"; + if(conv==a4) return "a4"; + if(conv==a5) return "a5"; + if(conv==a6) return "a6"; + if(conv==a7) return "a7"; + if(conv==a8) return "a8"; + if(conv==a9) return "a9"; + else return "xx"; +}