|
|
1.1 root 1: #include "tdef.hd"
2: #ifdef unix
3: #include <sgtty.h>
4: #endif
5: #include "strs.hd"
6: #ifdef NROFF
7: #include "tw.hd"
8: extern struct ttable t;
9: #endif
10: #ifdef unix
11: #include <setjmp.h>
12: extern jmp_buf sjbuf;
13: #endif
14:
15: /*
16: troff2.c
17:
18: output, cleanup
19: */
20:
21: extern struct s *frame, *stk, *nxf;
22: extern struct tmpfaddr ip;
23: extern struct tmpfaddr offset;
24: #ifndef INCORE
25: extern struct envblock eblock;
26: #else
27: extern struct envblock eblock[NEV];
28: extern int ev;
29: #endif
30: extern struct datablock dblock;
31: extern struct d d[NDI], *dip;
32:
33: extern char *enda;
34:
35:
36: extern int ch_CMASK;
37: extern char obuf[OBUFSZ];
38: extern char *obufp;
39: extern int dilev;
40: extern int eschar;
41: extern int tlss;
42: extern int tflg;
43: extern int ascii;
44: extern int print;
45: extern int waitf;
46: extern char ptname[];
47: extern filedes ptid;
48: extern int em;
49: extern int ds;
50: extern int mflg;
51: extern struct tmpfaddr woff;
52: extern int nflush;
53: extern int lgf;
54: extern int app;
55: extern int nfo;
56: extern int donef;
57: extern int nofeed;
58: extern int trap;
59: extern struct sgttyb ttys;
60: extern int ttysave;
61: extern int quiet;
62: extern int ndone;
63: extern int lead;
64: extern int ralss;
65: extern int gflag;
66: extern char *unlkp;
67: extern char newf[];
68: extern int ejf;
69: extern int no_out;
70: extern int level;
71: extern int stop;
72: int toolate;
73: int error;
74: #ifndef NROFF
75: extern int paper;
76: extern int acctf;
77: #else
78: #ifndef SMALL
79: extern int pipeflg;
80: #endif
81: #endif
82: pchar(c)
83: int c;
84: {
85: register j;
86:
87: if(c & MOT){pchar1(c); return;}
88: switch(j = c & CMASK){
89: case 0:
90: case IMP:
91: case RIGHT:
92: case LEFT:
93: return;
94: case HX:
95: j = (tlss>>9) | ((c&~0777)>>3);
96: if(c & 040000){
97: j &= ~(040000>>3);
98: if(j > dip->blss)dip->blss = j;
99: }else{
100: if(j > dip->alss)dip->alss = j;
101: ralss = dip->alss;
102: }
103: tlss = 0;
104: return;
105: case LX:
106: tlss = c;
107: return;
108: case PRESC:
109: if (dilev == 0) j = eschar;
110: default:
111: c = (trtab[j] & BMASK) | (c & ~CMASK);
112: }
113: pchar1(c);
114: }
115: pchar1(c)
116: int c;
117: {
118: register j, *k;
119: extern int chtab[];
120:
121: j = c & CMASK;
122: if (dilev > 0) {
123: wbf(c);
124: cptmpfaddr(dip->op,offset);
125: return;
126: }
127: if(!tflg && !print){
128: if(j == '\n')dip->alss = dip->blss = 0;
129: return;
130: }
131: if(no_out || (j == FILLER))return;
132: #ifndef NROFF
133: if(ascii){
134: if(c & MOT){
135: oput(' ');
136: return;
137: }
138: if(j < 0177){
139: oput(c);
140: return;
141: }
142: switch(j){
143: case 0200:
144: case 0210:
145: oput('-');
146: break;
147: case 0211:
148: oputs("\146\151"/*fi*/);
149: break;
150: case 0212:
151: oputs("\146\154"/*fl*/);
152: break;
153: case 0213:
154: oputs("\146\146"/*ff*/);
155: break;
156: case 0214:
157: oputs("\146\146\151"/*ffi*/);
158: break;
159: case 0215:
160: oputs("\146\146\154"/*ffl*/);
161: break;
162: default:
163: for(k=chtab; *++k != j; k++)
164: if(*k == 0)return;
165: oput('\\');
166: oput('(');
167: oput(*--k & BMASK);
168: oput(*k >> BYTE);
169: }
170: }else
171: #endif
172: ptout(c);
173: }
174: oput(i)
175: char i;
176: {
177: *obufp++ = i;
178: if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
179: }
180: oputs(i)
181: char *i;
182: {
183: while(*i != 0)oput(*i++);
184: }
185: flusho(){
186: if(!ascii)*obufp++ = 0;
187: #ifdef unix
188: if(!ptid){
189: while((ptid=open(ptname,1)) < 0){
190: if(++waitf <=2)prstr("Waiting for Typesetter.\n");
191: sleep(15);
192: }
193: }
194: #endif
195: if(no_out == 0){
196: if (!toolate) {
197: toolate++;
198: #ifdef NROFF
199: #ifdef unix
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: #endif
210: {
211: char *p = t.twinit;
212: while (*p++)
213: ;
214: #ifdef unix
215: write(ptid, t.twinit, p-t.twinit-1);
216: #endif
217: #ifdef tso
218: fwrite(t.twinit,p-t.twinit-1,1,ptid);
219: #endif
220: }
221: #endif
222: }
223: #ifdef unix
224: toolate += write(ptid, obuf, obufp-obuf);
225: #endif
226: #ifdef tso
227: toolate += fwrite(obuf,obufp-obuf,1,ptid);
228: #endif
229: }
230: obufp = obuf;
231: }
232: done(x) int x;{
233: register i;
234:
235: error |= x;
236: level = 0;
237: app = ds = lgf = 0;
238: if(i=em){
239: donef = -1;
240: em = 0;
241: #ifdef unix
242: if(control(i,0))longjmp(sjbuf,1);
243: #endif
244: #ifdef tso
245: if (control(i,0)) reset(0);
246: #endif
247: }
248: if(!nfo)done3(0);
249: mflg = 0;
250: dip = &d[dilev = 0];
251: if (woff.b) wbt(0);
252: if(pendw)getword(1);
253: pendnf = 0;
254: if(donef == 1)done1(0);
255: donef = 1;
256: ip.b = 0;
257: frame = stk;
258: #ifndef INCORE
259: nxf = frame + 1;
260: #else
261: nxf = (struct s *)malloc(sizeof(struct s));
262: #endif
263: if(!ejf)tbreak();
264: nflush++;
265: eject((struct s *)0);
266: #ifdef unix
267: longjmp(sjbuf,1);
268: #endif
269: #ifdef tso
270: reset(0);
271: #endif
272: }
273: done1(x) int x; {
274: error |= x;
275: if(v_nl){
276: trap = 0;
277: eject((struct s *)0);
278: #ifdef unix
279: longjmp(sjbuf,1);
280: #endif
281: #ifdef tso
282: reset(0);
283: #endif
284: }
285: if(nofeed){
286: ptlead();
287: flusho();
288: done3(0);
289: }else{
290: if(!gflag)lead += TRAILER;
291: done2(0);
292: }
293: }
294: done2(x) int x; {
295: register i;
296:
297: ptlead();
298: #ifndef NROFF
299: if(!ascii){
300: oput(T_INIT);
301: oput(T_STOP);
302: if(!gflag)for(i=8; i>0; i--)oput(T_PAD);
303: #ifndef tso
304: if(stop && (ptid != 1)) prstr("Troff finished.\n");
305: #endif
306: }
307: #endif
308: flusho();
309: done3(x);
310: }
311: done3(x) int x;{
312: error |= x;
313: #ifdef unix
314: signal(SIGINT, SIG_IGN);
315: signal(SIGTERM, SIG_IGN);
316: #ifndef INCORE
317: unlink(unlkp);
318: #endif
319: #endif
320: #ifdef NROFF
321: twdone();
322: #endif
323: #ifdef unix
324: if(quiet){
325: ttys.sg_flags |= ECHO;
326: stty(0, &ttys);
327: }
328: #endif
329: if(ascii)mesg(1);
330: #ifndef NROFF
331: #ifndef SMALL
332: report();
333: #endif
334: #endif
335: exit(error);
336: }
337: edone(x) int x;{
338: frame = stk;
339: #ifndef INCORE
340: nxf = frame + 1;
341: #else
342: nxf = (struct s *)malloc(sizeof(struct s));
343: #endif
344: ip.b = 0;
345: done(x);
346: }
347:
348: #ifndef NROFF
349: #ifndef SMALL
350: report(){
351: struct {int use; int uid;} a;
352:
353: if((ptid != 1) && paper ){
354: lseek(acctf,0L,2);
355: a.use = paper;
356: a.uid = getuid();
357: write(acctf,(char *)&a,sizeof(a));
358: }
359: }
360: #endif
361: #endif
362: #ifdef NROFF
363: casepi(){
364: #ifndef SMALL
365: register i;
366: int id[2];
367:
368: if(toolate || skip() || !getname() || (pipe(id) == -1) ||
369: ((i=fork()) == -1)){
370: prstr("Pipe not created.\n");
371: return;
372: }
373: ptid = id[1];
374: if(i>0){
375: close(id[0]);
376: toolate++;
377: pipeflg++;
378: return;
379: }
380: close(0);
381: dup(id[0]);
382: close(id[1]);
383: execl(newf,newf,0);
384: prstr("Cannot exec: ");
385: prstr(newf);
386: prstr("\n");
387: exit(-4);
388: #endif
389: }
390: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.