|
|
1.1 root 1: #include "tdef.h"
2: #include <sgtty.h>
3: extern
4: #include "d.h"
5: extern
6: #include "v.h"
7: #include "s.h"
8:
9: /*
10: troff5.c
11:
12: misc processing requests
13: */
14:
15: extern int inchar[LNSIZE], *pinchar; /* XXX */
16: extern struct s *frame;
17: extern struct s *litlev;
18: extern filep ip;
19: extern filep offset;
20:
21: extern int ascii;
22: extern int nonumb;
23: extern int admod;
24: extern int ad;
25: extern int fi;
26: extern int cc;
27: extern int c2;
28: extern int ohc;
29: extern int tabc;
30: extern int dotc;
31: extern int pendnf;
32: extern int hyf;
33: extern int ce;
34: extern int po;
35: extern int po1;
36: extern int nc;
37: extern int in;
38: extern int un;
39: extern int un1;
40: extern int in1;
41: extern int ll;
42: extern int ll1;
43: extern int lt;
44: extern int lt1;
45: extern int nlist[NTRAP];
46: extern int mlist[NTRAP];
47: extern int lgf;
48: extern int pl;
49: extern int npn;
50: extern int npnflg;
51: extern int copyf;
52: extern char nextf[];
53: extern int trap;
54: extern int lss;
55: extern int em;
56: extern int evlist[EVLSZ];
57: extern int evi;
58: extern int ibf;
59: extern int ev;
60: extern int ch;
61: extern int nflush;
62: extern int tty;
63: extern struct sgttyb ttys;
64: extern int quiet;
65: extern int iflg;
66: extern int eschar;
67: extern int lit;
68: extern int ls;
69: extern int ls1;
70: extern int tabtab[];
71: extern char trtab[];
72: extern int ul;
73: extern int cu;
74: extern int sfont;
75: extern int font;
76: extern int fontlab[];
77: extern int it;
78: extern int itmac;
79: extern int noscale;
80: extern int ic;
81: extern int icf;
82: extern int ics;
83: extern int *vlist;
84: extern int sv;
85: extern int esc;
86: extern int nn;
87: extern int nms;
88: extern int ndf;
89: extern int lnmod;
90: extern int ni;
91: extern int lnsize;
92: extern int nb;
93: extern int nlflg;
94: extern int apts, apts1, pts, pts1, font, font1;
95: extern int ulfont;
96: extern int ulbit;
97: extern int error;
98: extern int nmbits;
99: extern int chbits;
100: extern int tdelim;
101: extern int xxx;
102: int iflist[NIF];
103: int ifx;
104:
105: casead(){
106: register i;
107:
108: ad = 1;
109: /*leave admod alone*/
110: if(skip())return;
111: switch(i = getch() & CMASK){
112: case 'r': /*right adj, left ragged*/
113: admod = 2;
114: break;
115: case 'l': /*left adj, right ragged*/
116: admod = ad = 0; /*same as casena*/
117: break;
118: case 'c': /*centered adj*/
119: admod = 1;
120: break;
121: case 'b': case 'n':
122: admod = 0;
123: break;
124: case '0': case '2': case '4':
125: ad = 0;
126: case '1': case '3': case '5':
127: admod = (i - '0')/2;
128: }
129: }
130: casena(){
131: ad = 0;
132: }
133: casefi(){
134: tbreak();
135: fi++;
136: pendnf = 0;
137: lnsize = LNSIZE;
138: }
139: casenf(){
140: tbreak();
141: fi = 0;
142: /* can't do while oline is only LNSIZE
143: lnsize = LNSIZE + WDSIZE;
144: */
145: }
146: casers(){
147: dip->nls = 0;
148: }
149: casens(){
150: dip->nls++;
151: }
152: chget(c)
153: int c;
154: {
155: register i;
156:
157: if(skip() ||
158: ((i = getch()) & MOT) ||
159: ((i&CMASK) == ' ') ||
160: ((i&CMASK) == '\n')){
161: ch = i;
162: return(c);
163: }else return(i & BMASK);
164: }
165: casecc(){
166: cc = chget('.');
167: }
168: casec2(){
169: c2 = chget('\'');
170: }
171: casehc(){
172: ohc = chget(OHC);
173: }
174: casetc(){
175: tabc = chget(0);
176: }
177: caselc(){
178: dotc = chget(0);
179: }
180: casehy(){
181: register i;
182:
183: hyf = 1;
184: if(skip())return;
185: noscale++;
186: i = atoi();
187: noscale = 0;
188: if(nonumb)return;
189: hyf = max(i,0);
190: }
191: casenh(){
192: hyf = 0;
193: }
194: max(aa,bb)
195: int aa,bb;
196: {
197: if(aa>bb)return(aa);
198: else return(bb);
199: }
200: casece(){
201: register i;
202:
203: noscale++;
204: skip();
205: i = max(atoi(),0);
206: if(nonumb)i = 1;
207: tbreak();
208: ce = i;
209: noscale = 0;
210: }
211: casein(){
212: register i;
213:
214: if(skip())i = in1;
215: else i = max(hnumb(&in),0);
216: tbreak();
217: in1 = in;
218: in = i;
219: if(!nc){
220: un = in;
221: setnel();
222: }
223: }
224: casell(){
225: register i;
226:
227: if(skip())i = ll1;
228: else i = max(hnumb(&ll),INCH/10);
229: ll1 = ll;
230: ll = i;
231: setnel();
232: }
233: caselt(){
234: register i;
235:
236: if(skip())i = lt1;
237: else i = max(hnumb(<),0);
238: lt1 = lt;
239: lt = i;
240: }
241: caseti(){
242: register i;
243:
244: if(skip())return;
245: i = max(hnumb(&in),0);
246: tbreak();
247: un1 = i;
248: setnel();
249: }
250: casels(){
251: register i;
252:
253: noscale++;
254: if(skip())i = ls1;
255: else i = max(inumb(&ls),1);
256: ls1 = ls;
257: ls = i;
258: noscale = 0;
259: }
260: casepo(){
261: register i;
262:
263: if(skip())i = po1;
264: else i = max(hnumb(&po),0);
265: po1 = po;
266: po = i;
267: #ifndef NROFF
268: if(!ascii)esc += po - po1;
269: #endif
270: }
271: casepl(){
272: register i;
273:
274: skip();
275: if((i = vnumb(&pl)) == 0)pl = 11 * INCH; /*11in*/
276: else pl = i;
277: if(v.nl > pl)v.nl = pl;
278: }
279: casewh(){
280: register i, j, k;
281:
282: lgf++;
283: skip();
284: i = vnumb((int *)0);
285: if(nonumb)return;
286: skip();
287: j = getrq();
288: if((k=findn(i)) != NTRAP){
289: mlist[k] = j;
290: return;
291: }
292: for(k=0; k<NTRAP; k++)if(mlist[k] == 0)break;
293: if(k == NTRAP){
294: prstrfl("Cannot plant trap.\n");
295: return;
296: }
297: mlist[k] = j;
298: nlist[k] = i;
299: }
300: casech(){
301: register i, j, k;
302:
303: lgf++;
304: skip();
305: if(!(j=getrq()))return;
306: else for(k=0; k<NTRAP; k++)if(mlist[k] == j)break;
307: if(k == NTRAP)return;
308: skip();
309: i = vnumb((int *)0);
310: if(nonumb)mlist[k] = 0;
311: nlist[k] = i;
312: }
313: findn(i)
314: int i;
315: {
316: register k;
317:
318: for(k=0; k<NTRAP; k++)
319: if((nlist[k] == i) && (mlist[k] != 0))break;
320: return(k);
321: }
322: casepn(){
323: register i;
324:
325: skip();
326: noscale++;
327: i = max(inumb(&v.pn),0);
328: noscale = 0;
329: if(!nonumb){
330: npn = i;
331: npnflg++;
332: }
333: }
334: casebp(){
335: register i;
336: register struct s *savframe;
337:
338: if(dip != d)return;
339: savframe = frame;
340: skip();
341: if((i = inumb(&v.pn)) < 0)i = 0;
342: tbreak();
343: if(!nonumb){
344: npn = i;
345: npnflg++;
346: }else if(dip->nls)return;
347: eject(savframe);
348: }
349: casetm(x) int x;{
350: register i;
351: char tmbuf[NTM];
352:
353: lgf++;
354: copyf++;
355: if(skip() && x)prstrfl("User Abort.");
356: for(i=0; i<NTM-2;)if((tmbuf[i++]=getch()) == '\n')break;
357: if(i == NTM-2)tmbuf[i++] = '\n';
358: tmbuf[i] = 0;
359: prstrfl(tmbuf);
360: copyf--;
361: }
362: casesp(a)
363: int a;
364: {
365: register i, j, savlss;
366:
367: tbreak();
368: if(dip->nls || trap)return;
369: i = findt1();
370: if(!a){
371: skip();
372: j = vnumb((int *)0);
373: if(nonumb)j = lss;
374: }else j = a;
375: if(j == 0)return;
376: if(i < j)j = i;
377: savlss = lss;
378: if(dip != d)i = dip->dnl; else i = v.nl;
379: if((i + j) < 0)j = -i;
380: lss = j;
381: newline(0);
382: lss = savlss;
383: }
384: casert(){
385: register a, *p;
386:
387: skip();
388: if(dip != d)p = &dip->dnl; else p = &v.nl;
389: a = vnumb(p);
390: if(nonumb)a = dip->mkline;
391: if((a < 0) || (a >= *p))return;
392: nb++;
393: casesp(a - *p);
394: }
395: caseem(){
396: lgf++;
397: skip();
398: em = getrq();
399: }
400: casefl(){
401: tbreak();
402: flusho();
403: }
404: caseev(){
405: register nxev;
406: extern int block;
407:
408: if(skip()){
409: e0:
410: if(evi == 0)return;
411: nxev = evlist[--evi];
412: goto e1;
413: }
414: noscale++;
415: nxev = atoi();
416: noscale = 0;
417: if(nonumb)goto e0;
418: flushi();
419: if((nxev >= NEV) || (nxev < 0) || (evi >= EVLSZ)){
420: prstrfl("Cannot do ev.\n");
421: if(error)done2(040);else edone(040);
422: return;
423: }
424: evlist[evi++] = ev;
425: e1:
426: if(ev == nxev)return;
427: lseek(ibf, (long)(ev*EVS*sizeof(int)), 0);
428: write(ibf,(char *)&block, EVS*sizeof(int));
429: lseek(ibf, (long)(nxev*EVS*sizeof(int)), 0);
430: read(ibf,(char *)&block, EVS*sizeof(int));
431: ev = nxev;
432: }
433: caseel(){
434: if(--ifx < 0){
435: ifx = 0;
436: iflist[0] = 0;
437: }
438: caseif(2);
439: }
440: caseie(){
441: if(ifx >= NIF){
442: prstr("if-else overflow.\n");
443: ifx = 0;
444: edone(040);
445: }
446: caseif(1);
447: ifx++;
448: }
449: caseif(x)
450: int x;
451: {
452: register i, notflag, true;
453:
454: if(x == 2){
455: notflag = 0;
456: true = iflist[ifx];
457: goto i1;
458: }
459: true = 0;
460: skip();
461: if(((i = getch()) & CMASK) == '!'){
462: notflag = 1;
463: }else{
464: notflag = 0;
465: ch = i;
466: }
467: i = atoi();
468: if(!nonumb){
469: if(i > 0)true++;
470: goto i1;
471: }
472: switch((i = getch()) & CMASK){
473: case 'e':
474: if(!(v.pn & 01))true++;
475: break;
476: case 'o':
477: if(v.pn & 01)true++;
478: break;
479: #ifdef NROFF
480: case 'n':
481: true++;
482: case 't':
483: #endif
484: #ifndef NROFF
485: case 't':
486: true++;
487: case 'n':
488: #endif
489: case ' ':
490: break;
491: default:
492: true = cmpstr(i);
493: }
494: i1:
495: true ^= notflag;
496: if(x == 1)iflist[ifx] = !true;
497: if(true){
498: i2:
499: do{
500: v.hp = 0;
501: pinchar = inchar; /* XXX */
502: }
503: while(((i = getch()) & CMASK) == ' ');
504: if((i & CMASK) == LEFT)goto i2;
505: ch = i;
506: nflush++;
507: }else{
508: copyf++;
509: if(eat(LEFT) == LEFT){
510: while(eatblk(RIGHT,LEFT) != RIGHT)nlflg = 0;
511: }
512: copyf--;
513: }
514: }
515: eatblk(right,left)
516: int right,left;
517: {
518: register i;
519:
520: e0:
521: while(((i = getch() & CMASK) != right) &&
522: (i != left) &&
523: (i != '\n'));
524: if(i == left){
525: while((i=eatblk(right,left)) != right)nlflg = 0;
526: goto e0;
527: }
528: return(i);
529: }
530: cmpstr(delim)
531: int delim;
532: {
533: register i, j;
534: register filep p;
535: extern filep alloc();
536: extern filep incoff();
537: filep begin;
538: int cnt, k;
539: int savapts, savapts1, savfont, savfont1,
540: savpts, savpts1;
541:
542: if(delim & MOT)return(0);
543: delim &= CMASK;
544: if(dip != d)wbfl();
545: if((offset = begin = alloc()) == (filep)0)return(0);
546: cnt = 0;
547: v.hp = 0;
548: pinchar = inchar; /* XXX */
549: savapts = apts;
550: savapts1 = apts1;
551: savfont = font;
552: savfont1 = font1;
553: savpts = pts;
554: savpts1 = pts1;
555: while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
556: wbf(i);
557: cnt++;
558: }
559: wbt(0);
560: k = !cnt;
561: if(nlflg)goto rtn;
562: p = begin;
563: apts = savapts;
564: apts1 = savapts1;
565: font = savfont;
566: font1 = savfont1;
567: pts = savpts;
568: pts1 = savpts1;
569: mchbits();
570: v.hp = 0;
571: pinchar = inchar; /* XXX */
572: while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
573: if(rbf0(p) != i){
574: eat(delim);
575: k = 0;
576: break;
577: }
578: p = incoff(p);
579: k = !(--cnt);
580: }
581: rtn:
582: apts = savapts;
583: apts1 = savapts1;
584: font = savfont;
585: font1 = savfont1;
586: pts = savpts;
587: pts1 = savpts1;
588: mchbits();
589: offset = dip->op;
590: ffree(begin);
591: return(k);
592: }
593: caserd(){
594:
595: lgf++;
596: skip();
597: getname();
598: if(!iflg){
599: if(quiet){
600: ttys.sg_flags &= ~ECHO;
601: stty(0, &ttys);
602: prstrfl(""); /*bell*/
603: }else{
604: if(nextf[0]){
605: prstr(nextf);
606: prstr(":");
607: }else{
608: prstr(""); /*bell*/
609: }
610: }
611: }
612: collect();
613: tty++;
614: pushi((filep)-1);
615: }
616: rdtty(){
617: char onechar;
618:
619: onechar = 0;
620: if(read(0, &onechar, 1) == 1){
621: if(onechar == '\n')tty++;
622: else tty = 1;
623: if(tty != 3)return(onechar);
624: }
625: popi();
626: tty = 0;
627: if(quiet){
628: ttys.sg_flags |= ECHO;
629: stty(0, &ttys);
630: }
631: return(0);
632: }
633: caseec(){
634: eschar = chget('\\');
635: }
636: caseeo(){
637: eschar = 0;
638: }
639: caseli(){
640:
641: skip();
642: lit = max(inumb((int *)0),1);
643: litlev = frame;
644: if((dip == d) && (v.nl == -1))newline(1);
645: }
646: caseta(){
647: register i;
648:
649: tabtab[0] = nonumb = 0;
650: for(i=0; ((i < (NTAB-1)) && !nonumb); i++){
651: if(skip())break;
652: tabtab[i] = max(hnumb(&tabtab[max(i-1,0)]),0) & TMASK;
653: if(!nonumb) switch(ch & CMASK){
654: case 'C':
655: tabtab[i] |= CTAB;
656: break;
657: case 'R':
658: tabtab[i] |= RTAB;
659: break;
660: default: /*includes L*/
661: break;
662: }
663: nonumb = ch = 0;
664: }
665: tabtab[i] = 0;
666: }
667: casene(){
668: register i, j;
669:
670: skip();
671: i = vnumb((int *)0);
672: if(nonumb)i = lss;
673: if(i > (j = findt1())){
674: i = lss;
675: lss = j;
676: dip->nls = 0;
677: newline(0);
678: lss = i;
679: }
680: }
681: casetr(){
682: register i, j;
683:
684: lgf++;
685: skip();
686: while((i = getch() & CMASK) != '\n'){
687: if((i & MOT) || ((j = getch()) & MOT))return;
688: if((j &= CMASK) == '\n')j = ' ';
689: trtab[i] = j;
690: }
691: }
692: casecu(){
693: cu++;
694: caseul();
695: }
696: caseul(){
697: register i;
698:
699: noscale++;
700: if(skip())i = 1;
701: else i = atoi();
702: if(ul && (i == 0)){
703: font = sfont;
704: ul = cu = 0;
705: }
706: if(i){
707: if(!ul){
708: sfont = font;
709: font = ulfont;
710: }
711: ul = i;
712: }
713: noscale = 0;
714: mchbits();
715: }
716: caseuf(){
717: register i, j;
718:
719: if(skip() || !(i = getrq()) || (i == 'S') ||
720: ((j = find(i,fontlab)) == -1))
721: ulfont = 1; /*default position 2*/
722: else ulfont = j;
723: #ifdef NROFF
724: if(ulfont == 0)ulfont = 1;
725: #endif
726: ulbit = ulfont<<9;
727: }
728: caseit(){
729: register i;
730:
731: lgf++;
732: it = itmac = 0;
733: noscale++;
734: skip();
735: i = atoi();
736: skip();
737: if(!nonumb && (itmac = getrq()))it = i;
738: noscale = 0;
739: }
740: casemc(){
741: register i;
742:
743: if(icf > 1)ic = 0;
744: icf = 0;
745: if(skip())return;
746: ic = getch();
747: icf = 1;
748: skip();
749: i = max(hnumb((int *)0),0);
750: if(!nonumb)ics = i;
751: }
752: casemk(){
753: register i, j;
754:
755: if(dip != d)j = dip->dnl; else j = v.nl;
756: if(skip()){
757: dip->mkline = j;
758: return;
759: }
760: if((i = getrq()) == 0)return;
761: vlist[findr(i)] = j;
762: }
763: casesv(){
764: register i;
765:
766: skip();
767: if((i = vnumb((int *)0)) < 0)return;
768: if(nonumb)i = 1;
769: sv += i;
770: caseos();
771: }
772: caseos(){
773: register savlss;
774:
775: if(sv <= findt1()){
776: savlss = lss;
777: lss = sv;
778: newline(0);
779: lss = savlss;
780: sv = 0;
781: }
782: }
783: casenm(){
784: register i;
785:
786: lnmod = nn = 0;
787: if(skip())return;
788: lnmod++;
789: noscale++;
790: i = inumb(&v.ln);
791: if(!nonumb)v.ln = max(i,0);
792: getnm(&ndf,1);
793: getnm(&nms,0);
794: getnm(&ni,0);
795: noscale = 0;
796: nmbits = chbits;
797: }
798: getnm(p,min)
799: int *p, min;
800: {
801: register i;
802:
803: eat(' ');
804: if(skip())return;
805: i = atoi();
806: if(nonumb)return;
807: *p = max(i,min);
808: }
809: casenn(){
810: noscale++;
811: skip();
812: nn = max(atoi(),1);
813: noscale = 0;
814: }
815: caseab(){
816: dummy();
817: casetm(1);
818: done2(0);
819: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.