Started with actually freeing terms that are not used anymore
[lambda.git] / print.c
1 #include <stdio.h>
2 #include "lambda.h"
3
4 void print_apos(unsigned int revision)
5 {
6 if(revision == 1)
7 printf("\'");
8 if(revision > 2){
9 printf("\"");
10 print_apos(revision - 2);
11 }
12 }
13
14 void term_print(struct lambda *t, struct lambda *mark)
15 {
16 if(t == mark)
17 putchar('|');
18 switch(t->which){
19 case lambda_ident:
20 printf("%s", t->data.identifier.ident);
21 print_apos(t->data.identifier.revision);
22 break;
23 case lambda_abs:
24 printf("(λ");
25 printf("%s", t->data.abstraction.ident);
26 print_apos(t->data.abstraction.revision);
27 putchar('.');
28 term_print(t->data.abstraction.expr, mark);
29 putchar(')');
30 break;
31 case lambda_app:
32 putchar('(');
33 term_print(t->data.application.expr1, mark);
34 putchar(' ');
35 term_print(t->data.application.expr2, mark);
36 putchar(')');
37 break;
38 }
39 if(t == mark)
40 putchar('|');
41 }
42
43 void lambda_print(struct lambda *t, struct lambda *mark)
44 {
45 term_print(t, mark);
46 putchar('\n');
47 }