|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/stat.h> ! 3: #include "tdef.h" ! 4: extern ! 5: #include "d.h" ! 6: extern ! 7: #include "v.h" ! 8: #ifdef NROFF ! 9: extern ! 10: #include "tw.h" ! 11: #endif ! 12: #include "s.h" ! 13: #include <setjmp.h> ! 14: jmp_buf sjbuf; ! 15: #include <sgtty.h> ! 16: /* ! 17: troff1.c ! 18: ! 19: consume options, initialization, main loop, ! 20: input routines, escape function calling ! 21: */ ! 22: ! 23: int inchar[LNSIZE], *pinchar = inchar; /* XXX */ ! 24: extern struct s *frame, *stk, *nxf; ! 25: extern struct s *ejl, *litlev; ! 26: extern filep ip; ! 27: extern filep offset; ! 28: extern filep nextb; ! 29: ! 30: ! 31: extern int stdi; ! 32: extern int waitf; ! 33: extern int nofeed; ! 34: extern int quiet; ! 35: extern int ptid; ! 36: extern int ascii; ! 37: extern int npn; ! 38: extern int xflg; ! 39: extern int stop; ! 40: extern char ibuf[IBUFSZ]; ! 41: extern char xbuf[IBUFSZ]; ! 42: extern char *ibufp; ! 43: extern char *xbufp; ! 44: extern char *eibuf; ! 45: extern char *xeibuf; ! 46: extern int cbuf[NC]; ! 47: extern int *cp; ! 48: extern int *vlist; ! 49: extern int nx; ! 50: extern int mflg; ! 51: extern int ch; ! 52: extern int pto; ! 53: extern int pfrom; ! 54: extern int cps; ! 55: extern int chbits; ! 56: extern int ibf; ! 57: extern int ttyod; ! 58: extern struct sgttyb ttys; ! 59: extern int iflg; ! 60: extern int init; ! 61: extern int rargc; ! 62: extern char **argp; ! 63: extern char trtab[256]; ! 64: extern int lgf; ! 65: extern int copyf; ! 66: extern int eschar; ! 67: extern int ch0; ! 68: extern int cwidth; ! 69: extern int nlflg; ! 70: extern int *ap; ! 71: extern int donef; ! 72: extern int nflush; ! 73: extern int nchar; ! 74: extern int rchar; ! 75: extern int nfo; ! 76: extern int ifile; ! 77: extern int fc; ! 78: extern int padc; ! 79: extern int tabc; ! 80: extern int dotc; ! 81: extern int raw; ! 82: extern int tabtab[NTAB]; ! 83: extern char nextf[]; ! 84: extern int nfi; ! 85: #ifdef NROFF ! 86: extern char termtab[]; ! 87: extern int tti; ! 88: #endif ! 89: extern int ifl[NSO]; ! 90: extern int ifi; ! 91: extern int pendt; ! 92: extern int flss; ! 93: extern int fi; ! 94: extern int lg; ! 95: extern char ptname[]; ! 96: extern int print; ! 97: extern int nonumb; ! 98: extern int pnlist[]; ! 99: extern int *pnp; ! 100: extern int nb; ! 101: extern int trap; ! 102: extern int tflg; ! 103: extern int ejf; ! 104: extern int lit; ! 105: extern int cc; ! 106: extern int c2; ! 107: extern int spread; ! 108: extern int gflag; ! 109: extern int oline[]; ! 110: extern int *olinep; ! 111: extern int dpn; ! 112: extern int noscale; ! 113: extern char *unlkp; ! 114: extern int pts; ! 115: extern int level; ! 116: extern int ttysave; ! 117: extern int tdelim; ! 118: extern int dotT; ! 119: extern int tabch, ldrch; ! 120: extern int eqflg; ! 121: extern no_out; ! 122: extern int hflg; ! 123: #ifndef NROFF ! 124: extern char codetab[]; ! 125: extern int spbits; ! 126: #endif ! 127: extern int xxx; ! 128: int stopmesg; ! 129: filep ipl[NSO]; ! 130: long offl[NSO]; ! 131: long ioff; ! 132: char *ttyp; ! 133: extern struct contab { ! 134: int rq; ! 135: union { ! 136: int (*f)(); ! 137: unsigned mx; ! 138: }x; ! 139: }contab[NM]; ! 140: int ms[] = {31,28,31,30,31,30,31,31,30,31,30,31}; ! 141: #ifndef NROFF ! 142: int acctf; ! 143: #endif ! 144: ! 145: main(argc,argv) ! 146: int argc; ! 147: char **argv; ! 148: { ! 149: char *p, *q; ! 150: register i, j; ! 151: extern catch(), fpecatch(), kcatch(); ! 152: ! 153: signal(SIGHUP,catch); ! 154: if(signal(SIGINT,catch) == SIG_IGN){ ! 155: signal(SIGHUP,SIG_IGN); ! 156: signal(SIGINT,SIG_IGN); ! 157: signal(SIGQUIT,SIG_IGN); ! 158: } ! 159: signal(SIGFPE,fpecatch); ! 160: signal(SIGPIPE,catch); ! 161: signal(SIGTERM,kcatch); ! 162: init1(argv[0][0]); ! 163: options: ! 164: while(--argc > 0 && (++argv)[0][0]=='-') ! 165: switch(argv[0][1]){ ! 166: ! 167: case 0: ! 168: goto start; ! 169: case 'i': ! 170: stdi++; ! 171: continue; ! 172: case 'q': ! 173: quiet++; ! 174: if(gtty(0, &ttys) >= 0) ! 175: ttysave = ttys.sg_flags; ! 176: continue; ! 177: case 'n': ! 178: npn = cnum(&argv[0][2]); ! 179: continue; ! 180: case 'p': ! 181: xflg = 0; ! 182: cps = cnum(&argv[0][2]); ! 183: continue; ! 184: case 'S': ! 185: stopmesg++; ! 186: continue; ! 187: case 's': ! 188: if(!(stop = cnum(&argv[0][2])))stop++; ! 189: continue; ! 190: case 'r': ! 191: vlist[findr(argv[0][2])] = cnum(&argv[0][3]); ! 192: continue; ! 193: case 'm': ! 194: p = &nextf[nfi]; ! 195: q = &argv[0][2]; ! 196: while((*p++ = *q++) != 0); ! 197: if (access(nextf, 4) < 0) { ! 198: char *local = "/usr/local/lib/tmac/tmac.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; ! 199: strcat(local, &argv[0][2]); ! 200: if (access(local, 4) == 0) ! 201: strcpy(nextf, local); ! 202: } ! 203: mflg++; ! 204: continue; ! 205: case 'o': ! 206: getpn(&argv[0][2]); ! 207: continue; ! 208: #ifdef NROFF ! 209: case 'h': ! 210: hflg++; ! 211: continue; ! 212: case 'z': ! 213: no_out++; ! 214: continue; ! 215: case 'e': ! 216: eqflg++; ! 217: continue; ! 218: case 'T': ! 219: p = &termtab[tti]; ! 220: q = &argv[0][2]; ! 221: if(!((*q) & 0177))continue; ! 222: while((*p++ = *q++) != 0); ! 223: dotT++; ! 224: continue; ! 225: #endif ! 226: #ifndef NROFF ! 227: case 'z': ! 228: no_out++; ! 229: case 'a': ! 230: ascii = 1; ! 231: nofeed++; ! 232: case 't': ! 233: ptid = 1; ! 234: continue; ! 235: case 'w': ! 236: waitf = 1; ! 237: continue; ! 238: case 'f': ! 239: nofeed++; ! 240: continue; ! 241: case 'x': ! 242: xflg = 0; ! 243: continue; ! 244: case 'b': ! 245: if(open(ptname,1) < 0)prstr("Busy.\n"); ! 246: else prstr("Available.\n"); ! 247: done3(0); ! 248: case 'g': ! 249: stop = ptid = gflag = 1; ! 250: dpn = 0; ! 251: continue; ! 252: #endif ! 253: default: ! 254: pto = cnum(&argv[0][1]); ! 255: continue; ! 256: } ! 257: ! 258: if(argv[0][0] == '+'){ ! 259: pfrom = cnum(&argv[0][1]); ! 260: print = 0; ! 261: if(argc > 0)goto options; ! 262: } ! 263: ! 264: start: ! 265: argp = argv; ! 266: rargc = argc; ! 267: init2(); ! 268: setjmp(sjbuf); ! 269: loop: ! 270: copyf = lgf = nb = nflush = nlflg = 0; ! 271: if(ip && (rbf0(ip)==0) && ejf && (frame->pframe <= ejl)){ ! 272: nflush++; ! 273: trap = 0; ! 274: eject((struct s *)0); ! 275: goto loop; ! 276: } ! 277: i = getch(); ! 278: if(pendt)goto lt; ! 279: if(lit && (frame <= litlev)){ ! 280: lit--; ! 281: goto lt; ! 282: } ! 283: if((j = (i & CMASK)) == XPAR){ ! 284: copyf++; ! 285: tflg++; ! 286: for(;(i & CMASK) != '\n';)pchar(i = getch()); ! 287: tflg = 0; ! 288: copyf--; ! 289: goto loop; ! 290: } ! 291: if((j == cc) || (j == c2)){ ! 292: if(j == c2)nb++; ! 293: copyf++; ! 294: while(((j=((i=getch()) & CMASK)) == ' ') || ! 295: (j == '\t')); ! 296: ch = i; ! 297: copyf--; ! 298: control(getrq(),1); ! 299: flushi(); ! 300: goto loop; ! 301: } ! 302: lt: ! 303: ch = i; ! 304: text(); ! 305: goto loop; ! 306: } ! 307: catch(){ ! 308: /* ! 309: prstr("Interrupt\n"); ! 310: */ ! 311: done3(01); ! 312: } ! 313: fpecatch(){ ! 314: prstrfl("Floating Exception.\n"); ! 315: signal(SIGFPE,fpecatch); ! 316: } ! 317: kcatch(){ ! 318: signal(SIGTERM,SIG_IGN); ! 319: done3(01); ! 320: } ! 321: #ifndef NROFF ! 322: acctg() { ! 323: static char *acct_file = "/usr/adm/tracct"; ! 324: acctf = open(acct_file,1); ! 325: setuid(getuid()); ! 326: } ! 327: #endif ! 328: init1(a) ! 329: char a; ! 330: { ! 331: register char *p; ! 332: char *mktemp(); ! 333: register i; ! 334: ! 335: #ifndef NROFF ! 336: acctg();/*open troff actg file while mode 4755*/ ! 337: #endif ! 338: p = mktemp("/tmp/taXXXXX"); ! 339: if(a == 'a')p = &p[5]; ! 340: if((close(creat(p, 0600))) < 0){ ! 341: prstr("Cannot create temp file.\n"); ! 342: exit(-1); ! 343: } ! 344: ibf = open(p, 2); ! 345: for(i=256; --i;)trtab[i]=i; ! 346: trtab[UNPAD] = ' '; ! 347: mchbits(); ! 348: if(a != 'a')unlkp = p; ! 349: } ! 350: init2() ! 351: { ! 352: register i,j; ! 353: extern int block; ! 354: extern char *setbrk(); ! 355: extern char *ttyname(); ! 356: ! 357: ttyod = 2; ! 358: if(((ttyp=ttyname(j=0)) != (char *)0) || ! 359: ((ttyp=ttyname(j=1)) != (char *)0) || ! 360: ((ttyp=ttyname(j=2)) != (char *)0) ! 361: );else ttyp = "notty"; ! 362: iflg = j; ! 363: if(ascii)mesg(0); ! 364: ! 365: if((!ptid) && (!waitf)){ ! 366: if((ptid = open(ptname,1)) < 0){ ! 367: prstr("Typesetter busy.\n"); ! 368: done3(-2); ! 369: } ! 370: } ! 371: ptinit(); ! 372: for(i=NEV; i--;)write(ibf, (char *)&block, EVS*sizeof(int)); ! 373: olinep = oline; ! 374: ibufp = eibuf = ibuf; ! 375: v.hp = init = 0; ! 376: pinchar = inchar; /* XXX */ ! 377: ioff = 0; ! 378: v.nl = -1; ! 379: cvtime(); ! 380: frame = stk = (struct s *)setbrk(DELTA); ! 381: dip = &d[0]; ! 382: nxf = frame + 1; ! 383: nx = mflg; ! 384: } ! 385: cvtime(){ ! 386: ! 387: long tt; ! 388: register i; ! 389: ! 390: time(&tt); ! 391: tt -= 3600*ZONE; /*5hrs for EST*/ ! 392: v.dy = (tt/86400L) + 1; ! 393: v.dw = (v.dy + 3)%7 + 1; ! 394: for(v.yr=70;; v.yr++){ ! 395: if((v.yr)%4)ms[1]=28;else ms[1]=29; ! 396: for(i=0;i<12;){ ! 397: if(v.dy<=ms[i]){ ! 398: v.mo = i+1; ! 399: return; ! 400: } ! 401: v.dy -= ms[i++]; ! 402: } ! 403: } ! 404: } ! 405: cnum(a) ! 406: char *a; ! 407: { ! 408: register i; ! 409: ! 410: ibufp = a; ! 411: eibuf = MAXPTR; ! 412: i = atoi(); ! 413: ch = 0; ! 414: return(i); ! 415: } ! 416: mesg(f) ! 417: int f; ! 418: { ! 419: static int mode; ! 420: ! 421: if (ttyp==0) ! 422: return; ! 423: if(!f){ ! 424: stat(ttyp,cbuf); ! 425: mode = ((struct stat *)(cbuf))->st_mode; ! 426: chmod(ttyp,mode & ~022); ! 427: }else{ ! 428: chmod(ttyp,mode); ! 429: } ! 430: } ! 431: prstrfl(s) ! 432: char *s; ! 433: { ! 434: flusho(); ! 435: prstr(s); ! 436: } ! 437: prstr(s) ! 438: char *s; ! 439: { ! 440: register i; ! 441: register char *j; ! 442: ! 443: j = s; ! 444: for(i=0;*s;i++)s++; ! 445: write(ttyod,j,i); ! 446: } ! 447: control(a,b) ! 448: int a,b; ! 449: { ! 450: register i,j; ! 451: extern filep boff(); ! 452: ! 453: i = a; ! 454: if((i == 0) || ((j = findmn(i)) == -1))return(0); ! 455: if(contab[j].rq & MMASK){ ! 456: nxf->nargs = 0; ! 457: if(b)collect(); ! 458: flushi(); ! 459: return(pushi(((filep)contab[j].x.mx)<<BLKBITS)); ! 460: }else{ ! 461: if(!b)return(0); ! 462: return((*contab[j].x.f)(0)); ! 463: } ! 464: } ! 465: ! 466: getrq(){ ! 467: register i,j; ! 468: ! 469: if(((i=getach()) == 0) || ! 470: ((j=getach()) == 0))goto rtn; ! 471: i = PAIR(i,j); ! 472: rtn: ! 473: return(i); ! 474: } ! 475: getch(){ ! 476: register int i, j, k; ! 477: ! 478: level++; ! 479: g0: ! 480: if(ch){ ! 481: if(((i = ch) & CMASK) == '\n')nlflg++; ! 482: ch = 0; ! 483: level--; ! 484: return(i); ! 485: } ! 486: ! 487: if(nlflg){ ! 488: level--; ! 489: return('\n'); ! 490: } ! 491: ! 492: if((k = (i = getch0()) & CMASK) != ESC){ ! 493: if(i & MOT)goto g2; ! 494: if(k == FLSS){ ! 495: copyf++; raw++; ! 496: i = getch0(); ! 497: if(!fi)flss = i; ! 498: copyf--; raw--; ! 499: goto g0; ! 500: } ! 501: if(k == RPT){ ! 502: setrpt(); ! 503: goto g0; ! 504: } ! 505: if(!copyf){ ! 506: if((k == 'f') && lg && !lgf){ ! 507: i = getlg(i); ! 508: goto g2; ! 509: } ! 510: if((k == fc) || (k == tabch) || (k == ldrch)){ ! 511: if((i=setfield(k)) == 0)goto g0; else goto g2; ! 512: } ! 513: if(k == 010){ ! 514: i = makem(-width(' ' | chbits)); ! 515: goto g2; ! 516: } ! 517: } ! 518: goto g2; ! 519: } ! 520: k = (j = getch0()) & CMASK; ! 521: if(j & MOT){ ! 522: i = j; ! 523: goto g2; ! 524: } ! 525: /* ! 526: if(k == tdelim){ ! 527: i = TDELIM; ! 528: tdelim = IMP; ! 529: goto g2; ! 530: } ! 531: */ ! 532: switch(k){ ! 533: ! 534: case '\n': /*concealed newline*/ ! 535: goto g0; ! 536: case 'n': /*number register*/ ! 537: setn(); ! 538: goto g0; ! 539: case '*': /*string indicator*/ ! 540: setstr(); ! 541: goto g0; ! 542: case '$': /*argument indicator*/ ! 543: seta(); ! 544: goto g0; ! 545: case '{': /*LEFT*/ ! 546: i = LEFT; ! 547: goto gx; ! 548: case '}': /*RIGHT*/ ! 549: i = RIGHT; ! 550: goto gx; ! 551: case '"': /*comment*/ ! 552: while(((i=getch0()) & CMASK ) != '\n'); ! 553: goto g2; ! 554: case ESC: /*double backslash*/ ! 555: i = eschar; ! 556: goto gx; ! 557: case 'e': /*printable version of current eschar*/ ! 558: i = PRESC; ! 559: goto gx; ! 560: case ' ': /*unpaddable space*/ ! 561: i = UNPAD; ! 562: goto gx; ! 563: case '|': /*narrow space*/ ! 564: i = NARSP; ! 565: goto gx; ! 566: case '^': /*half of narrow space*/ ! 567: i = HNSP; ! 568: goto gx; ! 569: case '\'': /*\(aa*/ ! 570: i = 0222; ! 571: goto gx; ! 572: case '`': /*\(ga*/ ! 573: i = 0223; ! 574: goto gx; ! 575: case '_': /*\(ul*/ ! 576: i = 0224; ! 577: goto gx; ! 578: case '-': /*current font minus*/ ! 579: i = 0210; ! 580: goto gx; ! 581: case '&': /*filler*/ ! 582: i = FILLER; ! 583: goto gx; ! 584: case 'c': /*to be continued*/ ! 585: i = CONT; ! 586: goto gx; ! 587: case ':': /*lem's char*/ ! 588: i = COLON; ! 589: goto gx; ! 590: case '!': /*transparent indicator*/ ! 591: i = XPAR; ! 592: goto gx; ! 593: case 't': /*tab*/ ! 594: i = '\t'; ! 595: goto g2; ! 596: case 'a': /*leader (SOH)*/ ! 597: i = LEADER; ! 598: goto g2; ! 599: case '%': /*ohc*/ ! 600: i = OHC; ! 601: goto g2; ! 602: case '.': /*.*/ ! 603: i = '.'; ! 604: gx: ! 605: i = (j & ~CMASK) | i; ! 606: goto g2; ! 607: } ! 608: if(!copyf) ! 609: switch(k){ ! 610: ! 611: case 'p': /*spread*/ ! 612: spread++; ! 613: goto g0; ! 614: case '(': /*special char name*/ ! 615: if((i=setch()) == 0)goto g0; ! 616: break; ! 617: case 's': /*size indicator*/ ! 618: setps(); ! 619: goto g0; ! 620: case 'f': /*font indicator*/ ! 621: setfont(0); ! 622: goto g0; ! 623: case 'w': /*width function*/ ! 624: setwd(); ! 625: goto g0; ! 626: case 'v': /*vert mot*/ ! 627: if(i = vmot())break; ! 628: goto g0; ! 629: case 'h': /*horiz mot*/ ! 630: if(i = hmot())break; ! 631: goto g0; ! 632: case 'z': /*zero with char*/ ! 633: i = setz(); ! 634: break; ! 635: case 'l': /*hor line*/ ! 636: setline(); ! 637: goto g0; ! 638: case 'L': /*vert line*/ ! 639: setvline(); ! 640: goto g0; ! 641: case 'b': /*bracket*/ ! 642: setbra(); ! 643: goto g0; ! 644: case 'o': /*overstrike*/ ! 645: setov(); ! 646: goto g0; ! 647: case 'k': /*mark hor place*/ ! 648: if((i=findr(getsn())) == -1)goto g0; ! 649: vlist[i] = v.hp = sumhp(); /* XXX */ ! 650: goto g0; ! 651: case 'j': /*mark output hor place*/ ! 652: if(!(i=getach()))goto g0; ! 653: i = (i<<BYTE) | JREG; ! 654: break; ! 655: case '0': /*number space*/ ! 656: i = makem(width('0' | chbits)); ! 657: break; ! 658: case 'x': /*extra line space*/ ! 659: if(i = xlss())break; ! 660: goto g0; ! 661: case 'u': /*half em up*/ ! 662: case 'r': /*full em up*/ ! 663: case 'd': /*half em down*/ ! 664: i = sethl(k); ! 665: break; ! 666: default: ! 667: i = j; ! 668: } ! 669: else{ ! 670: ch0 = j; ! 671: i = eschar; ! 672: } ! 673: g2: ! 674: if((i & CMASK) == '\n'){ ! 675: nlflg++; ! 676: v.hp = 0; ! 677: pinchar = inchar; /* XXX */ ! 678: if(ip == 0)v.cd++; ! 679: } ! 680: if(!--level){ ! 681: /* j = width(i); */ ! 682: /* v.hp += j; */ ! 683: /* cwidth = j; */ ! 684: if (pinchar >= inchar + LNSIZE) { /* XXX */ ! 685: inchar[0] = makem(sumhp()); ! 686: pinchar = &inchar[1]; ! 687: } ! 688: *pinchar++ = i; /* XXX */ ! 689: } ! 690: return(i); ! 691: } ! 692: ! 693: sumhp() /* XXX - add up widths in inchar array */ ! 694: { ! 695: register int n; ! 696: register int *p; ! 697: ! 698: n = 0; ! 699: for (p = inchar; p < pinchar; p++) ! 700: n += width(*p); ! 701: return(n); ! 702: } ! 703: char ifilt[32] = {0,001,002,003,0,005,006,007,010,011,012}; ! 704: getch0(){ ! 705: register int i, j; ! 706: ! 707: if(ch0){i=ch0; ch0=0; return(i);} ! 708: if(nchar){nchar--; return(rchar);} ! 709: ! 710: again: ! 711: if(cp){ ! 712: if((i = *cp++) == 0){ ! 713: cp = 0; ! 714: goto again; ! 715: } ! 716: }else if(ap){ ! 717: if((i = *ap++) == 0){ ! 718: ap = 0; ! 719: goto again; ! 720: } ! 721: }else if(ip){ ! 722: if(ip == -1)i = rdtty(); ! 723: else i = rbf(); ! 724: }else{ ! 725: if(donef)done(0); ! 726: if(nx || ((ibufp >= eibuf) && (ibufp != MAXPTR))){ ! 727: if(nfo)goto g1; ! 728: g0: ! 729: if(nextfile()){ ! 730: if(ip)goto again; ! 731: if(ibufp < eibuf)goto g2; ! 732: } ! 733: g1: ! 734: nx = 0; ! 735: if((j=read(ifile,ibuf,IBUFSZ)) <= 0)goto g0; ! 736: ibufp = ibuf; ! 737: eibuf = ibuf + j; ! 738: if(ip)goto again; ! 739: } ! 740: g2: ! 741: i = *ibufp++ & 0177; ! 742: ioff++; ! 743: if(i >= 040)goto g4; else i = ifilt[i]; ! 744: } ! 745: if(raw)return(i); ! 746: if((j = i & CMASK) == IMP)goto again; ! 747: if((i == 0) && !init)goto again; ! 748: g4: ! 749: if((copyf == 0) && ((i & ~BMASK) == 0) && ((i & CMASK) < 0370)) ! 750: #ifndef NROFF ! 751: if(spbits && (i>31) && ((codetab[i-32] & 0200))) i |= spbits; ! 752: else ! 753: #endif ! 754: i |= chbits; ! 755: if((i & CMASK) == eschar)i = (i & ~CMASK) | ESC; ! 756: return(i); ! 757: } ! 758: nextfile(){ ! 759: register char *p; ! 760: ! 761: n0: ! 762: if(ifile)close(ifile); ! 763: if(nx){ ! 764: p = nextf; ! 765: if(*p != 0)goto n1; ! 766: } ! 767: if(ifi > 0){ ! 768: if(popf())goto n0; /*popf error*/ ! 769: return(1); /*popf ok*/ ! 770: } ! 771: if(rargc-- <= 0)goto n2; ! 772: p = (argp++)[0]; ! 773: n1: ! 774: if((p[0] == '-') && (p[1] == 0)){ ! 775: ifile = 0; ! 776: }else if((ifile=open(p,0)) < 0){ ! 777: prstr("Cannot open "); ! 778: prstr(p); ! 779: prstr("\n"); ! 780: nfo -= mflg; ! 781: done(02); ! 782: } ! 783: nfo++; ! 784: v.cd = 0; ! 785: ioff = 0; ! 786: return(0); ! 787: n2: ! 788: if((nfo -= mflg) && !stdi)done(0); ! 789: nfo++; ! 790: v.cd = ifile = stdi = mflg = 0; ! 791: ioff = 0; ! 792: return(0); ! 793: } ! 794: popf(){ ! 795: register i; ! 796: register char *p, *q; ! 797: extern char *ttyname(); ! 798: ! 799: ioff = offl[--ifi]; ! 800: ip = ipl[ifi]; ! 801: if((ifile = ifl[ifi]) == 0){ ! 802: p = xbuf; ! 803: q = ibuf; ! 804: ibufp = xbufp; ! 805: eibuf = xeibuf; ! 806: while(q < eibuf)*q++ = *p++; ! 807: return(0); ! 808: } ! 809: if((lseek(ifile,(long)(ioff & ~(IBUFSZ-1)),0) < 0) || ! 810: ((i = read(ifile,ibuf,IBUFSZ)) < 0))return(1); ! 811: eibuf = ibuf + i; ! 812: ibufp = ibuf; ! 813: if(ttyname(ifile) == (char *)0) ! 814: if((ibufp = ibuf + (int)(ioff & (IBUFSZ-1))) >= eibuf)return(1); ! 815: return(0); ! 816: } ! 817: flushi(){ ! 818: if(nflush)return; ! 819: ch = 0; ! 820: if((ch0 & CMASK) == '\n')nlflg++; ! 821: ch0 = 0; ! 822: copyf++; ! 823: while(!nlflg){ ! 824: if(donef && (frame == stk))break; ! 825: getch(); ! 826: } ! 827: copyf--; ! 828: v.hp = 0; ! 829: pinchar = inchar; /* XXX */ ! 830: } ! 831: getach(){ ! 832: register i; ! 833: ! 834: lgf++; ! 835: if(((i = getch()) & MOT) || ! 836: ((i&CMASK) == ' ') || ! 837: ((i&CMASK) == '\n')|| ! 838: (i & 0200)){ ! 839: ch = i; ! 840: i = 0; ! 841: } ! 842: lgf--; ! 843: return(i & 0177); ! 844: } ! 845: casenx(){ ! 846: lgf++; ! 847: skip(); ! 848: getname(); ! 849: nx++; ! 850: nextfile(); ! 851: nlflg++; ! 852: ip = 0; ! 853: ap = 0; ! 854: nchar = pendt = 0; ! 855: frame = stk; ! 856: nxf = frame + 1; ! 857: } ! 858: getname(){ ! 859: register int i, j, k; ! 860: ! 861: lgf++; ! 862: for(k=0; k < (NS-1); k++){ ! 863: if(((j=(i=getch()) & CMASK) <= ' ') || ! 864: (j > 0176))break; ! 865: nextf[k] = j; ! 866: } ! 867: nextf[k] = 0; ! 868: ch = i; ! 869: lgf--; ! 870: return(nextf[0]); ! 871: } ! 872: caseso(){ ! 873: register i; ! 874: register char *p, *q; ! 875: ! 876: lgf++; ! 877: nextf[0] = 0; ! 878: if(skip() || !getname() || ((i=open(nextf,0)) <0) || (ifi >= NSO)) { ! 879: prstr("can't open file "); ! 880: prstr(nextf); ! 881: prstr("\n"); ! 882: done(02); ! 883: } ! 884: flushi(); ! 885: ifl[ifi] = ifile; ! 886: ifile = i; ! 887: offl[ifi] = ioff; ! 888: ioff = 0; ! 889: ipl[ifi] = ip; ! 890: ip = 0; ! 891: nx++; ! 892: nflush++; ! 893: if(!ifl[ifi++]){ ! 894: p = ibuf; ! 895: q = xbuf; ! 896: xbufp = ibufp; ! 897: xeibuf = eibuf; ! 898: while(p < eibuf)*q++ = *p++; ! 899: } ! 900: } ! 901: ! 902: casecf(){ /* copy file without change */ ! 903: int fd, i, n; ! 904: char buf[OBUFSZ]; ! 905: ! 906: flusho(); ! 907: lgf++; ! 908: nextf[0] = 0; ! 909: if(skip() || !getname() || ((fd=open(nextf,0)) <0) || (ifi >= NSO)) { ! 910: prstr("can't open file "); ! 911: prstr(nextf); ! 912: prstr("\n"); ! 913: done(02); ! 914: } ! 915: while ((n = read(fd, buf, OBUFSZ)) > 0) ! 916: for (i = 0; i < n; i++) ! 917: oput(buf[i]); ! 918: flusho(); ! 919: close(fd); ! 920: } ! 921: getpn(a) ! 922: char *a; ! 923: { ! 924: register i, neg; ! 925: long atoi1(); ! 926: ! 927: if((*a & 0177) == 0)return; ! 928: neg = 0; ! 929: ibufp = a; ! 930: eibuf = MAXPTR; ! 931: noscale++; ! 932: while((i = getch() & CMASK) != 0)switch(i){ ! 933: case '+': ! 934: case ',': ! 935: continue; ! 936: case '-': ! 937: neg = MOT; ! 938: goto d2; ! 939: default: ! 940: ch = i; ! 941: d2: ! 942: i = atoi1(); ! 943: if(nonumb)goto fini; ! 944: else{ ! 945: *pnp++ = i | neg; ! 946: neg = 0; ! 947: if(pnp >= &pnlist[NPN-2]){ ! 948: prstr("Too many page numbers\n"); ! 949: done3(-3); ! 950: } ! 951: } ! 952: } ! 953: fini: ! 954: if(neg)*pnp++ = -2; ! 955: *pnp = -1; ! 956: ch = noscale = print = 0; ! 957: pnp = pnlist; ! 958: if(*pnp != -1)chkpn(); ! 959: } ! 960: setrpt(){ ! 961: register i, j; ! 962: ! 963: copyf++;raw++; ! 964: i = getch0(); ! 965: copyf--;raw--; ! 966: if((i < 0) || ! 967: (((j = getch0()) & CMASK) == RPT))return; ! 968: rchar = j; ! 969: nchar = i & BMASK; ! 970: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.