#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <signal.h>

volatile int io_happened;

void handle_io(int xxx)
{ io_happened=1; }

int A(int m, int n)
{ if (m==0) return n+1;
  if (n==0) return A(m-1, 1);
  return A(m-1, A(m, n-1)); }

int long_computation(int m, int n)
{ return A(m,n); }

void main(int argc, char * argv[])
{ int m=3, n=10;
  io_happened=0;
  if (argc>2) { m=atol(argv[1]); n=atol(argv[2]); }
  printf("m=%d, n=%d\n", m, n);
  printf("f(m,n)=%d\n", long_computation(m, n));
  termios buf;
  tcgetattr(0, &buf);
  buf.c_lflag &= ~(ECHO | ICANON);
  buf.c_cc[VMIN]=1;
  buf.c_cc[VTIME]=0;
  tcsetattr(0, TCSAFLUSH, &buf);
  signal(SIGIO, handle_io);
  int savedflags=fcntl(0, F_GETFL, 0);
  fcntl(0, F_SETFL, savedflags | O_ASYNC | O_NONBLOCK );
  fcntl(0, F_SETOWN, getpid());
  while (1)
  {
    printf(".");
    fflush(stdout);
    long_computation(m, n);

    if (io_happened)
    { int c=getchar();
      printf(" IO(%c) ", c^32);
      fflush(stdout);
      io_happened=0; } }

  printf("\nAll Done\n"); }