xref: /original-bsd/usr.bin/pascal/pdx/tree/tfree.c (revision fbed46ce)
1 /* Copyright (c) 1982 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)tfree.c 1.1 01/18/82";
4 
5 /*
6  * Free a tree; this is expensive but useful.
7  */
8 
9 #include "defs.h"
10 #include "tree.h"
11 #include "sym.h"
12 #include "tree.rep"
13 
14 tfree(p)
15 register NODE *p;
16 {
17 	if (p == NIL) {
18 		return;
19 	}
20 	switch(degree(p->op)) {
21 		case LEAF:
22 			switch(p->op) {
23 				case O_CALL:
24 					tfree(p->left);
25 					tfree(p->right);
26 					break;
27 
28 				case O_QLINE:
29 					dispose(p->left->sconval);
30 					dispose(p->left);
31 					tfree(p->right);
32 					break;
33 
34 				case O_ALIAS:
35 					dispose(p->left->sconval);
36 					dispose(p->left);
37 					dispose(p->right->sconval);
38 					dispose(p->right);
39 					break;
40 
41 				case O_SCON:
42 					unmkstring(p->nodetype);
43 					free(p->nodetype);
44 					free(p->sconval);
45 					p->sconval = NIL;
46 					break;
47 			}
48 			break;
49 
50 		case BINARY:
51 			tfree(p->right);
52 			/* fall through */
53 		case UNARY:
54 			tfree(p->left);
55 			break;
56 
57 		default:
58 			panic("bad op %d in tfree", p->op);
59 	}
60 	dispose(p);
61 }
62