1 /*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)n2.c 4.2 (Berkeley) 04/18/91";
10 #endif /* not lint */
11
12 #include "tdef.h"
13 #include <sgtty.h>
14 extern
15 #include "d.h"
16 extern
17 #include "v.h"
18 #ifdef NROFF
19 extern
20 #include "tw.h"
21 #endif
22 #include "sdef.h"
23 #include <setjmp.h>
24 jmp_buf sjbuf;
25
26 /*
27 troff2.c
28
29 output, cleanup
30 */
31
32 extern struct s *frame, *stk, *nxf;
33 extern filep ip;
34 extern filep offset;
35 extern char *enda;
36
37
38 extern char obuf[OBUFSZ];
39 extern char *obufp;
40 extern int dilev;
41 extern int eschar;
42 extern int tlss;
43 extern int tflg;
44 extern int ascii;
45 extern int print;
46 extern char trtab[];
47 extern int waitf;
48 extern char ptname[];
49 extern int ptid;
50 extern int em;
51 extern int ds;
52 extern int mflg;
53 extern filep woff;
54 extern int nflush;
55 extern int lgf;
56 extern int app;
57 extern int nfo;
58 extern int donef;
59 extern int *pendw;
60 extern int nofeed;
61 extern int trap;
62 extern struct sgttyb ttys;
63 extern int ttysave;
64 extern int quiet;
65 extern int pendnf;
66 extern int ndone;
67 extern int lead;
68 extern int ralss;
69 extern int paper;
70 extern int gflag;
71 extern char *unlkp;
72 extern char nextf[];
73 extern int pipeflg;
74 extern int ejf;
75 extern int no_out;
76 extern int level;
77 extern int stopmesg;
78 extern int xxx;
79 int toolate;
80 int error;
81 #ifndef NROFF
82 extern int acctf;
83 #endif
84
pchar(c)85 pchar(c)
86 int c;
87 {
88 register i, j;
89
90 if((i=c) & MOT){pchar1(i); return;}
91 switch(j = i & CMASK){
92 case 0:
93 case IMP:
94 case RIGHT:
95 case LEFT:
96 return;
97 case HX:
98 j = (tlss>>9) | ((i&~0777)>>3);
99 if(i & 040000){
100 j &= ~(040000>>3);
101 if(j > dip->blss)dip->blss = j;
102 }else{
103 if(j > dip->alss)dip->alss = j;
104 ralss = dip->alss;
105 }
106 tlss = 0;
107 return;
108 case LX:
109 tlss = i;
110 return;
111 case PRESC:
112 if(dip == &d[0])j = eschar;
113 default:
114 i = (trtab[j] & BMASK) | (i & ~CMASK);
115 }
116 pchar1(i);
117 }
pchar1(c)118 pchar1(c)
119 int c;
120 {
121 register i, j, *k;
122 extern int chtab[];
123
124 j = (i = c) & CMASK;
125 if(dip != &d[0]){
126 wbf(i);
127 dip->op = offset;
128 return;
129 }
130 if(!tflg && !print){
131 if(j == '\n')dip->alss = dip->blss = 0;
132 return;
133 }
134 if(no_out || (j == FILLER))return;
135 #ifndef NROFF
136 if(ascii){
137 if(i & MOT){
138 oput(' ');
139 return;
140 }
141 if(j < 0177){
142 oput(i);
143 return;
144 }
145 switch(j){
146 case 0200:
147 case 0210:
148 oput('-');
149 break;
150 case 0211:
151 oputs("fi");
152 break;
153 case 0212:
154 oputs("fl");
155 break;
156 case 0213:
157 oputs("ff");
158 break;
159 case 0214:
160 oputs("ffi");
161 break;
162 case 0215:
163 oputs("ffl");
164 break;
165 default:
166 for(k=chtab; *++k != j; k++)
167 if(*k == 0)return;
168 oput('\\');
169 oput('(');
170 oput(*--k & BMASK);
171 oput(*k >> BYTE);
172 }
173 }else
174 #endif
175 ptout(i);
176 }
oput(i)177 oput(i)
178 char i;
179 {
180 *obufp++ = i;
181 if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
182 }
oputs(i)183 oputs(i)
184 char *i;
185 {
186 while(*i != 0)oput(*i++);
187 }
flusho()188 flusho(){
189 if(!ascii)*obufp++ = 0;
190 if(!ptid){
191 while((ptid=open(ptname,1)) < 0){
192 if(++waitf <=2)prstr("Waiting for Typesetter.\n");
193 sleep(15);
194 }
195 }
196 if(no_out == 0){
197 if (!toolate) {
198 toolate++;
199 #ifdef NROFF
200 if(t.bset || t.breset){
201 if(ttysave == -1) {
202 gtty(1, &ttys);
203 ttysave = ttys.sg_flags;
204 }
205 ttys.sg_flags &= ~t.breset;
206 ttys.sg_flags |= t.bset;
207 stty(1, &ttys);
208 }
209 {
210 char *p = t.twinit;
211 while (*p++)
212 ;
213 write(ptid, t.twinit, p-t.twinit-1);
214 }
215 #endif
216 }
217 toolate += write(ptid, obuf, obufp-obuf);
218 }
219 obufp = obuf;
220 }
done(x)221 done(x) int x;{
222 register i;
223
224 error |= x;
225 level = 0;
226 app = ds = lgf = 0;
227 if(i=em){
228 donef = -1;
229 em = 0;
230 if(control(i,0))longjmp(sjbuf,1);
231 }
232 if(!nfo)done3(0);
233 mflg = 0;
234 dip = &d[0];
235 if(woff)wbt(0);
236 if(pendw)getword(1);
237 pendnf = 0;
238 if(donef == 1)done1(0);
239 donef = 1;
240 ip = 0;
241 frame = stk;
242 nxf = frame + 1;
243 if(!ejf)tbreak();
244 nflush++;
245 eject((struct s *)0);
246 longjmp(sjbuf,1);
247 }
done1(x)248 done1(x) int x; {
249 error |= x;
250 if(v.nl){
251 trap = 0;
252 eject((struct s *)0);
253 longjmp(sjbuf,1);
254 }
255 if(nofeed){
256 ptlead();
257 flusho();
258 done3(0);
259 }else{
260 if(!gflag)lead += TRAILER;
261 done2(0);
262 }
263 }
done2(x)264 done2(x) int x; {
265 register i;
266
267 ptlead();
268 #ifndef NROFF
269 if(!ascii){
270 oput(T_INIT);
271 oput(T_STOP);
272 if(!gflag)for(i=8; i>0; i--)oput(T_PAD);
273 if(stopmesg)prstr("Troff finished.\n");
274 }
275 #endif
276 flusho();
277 done3(x);
278 }
done3(x)279 done3(x) int x;{
280 error |= x;
281 signal(SIGINT, SIG_IGN);
282 signal(SIGTERM, SIG_IGN);
283 unlink(unlkp);
284 #ifdef NROFF
285 twdone();
286 #endif
287 if(quiet){
288 ttys.sg_flags |= ECHO;
289 stty(0, &ttys);
290 }
291 if(ascii)mesg(1);
292 #ifndef NROFF
293 report();
294 #endif
295 exit(error);
296 }
edone(x)297 edone(x) int x;{
298 frame = stk;
299 nxf = frame + 1;
300 ip = 0;
301 done(x);
302 }
303 #ifndef NROFF
report()304 report(){
305 struct {int use; int uid;} a;
306
307 if((ptid != 1) && paper ){
308 lseek(acctf,0L,2);
309 a.use = paper;
310 a.uid = getuid();
311 write(acctf,(char *)&a,sizeof(a));
312 close(acctf);
313 }
314 }
315 #endif
316 #ifdef NROFF
casepi()317 casepi(){
318 register i;
319 int id[2];
320
321 if(toolate || skip() || !getname() || (pipe(id) == -1) ||
322 ((i=fork()) == -1)){
323 prstr("Pipe not created.\n");
324 return;
325 }
326 ptid = id[1];
327 if(i>0){
328 close(id[0]);
329 toolate++;
330 pipeflg++;
331 return;
332 }
333 close(0);
334 dup(id[0]);
335 close(id[1]);
336 execl(nextf,nextf,0);
337 prstr("Cannot exec: ");
338 prstr(nextf);
339 prstr("\n");
340 exit(-4);
341 }
342 #endif
343