Commit | Line | Data |
---|---|---|
bc8daf47 PK |
1 | static 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 | ||
13 | tyrec(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 | ||
49 | field(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 | ||
86 | variant(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 | } |