123880Sjaap #ifndef lint
2*64044Sbostic /*
323902Sjaap static char sccsid[] = "@(#)n2.c	2.1 (CWI) 85/07/18";
4*64044Sbostic */
5*64044Sbostic static char sccsid[] = "@(#)n2.c	2.2 (Berkeley) 07/27/93";
623880Sjaap #endif lint
723902Sjaap /*
823902Sjaap  * n2.c
923902Sjaap  *
1023902Sjaap  * output, cleanup
1123902Sjaap  */
1223880Sjaap 
1323880Sjaap #include "tdef.h"
1423880Sjaap #include <sgtty.h>
1523902Sjaap #include <signal.h>
1623880Sjaap #ifdef NROFF
1723880Sjaap #include "tw.h"
1823880Sjaap #endif
1923880Sjaap #include <setjmp.h>
2023902Sjaap #include "ext.h"
2123880Sjaap 
2223902Sjaap extern	jmp_buf	sjbuf;
2323880Sjaap int	toolate;
2423880Sjaap int	error;
2523880Sjaap 
pchar(i)2623880Sjaap pchar(i)
2723902Sjaap 	register tchar i;
2823880Sjaap {
2923902Sjaap 	register int j;
3023880Sjaap 	static int hx = 0;	/* records if have seen HX */
3123880Sjaap 
3223880Sjaap 	if (hx) {
3323880Sjaap 		hx = 0;
3423880Sjaap 		j = absmot(i);
3523880Sjaap 		if (isnmot(i)) {
3623880Sjaap 			if (j > dip->blss)
3723880Sjaap 				dip->blss = j;
3823880Sjaap 		} else {
3923880Sjaap 			if (j > dip->alss)
4023880Sjaap 				dip->alss = j;
4123880Sjaap 			ralss = dip->alss;
4223880Sjaap 		}
4323880Sjaap 		return;
4423880Sjaap 	}
4523880Sjaap 	if (ismot(i)) {
4623880Sjaap 		pchar1(i);
4723880Sjaap 		return;
4823880Sjaap 	}
4923880Sjaap 	switch (j = cbits(i)) {
5023880Sjaap 	case 0:
5123880Sjaap 	case IMP:
5223880Sjaap 	case RIGHT:
5323880Sjaap 	case LEFT:
5423880Sjaap 		return;
5523880Sjaap 	case HX:
5623880Sjaap 		hx = 1;
5723880Sjaap 		return;
5823880Sjaap 	case PRESC:
5923880Sjaap 		if (dip == &d[0])
6023880Sjaap 			j = eschar;	/* fall through */
6123880Sjaap 	default:
6223880Sjaap 		setcbits(i, trtab[j]);
6323880Sjaap 	}
6423880Sjaap 	pchar1(i);
6523880Sjaap }
6623880Sjaap 
6723880Sjaap 
pchar1(i)6823880Sjaap pchar1(i)
6923902Sjaap 	register tchar i;
7023880Sjaap {
7123902Sjaap 	register j;
7223880Sjaap 
7323880Sjaap 	j = cbits(i);
7423880Sjaap 	if (dip != &d[0]) {
7523880Sjaap 		wbf(i);
7623880Sjaap 		dip->op = offset;
7723880Sjaap 		return;
7823880Sjaap 	}
7923880Sjaap 	if (!tflg && !print) {
8023880Sjaap 		if (j == '\n')
8123880Sjaap 			dip->alss = dip->blss = 0;
8223880Sjaap 		return;
8323880Sjaap 	}
8423880Sjaap 	if (no_out || j == FILLER)
8523880Sjaap 		return;
8623880Sjaap 	if (tflg) {	/* transparent mode, undiverted */
8723902Sjaap 		fdprintf(ptid, "%c", j);
8823880Sjaap 		return;
8923880Sjaap 	}
9023880Sjaap #ifndef NROFF
9123902Sjaap 	if (ascii)
9223902Sjaap 		outascii(i);
9323902Sjaap 	else
9423902Sjaap #endif
9523902Sjaap 		ptout(i);
9623902Sjaap }
9723902Sjaap 
outascii(i)9823902Sjaap outascii(i)	/* print i in best-guess ascii */
9923902Sjaap 	tchar i;
10023902Sjaap {
10123902Sjaap 	static int seendraw;
10223902Sjaap 	int j = cbits(i);
10323902Sjaap 
10423902Sjaap 	if (ismot(i)) {
10523902Sjaap 		if(!seendraw) {
10623902Sjaap 			oput(' ');
10723902Sjaap 		}
10823902Sjaap 		return;
10923902Sjaap 	}
11023902Sjaap 	if (j < 0177 && j >= 040) {
11123902Sjaap 		if(!seendraw) {
11223902Sjaap 			oput(j);
11323902Sjaap 			return;
11423902Sjaap 		} else {
11523902Sjaap 			switch(j) {
11623902Sjaap 				case DRAWCIRCLE: oputs("CIRCLE ");
11723902Sjaap 					break;
11823902Sjaap 				case DRAWELLIPSE: oputs("ELLIPSE ");
11923902Sjaap 					break;
12023902Sjaap 				case DRAWLINE: oputs("LINE ");
12123902Sjaap 					break;
12223902Sjaap 				case DRAWSPLINE: oputs("SPLINE ");
12323902Sjaap 					break;
12423902Sjaap 				case DRAWARC: oputs("ARC ");
12523902Sjaap 					break;
12623902Sjaap 				case '.':oputs(".");
12723902Sjaap 					/*
12823902Sjaap 					if(seendraw == 2)
12923902Sjaap 						seendraw = 0;
13023902Sjaap 					else
13123902Sjaap 						seendraw++;
13223902Sjaap 					*/
13323902Sjaap 					break;
13423902Sjaap 				default: oputs("UNKNOWN "); flusho();
13523902Sjaap 					errprint("Unknown 0%o %c function", j,j);
13623902Sjaap 					break;
13723880Sjaap 			}
13823880Sjaap 			return;
13923880Sjaap 		}
14023902Sjaap 	}
14123902Sjaap 	if( j < 040) {
14223902Sjaap 		switch(j) {
14323902Sjaap 			case SLANT:
14423902Sjaap 			case CHARHT:
14523902Sjaap 			case WORDSP:
14623902Sjaap 			case HX:
14723880Sjaap 				return;
14823902Sjaap 			case DRAWFCN:
14923902Sjaap 				if(seendraw == 1){
15023902Sjaap 					seendraw = 0;
15123902Sjaap 				} else {
15223902Sjaap 					oputs("DRAWFUNCTION ");flusho();
15323902Sjaap 					seendraw++;
15423880Sjaap 				}
15523902Sjaap 				/*
15623902Sjaap 				errprint("Seendraw %d", seendraw);
15723902Sjaap 				*/
15823880Sjaap 				return;
15923902Sjaap 			case '\n':
16023902Sjaap 				oput(j);
16123902Sjaap 				return;
16223902Sjaap 			default:
16323902Sjaap 				errprint("Unknown (2) 0%o function", j);
16423902Sjaap 				return;
16523880Sjaap 		}
16623902Sjaap 	}
16723902Sjaap 	if (j == HYPHEN || j == MINUS)
16823902Sjaap 		oput('-');
16923902Sjaap 	else if (j == LIG_FI)
17023902Sjaap 		oputs("fi");
17123902Sjaap 	else if (j == LIG_FL)
17223902Sjaap 		oputs("fl");
17323902Sjaap 	else if (j == LIG_FF)
17423902Sjaap 		oputs("ff");
17523902Sjaap 	else if (j == LIG_FFI)
17623902Sjaap 		oputs("ffi");
17723902Sjaap 	else if (j == LIG_FFL)
17823902Sjaap 		oputs("ffl");
17923902Sjaap 	else {
18023902Sjaap 		oput('\\');
18123902Sjaap 		oput('(');
18223902Sjaap 		oput(chname[chtab[j-128]]);
18323902Sjaap 		oput(chname[chtab[j-128]+1]);
18423902Sjaap 	}
18523880Sjaap }
18623880Sjaap 
oputs(i)18723880Sjaap oputs(i)
18823880Sjaap register char	*i;
18923880Sjaap {
19023880Sjaap 	while (*i != 0)
19123880Sjaap 		oput(*i++);
19223880Sjaap }
19323880Sjaap 
done(x)19423880Sjaap done(x)
19523880Sjaap int	x;
19623880Sjaap {
19723880Sjaap 	register i;
19823880Sjaap 
19923880Sjaap 	error |= x;
20023880Sjaap 	app = ds = lgf = 0;
20123880Sjaap 	if (i = em) {
20223880Sjaap 		donef = -1;
20323880Sjaap 		em = 0;
20423880Sjaap 		if (control(i, 0))
20523880Sjaap 			longjmp(sjbuf, 1);
20623880Sjaap 	}
20723880Sjaap 	if (!nfo)
20823880Sjaap 		done3(0);
20923880Sjaap 	mflg = 0;
21023880Sjaap 	dip = &d[0];
21123880Sjaap 	if (woff)
21223880Sjaap 		wbt((tchar)0);
21323880Sjaap 	if (pendw)
21423880Sjaap 		getword(1);
21523880Sjaap 	pendnf = 0;
21623880Sjaap 	if (donef == 1)
21723880Sjaap 		done1(0);
21823880Sjaap 	donef = 1;
21923880Sjaap 	ip = 0;
22023880Sjaap 	frame = stk;
22123880Sjaap 	nxf = frame + 1;
22223880Sjaap 	if (!ejf)
22323880Sjaap 		tbreak();
22423880Sjaap 	nflush++;
22523880Sjaap 	eject((struct s *)0);
22623880Sjaap 	longjmp(sjbuf, 1);
22723880Sjaap }
22823880Sjaap 
22923880Sjaap 
done1(x)23023880Sjaap done1(x)
23123880Sjaap int	x;
23223880Sjaap {
23323880Sjaap 	error |= x;
23423902Sjaap 	if (numtab[NL].val) {
23523880Sjaap 		trap = 0;
23623880Sjaap 		eject((struct s *)0);
23723880Sjaap 		longjmp(sjbuf, 1);
23823880Sjaap 	}
23923880Sjaap 	if (nofeed) {
24023880Sjaap 		ptlead();
24123880Sjaap 		flusho();
24223880Sjaap 		done3(0);
24323880Sjaap 	} else {
24423880Sjaap 		if (!gflag)
24523880Sjaap 			pttrailer();
24623880Sjaap 		done2(0);
24723880Sjaap 	}
24823880Sjaap }
24923880Sjaap 
25023880Sjaap 
done2(x)25123880Sjaap done2(x)
25223880Sjaap int	x;
25323880Sjaap {
25423880Sjaap 	ptlead();
25523880Sjaap #ifndef NROFF
25623880Sjaap 	if (!ascii)
25723880Sjaap 		ptstop();
25823880Sjaap #endif
25923880Sjaap 	flusho();
26023880Sjaap 	done3(x);
26123880Sjaap }
26223880Sjaap 
done3(x)26323880Sjaap done3(x)
26423880Sjaap int	x;
26523880Sjaap {
26623880Sjaap 	error |= x;
26723880Sjaap 	signal(SIGINT, SIG_IGN);
26823880Sjaap 	signal(SIGTERM, SIG_IGN);
26923880Sjaap #ifdef NROFF
27023880Sjaap 	twdone();
27123880Sjaap #endif
27223880Sjaap 	if (quiet) {
27323880Sjaap 		ttys.sg_flags |= ECHO;
27423880Sjaap 		stty(0, &ttys);
27523880Sjaap 	}
27623880Sjaap 	if (ascii)
27723880Sjaap 		mesg(1);
27823880Sjaap 	exit(error);
27923880Sjaap }
28023880Sjaap 
28123880Sjaap 
edone(x)28223880Sjaap edone(x)
28323880Sjaap int	x;
28423880Sjaap {
28523880Sjaap 	frame = stk;
28623880Sjaap 	nxf = frame + 1;
28723880Sjaap 	ip = 0;
28823880Sjaap 	done(x);
28923880Sjaap }
29023880Sjaap 
29123880Sjaap 
29223880Sjaap 
casepi()29323880Sjaap casepi()
29423880Sjaap {
29523880Sjaap 	register i;
29623880Sjaap 	int	id[2];
29723880Sjaap 
29823880Sjaap 	if (toolate || skip() || !getname() || pipe(id) == -1 || (i = fork()) == -1) {
29923902Sjaap 		errprint("Pipe not created.");
30023880Sjaap 		return;
30123880Sjaap 	}
302*64044Sbostic 	ptid = fdopen(id[1], "w");
30323880Sjaap 	if (i > 0) {
30423880Sjaap 		close(id[0]);
30523880Sjaap 		toolate++;
30623880Sjaap 		pipeflg++;
30723880Sjaap 		return;
30823880Sjaap 	}
30923880Sjaap 	close(0);
31023880Sjaap 	dup(id[0]);
31123880Sjaap 	close(id[1]);
31223880Sjaap 	execl(nextf, nextf, 0);
31323902Sjaap 	errprint("Cannot exec %s", nextf);
31423880Sjaap 	exit(-4);
31523880Sjaap }
316