Mercurial > hg > Members > kaito > longjump
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 } |