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