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;
+}