129dc968dSjaap #ifndef lint
2*3705696bSbostic /*
39255bebbSjaap static char sccsid[] = "@(#)n2.c 2.1 (CWI) 85/07/18";
4*3705696bSbostic */
5*3705696bSbostic static char sccsid[] = "@(#)n2.c 2.2 (Berkeley) 07/27/93";
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*3705696bSbostic 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