|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)n1.c 4.8 7/21/87"; ! 3: #endif lint ! 4: ! 5: #include "tdef.h" ! 6: #include <sys/types.h> ! 7: #include <sys/stat.h> ! 8: #include <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: extern time_t time(); ! 399: time_t t; ! 400: register struct tm *tmp; ! 401: ! 402: t = time((time_t *)0); ! 403: tmp = localtime(&t); ! 404: v.dy = tmp->tm_mday; ! 405: v.dw = tmp->tm_wday + 1; ! 406: v.yr = tmp->tm_year; ! 407: v.mo = tmp->tm_mon + 1; ! 408: } ! 409: cnum(a) ! 410: char *a; ! 411: { ! 412: register i; ! 413: ! 414: ibufp = a; ! 415: eibuf = (char *) MAXPTR; ! 416: i = atoi(); ! 417: ch = 0; ! 418: return(i); ! 419: } ! 420: mesg(f) ! 421: int f; ! 422: { ! 423: static int mode; ! 424: ! 425: if (ttyp==0) ! 426: return; ! 427: if(!f){ ! 428: stat(ttyp,cbuf); ! 429: mode = ((struct stat *)(cbuf))->st_mode; ! 430: chmod(ttyp,mode & ~022); ! 431: }else{ ! 432: chmod(ttyp,mode); ! 433: } ! 434: } ! 435: prstrfl(s) ! 436: char *s; ! 437: { ! 438: flusho(); ! 439: prstr(s); ! 440: } ! 441: prstr(s) ! 442: char *s; ! 443: { ! 444: register i; ! 445: register char *j; ! 446: ! 447: j = s; ! 448: for(i=0;*s;i++)s++; ! 449: write(ttyod,j,i); ! 450: } ! 451: control(a,b) ! 452: int a,b; ! 453: { ! 454: register i,j; ! 455: extern filep boff(); ! 456: ! 457: i = a; ! 458: if((i == 0) || ((j = findmn(i)) == -1))return(0); ! 459: if(contab[j].rq & MMASK){ ! 460: nxf->nargs = 0; ! 461: if(b)collect(); ! 462: flushi(); ! 463: return(pushi(((filep)contab[j].x.mx)<<BLKBITS)); ! 464: }else{ ! 465: if(!b)return(0); ! 466: return((*contab[j].x.f)(0)); ! 467: } ! 468: } ! 469: ! 470: getrq(){ ! 471: register i,j; ! 472: ! 473: if(((i=getach()) == 0) || ! 474: ((j=getach()) == 0))goto rtn; ! 475: i = PAIR(i,j); ! 476: rtn: ! 477: return(i); ! 478: } ! 479: getch(){ ! 480: register int i, j, k; ! 481: ! 482: level++; ! 483: g0: ! 484: if(ch){ ! 485: if(((i = ch) & CMASK) == '\n')nlflg++; ! 486: ch = 0; ! 487: level--; ! 488: return(i); ! 489: } ! 490: ! 491: if(nlflg){ ! 492: level--; ! 493: return('\n'); ! 494: } ! 495: ! 496: if((k = (i = getch0()) & CMASK) != ESC){ ! 497: if(i & MOT)goto g2; ! 498: if(k == FLSS){ ! 499: copyf++; raw++; ! 500: i = getch0(); ! 501: if(!fi)flss = i; ! 502: copyf--; raw--; ! 503: goto g0; ! 504: } ! 505: if(k == RPT){ ! 506: setrpt(); ! 507: goto g0; ! 508: } ! 509: if(!copyf){ ! 510: if((k == 'f') && lg && !lgf){ ! 511: i = getlg(i); ! 512: goto g2; ! 513: } ! 514: if((k == fc) || (k == tabch) || (k == ldrch)){ ! 515: if((i=setfield(k)) == 0)goto g0; else goto g2; ! 516: } ! 517: if(k == 010){ ! 518: i = makem(-width(' ' | chbits)); ! 519: goto g2; ! 520: } ! 521: } ! 522: goto g2; ! 523: } ! 524: k = (j = getch0()) & CMASK; ! 525: if(j & MOT){ ! 526: i = j; ! 527: goto g2; ! 528: } ! 529: /* ! 530: if(k == tdelim){ ! 531: i = TDELIM; ! 532: tdelim = IMP; ! 533: goto g2; ! 534: } ! 535: */ ! 536: switch(k){ ! 537: ! 538: case '\n': /*concealed newline*/ ! 539: goto g0; ! 540: case 'n': /*number register*/ ! 541: setn(); ! 542: goto g0; ! 543: case '*': /*string indicator*/ ! 544: setstr(); ! 545: goto g0; ! 546: case '$': /*argument indicator*/ ! 547: seta(); ! 548: goto g0; ! 549: case '{': /*LEFT*/ ! 550: i = LEFT; ! 551: goto gx; ! 552: case '}': /*RIGHT*/ ! 553: i = RIGHT; ! 554: goto gx; ! 555: case '"': /*comment*/ ! 556: while(((i=getch0()) & CMASK ) != '\n'); ! 557: goto g2; ! 558: case ESC: /*double backslash*/ ! 559: i = eschar; ! 560: goto gx; ! 561: case 'e': /*printable version of current eschar*/ ! 562: i = PRESC; ! 563: goto gx; ! 564: case ' ': /*unpaddable space*/ ! 565: i = UNPAD; ! 566: goto gx; ! 567: case '|': /*narrow space*/ ! 568: i = NARSP; ! 569: goto gx; ! 570: case '^': /*half of narrow space*/ ! 571: i = HNSP; ! 572: goto gx; ! 573: case '\'': /*\(aa*/ ! 574: i = 0222; ! 575: goto gx; ! 576: case '`': /*\(ga*/ ! 577: i = 0223; ! 578: goto gx; ! 579: case '_': /*\(ul*/ ! 580: i = 0224; ! 581: goto gx; ! 582: case '-': /*current font minus*/ ! 583: i = 0210; ! 584: goto gx; ! 585: case '&': /*filler*/ ! 586: i = FILLER; ! 587: goto gx; ! 588: case 'c': /*to be continued*/ ! 589: i = CONT; ! 590: goto gx; ! 591: case ':': /*lem's char*/ ! 592: i = COLON; ! 593: goto gx; ! 594: case '!': /*transparent indicator*/ ! 595: i = XPAR; ! 596: goto gx; ! 597: case 't': /*tab*/ ! 598: i = '\t'; ! 599: goto g2; ! 600: case 'a': /*leader (SOH)*/ ! 601: i = LEADER; ! 602: goto g2; ! 603: case '%': /*ohc*/ ! 604: i = OHC; ! 605: goto g2; ! 606: case '.': /*.*/ ! 607: i = '.'; ! 608: gx: ! 609: i = (j & ~CMASK) | i; ! 610: goto g2; ! 611: } ! 612: if(!copyf) ! 613: switch(k){ ! 614: ! 615: case 'p': /*spread*/ ! 616: spread++; ! 617: goto g0; ! 618: case '(': /*special char name*/ ! 619: if((i=setch()) == 0)goto g0; ! 620: break; ! 621: case 's': /*size indicator*/ ! 622: setps(); ! 623: goto g0; ! 624: case 'f': /*font indicator*/ ! 625: setfont(0); ! 626: goto g0; ! 627: case 'w': /*width function*/ ! 628: setwd(); ! 629: goto g0; ! 630: case 'v': /*vert mot*/ ! 631: if(i = vmot())break; ! 632: goto g0; ! 633: case 'h': /*horiz mot*/ ! 634: if(i = hmot())break; ! 635: goto g0; ! 636: case 'z': /*zero with char*/ ! 637: i = setz(); ! 638: break; ! 639: case 'l': /*hor line*/ ! 640: setline(); ! 641: goto g0; ! 642: case 'L': /*vert line*/ ! 643: setvline(); ! 644: goto g0; ! 645: case 'b': /*bracket*/ ! 646: setbra(); ! 647: goto g0; ! 648: case 'o': /*overstrike*/ ! 649: setov(); ! 650: goto g0; ! 651: case 'k': /*mark hor place*/ ! 652: if((i=findr(getsn())) == -1)goto g0; ! 653: vlist[i] = v.hp = sumhp(); /* XXX */ ! 654: goto g0; ! 655: case 'j': /*mark output hor place*/ ! 656: if(!(i=getach()))goto g0; ! 657: i = (i<<BYTE) | JREG; ! 658: break; ! 659: case '0': /*number space*/ ! 660: i = makem(width('0' | chbits)); ! 661: break; ! 662: case 'x': /*extra line space*/ ! 663: if(i = xlss())break; ! 664: goto g0; ! 665: case 'u': /*half em up*/ ! 666: case 'r': /*full em up*/ ! 667: case 'd': /*half em down*/ ! 668: i = sethl(k); ! 669: break; ! 670: default: ! 671: i = j; ! 672: } ! 673: else{ ! 674: ch0 = j; ! 675: i = eschar; ! 676: } ! 677: g2: ! 678: if((i & CMASK) == '\n'){ ! 679: nlflg++; ! 680: v.hp = 0; ! 681: pinchar = inchar; /* XXX */ ! 682: if(ip == 0)v.cd++; ! 683: } ! 684: if(!--level){ ! 685: /* j = width(i); */ ! 686: /* v.hp += j; */ ! 687: /* cwidth = j; */ ! 688: if (pinchar >= inchar + LNSIZE) { /* XXX */ ! 689: inchar[0] = makem(sumhp()); ! 690: pinchar = &inchar[1]; ! 691: } ! 692: *pinchar++ = i; /* XXX */ ! 693: } ! 694: return(i); ! 695: } ! 696: ! 697: sumhp() /* XXX - add up widths in inchar array */ ! 698: { ! 699: register int n; ! 700: register int *p; ! 701: ! 702: n = 0; ! 703: for (p = inchar; p < pinchar; p++) ! 704: n += width(*p); ! 705: return(n); ! 706: } ! 707: char ifilt[32] = {0,001,002,003,0,005,006,007,010,011,012}; ! 708: getch0(){ ! 709: register int i, j; ! 710: ! 711: if(ch0){i=ch0; ch0=0; return(i);} ! 712: if(nchar){nchar--; return(rchar);} ! 713: ! 714: again: ! 715: if(cp){ ! 716: if((i = *cp++) == 0){ ! 717: cp = 0; ! 718: goto again; ! 719: } ! 720: }else if(ap){ ! 721: if((i = *ap++) == 0){ ! 722: ap = 0; ! 723: goto again; ! 724: } ! 725: }else if(ip){ ! 726: if(ip == -1)i = rdtty(); ! 727: else i = rbf(); ! 728: }else{ ! 729: if(donef)done(0); ! 730: if(nx || ((ibufp >= eibuf) && (eibuf != (char *) MAXPTR))){ ! 731: if(nfo)goto g1; ! 732: g0: ! 733: if(nextfile()){ ! 734: if(ip)goto again; ! 735: if(ibufp < eibuf)goto g2; ! 736: } ! 737: g1: ! 738: nx = 0; ! 739: if((j=read(ifile,ibuf,IBUFSZ)) <= 0)goto g0; ! 740: ibufp = ibuf; ! 741: eibuf = ibuf + j; ! 742: if(ip)goto again; ! 743: } ! 744: g2: ! 745: i = *ibufp++ & 0177; ! 746: ioff++; ! 747: if(i >= 040)goto g4; else i = ifilt[i]; ! 748: } ! 749: if(raw)return(i); ! 750: if((j = i & CMASK) == IMP)goto again; ! 751: if((i == 0) && !init)goto again; ! 752: g4: ! 753: if((copyf == 0) && ((i & ~BMASK) == 0) && ((i & CMASK) < 0370)) ! 754: #ifndef NROFF ! 755: if(spbits && (i>31) && ((codetab[i-32] & 0200))) i |= spbits; ! 756: else ! 757: #endif ! 758: i |= chbits; ! 759: if((i & CMASK) == eschar)i = (i & ~CMASK) | ESC; ! 760: return(i); ! 761: } ! 762: nextfile(){ ! 763: register char *p; ! 764: ! 765: n0: ! 766: if(ifile)close(ifile); ! 767: if(nx){ ! 768: p = nextf; ! 769: if(*p != 0)goto n1; ! 770: } ! 771: if(ifi > 0){ ! 772: if(popf())goto n0; /*popf error*/ ! 773: return(1); /*popf ok*/ ! 774: } ! 775: if(rargc-- <= 0)goto n2; ! 776: p = (argp++)[0]; ! 777: n1: ! 778: if((p[0] == '-') && (p[1] == 0)){ ! 779: ifile = 0; ! 780: }else if((ifile=open(p,0)) < 0){ ! 781: prstr("Cannot open "); ! 782: prstr(p); ! 783: prstr("\n"); ! 784: nfo -= mflg; ! 785: done(02); ! 786: } ! 787: nfo++; ! 788: v.cd = 0; ! 789: ioff = 0; ! 790: return(0); ! 791: n2: ! 792: if((nfo -= mflg) && !stdi)done(0); ! 793: nfo++; ! 794: v.cd = ifile = stdi = mflg = 0; ! 795: ioff = 0; ! 796: return(0); ! 797: } ! 798: popf(){ ! 799: register i; ! 800: register char *p, *q; ! 801: extern char *ttyname(); ! 802: ! 803: ioff = offl[--ifi]; ! 804: ip = ipl[ifi]; ! 805: if((ifile = ifl[ifi]) == 0){ ! 806: p = xbuf; ! 807: q = ibuf; ! 808: ibufp = xbufp; ! 809: eibuf = xeibuf; ! 810: while(q < eibuf)*q++ = *p++; ! 811: return(0); ! 812: } ! 813: if((lseek(ifile,(long)(ioff & ~(IBUFSZ-1)),0) < 0) || ! 814: ((i = read(ifile,ibuf,IBUFSZ)) < 0))return(1); ! 815: eibuf = ibuf + i; ! 816: ibufp = ibuf; ! 817: if(ttyname(ifile) == (char *)0) ! 818: if((ibufp = ibuf + (int)(ioff & (IBUFSZ-1))) >= eibuf)return(1); ! 819: return(0); ! 820: } ! 821: flushi(){ ! 822: if(nflush)return; ! 823: ch = 0; ! 824: if((ch0 & CMASK) == '\n')nlflg++; ! 825: ch0 = 0; ! 826: copyf++; ! 827: while(!nlflg){ ! 828: if(donef && (frame == stk))break; ! 829: getch(); ! 830: } ! 831: copyf--; ! 832: v.hp = 0; ! 833: pinchar = inchar; /* XXX */ ! 834: } ! 835: getach(){ ! 836: register i; ! 837: ! 838: lgf++; ! 839: if(((i = getch()) & MOT) || ! 840: ((i&CMASK) == ' ') || ! 841: ((i&CMASK) == '\n')|| ! 842: (i & 0200)){ ! 843: ch = i; ! 844: i = 0; ! 845: } ! 846: lgf--; ! 847: return(i & 0177); ! 848: } ! 849: casenx(){ ! 850: lgf++; ! 851: skip(); ! 852: getname(); ! 853: nx++; ! 854: nextfile(); ! 855: nlflg++; ! 856: ip = 0; ! 857: ap = 0; ! 858: nchar = pendt = 0; ! 859: frame = stk; ! 860: nxf = frame + 1; ! 861: } ! 862: getname(){ ! 863: register int i, j, k; ! 864: ! 865: lgf++; ! 866: for(k=0; k < (NS-1); k++){ ! 867: if(((j=(i=getch()) & CMASK) <= ' ') || ! 868: (j > 0176))break; ! 869: nextf[k] = j; ! 870: } ! 871: nextf[k] = 0; ! 872: ch = i; ! 873: lgf--; ! 874: return(nextf[0]); ! 875: } ! 876: caseso(){ ! 877: register i; ! 878: register char *p, *q; ! 879: ! 880: lgf++; ! 881: nextf[0] = 0; ! 882: if(skip() || !getname() || ((i=open(nextf,0)) <0) || (ifi >= NSO)) { ! 883: prstr("can't open file "); ! 884: prstr(nextf); ! 885: prstr("\n"); ! 886: done(02); ! 887: } ! 888: flushi(); ! 889: ifl[ifi] = ifile; ! 890: ifile = i; ! 891: offl[ifi] = ioff; ! 892: ioff = 0; ! 893: ipl[ifi] = ip; ! 894: ip = 0; ! 895: nx++; ! 896: nflush++; ! 897: if(!ifl[ifi++]){ ! 898: p = ibuf; ! 899: q = xbuf; ! 900: xbufp = ibufp; ! 901: xeibuf = eibuf; ! 902: while(p < eibuf)*q++ = *p++; ! 903: } ! 904: } ! 905: ! 906: casecf(){ /* copy file without change */ ! 907: int fd, i, n; ! 908: char buf[OBUFSZ]; ! 909: ! 910: flusho(); ! 911: lgf++; ! 912: nextf[0] = 0; ! 913: if(skip() || !getname() || ((fd=open(nextf,0)) <0) || (ifi >= NSO)) { ! 914: prstr("can't open file "); ! 915: prstr(nextf); ! 916: prstr("\n"); ! 917: done(02); ! 918: } ! 919: while ((n = read(fd, buf, OBUFSZ)) > 0) ! 920: for (i = 0; i < n; i++) ! 921: oput(buf[i]); ! 922: flusho(); ! 923: close(fd); ! 924: } ! 925: getpn(a) ! 926: char *a; ! 927: { ! 928: register i, neg; ! 929: long atoi1(); ! 930: ! 931: if((*a & 0177) == 0)return; ! 932: neg = 0; ! 933: ibufp = a; ! 934: eibuf = (char *) MAXPTR; ! 935: noscale++; ! 936: while((i = getch() & CMASK) != 0)switch(i){ ! 937: case '+': ! 938: case ',': ! 939: continue; ! 940: case '-': ! 941: neg = MOT; ! 942: goto d2; ! 943: default: ! 944: ch = i; ! 945: d2: ! 946: i = atoi1(); ! 947: if(nonumb)goto fini; ! 948: else{ ! 949: *pnp++ = i | neg; ! 950: neg = 0; ! 951: if(pnp >= &pnlist[NPN-2]){ ! 952: prstr("Too many page numbers\n"); ! 953: done3(-3); ! 954: } ! 955: } ! 956: } ! 957: fini: ! 958: if(neg)*pnp++ = -2; ! 959: *pnp = -1; ! 960: ch = noscale = print = 0; ! 961: pnp = pnlist; ! 962: if(*pnp != -1)chkpn(); ! 963: } ! 964: setrpt(){ ! 965: register i, j; ! 966: ! 967: copyf++;raw++; ! 968: i = getch0(); ! 969: copyf--;raw--; ! 970: if((i < 0) || ! 971: (((j = getch0()) & CMASK) == RPT))return; ! 972: rchar = j; ! 973: nchar = i & BMASK; ! 974: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.