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