Mercurial > hg > Members > kaito > longjump
diff global_longjump.c @ 0:dee9711aeb06
the first commit
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 12 Nov 2013 11:32:39 +0900 |
parents | |
children | e6aa3b678e4a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/global_longjump.c Tue Nov 12 11:32:39 2013 +0900 @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <setjmp.h> +#include <stdlib.h> + +int retval; +__code code1(int n,void *__return,void *__enviroment){ + void(*ret)(int,void *); + printf("code1\n"); + ret = (void(*)(int,void *))__return; + ret(n,__enviroment); +} + +void *return1 (int n,void* env){ + printf("return1\n"); + retval = n; + longjmp(*(jmp_buf*)env,1); +} + +int main1 (){ + void *__return; + void *__enviroment; + printf("main1 entry\n"); + __enviroment = (void*)malloc(sizeof(jmp_buf)); + if (setjmp(__enviroment)){ + free(__enviroment); + printf("main1 return\n"); + return retval; + } + __return = (void*)return1; + goto code1(30,__return,__enviroment); + return 0; +} + +int main (){ + int n; + n = main1(); + printf("returned\n"); + printf("return = %d\n",n); + return 1; +}