scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | README | LICENSE

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 }