|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)n1.c 4.5 6/30/83";
3: #endif lint
4:
5: #include "tdef.h"
6: #include <sys/types.h>
7: #include <sys/stat.h>
8: #include <sys/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: register i;
399: struct timeval t;
400: struct timezone tz;
401:
402: gettimeofday(&t, &tz);
403: t.tv_sec -= 60*tz.tz_minuteswest; /* 5hrs for EST */
404: v.dy = (t.tv_sec/86400L) + 1;
405: v.dw = (v.dy + 3)%7 + 1;
406: for(v.yr=70;; v.yr++){
407: if((v.yr)%4)ms[1]=28;else ms[1]=29;
408: for(i=0;i<12;){
409: if(v.dy<=ms[i]){
410: v.mo = i+1;
411: return;
412: }
413: v.dy -= ms[i++];
414: }
415: }
416: }
417: cnum(a)
418: char *a;
419: {
420: register i;
421:
422: ibufp = a;
423: eibuf = MAXPTR;
424: i = atoi();
425: ch = 0;
426: return(i);
427: }
428: mesg(f)
429: int f;
430: {
431: static int mode;
432:
433: if (ttyp==0)
434: return;
435: if(!f){
436: stat(ttyp,cbuf);
437: mode = ((struct stat *)(cbuf))->st_mode;
438: chmod(ttyp,mode & ~022);
439: }else{
440: chmod(ttyp,mode);
441: }
442: }
443: prstrfl(s)
444: char *s;
445: {
446: flusho();
447: prstr(s);
448: }
449: prstr(s)
450: char *s;
451: {
452: register i;
453: register char *j;
454:
455: j = s;
456: for(i=0;*s;i++)s++;
457: write(ttyod,j,i);
458: }
459: control(a,b)
460: int a,b;
461: {
462: register i,j;
463: extern filep boff();
464:
465: i = a;
466: if((i == 0) || ((j = findmn(i)) == -1))return(0);
467: if(contab[j].rq & MMASK){
468: nxf->nargs = 0;
469: if(b)collect();
470: flushi();
471: return(pushi(((filep)contab[j].x.mx)<<BLKBITS));
472: }else{
473: if(!b)return(0);
474: return((*contab[j].x.f)(0));
475: }
476: }
477:
478: getrq(){
479: register i,j;
480:
481: if(((i=getach()) == 0) ||
482: ((j=getach()) == 0))goto rtn;
483: i = PAIR(i,j);
484: rtn:
485: return(i);
486: }
487: getch(){
488: register int i, j, k;
489:
490: level++;
491: g0:
492: if(ch){
493: if(((i = ch) & CMASK) == '\n')nlflg++;
494: ch = 0;
495: level--;
496: return(i);
497: }
498:
499: if(nlflg){
500: level--;
501: return('\n');
502: }
503:
504: if((k = (i = getch0()) & CMASK) != ESC){
505: if(i & MOT)goto g2;
506: if(k == FLSS){
507: copyf++; raw++;
508: i = getch0();
509: if(!fi)flss = i;
510: copyf--; raw--;
511: goto g0;
512: }
513: if(k == RPT){
514: setrpt();
515: goto g0;
516: }
517: if(!copyf){
518: if((k == 'f') && lg && !lgf){
519: i = getlg(i);
520: goto g2;
521: }
522: if((k == fc) || (k == tabch) || (k == ldrch)){
523: if((i=setfield(k)) == 0)goto g0; else goto g2;
524: }
525: if(k == 010){
526: i = makem(-width(' ' | chbits));
527: goto g2;
528: }
529: }
530: goto g2;
531: }
532: k = (j = getch0()) & CMASK;
533: if(j & MOT){
534: i = j;
535: goto g2;
536: }
537: /*
538: if(k == tdelim){
539: i = TDELIM;
540: tdelim = IMP;
541: goto g2;
542: }
543: */
544: switch(k){
545:
546: case '\n': /*concealed newline*/
547: goto g0;
548: case 'n': /*number register*/
549: setn();
550: goto g0;
551: case '*': /*string indicator*/
552: setstr();
553: goto g0;
554: case '$': /*argument indicator*/
555: seta();
556: goto g0;
557: case '{': /*LEFT*/
558: i = LEFT;
559: goto gx;
560: case '}': /*RIGHT*/
561: i = RIGHT;
562: goto gx;
563: case '"': /*comment*/
564: while(((i=getch0()) & CMASK ) != '\n');
565: goto g2;
566: case ESC: /*double backslash*/
567: i = eschar;
568: goto gx;
569: case 'e': /*printable version of current eschar*/
570: i = PRESC;
571: goto gx;
572: case ' ': /*unpaddable space*/
573: i = UNPAD;
574: goto gx;
575: case '|': /*narrow space*/
576: i = NARSP;
577: goto gx;
578: case '^': /*half of narrow space*/
579: i = HNSP;
580: goto gx;
581: case '\'': /*\(aa*/
582: i = 0222;
583: goto gx;
584: case '`': /*\(ga*/
585: i = 0223;
586: goto gx;
587: case '_': /*\(ul*/
588: i = 0224;
589: goto gx;
590: case '-': /*current font minus*/
591: i = 0210;
592: goto gx;
593: case '&': /*filler*/
594: i = FILLER;
595: goto gx;
596: case 'c': /*to be continued*/
597: i = CONT;
598: goto gx;
599: case ':': /*lem's char*/
600: i = COLON;
601: goto gx;
602: case '!': /*transparent indicator*/
603: i = XPAR;
604: goto gx;
605: case 't': /*tab*/
606: i = '\t';
607: goto g2;
608: case 'a': /*leader (SOH)*/
609: i = LEADER;
610: goto g2;
611: case '%': /*ohc*/
612: i = OHC;
613: goto g2;
614: case '.': /*.*/
615: i = '.';
616: gx:
617: i = (j & ~CMASK) | i;
618: goto g2;
619: }
620: if(!copyf)
621: switch(k){
622:
623: case 'p': /*spread*/
624: spread++;
625: goto g0;
626: case '(': /*special char name*/
627: if((i=setch()) == 0)goto g0;
628: break;
629: case 's': /*size indicator*/
630: setps();
631: goto g0;
632: case 'f': /*font indicator*/
633: setfont(0);
634: goto g0;
635: case 'w': /*width function*/
636: setwd();
637: goto g0;
638: case 'v': /*vert mot*/
639: if(i = vmot())break;
640: goto g0;
641: case 'h': /*horiz mot*/
642: if(i = hmot())break;
643: goto g0;
644: case 'z': /*zero with char*/
645: i = setz();
646: break;
647: case 'l': /*hor line*/
648: setline();
649: goto g0;
650: case 'L': /*vert line*/
651: setvline();
652: goto g0;
653: case 'b': /*bracket*/
654: setbra();
655: goto g0;
656: case 'o': /*overstrike*/
657: setov();
658: goto g0;
659: case 'k': /*mark hor place*/
660: if((i=findr(getsn())) == -1)goto g0;
661: vlist[i] = v.hp = sumhp(); /* XXX */
662: goto g0;
663: case 'j': /*mark output hor place*/
664: if(!(i=getach()))goto g0;
665: i = (i<<BYTE) | JREG;
666: break;
667: case '0': /*number space*/
668: i = makem(width('0' | chbits));
669: break;
670: case 'x': /*extra line space*/
671: if(i = xlss())break;
672: goto g0;
673: case 'u': /*half em up*/
674: case 'r': /*full em up*/
675: case 'd': /*half em down*/
676: i = sethl(k);
677: break;
678: default:
679: i = j;
680: }
681: else{
682: ch0 = j;
683: i = eschar;
684: }
685: g2:
686: if((i & CMASK) == '\n'){
687: nlflg++;
688: v.hp = 0;
689: pinchar = inchar; /* XXX */
690: if(ip == 0)v.cd++;
691: }
692: if(!--level){
693: /* j = width(i); */
694: /* v.hp += j; */
695: /* cwidth = j; */
696: if (pinchar >= inchar + LNSIZE) { /* XXX */
697: inchar[0] = makem(sumhp());
698: pinchar = &inchar[1];
699: }
700: *pinchar++ = i; /* XXX */
701: }
702: return(i);
703: }
704:
705: sumhp() /* XXX - add up widths in inchar array */
706: {
707: register int n;
708: register int *p;
709:
710: n = 0;
711: for (p = inchar; p < pinchar; p++)
712: n += width(*p);
713: return(n);
714: }
715: char ifilt[32] = {0,001,002,003,0,005,006,007,010,011,012};
716: getch0(){
717: register int i, j;
718:
719: if(ch0){i=ch0; ch0=0; return(i);}
720: if(nchar){nchar--; return(rchar);}
721:
722: again:
723: if(cp){
724: if((i = *cp++) == 0){
725: cp = 0;
726: goto again;
727: }
728: }else if(ap){
729: if((i = *ap++) == 0){
730: ap = 0;
731: goto again;
732: }
733: }else if(ip){
734: if(ip == -1)i = rdtty();
735: else i = rbf();
736: }else{
737: if(donef)done(0);
738: if(nx || ((ibufp >= eibuf) && (ibufp != MAXPTR))){
739: if(nfo)goto g1;
740: g0:
741: if(nextfile()){
742: if(ip)goto again;
743: if(ibufp < eibuf)goto g2;
744: }
745: g1:
746: nx = 0;
747: if((j=read(ifile,ibuf,IBUFSZ)) <= 0)goto g0;
748: ibufp = ibuf;
749: eibuf = ibuf + j;
750: if(ip)goto again;
751: }
752: g2:
753: i = *ibufp++ & 0177;
754: ioff++;
755: if(i >= 040)goto g4; else i = ifilt[i];
756: }
757: if(raw)return(i);
758: if((j = i & CMASK) == IMP)goto again;
759: if((i == 0) && !init)goto again;
760: g4:
761: if((copyf == 0) && ((i & ~BMASK) == 0) && ((i & CMASK) < 0370))
762: #ifndef NROFF
763: if(spbits && (i>31) && ((codetab[i-32] & 0200))) i |= spbits;
764: else
765: #endif
766: i |= chbits;
767: if((i & CMASK) == eschar)i = (i & ~CMASK) | ESC;
768: return(i);
769: }
770: nextfile(){
771: register char *p;
772:
773: n0:
774: if(ifile)close(ifile);
775: if(nx){
776: p = nextf;
777: if(*p != 0)goto n1;
778: }
779: if(ifi > 0){
780: if(popf())goto n0; /*popf error*/
781: return(1); /*popf ok*/
782: }
783: if(rargc-- <= 0)goto n2;
784: p = (argp++)[0];
785: n1:
786: if((p[0] == '-') && (p[1] == 0)){
787: ifile = 0;
788: }else if((ifile=open(p,0)) < 0){
789: prstr("Cannot open ");
790: prstr(p);
791: prstr("\n");
792: nfo -= mflg;
793: done(02);
794: }
795: nfo++;
796: v.cd = 0;
797: ioff = 0;
798: return(0);
799: n2:
800: if((nfo -= mflg) && !stdi)done(0);
801: nfo++;
802: v.cd = ifile = stdi = mflg = 0;
803: ioff = 0;
804: return(0);
805: }
806: popf(){
807: register i;
808: register char *p, *q;
809: extern char *ttyname();
810:
811: ioff = offl[--ifi];
812: ip = ipl[ifi];
813: if((ifile = ifl[ifi]) == 0){
814: p = xbuf;
815: q = ibuf;
816: ibufp = xbufp;
817: eibuf = xeibuf;
818: while(q < eibuf)*q++ = *p++;
819: return(0);
820: }
821: if((lseek(ifile,(long)(ioff & ~(IBUFSZ-1)),0) < 0) ||
822: ((i = read(ifile,ibuf,IBUFSZ)) < 0))return(1);
823: eibuf = ibuf + i;
824: ibufp = ibuf;
825: if(ttyname(ifile) == (char *)0)
826: if((ibufp = ibuf + (int)(ioff & (IBUFSZ-1))) >= eibuf)return(1);
827: return(0);
828: }
829: flushi(){
830: if(nflush)return;
831: ch = 0;
832: if((ch0 & CMASK) == '\n')nlflg++;
833: ch0 = 0;
834: copyf++;
835: while(!nlflg){
836: if(donef && (frame == stk))break;
837: getch();
838: }
839: copyf--;
840: v.hp = 0;
841: pinchar = inchar; /* XXX */
842: }
843: getach(){
844: register i;
845:
846: lgf++;
847: if(((i = getch()) & MOT) ||
848: ((i&CMASK) == ' ') ||
849: ((i&CMASK) == '\n')||
850: (i & 0200)){
851: ch = i;
852: i = 0;
853: }
854: lgf--;
855: return(i & 0177);
856: }
857: casenx(){
858: lgf++;
859: skip();
860: getname();
861: nx++;
862: nextfile();
863: nlflg++;
864: ip = 0;
865: ap = 0;
866: nchar = pendt = 0;
867: frame = stk;
868: nxf = frame + 1;
869: }
870: getname(){
871: register int i, j, k;
872:
873: lgf++;
874: for(k=0; k < (NS-1); k++){
875: if(((j=(i=getch()) & CMASK) <= ' ') ||
876: (j > 0176))break;
877: nextf[k] = j;
878: }
879: nextf[k] = 0;
880: ch = i;
881: lgf--;
882: return(nextf[0]);
883: }
884: caseso(){
885: register i;
886: register char *p, *q;
887:
888: lgf++;
889: nextf[0] = 0;
890: if(skip() || !getname() || ((i=open(nextf,0)) <0) || (ifi >= NSO)) {
891: prstr("can't open file ");
892: prstr(nextf);
893: prstr("\n");
894: done(02);
895: }
896: flushi();
897: ifl[ifi] = ifile;
898: ifile = i;
899: offl[ifi] = ioff;
900: ioff = 0;
901: ipl[ifi] = ip;
902: ip = 0;
903: nx++;
904: nflush++;
905: if(!ifl[ifi++]){
906: p = ibuf;
907: q = xbuf;
908: xbufp = ibufp;
909: xeibuf = eibuf;
910: while(p < eibuf)*q++ = *p++;
911: }
912: }
913:
914: casecf(){ /* copy file without change */
915: int fd, i, n;
916: char buf[OBUFSZ];
917:
918: flusho();
919: lgf++;
920: nextf[0] = 0;
921: if(skip() || !getname() || ((fd=open(nextf,0)) <0) || (ifi >= NSO)) {
922: prstr("can't open file ");
923: prstr(nextf);
924: prstr("\n");
925: done(02);
926: }
927: while ((n = read(fd, buf, OBUFSZ)) > 0)
928: for (i = 0; i < n; i++)
929: oput(buf[i]);
930: flusho();
931: close(fd);
932: }
933: getpn(a)
934: char *a;
935: {
936: register i, neg;
937: long atoi1();
938:
939: if((*a & 0177) == 0)return;
940: neg = 0;
941: ibufp = a;
942: eibuf = MAXPTR;
943: noscale++;
944: while((i = getch() & CMASK) != 0)switch(i){
945: case '+':
946: case ',':
947: continue;
948: case '-':
949: neg = MOT;
950: goto d2;
951: default:
952: ch = i;
953: d2:
954: i = atoi1();
955: if(nonumb)goto fini;
956: else{
957: *pnp++ = i | neg;
958: neg = 0;
959: if(pnp >= &pnlist[NPN-2]){
960: prstr("Too many page numbers\n");
961: done3(-3);
962: }
963: }
964: }
965: fini:
966: if(neg)*pnp++ = -2;
967: *pnp = -1;
968: ch = noscale = print = 0;
969: pnp = pnlist;
970: if(*pnp != -1)chkpn();
971: }
972: setrpt(){
973: register i, j;
974:
975: copyf++;raw++;
976: i = getch0();
977: copyf--;raw--;
978: if((i < 0) ||
979: (((j = getch0()) & CMASK) == RPT))return;
980: rchar = j;
981: nchar = i & BMASK;
982: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.