a0b18daf50bd5fb12378cd35fe0584df89590da7
[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 if(t->refcount == 1){
8 switch(t->which){
9 case lambda_ident:
10 free(t->data.identifier.ident);
11 break;
12 case lambda_abs:
13 free(t->data.abstraction.ident);
14 lambda_free(t->data.abstraction.expr);
15 break;
16 case lambda_app:
17 lambda_free(t->data.application.expr1);
18 lambda_free(t->data.application.expr2);
19 break;
20 }
21 free(t);
22 } else {
23 t->refcount--;
24 }
25 }
26 }
27
28 struct lambda *copy(struct lambda *t)
29 {
30 struct lambda *c = malloc(sizeof (struct lambda));
31 c->which = t->which;
32 switch(t->which){
33 case lambda_ident:
34 c->data.identifier.ident = strdup(t->data.identifier.ident);
35 c->data.identifier.revision = t->data.identifier.revision;
36 break;
37 case lambda_abs:
38 c->data.abstraction.ident = strdup(t->data.abstraction.ident);
39 c->data.abstraction.strict = t->data.abstraction.strict;
40 c->data.abstraction.expr = copy(t->data.abstraction.expr);
41 c->data.abstraction.revision = t->data.abstraction.revision;
42 break;
43 case lambda_app:
44 c->data.application.expr1 = copy(t->data.application.expr1);
45 c->data.application.expr2 = copy(t->data.application.expr2);
46 break;
47 }
48 return c;
49 }
50