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