/* catch-test.c
 *
 * Tests catch,throw and unwind-protect in C
 */

#include <catch.h>
#include <stdio.h>

catch_tag tag;

void foo(void);
void bar(void);
void call( void (*fn) (void), int i);

int main(int argc, char **argv)
{
  int result;

  init_catch();
  
  result = CATCH(&tag, {
    printf("main ...\n");
    call(foo,3);
    printf("main, after foo.\n");
    7;
  });
  printf("Back in main, result is %d\n",result);
  result = CATCH(&tag, {
    printf("main ...\n");
    call(bar,11);
    printf("main, after bar.\n");
    17;
  });
  printf("Back in main, result is %d\n",result);
  return 0;
}

void call (void (*fn)(void), int i)
{
  PROTECT({
    /* This is the body */
    printf("Calling...\n");
    fn();
  },
	  {
	    /* This is the cleanup code */
	    printf("Cleaning up. The number is %d\n", i);
	  });
  printf("Call finished\n");
}


void foo()
{
  printf("foo, returning\n");
}


void bar()
{
  printf("bar, throwing...\n");
  THROW(tag, 17);
  printf("Can't happen");
}
