#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

#define ERROR           20

#define ereport(elevel, rest)  \
        (errstart(elevel, __FILE__, __LINE__, __func__) ? \
	         (errfinish rest) : (void) 0)

#define PG_RE_THROW()  \
        siglongjmp(PG_exception_stack, 1)

sigjmp_buf PG_exception_stack;

int errstart(int elevel, const char *filename, int lineno,
                 const char *funcname)
{
	printf("error: level %i %s:%i function %s\n", elevel, filename, lineno, funcname);
	return 1;
}

void errfinish(int dummy, const char* msg)
{
	puts(msg);
	PG_RE_THROW();
}


int
do_div(char** argv)
{
        int     arg1 = atoi(argv[1]);
        int     arg2 = atoi(argv[2]);
        int     result;

        if (arg2 == 0)
                ereport(ERROR, (1, "division by zero"));

        result = arg1 / arg2;

	return result;
}

int
main(int argc, char **argv)
{
	if (sigsetjmp(PG_exception_stack, 0) == 0) {
		int result = do_div(argv);
		printf("%d\n", result);
	} else {
		printf("caught error, aborting\n");
		return 1;
	}

        return 0;
}

