BSD 2 development
[unix-history] / src / pi0 / send.c
CommitLineData
a0ce3a0c
BJ
1/* Copyright (c) 1979 Regents of the University of California */
2#include "0.h"
3#include "tree.h"
4/*
5 * pi - Pascal interpreter code translator
6 * Bill Joy UCB
7 * February 5, 1978
8 */
9
10int pipbuf[259];
11int pv[2], pv2[2];
12int pid -1;
13
14char *PI1 "/usr/lib/pi1";
15
16#define ETXTBSY 26
17
18char printed, hadsome;
19#ifdef PC0
20char fileout;
21#endif
22
23send(i, a1, a2, a3, a4)
24 register int i;
25{
26 register int *ap;
27 register char *cp;
28 int x;
29 extern errno;
30 extern char *lastname, *obj;
31
32 switch (i) {
33
34 case RINIT:
35#ifdef PC0
36 if (opt('f')) {
37 fileout++;
38 if (fcreat(pipbuf, "tree") < 0) {
39 perror( "tree");
40 pexit(NOSTART);
41 }
42 } else {
43#endif
44 if (pipe(pv) || pipe(pv2)) {
45 perror( "pipe");
46 pexit(NOSTART);
47 }
48 pid = fork();
49 if (pid == -1) {
50 perror(0);
51 pexit(NOSTART);
52 }
53 if (pid == 0) {
54 close(0);
55 dup(pv[0]);
56 close(pv[0]);
57 close(pv[1]);
58 close(pv2[0]);
59 for (;;) {
60#ifdef DEBUG
61 execl(PI1, "pi1", hp21mx ? "" : 0, 0);
62#else
63 execl(PI1, "pi1", 0);
64#endif
65 if (errno != ETXTBSY)
66 break;
67 sleep(2);
68 }
69 perror(PI1);
70 exit(1);
71 }
72 pipbuf[0] = pv[1];
73 close(pv[0]);
74 pv[0] = pv2[0];
75 close(pv2[1]);
76#ifdef PC0
77 }
78#endif
79 filename = lastname = savestr(filename);
80 obj = savestr(obj);
81 errfile = savestr(errfile);
82 putac(i);
83 putaw(soffset(lastname));
84 putaw(soffset(obj));
85 putac(pv2[1]);
86 for (i = 0; i < 26; i++)
87 putac(opts[i]);
88 putac(efil);
89 putaw(soffset(errfile));
90 putac(ofil);
91 break;
92
93 case RENQ:
94ackit:
95 if (opt('l'))
96 yyoutline();
97 putac(RENQ);
98 ack();
99 break;
100
101 case RTREE:
102 ap = a1;
103 putac(i);
104 i = *ap++;
105 if (i < 0 || i > T_LAST)
106 panic("send RTREE");
107 putac(i);
108 cp = trdesc[i];
109 while (*cp) switch (*cp++) {
110
111 case 's':
112 cp = ap;
113 while (*cp)
114 putac(*cp++);
115 putac(0);
116 ap = (((unsigned) cp) + 2) &~ 1;
117 return (ap);
118
119 case 'd':
120 putac(*ap++);
121 continue;
122
123 case 'n':
124 putaw(*ap++);
125 continue;
126
127 case '"':
128 putaw(soffset(*ap++));
129 continue;
130
131 case 'p':
132 putaw(toffset(*ap++));
133 continue;
134
135 default:
136 panic("send RTREE case");
137 }
138#ifdef DEBUG
139 if (*ap < 0 || *ap > T_LAST)
140 printf("trdesc[%d] flunks\n", i);
141#endif
142 return (ap);
143
144#ifdef DEBUG
145 case RTRCHK:
146 putac(i);
147 putaw(a1);
148 break;
149#endif
150
151 case RTRFREE:
152 tsend();
153 case REVTBEG:
154 case REVVBEG:
155 case REVTEND:
156 case REVVEND:
157 case REVENIT:
158 putac(i);
159 break;
160
161 case RSTRING:
162 putac(RSTRING);
163 for (cp = a1; *cp; cp)
164 putac(*cp++);
165 putac(0);
166 break;
167
168 case REVLAB:
169 tsend();
170 putac(i);
171 putaw(toffset(a1));
172 break;
173
174 case REVCNST:
175 tsend();
176 putac(i);
177 putaw(a1);
178 putaw(soffset(a2));
179 putaw(toffset(a3));
180 break;
181
182 case REVTYPE:
183 tsend();
184 putac(i);
185 putaw(a1);
186 putaw(soffset(a2));
187 putaw(toffset(a3));
188 break;
189
190 case REVVAR:
191 tsend();
192 putac(i);
193 putaw(a1);
194 putaw(toffset(a2));
195 putaw(toffset(a3));
196 break;
197
198 case REVFHDR:
199 tsend();
200 putac(i);
201 putaw(toffset(a1));
202 break;
203
204 case REVFBDY:
205 putac(i);
206 break;
207
208 case REVFEND:
209 tsend();
210 putac(i);
211 putaw(toffset(a1));
212 putaw(a2);
213 putaw(a3);
214 putaw(soffset(lastname));
215 putaw(soffset(filename));
216 putac(printed);
217 putac(hadsome);
218 goto ackit;
219
220 case ROPUSH:
221 case ROPOP:
222 putac(i);
223 putac(a1);
224 break;
225
226 case ROSET:
227 putac(i);
228 putac(a1);
229 putaw(a2);
230 break;
231
232 case RKILL:
233 kill(pid, 1);
234 /* wait(&status); */
235 break;
236
237 case RFINISH:
238 putac(i);
239 fflush(pipbuf);
240#ifdef PC0
241 if (!fileout) {
242#endif
243 if (read(pv[0], &x, 2) != 2)
244 panic("RFINISH");
245 eflg =| x;
246#ifdef PC0
247 } else
248 pexit(NOSTART);
249#endif
250 return;
251
252 default:
253 panic("send");
254 }
255}
256
257putaw(i)
258 int i;
259{
260
261 putw(i, pipbuf);
262}
263
264putac(i)
265 int i;
266{
267
268 putc(i, pipbuf);
269}
270
271extern struct nl *Fp;
272
273ack()
274{
275 int i[3], j;
276
277#ifdef PC0
278 if (!fileout) {
279#endif
280 fflush(pipbuf);
281 j = read(pv[0], &i, 6);
282 if (j != 6) {
283 error("Fatal error in pass 2");
284 pexit(DIED);
285 }
286 if (soffset(lastname) != i[0])
287 lastname = filename;
288 Fp = i[1];
289 printed = i[2] & 0377;
290 hadsome = (i[2] >> 8) & 0377;
291#ifdef PC0
292 } else
293 Fp = NIL;
294#endif
295}