-
-/*
- * A recursive tree search routine to test if two trees are equivalent.
- */
-
-public Boolean tr_equal(t1, t2)
-register Node t1;
-register Node t2;
-{
- register Boolean b;
-
- if (t1 == nil and t2 == nil) {
- b = true;
- } else if (t1 == nil or t2 == nil) {
- b = false;
- } else if (t1->op != t2->op or degree(t1->op) != degree(t2->op)) {
- b = false;
- } else {
- switch (degree(t1->op)) {
- case LEAF:
- switch (t1->op) {
- case O_NAME:
- b = (Boolean) (t1->value.name == t2->value.name);
- break;
-
- case O_SYM:
- b = (Boolean) (t1->value.sym == t2->value.sym);
- break;
-
- case O_LCON:
- b = (Boolean) (t1->value.lcon == t2->value.lcon);
- break;
-
- case O_FCON:
- b = (Boolean) (t1->value.fcon == t2->value.fcon);
- break;
-
- case O_SCON:
- b = (Boolean) (t1->value.scon == t2->value.scon);
- break;
-
- default:
- panic("tr_equal: leaf %d\n", t1->op);
- }
- /*NOTREACHED*/
-
- case BINARY:
- if (not tr_equal(t1->value.arg[0], t2->value.arg[0])) {
- b = false;
- } else {
- b = tr_equal(t1->value.arg[1], t2->value.arg[1]);
- }
- break;
-
- case UNARY:
- b = tr_equal(t1->value.arg[0], t2->value.arg[0]);
- break;
-
- default:
- panic("tr_equal: bad degree for op %d\n", t1->op);
- }
- }
- return b;
-}