0008-longjmp.c (572B)
1 #include <setjmp.h> 2 #include <stdio.h> 3 4 /* 5 output: 6 test 1 7 i = 1, v = 2 8 test 2 9 i = 2, v = 3 10 end: 11 */ 12 13 jmp_buf recover; 14 15 void 16 test(char *s, int val) 17 { 18 puts(s); 19 longjmp(recover, val); 20 } 21 22 int 23 main() 24 { 25 static int i; 26 #ifdef __QBE__ 27 // We cannot implement proper volatile with qbe 28 static volatile int v; 29 #else 30 auto volatile int v; 31 #endif 32 33 i = 0; 34 v = 1; 35 if (!setjmp(recover)) { 36 i = 1; 37 v = 2; 38 test("test 1", 1); 39 } 40 printf("i = %d, v = %d\n", i, v); 41 42 if (!setjmp(recover)) { 43 i = 2; 44 v = 3; 45 test("test 2", 0); 46 } 47 printf("i = %d, v = %d\n", i, v); 48 49 return 0; 50 }