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