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