/* Factorial function using continuations in C. * Copyright (C) 2008, Ertugrul Söylemez */ #include #include #include int factorial(int x, jmp_buf e, jmp_buf k) { static int p; jmp_buf r; int jv; p = 1; if (x < 0) longjmp(e, 25); jv = setjmp(r); if (!jv) longjmp(r, x); p *= jv; if (jv > 1) longjmp(r, jv-1); longjmp(k, p); } int main(int argc, char **argv) { jmp_buf e; jmp_buf p; int jv; jv = setjmp(e); if (jv) { puts("_Expecting one argument.\0Invalid integer." + jv); return jv; } jv = setjmp(p); if (jv) { printf("%i\n", jv); return 0; } if (argc != 2) longjmp(e, 1); factorial(atoi(argv[1]), e, p); }