add strictness
[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.strict = t->data.abstraction.strict;
36 c->data.abstraction.expr = copy(t->data.abstraction.expr);
37 c->data.abstraction.revision = t->data.abstraction.revision;
38 break;
39 case lambda_app:
40 c->data.application.expr1 = copy(t->data.application.expr1);
41 c->data.application.expr2 = copy(t->data.application.expr2);
42 break;
43 }
44 return c;
45 }
46