comparison struct_longjump.c @ 6:509523ee1e27

add struct_longjump.c
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Sun, 24 Nov 2013 01:10:16 +0900
parents
children c49bf9e28ea8
comparison
equal deleted inserted replaced
5:4e7858590985 6:509523ee1e27
1 #include <stdio.h>
2 #include <setjmp.h>
3
4 struct CbC_env {
5 void *ret_p,*env;
6 };
7
8 __code code1(int n,__code(*__return)(int,void *),void *__environment){
9 printf("code1 : code entry1\n");
10 goto __return(n,__environment);
11 }
12
13 __code return1 (int n,void* env){
14 printf("return1 : __return entry\n");
15 *(int*)((struct CbC_env *)(env))->ret_p = n;
16 longjmp(*(jmp_buf*)(((struct CbC_env *)env)->env),1);
17 }
18
19 int main1 (){
20 __code (*__return)();
21 struct CbC_env __environment;
22 jmp_buf j_buf;
23 int retval;
24 __environment.ret_p = &retval;
25 __environment.env = &j_buf;
26 printf("main1 : main1 entry\n");
27 if (setjmp(__environment.env)){
28 printf("main1 : main1 return\n");
29 return *((int *)__environment.ret_p);
30 }
31 __return = return1;
32 goto code1(30,__return,&__environment);
33 return 0;
34 }
35
36 int main (){
37 int n;
38 n = main1();
39 printf("returned\n");
40 printf("return = %d\n",n);
41 return 1;
42 }