|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2: #
3: /*
4: * pi - Pascal interpreter code translator
5: *
6: * Charles Haley, Bill Joy UCB
7: * Version 1.1 February 1978
8: *
9: *
10: * pxp - Pascal execution profiler
11: *
12: * Bill Joy UCB
13: * Version 1.1 February 1978
14: */
15:
16: #include "0.h"
17:
18: /*
19: * TREE SPACE DECLARATIONS
20: */
21: struct tr {
22: int *tr_low;
23: int *tr_high;
24: } ttab[MAXTREE], *tract;
25:
26: /*
27: * The variable space is the
28: * absolute base of the tree segments.
29: * (exactly the same as ttab[0].tr_low)
30: * Spacep is maintained to point at the
31: * beginning of the next tree slot to
32: * be allocated for use by the grammar.
33: * Spacep is used "extern" by the semantic
34: * actions in pas.y.
35: * The variable tract is maintained to point
36: * at the tree segment out of which we are
37: * allocating (the active segment).
38: */
39: int *space, *spacep;
40:
41: /*
42: * TREENMAX is the maximum width
43: * in words that any tree node
44: * due to the way in which the parser uses
45: * the pointer spacep.
46: */
47: #define TREENMAX 6
48:
49: int trspace[ITREE];
50: int *space = trspace;
51: int *spacep = trspace;
52: struct tr *tract = ttab;
53:
54: /*
55: * Inittree allocates the first tree slot
56: * and sets up the first segment descriptor.
57: * A lot of this work is actually done statically
58: * above.
59: */
60: inittree()
61: {
62:
63: ttab[0].tr_low = space;
64: ttab[0].tr_high = &space[ITREE];
65: }
66:
67: /*
68: * Tree builds the nodes in the
69: * parse tree. It is rarely called
70: * directly, rather calls are made
71: * to tree[12345] which supplies the
72: * first argument to save space in
73: * the code. Tree also guarantees
74: * that spacep points to the beginning
75: * of the next slot it will return,
76: * a property required by the parser
77: * which was always true before we
78: * segmented the tree space.
79: */
80: int *tree(cnt, a)
81: int cnt;
82: {
83: register int *p, *q;
84: register int i;
85:
86: i = cnt;
87: p = spacep;
88: q = &a;
89: do
90: *p++ = *q++;
91: while (--i);
92: q = spacep;
93: spacep = p;
94: if (p+TREENMAX >= tract->tr_high)
95: /*
96: * this peek-ahead should
97: * save a great number of calls
98: * to tralloc.
99: */
100: tralloc(TREENMAX);
101: return (q);
102: }
103:
104: /*
105: * Tralloc preallocates enough
106: * space in the tree to allow
107: * the grammar to use the variable
108: * spacep, as it did before the
109: * tree was segmented.
110: */
111: tralloc(howmuch)
112: {
113: register char *cp;
114: register i;
115:
116: if (spacep + howmuch >= tract->tr_high) {
117: i = TRINC;
118: cp = malloc(i * sizeof ( int ));
119: if (cp == -1) {
120: yerror("Ran out of memory (tralloc)");
121: pexit(DIED);
122: }
123: spacep = cp;
124: tract++;
125: if (tract >= &ttab[MAXTREE]) {
126: yerror("Ran out of tree tables");
127: pexit(DIED);
128: }
129: tract->tr_low = cp;
130: tract->tr_high = tract->tr_low+i;
131: }
132: }
133:
134: extern int yylacnt;
135: extern bottled;
136: #ifdef PXP
137: #endif
138: /*
139: * Free up the tree segments
140: * at the end of a block.
141: * If there is scanner lookahead,
142: * i.e. if yylacnt != 0 or there is bottled output, then we
143: * cannot free the tree space.
144: * This happens only when errors
145: * occur and the forward move extends
146: * across "units".
147: */
148: trfree()
149: {
150:
151: if (yylacnt != 0 || bottled != NIL)
152: return;
153: #ifdef PXP
154: if (needtree())
155: return;
156: #endif
157: spacep = space;
158: while (tract->tr_low > spacep || tract->tr_high <= spacep) {
159: free(tract->tr_low);
160: tract->tr_low = NIL;
161: tract->tr_high = NIL;
162: tract--;
163: if (tract < ttab)
164: panic("ttab");
165: }
166: #ifdef PXP
167: packtree();
168: #endif
169: }
170:
171: /*
172: * Copystr copies a token from
173: * the "token" buffer into the
174: * tree space.
175: */
176: copystr(token)
177: register char *token;
178: {
179: register char *cp;
180: register int i;
181:
182: i = (strlen(token) + sizeof ( int )) & ~( ( sizeof ( int ) ) - 1 );
183: tralloc(i / sizeof ( int ));
184: strcpy(spacep, token);
185: cp = spacep;
186: spacep = cp + i;
187: tralloc(TREENMAX);
188: return (cp);
189: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.