|
|
1.1 root 1: /*
2: * The routines in this file
3: * read in expression trees from the intermediate
4: * file. They are used by both the modify phase and the
5: * code generation phase.
6: */
7: #ifdef vax
8: #include "INC$LIB:cc1.h"
9: #else
10: #include "cc1.h"
11: #endif
12:
13: /*
14: * Read in a tree.
15: * The tree is built up in the
16: * tree buffer.
17: * Return a pointer to the top
18: * of the tree.
19: */
20: TREE *
21: treeget()
22: {
23:
24: newtree(sizeof(TREE));
25: return (treeget1());
26: }
27:
28: /*
29: * This recursive routine is
30: * the real workhorse of the tree
31: * reader.
32: * It build the node and calls
33: * itself to grab the subtrees of
34: * the node.
35: */
36: TREE *
37: treeget1()
38: {
39: register TREE *tp;
40: register op;
41:
42: if ((op=iget()) == NIL)
43: return (NULL);
44: tp = alocnode();
45: tp->t_op = op;
46: tp->t_type = bget();
47: tp->t_size = 0;
48: if (tp->t_type == BLK)
49: tp->t_size = iget();
50: switch (op) {
51:
52: case ICON:
53: tp->t_ival = iget();
54: break;
55:
56: case LCON:
57: tp->t_lval = lget();
58: break;
59:
60: case DCON:
61: dget(tp->t_dval);
62: break;
63:
64: case AID:
65: case PID:
66: tp->t_offs = zget();
67: break;
68:
69: case LID:
70: tp->t_offs = zget();
71: tp->t_seg = bget();
72: tp->t_label = iget();
73: break;
74:
75: case GID:
76: tp->t_offs = zget();
77: tp->t_seg = bget();
78: sget(id, NCSYMB);
79: tp->t_sp = gidpool(id);
80: break;
81:
82: case REG:
83: tp->t_reg = iget();
84: break;
85:
86: case FIELD:
87: tp->t_width = bget();
88: tp->t_base = bget();
89: tp->t_lp = treeget1();
90: break;
91:
92: default:
93: tp->t_lp = treeget1();
94: tp->t_rp = treeget1();
95: }
96: return (tp);
97: }
98:
99: /*
100: * Walk a tree, calling the supplied
101: * function at each node. The order of the
102: * walk is left, right, root.
103: */
104: walk(tp, f)
105: TREE *tp;
106: int (*f)();
107: {
108: walk1(tp, NULL, f);
109: }
110:
111: walk1(tp, ptp, f)
112: register TREE *tp;
113: TREE *ptp;
114: int (*f)();
115: {
116: register TREE *stp;
117:
118: if (!isleaf(tp->t_op)) {
119: walk1(tp->t_lp, tp, f);
120: if (tp->t_op!=FIELD && (stp=tp->t_rp)!=NULL)
121: walk1(stp, tp, f);
122: }
123: (*f)(tp, ptp);
124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.