Fix reduction, add declarations
[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);
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 = strdup(t->data.identifier);
31 break;
32 case lambda_abs:
33 c->data.abstraction.ident = strdup(t->data.abstraction.ident);
34 c->data.abstraction.expr = copy(t->data.abstraction.expr);
35 break;
36 case lambda_app:
37 c->data.application.expr1 = copy(t->data.application.expr1);
38 c->data.application.expr2 = copy(t->data.application.expr2);
39 break;
40 }
41 return c;
42 }
43