169 lines · 2.7 KB · C
RawDownload
#include <stdio.h>#include <string.h>#include <setjmp.h> #define TST   int i, a[2], b[2];                \              for (i = 0; i < 2; i++) a[i] = 0; \              for (i = 0; i < 2; i++) b[i] = 0 static jmp_buf jmp; static void tst1 (void){    TST;    longjmp(jmp, 1);} static void tst2(void){    jmp_buf jmp;     setjmp (jmp);    TST;    tst1();} static void tst3 (jmp_buf loc){    TST;    longjmp(loc, 1);} static void tst4(jmp_buf loc){    jmp_buf jmp;     setjmp (jmp);    TST;    tst3(loc);} static void tst (void){    jmp_buf loc;    static int cnt;     cnt = 0;    if (setjmp (jmp) == 0) {        TST;        tst2();    }    else {        cnt++;    }    if (setjmp (loc) == 0) {        TST;        tst4(loc);    }    else {        cnt++;    }    if (cnt != 2)        printf ("incorrect cnt %d\n", cnt);} static jmp_buf buf1;static jmp_buf buf2;static int *p;static int n_x = 6;static int g_counter; static void stack (void){    static int counter;    static int way_point1;    static int way_point2;     counter = 0;    way_point1 = 3;    way_point2 = 2;    g_counter = 0;    if (setjmp (buf1) != 101) {        int a[n_x];        g_counter++;        p = &a[0];        if (g_counter < 5)            longjmp (buf1, 2);        else if (g_counter == 5)            longjmp (buf1, 101);        else {            setjmp (buf2);             longjmp (buf1, 101);        }    }        way_point1--;     if (counter == 0) {        counter++;        {            int a[n_x];            g_counter++;            p = &a[0];            if (g_counter < 5)                longjmp (buf1, 2);            else if (g_counter == 5)                longjmp (buf1, 101);            else {                setjmp (buf2);                longjmp (buf1, 101);            }        }    }     way_point2--;     if (counter == 1) {        counter++;        longjmp (buf2, 2);    }     if (!(way_point1 == 0 && way_point2 == 0 &&          g_counter == 6 && counter == 2))        printf ("Failed %d %d %d %d\n",                way_point1, way_point2, g_counter, counter);} static jmp_buf env;static int last_value; static void jump (int val){    longjmp (env, val);} static void check (void){    int value;     last_value = -1;    value = setjmp (env);    if (value != last_value + 1) {        printf ("incorrect value %d %d\n",                value, last_value + 1);        return;    }    last_value = value;    switch (value) {    case 0:        jump (0);    default:        if (value < 10)          jump (value + 1);    }} intmain (void){    int i;     for (i = 0; i < 10;  i++) {        tst();        stack();        check();    }    return 0;}