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