All pastes #1881437 Raw Copy code Copy link Edit

fact5.c

public text v1 · immutable
#1881437 ·published 2010-06-11 23:47 UTC
rendered paste body
#include <setjmp.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include "fact5.h"

void *ktr_empty(void *dismount) {
kt* _data = (kt*)malloc(sizeof(kt));
if(!_data) {
  fprintf(stderr, "Out of memory\n");
  exit(1);
}
  _data->tag = _empty_kt;
  _data->u._empty._dismount = dismount;
  return (void *)_data;
}

void *ktr_extend(void *n, void *k) {
kt* _data = (kt*)malloc(sizeof(kt));
if(!_data) {
  fprintf(stderr, "Out of memory\n");
  exit(1);
}
  _data->tag = _extend_kt;
  _data->u._extend._n = n;
  _data->u._extend._k = k;
  return (void *)_data;
}

int main()
{
n = (void *)(void *)5;
pc = &factorialr_cps;
mount_tram();
printf("Factorial of 5: %d\n", (int)v);}

void factorialr_cps()
{
if((n == 0)) {
  kh = (void *)k;
v = (void *)(void *)1;
pc = &applyr_k;

} else {
  k = (void *)ktr_extend(n,k);
n = (void *)(void *)((int)n - (int)(void *)1);
pc = &factorialr_cps;

}
}

void applyr_k()
{
kt* _c = (kt*)kh;
switch (_c->tag) {
case _empty_kt: {
void *dismount = _c->u._empty._dismount;
_trstr *trstr = (_trstr *)dismount;
longjmp(*trstr->jmpbuf, 1);
break; }
case _extend_kt: {
void *n = _c->u._extend._n;
void *k = _c->u._extend._k;
kh = (void *)k;
v = (void *)(void *)((int)n * (int)v);
pc = &applyr_k;
break; }
}
}

int mount_tram ()
{
srand (time (NULL));
jmp_buf jb;
_trstr trstr;
void *dismount;
int _status = setjmp(jb);
trstr.jmpbuf = &jb;
dismount = &trstr;
if(!_status) {
k= (void *)ktr_empty(dismount);
for(;;) {
pc();
}
}
return 0;
}