|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2: #
3: /*
4: * pxp - Pascal execution profiler
5: *
6: * Bill Joy UCB
7: * Version 1.2 January 1979
8: */
9:
10: #include "0.h"
11: #include "tree.h"
12:
13: STATIC int typecnt -1;
14: /*
15: * Type declaration part
16: */
17: typebeg(l, tline)
18: int l, tline;
19: {
20:
21: line = l;
22: if (nodecl)
23: printoff();
24: puthedr();
25: putcm();
26: ppnl();
27: indent();
28: ppkw("type");
29: ppgoin(DECL);
30: typecnt = 0;
31: setline(tline);
32: }
33:
34: type(tline, tid, tdecl)
35: int tline;
36: char *tid;
37: int *tdecl;
38: {
39:
40: if (typecnt)
41: putcm();
42: setline(tline);
43: ppitem();
44: ppid(tid);
45: ppsep(" =");
46: gtype(tdecl);
47: ppsep(";");
48: setinfo(tline);
49: putcml();
50: typecnt++;
51: }
52:
53: typeend()
54: {
55:
56: if (typecnt == -1)
57: return;
58: if (typecnt == 0)
59: ppid("{type decls}");
60: ppgoout(DECL);
61: typecnt = -1;
62: }
63:
64: /*
65: * A single type declaration
66: */
67: gtype(r)
68: register int *r;
69: {
70:
71: if (r == NIL) {
72: ppid("{type}");
73: return;
74: }
75: if (r[0] != T_ID && r[0] != T_TYPACK)
76: setline(r[1]);
77: switch (r[0]) {
78: default:
79: panic("type");
80: case T_ID:
81: ppspac();
82: ppid(r[1]);
83: return;
84: case T_TYID:
85: ppspac();
86: ppid(r[2]);
87: break;
88: case T_TYSCAL:
89: ppspac();
90: tyscal(r);
91: break;
92: case T_TYRANG:
93: ppspac();
94: tyrang(r);
95: break;
96: case T_TYPTR:
97: ppspac();
98: ppop("^");
99: gtype(r[2]);
100: break;
101: case T_TYPACK:
102: ppspac();
103: ppkw("packed");
104: gtype(r[2]);
105: break;
106: case T_TYARY:
107: ppspac();
108: tyary(r);
109: break;
110: case T_TYREC:
111: ppspac();
112: tyrec(r[2], NIL);
113: break;
114: case T_TYFILE:
115: ppspac();
116: ppkw("file");
117: ppspac();
118: ppkw("of");
119: gtype(r[2]);
120: break;
121: case T_TYSET:
122: ppspac();
123: ppkw("set");
124: ppspac();
125: ppkw("of");
126: gtype(r[2]);
127: break;
128: }
129: setline(r[1]);
130: putcml();
131: }
132:
133: /*
134: * Scalar type declaration
135: */
136: tyscal(r)
137: register int *r;
138: {
139: register int i;
140:
141: ppsep("(");
142: r = r[2];
143: if (r != NIL) {
144: i = 0;
145: ppgoin(DECL);
146: for (;;) {
147: ppid(r[1]);
148: r = r[2];
149: if (r == NIL)
150: break;
151: ppsep(", ");
152: i++;
153: if (i == 7) {
154: ppitem();
155: i = 0;
156: }
157: }
158: ppgoout(DECL);
159: } else
160: ppid("{constant list}");
161: ppsep(")");
162: }
163:
164: /*
165: * Subrange type declaration
166: */
167: tyrang(r)
168: register int *r;
169: {
170:
171: gconst(r[2]);
172: ppsep("..");
173: gconst(r[3]);
174: }
175:
176: /*
177: * Array type declaration
178: */
179: tyary(r)
180: register int *r;
181: {
182: register int *tl;
183:
184: ppkw("array");
185: ppspac();
186: ppsep("[");
187: tl = r[2];
188: if (tl != NIL) {
189: ppunspac();
190: for (;;) {
191: gtype(tl[1]);
192: tl = tl[2];
193: if (tl == NIL)
194: break;
195: ppsep(",");
196: }
197: } else
198: ppid("{subscr list}");
199: ppsep("]");
200: ppspac();
201: ppkw("of");
202: gtype(r[3]);
203: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.