"errorjmp.h"


#pragma once

#include <setjmp.h>

#define _Thread_local _declspec(thread) 

_Thread_local jmp_buf* pCurrent = 0;

#define THROW longjmp(*pCurrent, 1)
#define THROW_(x) longjmp(*pCurrent, x)

#define STOP_PROPAGATION pCurrentOld = 0
#define EXCEPT_ERROR er

#define __TRY \
{\
    jmp_buf* pCurrentOld = pCurrent;\
    jmp_buf jmp;\
    int er = setjmp(jmp);\
    if (er == 0)\
    {\
        pCurrent = &jmp;\
    }\
    if (er == 0)
        
#define __EXCEPT\
    if (er == 0)\
    {\
        pCurrent = pCurrentOld;\
    }\
    else

#define __EXCEPT_END \
    if (er != 0 && pCurrentOld)\
    {\
        pCurrent = pCurrentOld;\
        longjmp(*pCurrentOld, EXCEPT_ERROR);\
    }\
}




#include <stdio.h>
#include <string.h>
#include "errorjmp.h"


void F2() 
{ 
    printf("F2\n");
    THROW_(2);
}

void F1()
{
    printf("F1\n");

    __TRY
    {
        F2();
    }
    __EXCEPT
    {
        printf("__EXCEPT of F1\n");
        //STOP_PROPAGATION;
    }
    __EXCEPT_END
}

void F3() { printf("F3\n"); }

void F4() {  printf("F4\n"); }

int main(int argc, char *argv[])
{
    __TRY
    {
        F1();
        F3();
        F4();
    }
    __EXCEPT
    {
        printf("__EXCEPT of main %d\n", EXCEPT_ERROR);
    }
    __EXCEPT_END

    return 0;
}




#pragma once

#include <setjmp.h>

#define _Thread_local _declspec(thread) 

_Thread_local int errorcode = 0;

#define GOTO_ON_ERROR if (errorcode !=0) goto ERROR_LABEL; 

#define THROW errorcode = 1;  goto END_LABEL 
#define THROW_(x) errorcode = (x);  goto END_LABEL 

#define EXCEPT_ERROR errorcode 

#define __TRY if (1) 

#define __EXCEPT else  ERROR_LABEL: 

#define __EXCEPT_END if (errorcode != 0) goto END_LABEL; 

#define STOP_PROPAGATION errorcode= 0 

#include <stdio.h>
#include <string.h>
#include "errorjmp.h"


void F2() 
{ 
    printf("F2\n");
    THROW_(2);
    
END_LABEL:;
}

void F1()
{
    printf("F1\n");

    __TRY
    {
        F2(); GOTO_ON_ERROR
    }
    __EXCEPT
    {
        printf("__EXCEPT of F1\n");
        //STOP_PROPAGATION;
    }
    __EXCEPT_END

   printf("__\n");

END_LABEL:;
}

void F3() { printf("F3\n"); }

void F4() {  printf("F4\n"); }

int main(int argc, char *argv[])
{
    __TRY
    {
        F1(); GOTO_ON_ERROR
        F3(); GOTO_ON_ERROR
        F4(); GOTO_ON_ERROR
    }
    __EXCEPT
    {
        printf("__EXCEPT of main %d\n", EXCEPT_ERROR);
    }
    __EXCEPT_END

    return 0;
END_LABEL:;
}