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