129dc968dSjaap #ifndef lint
2*cbcd6dcaSkarels /*
39255bebbSjaap static char sccsid[] = "@(#)n2.c	2.1 (CWI) 85/07/18";
4*cbcd6dcaSkarels */
5*cbcd6dcaSkarels static char sccsid[] = "@(#)n2.c	2.2 (Berkeley) 11/03/90";
629dc968dSjaap #endif lint
79255bebbSjaap /*
89255bebbSjaap  * n2.c
99255bebbSjaap  *
109255bebbSjaap  * output, cleanup
119255bebbSjaap  */
1229dc968dSjaap 
1329dc968dSjaap #include "tdef.h"
1429dc968dSjaap #include <sgtty.h>
159255bebbSjaap #include <signal.h>
1629dc968dSjaap #ifdef NROFF
1729dc968dSjaap #include "tw.h"
1829dc968dSjaap #endif
1929dc968dSjaap #include <setjmp.h>
2029dc968dSjaap #include "ext.h"
219255bebbSjaap 
2229dc968dSjaap extern	jmp_buf	sjbuf;
2329dc968dSjaap int	toolate;
2429dc968dSjaap int	error;
2529dc968dSjaap 
pchar(i)2629dc968dSjaap pchar(i)
279255bebbSjaap 	register tchar i;
2829dc968dSjaap {
299255bebbSjaap 	register int j;
3029dc968dSjaap 	static int hx = 0;	/* records if have seen HX */
3129dc968dSjaap 
3229dc968dSjaap 	if (hx) {
3329dc968dSjaap 		hx = 0;
3429dc968dSjaap 		j = absmot(i);
3529dc968dSjaap 		if (isnmot(i)) {
3629dc968dSjaap 			if (j > dip->blss)
3729dc968dSjaap 				dip->blss = j;
3829dc968dSjaap 		} else {
3929dc968dSjaap 			if (j > dip->alss)
4029dc968dSjaap 				dip->alss = j;
4129dc968dSjaap 			ralss = dip->alss;
4229dc968dSjaap 		}
4329dc968dSjaap 		return;
4429dc968dSjaap 	}
4529dc968dSjaap 	if (ismot(i)) {
4629dc968dSjaap 		pchar1(i);
4729dc968dSjaap 		return;
4829dc968dSjaap 	}
4929dc968dSjaap 	switch (j = cbits(i)) {
5029dc968dSjaap 	case 0:
5129dc968dSjaap 	case IMP:
5229dc968dSjaap 	case RIGHT:
5329dc968dSjaap 	case LEFT:
5429dc968dSjaap 		return;
5529dc968dSjaap 	case HX:
5629dc968dSjaap 		hx = 1;
5729dc968dSjaap 		return;
5829dc968dSjaap 	case PRESC:
5929dc968dSjaap 		if (dip == &d[0])
6029dc968dSjaap 			j = eschar;	/* fall through */
6129dc968dSjaap 	default:
6229dc968dSjaap 		setcbits(i, trtab[j]);
6329dc968dSjaap 	}
6429dc968dSjaap 	pchar1(i);
6529dc968dSjaap }
6629dc968dSjaap 
6729dc968dSjaap 
pchar1(i)6829dc968dSjaap pchar1(i)
699255bebbSjaap 	register tchar i;
7029dc968dSjaap {
719255bebbSjaap 	register j;
7229dc968dSjaap 
7329dc968dSjaap 	j = cbits(i);
7429dc968dSjaap 	if (dip != &d[0]) {
7529dc968dSjaap 		wbf(i);
7629dc968dSjaap 		dip->op = offset;
7729dc968dSjaap 		return;
7829dc968dSjaap 	}
7929dc968dSjaap 	if (!tflg && !print) {
8029dc968dSjaap 		if (j == '\n')
8129dc968dSjaap 			dip->alss = dip->blss = 0;
8229dc968dSjaap 		return;
8329dc968dSjaap 	}
8429dc968dSjaap 	if (no_out || j == FILLER)
8529dc968dSjaap 		return;
8629dc968dSjaap 	if (tflg) {	/* transparent mode, undiverted */
879255bebbSjaap 		fdprintf(ptid, "%c", j);
8829dc968dSjaap 		return;
8929dc968dSjaap 	}
9029dc968dSjaap #ifndef NROFF
919255bebbSjaap 	if (ascii)
929255bebbSjaap 		outascii(i);
939255bebbSjaap 	else
949255bebbSjaap #endif
959255bebbSjaap 		ptout(i);
969255bebbSjaap }
979255bebbSjaap 
outascii(i)989255bebbSjaap outascii(i)	/* print i in best-guess ascii */
999255bebbSjaap 	tchar i;
1009255bebbSjaap {
1019255bebbSjaap 	static int seendraw;
1029255bebbSjaap 	int j = cbits(i);
1039255bebbSjaap 
10429dc968dSjaap 	if (ismot(i)) {
10529dc968dSjaap 		if(!seendraw) {
10629dc968dSjaap 			oput(' ');
10729dc968dSjaap 		}
10829dc968dSjaap 		return;
10929dc968dSjaap 	}
11029dc968dSjaap 	if (j < 0177 && j >= 040) {
11129dc968dSjaap 		if(!seendraw) {
11229dc968dSjaap 			oput(j);
11329dc968dSjaap 			return;
11429dc968dSjaap 		} else {
11529dc968dSjaap 			switch(j) {
11629dc968dSjaap 				case DRAWCIRCLE: oputs("CIRCLE ");
11729dc968dSjaap 					break;
11829dc968dSjaap 				case DRAWELLIPSE: oputs("ELLIPSE ");
11929dc968dSjaap 					break;
12029dc968dSjaap 				case DRAWLINE: oputs("LINE ");
12129dc968dSjaap 					break;
1229255bebbSjaap 				case DRAWSPLINE: oputs("SPLINE ");
12329dc968dSjaap 					break;
12429dc968dSjaap 				case DRAWARC: oputs("ARC ");
12529dc968dSjaap 					break;
1269255bebbSjaap 				case '.':oputs(".");
1279255bebbSjaap 					/*
12829dc968dSjaap 					if(seendraw == 2)
12929dc968dSjaap 						seendraw = 0;
13029dc968dSjaap 					else
13129dc968dSjaap 						seendraw++;
1329255bebbSjaap 					*/
13329dc968dSjaap 					break;
1349255bebbSjaap 				default: oputs("UNKNOWN "); flusho();
1359255bebbSjaap 					errprint("Unknown 0%o %c function", j,j);
13629dc968dSjaap 					break;
13729dc968dSjaap 			}
13829dc968dSjaap 			return;
13929dc968dSjaap 		}
14029dc968dSjaap 	}
14129dc968dSjaap 	if( j < 040) {
14229dc968dSjaap 		switch(j) {
14329dc968dSjaap 			case SLANT:
14429dc968dSjaap 			case CHARHT:
14529dc968dSjaap 			case WORDSP:
14629dc968dSjaap 			case HX:
14729dc968dSjaap 				return;
14829dc968dSjaap 			case DRAWFCN:
1499255bebbSjaap 				if(seendraw == 1){
1509255bebbSjaap 					seendraw = 0;
1519255bebbSjaap 				} else {
1529255bebbSjaap 					oputs("DRAWFUNCTION ");flusho();
15329dc968dSjaap 					seendraw++;
1549255bebbSjaap 				}
1559255bebbSjaap 				/*
1569255bebbSjaap 				errprint("Seendraw %d", seendraw);
1579255bebbSjaap 				*/
15829dc968dSjaap 				return;
15929dc968dSjaap 			case '\n':
16029dc968dSjaap 				oput(j);
16129dc968dSjaap 				return;
16229dc968dSjaap 			default:
1639255bebbSjaap 				errprint("Unknown (2) 0%o function", j);
16429dc968dSjaap 				return;
16529dc968dSjaap 		}
16629dc968dSjaap 	}
16729dc968dSjaap 	if (j == HYPHEN || j == MINUS)
16829dc968dSjaap 		oput('-');
16929dc968dSjaap 	else if (j == LIG_FI)
17029dc968dSjaap 		oputs("fi");
17129dc968dSjaap 	else if (j == LIG_FL)
17229dc968dSjaap 		oputs("fl");
17329dc968dSjaap 	else if (j == LIG_FF)
17429dc968dSjaap 		oputs("ff");
17529dc968dSjaap 	else if (j == LIG_FFI)
17629dc968dSjaap 		oputs("ffi");
17729dc968dSjaap 	else if (j == LIG_FFL)
17829dc968dSjaap 		oputs("ffl");
17929dc968dSjaap 	else {
18029dc968dSjaap 		oput('\\');
18129dc968dSjaap 		oput('(');
18229dc968dSjaap 		oput(chname[chtab[j-128]]);
18329dc968dSjaap 		oput(chname[chtab[j-128]+1]);
18429dc968dSjaap 	}
18529dc968dSjaap }
18629dc968dSjaap 
oputs(i)18729dc968dSjaap oputs(i)
18829dc968dSjaap register char	*i;
18929dc968dSjaap {
19029dc968dSjaap 	while (*i != 0)
19129dc968dSjaap 		oput(*i++);
19229dc968dSjaap }
19329dc968dSjaap 
done(x)19429dc968dSjaap done(x)
19529dc968dSjaap int	x;
19629dc968dSjaap {
19729dc968dSjaap 	register i;
19829dc968dSjaap 
19929dc968dSjaap 	error |= x;
20029dc968dSjaap 	app = ds = lgf = 0;
20129dc968dSjaap 	if (i = em) {
20229dc968dSjaap 		donef = -1;
20329dc968dSjaap 		em = 0;
20429dc968dSjaap 		if (control(i, 0))
20529dc968dSjaap 			longjmp(sjbuf, 1);
20629dc968dSjaap 	}
20729dc968dSjaap 	if (!nfo)
20829dc968dSjaap 		done3(0);
20929dc968dSjaap 	mflg = 0;
21029dc968dSjaap 	dip = &d[0];
21129dc968dSjaap 	if (woff)
21229dc968dSjaap 		wbt((tchar)0);
21329dc968dSjaap 	if (pendw)
21429dc968dSjaap 		getword(1);
21529dc968dSjaap 	pendnf = 0;
21629dc968dSjaap 	if (donef == 1)
21729dc968dSjaap 		done1(0);
21829dc968dSjaap 	donef = 1;
21929dc968dSjaap 	ip = 0;
22029dc968dSjaap 	frame = stk;
22129dc968dSjaap 	nxf = frame + 1;
22229dc968dSjaap 	if (!ejf)
22329dc968dSjaap 		tbreak();
22429dc968dSjaap 	nflush++;
22529dc968dSjaap 	eject((struct s *)0);
22629dc968dSjaap 	longjmp(sjbuf, 1);
22729dc968dSjaap }
22829dc968dSjaap 
22929dc968dSjaap 
done1(x)23029dc968dSjaap done1(x)
23129dc968dSjaap int	x;
23229dc968dSjaap {
23329dc968dSjaap 	error |= x;
2349255bebbSjaap 	if (numtab[NL].val) {
23529dc968dSjaap 		trap = 0;
23629dc968dSjaap 		eject((struct s *)0);
23729dc968dSjaap 		longjmp(sjbuf, 1);
23829dc968dSjaap 	}
23929dc968dSjaap 	if (nofeed) {
24029dc968dSjaap 		ptlead();
24129dc968dSjaap 		flusho();
24229dc968dSjaap 		done3(0);
24329dc968dSjaap 	} else {
24429dc968dSjaap 		if (!gflag)
24529dc968dSjaap 			pttrailer();
24629dc968dSjaap 		done2(0);
24729dc968dSjaap 	}
24829dc968dSjaap }
24929dc968dSjaap 
25029dc968dSjaap 
done2(x)25129dc968dSjaap done2(x)
25229dc968dSjaap int	x;
25329dc968dSjaap {
25429dc968dSjaap 	ptlead();
25529dc968dSjaap #ifndef NROFF
25629dc968dSjaap 	if (!ascii)
25729dc968dSjaap 		ptstop();
25829dc968dSjaap #endif
25929dc968dSjaap 	flusho();
26029dc968dSjaap 	done3(x);
26129dc968dSjaap }
26229dc968dSjaap 
done3(x)26329dc968dSjaap done3(x)
26429dc968dSjaap int	x;
26529dc968dSjaap {
26629dc968dSjaap 	error |= x;
26729dc968dSjaap 	signal(SIGINT, SIG_IGN);
26829dc968dSjaap 	signal(SIGTERM, SIG_IGN);
26929dc968dSjaap #ifdef NROFF
27029dc968dSjaap 	twdone();
27129dc968dSjaap #endif
27229dc968dSjaap 	if (quiet) {
27329dc968dSjaap 		ttys.sg_flags |= ECHO;
27429dc968dSjaap 		stty(0, &ttys);
27529dc968dSjaap 	}
27629dc968dSjaap 	if (ascii)
27729dc968dSjaap 		mesg(1);
27829dc968dSjaap 	exit(error);
27929dc968dSjaap }
28029dc968dSjaap 
28129dc968dSjaap 
edone(x)28229dc968dSjaap edone(x)
28329dc968dSjaap int	x;
28429dc968dSjaap {
28529dc968dSjaap 	frame = stk;
28629dc968dSjaap 	nxf = frame + 1;
28729dc968dSjaap 	ip = 0;
28829dc968dSjaap 	done(x);
28929dc968dSjaap }
29029dc968dSjaap 
29129dc968dSjaap 
29229dc968dSjaap 
casepi()29329dc968dSjaap casepi()
29429dc968dSjaap {
29529dc968dSjaap 	register i;
29629dc968dSjaap 	int	id[2];
29729dc968dSjaap 
29829dc968dSjaap 	if (toolate || skip() || !getname() || pipe(id) == -1 || (i = fork()) == -1) {
2999255bebbSjaap 		errprint("Pipe not created.");
30029dc968dSjaap 		return;
30129dc968dSjaap 	}
302*cbcd6dcaSkarels 	ptid = fdopen(id[1], "w");
30329dc968dSjaap 	if (i > 0) {
30429dc968dSjaap 		close(id[0]);
30529dc968dSjaap 		toolate++;
30629dc968dSjaap 		pipeflg++;
30729dc968dSjaap 		return;
30829dc968dSjaap 	}
30929dc968dSjaap 	close(0);
31029dc968dSjaap 	dup(id[0]);
31129dc968dSjaap 	close(id[1]);
31229dc968dSjaap 	execl(nextf, nextf, 0);
3139255bebbSjaap 	errprint("Cannot exec %s", nextf);
31429dc968dSjaap 	exit(-4);
31529dc968dSjaap }
316