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