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: }