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