|
|
1.1 root 1: #include "tdef.h"
2: #include <sgtty.h>
3: extern
4: #include "d.h"
5: extern
6: #include "v.h"
7: #ifdef NROFF
8: extern
9: #include "tw.h"
10: #endif
11: #include "s.h"
12: #include <setjmp.h>
13:
14: /*
15: troff2.c
16:
17: output, cleanup
18: */
19:
20: #include "ext.h"
21: extern jmp_buf sjbuf;
22: int toolate;
23: int error;
24:
25: pchar(i)
26: tchar i;
27: {
28: int j;
29: static int hx = 0; /* records if have seen HX */
30:
31: if (hx) {
32: hx = 0;
33: j = absmot(i);
34: if (isnmot(i)) {
35: if (j > dip->blss)
36: dip->blss = j;
37: } else {
38: if (j > dip->alss)
39: dip->alss = j;
40: ralss = dip->alss;
41: }
42: return;
43: }
44: if (ismot(i)) {
45: pchar1(i);
46: return;
47: }
48: switch (j = cbits(i)) {
49: case 0:
50: case IMP:
51: case RIGHT:
52: case LEFT:
53: return;
54: case HX:
55: hx = 1;
56: return;
57: case PRESC:
58: if (dip == &d[0])
59: j = eschar; /* fall through */
60: default:
61: setcbits(i, trtab[j]);
62: }
63: pchar1(i);
64: }
65:
66:
67: pchar1(i)
68: tchar i;
69: {
70: register j, *k;
71:
72: j = cbits(i);
73: if (dip != &d[0]) {
74: wbf(i);
75: dip->op = offset;
76: return;
77: }
78: if (!tflg && !print) {
79: if (j == '\n')
80: dip->alss = dip->blss = 0;
81: return;
82: }
83: if (no_out || j == FILLER)
84: return;
85: if (tflg) { /* transparent mode, undiverted */
86: fprintf(ptid, "%c", j);
87: return;
88: }
89: #ifndef NROFF
90: if (ascii) {
91: if (ismot(i)) {
92: oput(' ');
93: return;
94: }
95: if (j < 0177) {
96: oput(j);
97: return;
98: }
99: if (j == HYPHEN || j == MINUS)
100: oput('-');
101: else if (j == LIG_FI)
102: oputs("fi");
103: else if (j == LIG_FL)
104: oputs("fl");
105: else if (j == LIG_FF)
106: oputs("ff");
107: else if (j == LIG_FFI)
108: oputs("ffi");
109: else if (j == LIG_FFL)
110: oputs("ffl");
111: else if (j == NARSP || j == HNARSP || j == WORDSP)
112: ; /* nothing at all */
113: else {
114: oput('\\');
115: oput('(');
116: oput(chname[chtab[j-128]]);
117: oput(chname[chtab[j-128]+1]);
118: }
119: } else
120: #endif
121: ptout(i);
122: }
123:
124:
125: oput(i)
126: char i;
127: {
128: *obufp++ = i;
129: if (obufp >= &obuf[OBUFSZ])
130: flusho();
131: }
132:
133:
134: oputs(i)
135: register char *i;
136: {
137: while (*i != 0)
138: oput(*i++);
139: }
140:
141:
142: flusho()
143: {
144: if (obufp == obuf)
145: return;
146: if (no_out == 0) {
147: if (!toolate) {
148: toolate++;
149: #ifdef NROFF
150: if (t.bset || t.breset) {
151: if (ttysave == -1) {
152: gtty(1, &ttys);
153: ttysave = ttys.sg_flags;
154: }
155: ttys.sg_flags &= ~t.breset;
156: ttys.sg_flags |= t.bset;
157: stty(1, &ttys);
158: }
159: {
160: char *p = t.twinit;
161: while (*p++)
162: ;
163: write(ptid, t.twinit, p - t.twinit - 1);
164: }
165: #endif
166: }
167: toolate += write(ptid, obuf, obufp - obuf);
168: }
169: obufp = obuf;
170: }
171:
172:
173: done(x)
174: int x;
175: {
176: register i;
177:
178: error |= x;
179: level = 0;
180: app = ds = lgf = 0;
181: if (i = em) {
182: donef = -1;
183: em = 0;
184: if (control(i, 0))
185: longjmp(sjbuf, 1);
186: }
187: if (!nfo)
188: done3(0);
189: mflg = 0;
190: dip = &d[0];
191: if (woff)
192: wbt((tchar)0);
193: if (pendw)
194: getword(1);
195: pendnf = 0;
196: if (donef == 1)
197: done1(0);
198: donef = 1;
199: ip = 0;
200: frame = stk;
201: nxf = frame + 1;
202: if (!ejf)
203: tbreak();
204: nflush++;
205: eject((struct s *)0);
206: longjmp(sjbuf, 1);
207: }
208:
209:
210: done1(x)
211: int x;
212: {
213: error |= x;
214: if (v.nl) {
215: trap = 0;
216: eject((struct s *)0);
217: longjmp(sjbuf, 1);
218: }
219: if (nofeed) {
220: ptlead();
221: flusho();
222: done3(0);
223: } else {
224: if (!gflag)
225: pttrailer();
226: done2(0);
227: }
228: }
229:
230:
231: done2(x)
232: int x;
233: {
234: ptlead();
235: #ifndef NROFF
236: if (!ascii)
237: ptstop();
238: #endif
239: flusho();
240: done3(x);
241: }
242:
243: done3(x)
244: int x;
245: {
246: error |= x;
247: signal(SIGINT, SIG_IGN);
248: signal(SIGTERM, SIG_IGN);
249: unlink(unlkp);
250: #ifdef NROFF
251: twdone();
252: #endif
253: if (quiet) {
254: ttys.sg_flags |= ECHO;
255: stty(0, &ttys);
256: }
257: if (ascii)
258: mesg(1);
259: exit(error);
260: }
261:
262:
263: edone(x)
264: int x;
265: {
266: frame = stk;
267: nxf = frame + 1;
268: ip = 0;
269: done(x);
270: }
271:
272:
273:
274: casepi()
275: {
276: register i;
277: int id[2];
278:
279: if (toolate || skip() || !getname() || pipe(id) == -1 || (i = fork()) == -1) {
280: fprintf(stderr, "Pipe not created.\n");
281: return;
282: }
283: ptid = id[1];
284: if (i > 0) {
285: close(id[0]);
286: toolate++;
287: pipeflg++;
288: return;
289: }
290: close(0);
291: dup(id[0]);
292: close(id[1]);
293: execl(nextf, nextf, 0);
294: fprintf(stderr, "Cannot exec %s\n", nextf);
295: exit(-4);
296: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.