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