home *** CD-ROM | disk | FTP | other *** search
- #include "tdef.h"
- #include <sgtty.h>
- extern
- #include "d.h"
- extern
- #include "v.h"
- #ifdef NROFF
- extern
- #include "tw.h"
- #endif
- #include "s.h"
- #include <setjmp.h>
- jmp_buf sjbuf;
-
- /*
- troff2.c
-
- output, cleanup
- */
-
- extern struct s *frame, *stk, *nxf;
- extern filep ip;
- extern filep offset;
- extern char *enda;
-
-
- extern char obuf[OBUFSZ];
- extern char *obufp;
- extern int dilev;
- extern int eschar;
- extern int tlss;
- extern int tflg;
- extern int ascii;
- extern int print;
- extern char trtab[];
- extern int waitf;
- extern char ptname[];
- extern int ptid;
- extern int em;
- extern int ds;
- extern int mflg;
- extern filep woff;
- extern int nflush;
- extern int lgf;
- extern int app;
- extern int nfo;
- extern int donef;
- extern int *pendw;
- extern int nofeed;
- extern int trap;
- extern struct sgttyb ttys;
- extern int ttysave;
- extern int quiet;
- extern int pendnf;
- extern int ndone;
- extern int lead;
- extern int ralss;
- extern int paper;
- extern int gflag;
- extern char *unlkp;
- extern char nextf[];
- extern int pipeflg;
- extern int ejf;
- extern int no_out;
- extern int level;
- extern int stopmesg;
- extern int xxx;
- int toolate;
- int error;
- #ifndef NROFF
- extern int acctf;
- #endif
-
- pchar(c)
- int c;
- {
- register i, j;
-
- if((i=c) & MOT){pchar1(i); return;}
- switch(j = i & CMASK){
- case 0:
- case IMP:
- case RIGHT:
- case LEFT:
- return;
- case HX:
- j = (tlss>>9) | ((i&~0777)>>3);
- if(i & 040000){
- j &= ~(040000>>3);
- if(j > dip->blss)dip->blss = j;
- }else{
- if(j > dip->alss)dip->alss = j;
- ralss = dip->alss;
- }
- tlss = 0;
- return;
- case LX:
- tlss = i;
- return;
- case PRESC:
- if(dip == &d[0])j = eschar;
- default:
- i = (trtab[j] & BMASK) | (i & ~CMASK);
- }
- pchar1(i);
- }
- pchar1(c)
- int c;
- {
- register i, j, *k;
- extern int chtab[];
-
- j = (i = c) & CMASK;
- 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;
- #ifndef NROFF
- if(ascii){
- if(i & MOT){
- oput(' ');
- return;
- }
- if(j < 0177){
- oput(i);
- return;
- }
- switch(j){
- case 0200:
- case 0210:
- oput('-');
- break;
- case 0211:
- oputs("fi");
- break;
- case 0212:
- oputs("fl");
- break;
- case 0213:
- oputs("ff");
- break;
- case 0214:
- oputs("ffi");
- break;
- case 0215:
- oputs("ffl");
- break;
- default:
- for(k=chtab; *++k != j; k++)
- if(*k == 0)return;
- oput('\\');
- oput('(');
- oput(*--k & BMASK);
- oput(*k >> BYTE);
- }
- }else
- #endif
- ptout(i);
- }
- oput(i)
- char i;
- {
- *obufp++ = i;
- if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
- }
- oputs(i)
- char *i;
- {
- while(*i != 0)oput(*i++);
- }
- flusho(){
- if(!ascii)*obufp++ = 0;
- if(!ptid){
- while((ptid=open(ptname,1)) < 0){
- if(++waitf <=2)prstr("Waiting for Typesetter.\n");
- sleep(15);
- }
- }
- if(no_out == 0){
- if (!toolate) {
- toolate++;
- #ifdef NROFF
- if(t.bset || t.breset){
- if(ttysave == -1) {
- gtty(1, &ttys);
- ttysave = ttys.sg_flags;
- }
- ttys.sg_flags &= ~t.breset;
- ttys.sg_flags |= t.bset;
- stty(1, &ttys);
- }
- {
- char *p = t.twinit;
- while (*p++)
- ;
- write(ptid, t.twinit, p-t.twinit-1);
- }
- #endif
- }
- toolate += write(ptid, obuf, obufp-obuf);
- }
- obufp = obuf;
- }
- done(x) int x;{
- register i;
-
- error |= x;
- level = 0;
- 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(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(v.nl){
- trap = 0;
- eject((struct s *)0);
- longjmp(sjbuf,1);
- }
- if(nofeed){
- ptlead();
- flusho();
- done3(0);
- }else{
- if(!gflag)lead += TRAILER;
- done2(0);
- }
- }
- done2(x) int x; {
- register i;
-
- ptlead();
- #ifndef NROFF
- if(!ascii){
- oput(T_INIT);
- oput(T_STOP);
- if(!gflag)for(i=8; i>0; i--)oput(T_PAD);
- if(stopmesg)prstr("Troff finished.\n");
- }
- #endif
- flusho();
- done3(x);
- }
- done3(x) int x;{
- error |= x;
- signal(SIGINT, SIG_IGN);
- signal(SIGTERM, SIG_IGN);
- unlink(unlkp);
- #ifdef NROFF
- twdone();
- #endif
- if(quiet){
- ttys.sg_flags |= ECHO;
- stty(0, &ttys);
- }
- if(ascii)mesg(1);
- #ifndef NROFF
- report();
- #endif
- exit(error);
- }
- edone(x) int x;{
- frame = stk;
- nxf = frame + 1;
- ip = 0;
- done(x);
- }
- #ifndef NROFF
- report(){
- struct {int use; int uid;} a;
-
- if((ptid != 1) && paper ){
- lseek(acctf,0L,2);
- a.use = paper;
- a.uid = getuid();
- write(acctf,(char *)&a,sizeof(a));
- }
- }
- #endif
- #ifdef NROFF
- casepi(){
- register i;
- int id[2];
-
- if(toolate || skip() || !getname() || (pipe(id) == -1) ||
- ((i=fork()) == -1)){
- prstr("Pipe not created.\n");
- 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);
- prstr("Cannot exec: ");
- prstr(nextf);
- prstr("\n");
- exit(-4);
- }
- #endif
-