1: #include "tdef.h"
   2: #include <sgtty.h>
   3: extern
   4: #include "d.h"
   5: extern
   6: #include "v.h"
   7: #ifdef NROFF
   8: extern
   9: #include "tw.h"
  10: #endif
  11: #include "s.h"
  12: #include <setjmp.h>
  13: jmp_buf sjbuf;
  14: 
  15: /*
  16: troff2.c
  17: 
  18: output, cleanup
  19: */
  20: 
  21: extern struct s *frame, *stk, *nxf;
  22: extern filep ip;
  23: extern filep offset;
  24: extern char *enda;
  25: 
  26: 
  27: extern char obuf[OBUFSZ];
  28: extern char *obufp;
  29: extern int dilev;
  30: extern int eschar;
  31: extern int tlss;
  32: extern int tflg;
  33: extern int ascii;
  34: extern int print;
  35: extern char trtab[];
  36: extern int waitf;
  37: extern char ptname[];
  38: extern int ptid;
  39: extern int em;
  40: extern int ds;
  41: extern int mflg;
  42: extern filep woff;
  43: extern int nflush;
  44: extern int lgf;
  45: extern int app;
  46: extern int nfo;
  47: extern int donef;
  48: extern int *pendw;
  49: extern int nofeed;
  50: extern int trap;
  51: extern struct sgttyb ttys;
  52: extern int ttysave;
  53: extern int quiet;
  54: extern int pendnf;
  55: extern int ndone;
  56: extern int lead;
  57: extern int ralss;
  58: extern int paper;
  59: extern int gflag;
  60: extern char *unlkp;
  61: extern char nextf[];
  62: extern int pipeflg;
  63: extern int ejf;
  64: extern int no_out;
  65: extern int level;
  66: extern int stopmesg;
  67: extern int xxx;
  68: int toolate;
  69: int error;
  70: #ifndef NROFF
  71: extern int acctf;
  72: #endif
  73: 
  74: pchar(c)
  75: int c;
  76: {
  77:     register i, j;
  78: 
  79:     if((i=c) & MOT){pchar1(i); return;}
  80:     switch(j = i & CMASK){
  81:         case 0:
  82:         case IMP:
  83:         case RIGHT:
  84:         case LEFT:
  85:             return;
  86:         case HX:
  87:             j = (tlss>>9) | ((i&~0777)>>3);
  88:             if(i & 040000){
  89:                 j &= ~(040000>>3);
  90:                 if(j > dip->blss)dip->blss = j;
  91:             }else{
  92:                 if(j > dip->alss)dip->alss = j;
  93:                 ralss = dip->alss;
  94:             }
  95:             tlss = 0;
  96:             return;
  97:         case LX:
  98:             tlss = i;
  99:             return;
 100:         case PRESC:
 101:             if(dip == &d[0])j = eschar;
 102:         default:
 103:             i = (trtab[j] & BMASK) | (i & ~CMASK);
 104:     }
 105:     pchar1(i);
 106: }
 107: pchar1(c)
 108: int c;
 109: {
 110:     register i, j, *k;
 111:     extern int chtab[];
 112: 
 113:     j = (i = c) & CMASK;
 114:     if(dip != &d[0]){
 115:         wbf(i);
 116:         dip->op = offset;
 117:         return;
 118:     }
 119:     if(!tflg && !print){
 120:         if(j == '\n')dip->alss = dip->blss = 0;
 121:         return;
 122:     }
 123:     if(no_out || (j == FILLER))return;
 124: #ifndef NROFF
 125:     if(ascii){
 126:         if(i & MOT){
 127:             oput(' ');
 128:             return;
 129:         }
 130:         if(j < 0177){
 131:             oput(i);
 132:             return;
 133:         }
 134:         switch(j){
 135:             case 0200:
 136:             case 0210:
 137:                 oput('-');
 138:                 break;
 139:             case 0211:
 140:                 oputs("fi");
 141:                 break;
 142:             case 0212:
 143:                 oputs("fl");
 144:                 break;
 145:             case 0213:
 146:                 oputs("ff");
 147:                 break;
 148:             case 0214:
 149:                 oputs("ffi");
 150:                 break;
 151:             case 0215:
 152:                 oputs("ffl");
 153:                 break;
 154:             default:
 155:                 for(k=chtab; *++k != j; k++)
 156:                     if(*k == 0)return;
 157:                 oput('\\');
 158:                 oput('(');
 159:                 oput(*--k & BMASK);
 160:                 oput(*k >> BYTE);
 161:         }
 162:     }else
 163: #endif
 164:     ptout(i);
 165: }
 166: oput(i)
 167: char i;
 168: {
 169:     *obufp++ = i;
 170:     if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
 171: }
 172: oputs(i)
 173: char *i;
 174: {
 175:     while(*i != 0)oput(*i++);
 176: }
 177: flusho(){
 178:     if(!ascii)*obufp++ = 0;
 179:     if(!ptid){
 180:         while((ptid=open(ptname,1)) < 0){
 181:             if(++waitf <=2)prstr("Waiting for Typesetter.\n");
 182:             sleep(15);
 183:         }
 184:     }
 185:     if(no_out == 0){
 186:         if (!toolate) {
 187:             toolate++;
 188: #ifdef NROFF
 189:             if(t.bset || t.breset){
 190:                 if(ttysave == -1) {
 191:                     gtty(1, &ttys);
 192:                     ttysave = ttys.sg_flags;
 193:                 }
 194:                 ttys.sg_flags &= ~t.breset;
 195:                 ttys.sg_flags |= t.bset;
 196:                 stty(1, &ttys);
 197:             }
 198:             {
 199:             char *p = t.twinit;
 200:             while (*p++)
 201:                 ;
 202:             write(ptid, t.twinit, p-t.twinit-1);
 203:             }
 204: #endif
 205:         }
 206:         toolate += write(ptid, obuf, obufp-obuf);
 207:     }
 208:     obufp = obuf;
 209: }
 210: done(x) int x;{
 211:     register i;
 212: 
 213:     error |= x;
 214:     level = 0;
 215:     app = ds = lgf = 0;
 216:     if(i=em){
 217:         donef = -1;
 218:         em = 0;
 219:         if(control(i,0))longjmp(sjbuf,1);
 220:     }
 221:     if(!nfo)done3(0);
 222:     mflg = 0;
 223:     dip = &d[0];
 224:     if(woff)wbt(0);
 225:     if(pendw)getword(1);
 226:     pendnf = 0;
 227:     if(donef == 1)done1(0);
 228:     donef = 1;
 229:     ip = 0;
 230:     frame = stk;
 231:     nxf = frame + 1;
 232:     if(!ejf)tbreak();
 233:     nflush++;
 234:     eject((struct s *)0);
 235:     longjmp(sjbuf,1);
 236: }
 237: done1(x) int x; {
 238:     error |= x;
 239:     if(v.nl){
 240:         trap = 0;
 241:         eject((struct s *)0);
 242:         longjmp(sjbuf,1);
 243:     }
 244:     if(nofeed){
 245:         ptlead();
 246:         flusho();
 247:         done3(0);
 248:     }else{
 249:         if(!gflag)lead += TRAILER;
 250:         done2(0);
 251:     }
 252: }
 253: done2(x) int x; {
 254:     register i;
 255: 
 256:     ptlead();
 257: #ifndef NROFF
 258:     if(!ascii){
 259:         oput(T_INIT);
 260:         oput(T_STOP);
 261:         if(!gflag)for(i=8; i>0; i--)oput(T_PAD);
 262:         if(stopmesg)prstr("Troff finished.\n");
 263:     }
 264: #endif
 265:     flusho();
 266:     done3(x);
 267: }
 268: done3(x) int x;{
 269:     error |= x;
 270:     signal(SIGINT, SIG_IGN);
 271:     signal(SIGTERM, SIG_IGN);
 272:     unlink(unlkp);
 273: #ifdef NROFF
 274:     twdone();
 275: #endif
 276:     if(quiet){
 277:         ttys.sg_flags |= ECHO;
 278:         stty(0, &ttys);
 279:     }
 280:     if(ascii)mesg(1);
 281: #ifndef NROFF
 282:     report();
 283: #endif
 284:     exit(error);
 285: }
 286: edone(x) int x;{
 287:     frame = stk;
 288:     nxf = frame + 1;
 289:     ip = 0;
 290:     done(x);
 291: }
 292: #ifndef NROFF
 293: report(){
 294:     struct {int use; int uid;} a;
 295: 
 296:     if((ptid != 1) && paper ){
 297:         lseek(acctf,0L,2);
 298:         a.use = paper;
 299:         a.uid = getuid();
 300:         write(acctf,(char *)&a,sizeof(a));
 301:     }
 302: }
 303: #endif
 304: #ifdef NROFF
 305: casepi(){
 306:     register i;
 307:     int id[2];
 308: 
 309:     if(toolate || skip() || !getname() || (pipe(id) == -1) ||
 310:        ((i=fork()) == -1)){
 311:         prstr("Pipe not created.\n");
 312:         return;
 313:     }
 314:     ptid = id[1];
 315:     if(i>0){
 316:         close(id[0]);
 317:         toolate++;
 318:         pipeflg++;
 319:         return;
 320:     }
 321:     close(0);
 322:     dup(id[0]);
 323:     close(id[1]);
 324:     execl(nextf,nextf,0);
 325:     prstr("Cannot exec: ");
 326:     prstr(nextf);
 327:     prstr("\n");
 328:     exit(-4);
 329: }
 330: #endif

Defined functions

casepi defined in line 305; used 2 times
done defined in line 210; used 9 times
done1 defined in line 237; used 3 times
done3 defined in line 268; used 8 times
edone defined in line 286; used 7 times
oput defined in line 166; used 34 times
oputs defined in line 172; used 21 times
pchar defined in line 74; used 10 times
pchar1 defined in line 107; used 9 times
report defined in line 293; used 2 times

Defined variables

error defined in line 69; used 5 times
toolate defined in line 68; used 5 times
Last modified: 1981-07-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1309
Valid CSS Valid XHTML 1.0 Strict