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