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