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