/* Factorial function using continuations in C. * This time without setjmp() and longjmp(). * Copyright (C) 2008, Ertugrul Söylemez */ #include #include void fact(int x, void (*e)(char *), void (*k)(int)) { void mulCont(int y) { k(x*y); } if (x < 0) e("Factorial of negative number."); if (x > 12) e("Number too big."); if (!x) k(1); fact(x-1, e, mulCont); } void readInt(char *str, void (*e)(char *), void (*k)(int)) { char *endp; int res; res = strtol(str, &endp, 0); if (str[0] && !endp[0]) k(res); e("Invalid integer."); } void error(char *msg) { printf("Error: %s\n", msg); exit(1); } void final(int x) { printf("%i\n", x); exit(0); } int main(int argc, char **argv) { void factCont(int x) { fact(x, error, final); } if (argc != 2) error("Expecting one argument."); readInt(argv[1], error, factCont); }