bigger machines get to have bigger tables.
[unix-history] / usr / src / usr.bin / pascal / pxp / rec.c
CommitLineData
bc8daf47
PK
1static char *sccsid = "@(#)rec.c 1.1 (Berkeley) %G%";
2/* Copyright (c) 1979 Regents of the University of California */
3#
4/*
5 * pxp - Pascal execution profiler
6 *
7 * Bill Joy UCB
8 * Version 1.2 January 1979
9 */
10
11#include "0.h"
12
13tyrec(r, p0)
14 int *r, p0;
15{
16
17 if (r != NIL)
18 setinfo(r[1]);
19 if (p0 == NIL) {
20 ppgoin(DECL);
21 ppnl();
22 indent();
23 ppkw("record");
24 ppspac();
25 } else {
26 ppspac();
27 ppbra("(");
28 }
29 ppgoin(DECL);
30 if (r) {
31 field(r[2], r[3]);
32 variant(r[3]);
33 }
34 if (r != NIL)
35 setinfo(r[1]);
36 putcml();
37 ppgoout(DECL);
38 if (p0 == NIL) {
39 ppnl();
40 indent();
41 ppkw("end");
42 ppgoout(DECL);
43 } else {
44 ppitem();
45 ppket(")");
46 }
47}
48
49field(r, v)
50 int *r, *v;
51{
52 register int *fp, *tp, *ip;
53
54 fp = r;
55 if (fp != NIL)
56 for (;;) {
57 tp = fp[1];
58 if (tp != NIL) {
59 setline(tp[1]);
60 ip = tp[2];
61 ppitem();
62 if (ip != NIL)
63 for (;;) {
64 ppid(ip[1]);
65 ip = ip[2];
66 if (ip == NIL)
67 break;
68 ppsep(", ");
69 }
70 else
71 ppid("{field id list}");
72 ppsep(":");
73 gtype(tp[3]);
74 setinfo(tp[1]);
75 putcm();
76 }
77 fp = fp[2];
78 if (fp == NIL)
79 break;
80 ppsep(";");
81 }
82 if (v != NIL && r != NIL)
83 ppsep(";");
84}
85
86variant(r)
87 register int *r;
88{
89 register int *v, *vc;
90
91 if (r == NIL)
92 return;
93 setline(r[1]);
94 ppitem();
95 ppkw("case");
96 v = r[2];
97 if (v != NIL) {
98 ppspac();
99 ppid(v);
100 ppsep(":");
101 }
102 gtype(r[3]);
103 ppspac();
104 ppkw("of");
105 for (vc = r[4]; vc != NIL;) {
106 v = vc[1];
107 if (v == NIL)
108 continue;
109 ppgoin(DECL);
110 setline(v[1]);
111 ppnl();
112 indent();
113 ppbra(NIL);
114 v = v[2];
115 if (v != NIL) {
116 for (;;) {
117 gconst(v[1]);
118 v = v[2];
119 if (v == NIL)
120 break;
121 ppsep(", ");
122 }
123 } else
124 ppid("{case label list}");
125 ppket(":");
126 v = vc[1];
127 tyrec(v[3], 1);
128 setinfo(v[1]);
129 putcml();
130 ppgoout(DECL);
131 vc = vc[2];
132 if (vc == NIL)
133 break;
134 ppsep(";");
135 }
136 setinfo(r[1]);
137 putcm();
138}