Mercurial > hg > Members > kaito > longjump
annotate pointer_longjump.c @ 4:d75a89b10176
write pointer_longjump.c
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 14 Nov 2013 13:16:46 +0900 |
parents | e6aa3b678e4a |
children | 4e7858590985 |
rev | line source |
---|---|
0 | 1 #include <stdio.h> |
2 #include <setjmp.h> | |
3 #include <stdlib.h> | |
4 | |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
5 __code code1(int n,__code(*__return)(int,void *,int *),void *__environment,int *__ret_p){ |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
6 printf("code1 : code entry1\n"); |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
7 goto __return(n,__environment,__ret_p); |
0 | 8 } |
9 | |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
10 __code return1 (int n,void* env,int* __ret_p){ |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
11 printf("return1 : __return entry\n"); |
1
6d11ed2a5bed
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
12 *__ret_p = n; |
0 | 13 longjmp(*(jmp_buf*)env,1); |
14 } | |
15 | |
16 int main1 (){ | |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
17 __code (*__return)(); |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
18 void *__environment; |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
19 int retval; |
3
e6aa3b678e4a
remove ret from global_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
20 int *__ret_p; |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
21 __ret_p = &retval; |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
22 printf("main1 : main1 entry\n"); |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
23 __environment = (void*)malloc(sizeof(jmp_buf)); |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
24 if (setjmp(__environment)){ |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
25 free(__environment); |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
26 printf("main1 : main1 return\n"); |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
27 return retval; |
0 | 28 } |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
29 __return = return1; |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
30 goto code1(30,__return,__environment,__ret_p); |
0 | 31 return 0; |
32 } | |
33 | |
34 int main (){ | |
35 int n; | |
36 n = main1(); | |
37 printf("returned\n"); | |
38 printf("return = %d\n",n); | |
39 return 1; | |
40 } |