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