#include <tc.h>

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

unsigned cfib (unsigned _n)
{
  return _n < 2 ? _n : cfib(_n - 1) + cfib(_n - 2);
}

tfun void fib (unsigned _n, tout unsigned *_res)
{
  if (_n < 32) {
    *_res = cfib(_n);
  } else {
    tval unsigned res1, res2;
    fib(_n - 1, &res1);
    fib(_n - 2, &res2);
    *_res = res1 + res2;
  }
}

int tmain (int argc, char* argv[])
{
  unsigned n;
  tval unsigned res;
  if (argc < 2) {
#if 1
    terrprint(
      "Usage:\n"
      "gr_fib <number>\n"
    );
#endif
    return -1;
  }
  n = (unsigned)atoi(argv[1]);
  fib(n, &res);
  (volatile unsigned)res;
  terrprint("fib(%u) = %u\n", n, res);
  return 0;
}