|
|
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.