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

Defined functions

casepi defined in line 310; used 2 times
done1 defined in line 241; used 3 times
done3 defined in line 272; used 8 times
oput defined in line 170; used 34 times
oputs defined in line 176; used 21 times
pchar1 defined in line 111; used 9 times
report defined in line 297; used 2 times

Defined variables

error defined in line 73; used 5 times
sccsid defined in line 2; never used
toolate defined in line 72; used 5 times
Last modified: 1982-08-05
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2116
Valid CSS Valid XHTML 1.0 Strict