MACHINE defined by make(1), now
[unix-history] / usr / src / usr.bin / pascal / pxp / type.c
CommitLineData
252367af
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
9b6f37eb 6
252367af
DF
7#ifndef lint
8static char sccsid[] = "@(#)type.c 5.1 (Berkeley) %G%";
9#endif not lint
9b6f37eb 10
1f3fb7de
PK
11/*
12 * pxp - Pascal execution profiler
13 *
14 * Bill Joy UCB
15 * Version 1.2 January 1979
16 */
17
18#include "0.h"
19#include "tree.h"
20
f4e01610 21STATIC int typecnt = -1;
1f3fb7de
PK
22/*
23 * Type declaration part
24 */
25typebeg(l, tline)
26 int l, tline;
27{
28
29 line = l;
30 if (nodecl)
31 printoff();
32 puthedr();
33 putcm();
34 ppnl();
35 indent();
36 ppkw("type");
37 ppgoin(DECL);
38 typecnt = 0;
39 setline(tline);
40}
41
42type(tline, tid, tdecl)
43 int tline;
44 char *tid;
45 int *tdecl;
46{
47
48 if (typecnt)
49 putcm();
50 setline(tline);
51 ppitem();
52 ppid(tid);
53 ppsep(" =");
54 gtype(tdecl);
55 ppsep(";");
56 setinfo(tline);
57 putcml();
58 typecnt++;
59}
60
61typeend()
62{
63
64 if (typecnt == -1)
65 return;
66 if (typecnt == 0)
67 ppid("{type decls}");
68 ppgoout(DECL);
69 typecnt = -1;
70}
71
72/*
73 * A single type declaration
74 */
75gtype(r)
76 register int *r;
77{
78
79 if (r == NIL) {
80 ppid("{type}");
81 return;
82 }
83 if (r[0] != T_ID && r[0] != T_TYPACK)
84 setline(r[1]);
85 switch (r[0]) {
86 default:
87 panic("type");
88 case T_ID:
89 ppspac();
90 ppid(r[1]);
91 return;
92 case T_TYID:
93 ppspac();
94 ppid(r[2]);
95 break;
96 case T_TYSCAL:
97 ppspac();
98 tyscal(r);
99 break;
9b6f37eb
PA
100 case T_TYCRANG:
101 ppspac();
102 tycrang(r);
103 break;
1f3fb7de
PK
104 case T_TYRANG:
105 ppspac();
106 tyrang(r);
107 break;
108 case T_TYPTR:
109 ppspac();
110 ppop("^");
111 gtype(r[2]);
112 break;
113 case T_TYPACK:
114 ppspac();
115 ppkw("packed");
116 gtype(r[2]);
117 break;
9b6f37eb 118 case T_TYCARY:
1f3fb7de
PK
119 case T_TYARY:
120 ppspac();
121 tyary(r);
122 break;
123 case T_TYREC:
124 ppspac();
125 tyrec(r[2], NIL);
126 break;
127 case T_TYFILE:
128 ppspac();
129 ppkw("file");
130 ppspac();
131 ppkw("of");
132 gtype(r[2]);
133 break;
134 case T_TYSET:
135 ppspac();
136 ppkw("set");
137 ppspac();
138 ppkw("of");
139 gtype(r[2]);
140 break;
141 }
142 setline(r[1]);
143 putcml();
144}
145
146/*
147 * Scalar type declaration
148 */
149tyscal(r)
150 register int *r;
151{
152 register int i;
153
154 ppsep("(");
155 r = r[2];
156 if (r != NIL) {
157 i = 0;
158 ppgoin(DECL);
159 for (;;) {
160 ppid(r[1]);
161 r = r[2];
162 if (r == NIL)
163 break;
164 ppsep(", ");
165 i++;
166 if (i == 7) {
167 ppitem();
168 i = 0;
169 }
170 }
171 ppgoout(DECL);
172 } else
173 ppid("{constant list}");
174 ppsep(")");
175}
176
9b6f37eb
PA
177/*
178 * Conformant array subrange.
179 */
180tycrang(r)
181 register int *r;
182{
183
184 ppid(r[2]);
185 ppsep("..");
186 ppid(r[3]);
187 ppsep(":");
188 gtype(r[4]);
189}
190
1f3fb7de
PK
191/*
192 * Subrange type declaration
193 */
194tyrang(r)
195 register int *r;
196{
197
198 gconst(r[2]);
199 ppsep("..");
200 gconst(r[3]);
201}
202
203/*
204 * Array type declaration
205 */
206tyary(r)
207 register int *r;
208{
209 register int *tl;
210
211 ppkw("array");
212 ppspac();
213 ppsep("[");
214 tl = r[2];
215 if (tl != NIL) {
216 ppunspac();
217 for (;;) {
218 gtype(tl[1]);
219 tl = tl[2];
220 if (tl == NIL)
221 break;
222 ppsep(",");
223 }
224 } else
225 ppid("{subscr list}");
226 ppsep("]");
227 ppspac();
228 ppkw("of");
229 gtype(r[3]);
230}