Started with actually freeing terms that are not used anymore
[lambda.git] / mem.c
1 #include <stdlib.h>
2 #include "lambda.h"
3
4 void lambda_free(struct lambda *t)
5 {
6 if(t != NULL){
7 switch(t->which){
8 case lambda_ident:
9 free(t->data.identifier.ident);
10 break;
11 case lambda_abs:
12 free(t->data.abstraction.ident);
13 lambda_free(t->data.abstraction.expr);
14 break;
15 case lambda_app:
16 lambda_free(t->data.application.expr1);
17 lambda_free(t->data.application.expr2);
18 break;
19 }
20 }
21 free(t);
22 }
23
24 struct lambda *copy(struct lambda *t)
25 {
26 struct lambda *c = malloc(sizeof (struct lambda));
27 c->which = t->which;
28 switch(t->which){
29 case lambda_ident:
30 c->data.identifier.ident = strdup(t->data.identifier.ident);
31 c->data.identifier.revision = t->data.identifier.revision;
32 break;
33 case lambda_abs:
34 c->data.abstraction.ident = strdup(t->data.abstraction.ident);
35 c->data.abstraction.expr = copy(t->data.abstraction.expr);
36 c->data.abstraction.revision = t->data.abstraction.revision;
37 break;
38 case lambda_app:
39 c->data.application.expr1 = copy(t->data.application.expr1);
40 c->data.application.expr2 = copy(t->data.application.expr2);
41 break;
42 }
43 return c;
44 }
45