#include <stdio.h>
#include <stdlib.h>
static void hanoi();
typedef struct cont_r *cont;
struct cont_r {
int n;
char a;
char b;
char c;
struct cont_r *k;
};
typedef enum enum_e { FALSE, TRUE} enum_t;
void (*pc)();
int n;
char a;
char b;
char c;
cont k;
enum_t done;
void apply_k(){
cont tmp;
if(k == NULL)
done = TRUE;
else {
printf("%c ==> %c\n", k
->a
, k
->c
); n = k->n - 1;
a = k->b;
b = k->a;
c = k->c;
tmp = k;
k = k->k;
pc = hanoi;
}
}
cont make_k(int n, char a, char c, char b, cont k2){
k3->n = n;
k3->a = a;
k3->b = b;
k3->c = c;
k3->k = k2;
return k3;
}
void hanoi(){
char tmp;
if(n == 0){
pc = apply_k;
}
else {
k = make_k(n, a, c, b, k);
tmp = c;
c = b;
b = tmp;
n = n - 1;
pc = hanoi;
}
}
void trampoline(){
while(!done){
pc();
}
}
void init_hanoi(int n2, char a2, char b2, char c2){
n = n2;
a = a2;
b = b2;
c = c2;
k = NULL;
done = FALSE;
pc = hanoi;
trampoline();
}
int main () {
init_hanoi(3,'A','B','C');
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KIApzdGF0aWMgdm9pZCBoYW5vaSgpOwogCnR5cGVkZWYgc3RydWN0IGNvbnRfciAqY29udDsKc3RydWN0IGNvbnRfciB7CiAgaW50IG47CiAgY2hhciBhOwogIGNoYXIgYjsKICBjaGFyIGM7CiAgc3RydWN0IGNvbnRfciAqazsKfTsKIAp0eXBlZGVmIGVudW0gZW51bV9lIHsgRkFMU0UsIFRSVUV9IGVudW1fdDsgCiAKdm9pZCAoKnBjKSgpOwppbnQgbjsKY2hhciBhOwpjaGFyIGI7CmNoYXIgYzsKY29udCBrOwplbnVtX3QgZG9uZTsKIAp2b2lkIGFwcGx5X2soKXsKICBjb250IHRtcDsKICBpZihrID09IE5VTEwpCiAgICBkb25lID0gVFJVRTsKICBlbHNlIHsKICAgIHByaW50ZigiJWMgPT0+ICVjXG4iLCBrLT5hLCBrLT5jKTsKICAgIG4gPSBrLT5uIC0gMTsKICAgIGEgPSBrLT5iOwogICAgYiA9IGstPmE7CiAgICBjID0gay0+YzsKICAgIHRtcCA9IGs7CiAgICBrID0gay0+azsKICAgIGZyZWUodG1wKTsKICAgIHBjID0gaGFub2k7CiAgfQp9CiAKY29udCBtYWtlX2soaW50IG4sIGNoYXIgYSwgY2hhciBjLCBjaGFyIGIsIGNvbnQgazIpewogIGNvbnQgazMgPSBtYWxsb2Moc2l6ZW9mICprMyk7CiAgazMtPm4gPSBuOwogIGszLT5hID0gYTsKICBrMy0+YiA9IGI7CiAgazMtPmMgPSBjOwogIGszLT5rID0gazI7CiAgcmV0dXJuIGszOwp9CiAKdm9pZCBoYW5vaSgpewogIGNoYXIgdG1wOwogIGlmKG4gPT0gMCl7CiAgICBwYyA9IGFwcGx5X2s7CiAgfQogIGVsc2UgewogICAgayA9IG1ha2VfayhuLCBhLCBjLCBiLCBrKTsKICAgIHRtcCA9IGM7CiAgICBjID0gYjsKICAgIGIgPSB0bXA7CiAgICBuID0gbiAtIDE7CiAgICBwYyA9IGhhbm9pOwogIH0KfQogCnZvaWQgdHJhbXBvbGluZSgpewogIHdoaWxlKCFkb25lKXsKICAgIHBjKCk7CiAgfQp9CiAKdm9pZCBpbml0X2hhbm9pKGludCBuMiwgY2hhciBhMiwgY2hhciBiMiwgY2hhciBjMil7CiAgbiA9IG4yOwogIGEgPSBhMjsKICBiID0gYjI7CiAgYyA9IGMyOwogIGsgPSBOVUxMOwogIGRvbmUgPSBGQUxTRTsKICBwYyA9IGhhbm9pOwogIHRyYW1wb2xpbmUoKTsKfSAKIAppbnQgbWFpbiAoKSB7CiAgayA9IG1hbGxvYyhzaXplb2YgKmspOwogIGluaXRfaGFub2koMywnQScsJ0InLCdDJyk7CiAgZnJlZShrKTsKICByZXR1cm4gMDsKfQ==