Mercurial > hg > Members > kaito > longjump
annotate struct_longjump.c @ 7:c49bf9e28ea8
remove jmp_buf (replaced by integer array)
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 01 Dec 2013 14:59:18 +0900 |
parents | 509523ee1e27 |
children | a7c771f554e7 |
rev | line source |
---|---|
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #include <stdio.h> |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 #include <setjmp.h> |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 struct CbC_env { |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 void *ret_p,*env; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 }; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 __code code1(int n,__code(*__return)(int,void *),void *__environment){ |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 printf("code1 : code entry1\n"); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 goto __return(n,__environment); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 } |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 __code return1 (int n,void* env){ |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 printf("return1 : __return entry\n"); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 *(int*)((struct CbC_env *)(env))->ret_p = n; |
7
c49bf9e28ea8
remove jmp_buf (replaced by integer array)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
16 longjmp((int*)(((struct CbC_env *)env)->env),1); |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 } |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 int main1 (){ |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 __code (*__return)(); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 struct CbC_env __environment; |
7
c49bf9e28ea8
remove jmp_buf (replaced by integer array)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
22 int i_buf[128]; |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 int retval; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 __environment.ret_p = &retval; |
7
c49bf9e28ea8
remove jmp_buf (replaced by integer array)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
25 __environment.env = &i_buf; |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 printf("main1 : main1 entry\n"); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 if (setjmp(__environment.env)){ |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 printf("main1 : main1 return\n"); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 return *((int *)__environment.ret_p); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 } |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 __return = return1; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 goto code1(30,__return,&__environment); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 return 0; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 } |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 int main (){ |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 int n; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 n = main1(); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 printf("returned\n"); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 printf("return = %d\n",n); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 return 1; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 } |