// --------------------------------------------------------------------------------
// cps converted, using gcc's lexical functions to handle the free variables.
// --------------------------------------------------------------------------------

typedef int factk (int);

int
ret_cps (int n)
{
  return n;
}

int
minus_cps (int a, int b, factk k)
{
  return k (a-b);
}

int
mul_cps (int a, int b, factk k)
{
  return k (a*b);
}

int
eq_cps (int a, int b, factk k)
{
  return k (a==b);
}

int
factcps (int n, factk k)
{
  int factcps_1 (int b) {
    int factcps_2 (int nm1) {
      int factcps_3 (int f) {
	return mul_cps (n, f, k);
      }
      return factcps (nm1, factcps_3);
    }
    if (b) {
      return k (1);
    } else {
      return minus_cps (n, 1, factcps_2);
    }
  }
  return eq_cps (n, 0, factcps_1);
}

#include <stdio.h>
int
main (int argc, char * argv[])
{
  int result = factcps (5, ret_cps);
  fprintf (stdout, "factcps(5)==%d\n", result);
  return 0;
}