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