Thursday, October 31

C Exception macros

/***********************************************************************\
* Exception handling. *
\***********************************************************************/

#include

typedef struct EXCEPTION
{
jmp_buf stack;
} Exception;

typedef enum STATE
{
Success,
Warning,
Error,
Fatal
} State;

extern Exception gs_x_env;
extern State gs_x_state;
extern void* gs_x_exception;
extern Bool gs_x_flag;

#define TRY \
{ \
static Exception l_x_env; \
gs_x_flag=False; \
gs_x_exception=0; \
l_x_env=gs_x_env; \
if (setjmp(gs_x_env.stack)==0) \
{

#define CATCH(a_type,a_var) \
gs_x_flag=False; \
} \
else \
{ \
a_type a_var; \
gs_x_env=l_x_env; \
a_var=(a_type)gs_x_exception; \
(void)a_var;

#define FINALLY \
gs_x_flag=False; \
} \
gs_x_env=l_x_env; \
}

#define RAISE \
{ \
if (gs_x_flag) \
{ \
longjmp(gs_x_env.stack,1); \
} \
} \
(void)0

#define THROW(a_state,a_var) \
{ \
gs_x_flag=True; \
gs_x_state=a_state; \
gs_x_exception=(void*)a_var; \
RAISE; \
} \
(void)0

#define isSuccess (gs_x_state==Success)
#define isFailure (gs_x_state!=Success)
#define isWarning (gs_x_state==Warning)
#define isError (gs_x_state==Error)
#define isFatal (gs_x_state==Fatal)

No comments: