/* * n2.c * * output, cleanup */ #include "tdef.h" #include <ctype.h> #include <signal.h> #ifdef NROFF #include "tw.h" #endif #include <setjmp.h> #include "ext.h" extern jmp_buf sjbuf; int toolate; int error; extern int nchtab; pchar(i) register tchar i; { register int j; static int hx = 0; /* records if have seen HX */ if (hx) { hx = 0; j = absmot(i); if (isnmot(i)) { if (j > dip->blss) dip->blss = j; } else { if (j > dip->alss) dip->alss = j; ralss = dip->alss; } return; } if (ismot(i)) { pchar1(i); return; } switch (j = cbits(i)) { case 0: case IMP: case RIGHT: case LEFT: return; case HX: hx = 1; return; case PRESC: if (dip == &d[0]) j = eschar; /* fall through */ default: setcbits(i, trtab[j]); } pchar1(i); } pchar1(i) register tchar i; { register j; j = cbits(i); if (dip != &d[0]) { wbf(i); dip->op = offset; return; } if (!tflg && !print) { if (j == '\n') dip->alss = dip->blss = 0; return; } if (no_out || j == FILLER) return; if (tflg) { /* transparent mode, undiverted */ fdprintf(ptid, "%c", j); return; } #ifndef NROFF if (ascii) outascii(i); else #endif ptout(i); } outascii(i) /* print i in best-guess ascii */ tchar i; { int j = cbits(i); if (ismot(i)) { oput(' '); return; } if (j < 0177 && j >= ' ' || j == '\n') { oput(j); return; } if (j == DRAWFCN) oputs("\\D"); else if (j == HYPHEN || j == MINUS) oput('-'); else if (j == XON) oputs("\\X"); else if (j == LIG_FI) oputs("fi"); else if (j == LIG_FL) oputs("fl"); else if (j == LIG_FF) oputs("ff"); else if (j == LIG_FFI) oputs("ffi"); else if (j == LIG_FFL) oputs("ffl"); else if (j == WORDSP) ; /* nothing at all */ else if (j > 0177 && j < nchtab + 128-32) { oput('\\'); oput('('); oput(chname[chtab[j-128]]); oput(chname[chtab[j-128]+1]); } else if (j >= nchtab + 128) { char buf[10]; sprintf(buf, "N%d", j - (nchtab+128)); oputs(buf); } } /* * now a macro oput(i) register int i; { *obufp++ = i; if (obufp >= &obuf[OBUFSZ]) flusho(); } */ oputs(i) register char *i; { while (*i != 0) oput(*i++); } flusho() { if (obufp == obuf) return; if (no_out == 0) { if (!toolate) { toolate++; #ifdef NROFF set_tty(); { char *p = t.twinit; while (*p++) ; if (p - t.twinit > 1) write(ptid, t.twinit, p - t.twinit - 1); } #endif } toolate += write(ptid, obuf, (int)(obufp - obuf)); } obufp = obuf; } done(x) int x; { register i; error |= x; app = ds = lgf = 0; if (i = em) { donef = -1; em = 0; if (control(i, 0)) longjmp(sjbuf, 1); } if (!nfo) done3(0); mflg = 0; dip = &d[0]; if (woff) wbt((tchar)0); if (pendw) getword(1); pendnf = 0; if (donef == 1) done1(0); donef = 1; ip = 0; frame = stk; nxf = frame + 1; if (!ejf) tbreak(); nflush++; eject((struct s *)0); longjmp(sjbuf, 1); } done1(x) int x; { error |= x; if (numtab[NL].val) { trap = 0; eject((struct s *)0); longjmp(sjbuf, 1); } if (nofeed) { ptlead(); flusho(); done3(0); } else { if (!gflag) pttrailer(); done2(0); } } done2(x) int x; { ptlead(); #ifndef NROFF if (!ascii) ptstop(); #endif flusho(); done3(x); } done3(x) int x; { error |= x; signal(SIGINT, SIG_IGN); signal(SIGTERM, SIG_IGN); unlink(unlkp); #ifdef NROFF twdone(); #endif exit(error); } edone(x) int x; { frame = stk; nxf = frame + 1; ip = 0; done(x); } casepi() { register i; int id[2]; if (toolate || skip() || !getname() || pipe(id) == -1 || (i = fork()) == -1) { errprint("Pipe not created."); return; } ptid = id[1]; if (i > 0) { close(id[0]); toolate++; pipeflg++; return; } close(0); dup(id[0]); close(id[1]); execl(nextf, nextf, 0); errprint("Cannot exec %s", nextf); exit(-4); }