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

static jmp_buf env;

void loop(int (*fp)(int))
{
  int i;
  if (sigsetjmp(env,0) != 0) {
    printf("exited loop\n");
  } else {
    for (i = 1; i < 1000; i++) {
      printf("%d = %d\n", i, (*fp)(i));
    }
  }
}

static void sigfpe(int sig)
{
  printf("within sigfpe: %d\n", sig);
  siglongjmp(env, 1);
}

int divide(int i)
{
  return i / (i-10);
}

int main(int argc, char *argv[])
{
  if (signal(SIGFPE, sigfpe) == SIG_ERR) {
    perror("signal");
  }
  loop(divide);
  exit(0);
}
