|
|
1.1 root 1: #include "tdef.h"
2: #include "ext.h"
3:
4: #define stty(f, a) ioctl(f, TIOCSETP, a)
5: #define gtty(f, a) ioctl(f, TIOCGETP, a)
6:
7: /*
8: * troff5.c
9: *
10: * misc processing requests
11: */
12:
13: int iflist[NIF];
14: int ifx;
15:
16: casead()
17: {
18: register i;
19:
20: ad = 1;
21: /*leave admod alone*/
22: if (skip())
23: return;
24: switch (i = cbits(getch())) {
25: case 'r': /*right adj, left ragged*/
26: admod = 2;
27: break;
28: case 'l': /*left adj, right ragged*/
29: admod = ad = 0; /*same as casena*/
30: break;
31: case 'c': /*centered adj*/
32: admod = 1;
33: break;
34: case 'b':
35: case 'n':
36: admod = 0;
37: break;
38: case '0':
39: case '2':
40: case '4':
41: ad = 0;
42: case '1':
43: case '3':
44: case '5':
45: admod = (i - '0') / 2;
46: }
47: }
48:
49:
50: casena()
51: {
52: ad = 0;
53: }
54:
55:
56: casefi()
57: {
58: tbreak();
59: fi++;
60: pendnf = 0;
61: lnsize = LNSIZE;
62: }
63:
64:
65: casenf()
66: {
67: tbreak();
68: fi = 0;
69: }
70:
71:
72: casers()
73: {
74: dip->nls = 0;
75: }
76:
77:
78: casens()
79: {
80: dip->nls++;
81: }
82:
83:
84: chget(c)
85: int c;
86: {
87: tchar i;
88:
89: if (skip() || ismot(i = getch()) || cbits(i) == ' ' || cbits(i) == '\n') {
90: ch = i;
91: return(c);
92: } else
93: return(i & BYTEMASK);
94: }
95:
96:
97: casecc()
98: {
99: cc = chget('.');
100: }
101:
102:
103: casec2()
104: {
105: c2 = chget('\'');
106: }
107:
108:
109: casehc()
110: {
111: ohc = chget(OHC);
112: }
113:
114:
115: casetc()
116: {
117: tabc = chget(0);
118: }
119:
120:
121: caselc()
122: {
123: dotc = chget(0);
124: }
125:
126:
127: casehy()
128: {
129: register i;
130:
131: hyf = 1;
132: if (skip())
133: return;
134: noscale++;
135: i = atoi();
136: noscale = 0;
137: if (nonumb)
138: return;
139: hyf = max(i, 0);
140: }
141:
142:
143: casenh()
144: {
145: hyf = 0;
146: }
147:
148:
149: max(aa, bb)
150: int aa, bb;
151: {
152: if (aa > bb)
153: return(aa);
154: else
155: return(bb);
156: }
157:
158:
159: casece()
160: {
161: register i;
162:
163: noscale++;
164: skip();
165: i = max(atoi(), 0);
166: if (nonumb)
167: i = 1;
168: tbreak();
169: ce = i;
170: noscale = 0;
171: }
172:
173:
174: casein()
175: {
176: register i;
177:
178: if (skip())
179: i = in1;
180: else
181: i = max(hnumb(&in), 0);
182: tbreak();
183: in1 = in;
184: in = i;
185: if (!nc) {
186: un = in;
187: setnel();
188: }
189: }
190:
191:
192: casell()
193: {
194: register i;
195:
196: if (skip())
197: i = ll1;
198: else
199: i = max(hnumb(&ll), INCH / 10);
200: ll1 = ll;
201: ll = i;
202: setnel();
203: }
204:
205:
206: caselt()
207: {
208: register i;
209:
210: if (skip())
211: i = lt1;
212: else
213: i = max(hnumb(<), 0);
214: lt1 = lt;
215: lt = i;
216: }
217:
218:
219: caseti()
220: {
221: register i;
222:
223: if (skip())
224: return;
225: i = max(hnumb(&in), 0);
226: tbreak();
227: un1 = i;
228: setnel();
229: }
230:
231:
232: casels()
233: {
234: register i;
235:
236: noscale++;
237: if (skip())
238: i = ls1;
239: else
240: i = max(inumb(&ls), 1);
241: ls1 = ls;
242: ls = i;
243: noscale = 0;
244: }
245:
246:
247: casepo()
248: {
249: register i;
250:
251: if (skip())
252: i = po1;
253: else {
254: i = max(hnumb(&po), 0);
255: if (nonumb)
256: i = po1;
257: }
258: po1 = po;
259: po = i;
260: #ifndef NROFF
261: if (!ascii)
262: esc += po - po1;
263: #endif
264: }
265:
266:
267: casepl()
268: {
269: register i;
270:
271: skip();
272: if ((i = vnumb(&pl)) == 0)
273: pl = 11 * INCH; /*11in*/
274: else
275: pl = i;
276: if (numtab[NL].val > pl)
277: numtab[NL].val = pl;
278: }
279:
280:
281: casewh()
282: {
283: register i, j, k;
284:
285: lgf++;
286: skip();
287: i = vnumb((int *)0);
288: if (nonumb)
289: return;
290: skip();
291: j = getrq();
292: if ((k = findn(i)) != NTRAP) {
293: mlist[k] = j;
294: return;
295: }
296: for (k = 0; k < NTRAP; k++)
297: if (mlist[k] == 0)
298: break;
299: if (k == NTRAP) {
300: flusho();
301: errprint("cannot plant trap.");
302: return;
303: }
304: mlist[k] = j;
305: nlist[k] = i;
306: }
307:
308:
309: casech()
310: {
311: register i, j, k;
312:
313: lgf++;
314: skip();
315: if (!(j = getrq()))
316: return;
317: else
318: for (k = 0; k < NTRAP; k++)
319: if (mlist[k] == j)
320: break;
321: if (k == NTRAP)
322: return;
323: skip();
324: i = vnumb((int *)0);
325: if (nonumb)
326: mlist[k] = 0;
327: nlist[k] = i;
328: }
329:
330:
331: findn(i)
332: int i;
333: {
334: register k;
335:
336: for (k = 0; k < NTRAP; k++)
337: if ((nlist[k] == i) && (mlist[k] != 0))
338: break;
339: return(k);
340: }
341:
342:
343: casepn()
344: {
345: register i;
346:
347: skip();
348: noscale++;
349: i = max(inumb(&numtab[PN].val), 0);
350: noscale = 0;
351: if (!nonumb) {
352: npn = i;
353: npnflg++;
354: }
355: }
356:
357:
358: casebp()
359: {
360: register i;
361: register struct s *savframe;
362:
363: if (dip != d)
364: return;
365: savframe = frame;
366: skip();
367: if ((i = inumb(&numtab[PN].val)) < 0)
368: i = 0;
369: tbreak();
370: if (!nonumb) {
371: npn = i;
372: npnflg++;
373: } else if (dip->nls)
374: return;
375: eject(savframe);
376: }
377:
378:
379: casetm(ab)
380: int ab;
381: {
382: register i, c;
383: char tmbuf[NTM];
384:
385: lgf++;
386: copyf++;
387: if (skip() && ab)
388: errprint("User Abort");
389: for (i = 0; i < NTM - 2; )
390: if ((c = tmbuf[i++] = getch()) == '\n' || c == RIGHT)
391: break;
392: if (i == NTM - 2)
393: tmbuf[i++] = '\n';
394: tmbuf[i] = 0;
395: if (ab) /* truncate output */
396: obufp = obuf; /* should be a function in n2.c */
397: flusho();
398: fdprintf(stderr, "%s", tmbuf);
399: copyf--;
400: lgf--;
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 = numtab[NL].val;
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 = &numtab[NL].val;
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:
475: if (skip()) {
476: e0:
477: if (evi == 0)
478: return;
479: nxev = evlist[--evi];
480: goto e1;
481: }
482: noscale++;
483: nxev = atoi();
484: noscale = 0;
485: if (nonumb)
486: goto e0;
487: flushi();
488: if ((nxev >= NEV) || (nxev < 0) || (evi >= EVLSZ)) {
489: flusho();
490: errprint("cannot do ev.");
491: if (error)
492: done2(040);
493: else
494: edone(040);
495: return;
496: }
497: evlist[evi++] = ev;
498: e1:
499: if (ev == nxev)
500: return;
501: #ifdef INCORE
502: { extern tchar corebuf[];
503: envcopy((struct env *) &corebuf[ev * sizeof(env)/sizeof(tchar)], &env);
504: envcopy(&env, (struct env *) &corebuf[nxev * sizeof(env)/sizeof(tchar)]);
505: }
506: #else
507: lseek(ibf, ev * (long)sizeof(env), 0);
508: write(ibf, (char *) & env, sizeof(env));
509: lseek(ibf, nxev * (long)sizeof(env), 0);
510: read(ibf, (char *) & env, sizeof(env));
511: #endif
512: ev = nxev;
513: }
514:
515: envcopy(e1, e2) /* copy env e2 to e1 */
516: struct env *e1, *e2;
517: {
518: *e1 = *e2; /* rumor hath that this fails on some machines */
519: }
520:
521:
522: caseel()
523: {
524: if (--ifx < 0) {
525: ifx = 0;
526: iflist[0] = 0;
527: }
528: caseif(2);
529: }
530:
531:
532: caseie()
533: {
534: if (ifx >= NIF) {
535: errprint("if-else overflow.");
536: ifx = 0;
537: edone(040);
538: }
539: caseif(1);
540: ifx++;
541: }
542:
543:
544: caseif(x)
545: int x;
546: {
547: extern int falsef;
548: register notflag, true;
549: tchar i;
550:
551: if (x == 2) {
552: notflag = 0;
553: true = iflist[ifx];
554: goto i1;
555: }
556: true = 0;
557: skip();
558: if ((cbits(i = getch())) == '!') {
559: notflag = 1;
560: } else {
561: notflag = 0;
562: ch = i;
563: }
564: i = atoi();
565: if (!nonumb) {
566: if (i > 0)
567: true++;
568: goto i1;
569: }
570: i = getch();
571: switch (cbits(i)) {
572: case 'e':
573: if (!(numtab[PN].val & 01))
574: true++;
575: break;
576: case 'o':
577: if (numtab[PN].val & 01)
578: true++;
579: break;
580: #ifdef NROFF
581: case 'n':
582: true++;
583: case 't':
584: #endif
585: #ifndef NROFF
586: case 't':
587: true++;
588: case 'n':
589: #endif
590: case ' ':
591: break;
592: default:
593: true = cmpstr(i);
594: }
595: i1:
596: true ^= notflag;
597: if (x == 1)
598: iflist[ifx] = !true;
599: if (true) {
600: i2:
601: while ((cbits(i = getch())) == ' ')
602: ;
603: if (cbits(i) == LEFT)
604: goto i2;
605: ch = i;
606: nflush++;
607: } else {
608: copyf++;
609: falsef++;
610: eatblk(0);
611: copyf--;
612: falsef--;
613: }
614: }
615:
616: eatblk(inblk)
617: int inblk;
618: { register int cnt, i;
619:
620: cnt = 0;
621: do {
622: if (ch) {
623: i = cbits(ch);
624: ch = 0;
625: } else
626: i = cbits(getch0());
627: if (i == ESC)
628: cnt++;
629: else {
630: if (cnt == 1)
631: switch (i) {
632: case '{': i = LEFT; break;
633: case '}': i = RIGHT; break;
634: case '\n': i = 'x'; break;
635: }
636: cnt = 0;
637: }
638: if (i == LEFT) eatblk(1);
639: } while ((!inblk && (i != '\n')) || (inblk && (i != RIGHT)));
640: if (i == '\n')
641: nlflg++;
642: }
643:
644:
645: cmpstr(c)
646: tchar c;
647: {
648: register j, delim;
649: register tchar i;
650: register val;
651: int savapts, savapts1, savfont, savfont1, savpts, savpts1;
652: tchar string[1280];
653: register tchar *sp;
654:
655: if (ismot(c))
656: return(0);
657: delim = cbits(c);
658: savapts = apts;
659: savapts1 = apts1;
660: savfont = font;
661: savfont1 = font1;
662: savpts = pts;
663: savpts1 = pts1;
664: sp = string;
665: while ((j = cbits(i = getch()))!=delim && j!='\n' && sp<&string[1280-1])
666: *sp++ = i;
667: if (sp >= string + 1280) {
668: errprint("too-long string compare.");
669: edone(0100);
670: }
671: if (nlflg) {
672: val = sp==string;
673: goto rtn;
674: }
675: *sp = 0;
676: apts = savapts;
677: apts1 = savapts1;
678: font = savfont;
679: font1 = savfont1;
680: pts = savpts;
681: pts1 = savpts1;
682: mchbits();
683: val = 1;
684: sp = string;
685: while ((j = cbits(i = getch())) != delim && j != '\n') {
686: if (*sp != i) {
687: eat(delim);
688: val = 0;
689: goto rtn;
690: }
691: sp++;
692: }
693: if (*sp)
694: val = 0;
695: rtn:
696: apts = savapts;
697: apts1 = savapts1;
698: font = savfont;
699: font1 = savfont1;
700: pts = savpts;
701: pts1 = savpts1;
702: mchbits();
703: return(val);
704: }
705:
706:
707: caserd()
708: {
709:
710: lgf++;
711: skip();
712: getname();
713: if (!iflg) {
714: if (quiet) {
715: #ifdef NROFF
716: echo_off();
717: flusho();
718: #endif NROFF
719: fdprintf(stderr, "\007"); /*bell*/
720: } else {
721: if (nextf[0]) {
722: fdprintf(stderr, "%s:", nextf);
723: } else {
724: fdprintf(stderr, "\007"); /*bell*/
725: }
726: }
727: }
728: collect();
729: tty++;
730: pushi((filep)NBLIST*BLK, PAIR('r','d'));
731: }
732:
733:
734: rdtty()
735: {
736: char onechar;
737:
738: onechar = 0;
739: if (read(0, &onechar, 1) == 1) {
740: if (onechar == '\n')
741: tty++;
742: else
743: tty = 1;
744: if (tty != 3)
745: return(onechar);
746: }
747: popi();
748: tty = 0;
749: #ifdef NROFF
750: if (quiet)
751: echo_on();
752: #endif NROFF
753: return(0);
754: }
755:
756:
757: caseec()
758: {
759: eschar = chget('\\');
760: }
761:
762:
763: caseeo()
764: {
765: eschar = 0;
766: }
767:
768:
769: caseta()
770: {
771: register i;
772:
773: tabtab[0] = nonumb = 0;
774: for (i = 0; ((i < (NTAB - 1)) && !nonumb); i++) {
775: if (skip())
776: break;
777: tabtab[i] = max(hnumb(&tabtab[max(i-1,0)]), 0) & TABMASK;
778: if (!nonumb)
779: switch (cbits(ch)) {
780: case 'C':
781: tabtab[i] |= CTAB;
782: break;
783: case 'R':
784: tabtab[i] |= RTAB;
785: break;
786: default: /*includes L*/
787: break;
788: }
789: nonumb = ch = 0;
790: }
791: tabtab[i] = 0;
792: }
793:
794:
795: casene()
796: {
797: register i, j;
798:
799: skip();
800: i = vnumb((int *)0);
801: if (nonumb)
802: i = lss;
803: if (i > (j = findt1())) {
804: i = lss;
805: lss = j;
806: dip->nls = 0;
807: newline(0);
808: lss = i;
809: }
810: }
811:
812:
813: casetr()
814: {
815: register i, j;
816: tchar k;
817:
818: lgf++;
819: skip();
820: while ((i = cbits(k=getch())) != '\n') {
821: if (ismot(k))
822: return;
823: if (ismot(k = getch()))
824: return;
825: if ((j = cbits(k)) == '\n')
826: j = ' ';
827: trtab[i] = j;
828: }
829: }
830:
831:
832: casecu()
833: {
834: cu++;
835: caseul();
836: }
837:
838:
839: caseul()
840: {
841: register i;
842:
843: noscale++;
844: if (skip())
845: i = 1;
846: else
847: i = atoi();
848: if (ul && (i == 0)) {
849: font = sfont;
850: ul = cu = 0;
851: }
852: if (i) {
853: if (!ul) {
854: sfont = font;
855: font = ulfont;
856: }
857: ul = i;
858: }
859: noscale = 0;
860: mchbits();
861: }
862:
863:
864: caseuf()
865: {
866: register i, j;
867:
868: if (skip() || !(i = getrq()) || i == 'S' || (j = findft(i)) == -1)
869: ulfont = ULFONT; /*default underline position*/
870: else
871: ulfont = j;
872: #ifdef NROFF
873: if (ulfont == FT)
874: ulfont = ULFONT;
875: #endif
876: }
877:
878:
879: caseit()
880: {
881: register i;
882:
883: lgf++;
884: it = itmac = 0;
885: noscale++;
886: skip();
887: i = atoi();
888: skip();
889: if (!nonumb && (itmac = getrq()))
890: it = i;
891: noscale = 0;
892: }
893:
894:
895: casemc()
896: {
897: register i;
898:
899: if (icf > 1)
900: ic = 0;
901: icf = 0;
902: if (skip())
903: return;
904: ic = getch();
905: icf = 1;
906: skip();
907: i = max(hnumb((int *)0), 0);
908: if (!nonumb)
909: ics = i;
910: }
911:
912:
913: casemk()
914: {
915: register i, j;
916:
917: if (dip != d)
918: j = dip->dnl;
919: else
920: j = numtab[NL].val;
921: if (skip()) {
922: dip->mkline = j;
923: return;
924: }
925: if ((i = getrq()) == 0)
926: return;
927: numtab[findr(i)].val = j;
928: }
929:
930:
931: casesv()
932: {
933: register i;
934:
935: skip();
936: if ((i = vnumb((int *)0)) < 0)
937: return;
938: if (nonumb)
939: i = 1;
940: sv += i;
941: caseos();
942: }
943:
944:
945: caseos()
946: {
947: register savlss;
948:
949: if (sv <= findt1()) {
950: savlss = lss;
951: lss = sv;
952: newline(0);
953: lss = savlss;
954: sv = 0;
955: }
956: }
957:
958:
959: casenm()
960: {
961: register i;
962:
963: lnmod = nn = 0;
964: if (skip())
965: return;
966: lnmod++;
967: noscale++;
968: i = inumb(&numtab[LN].val);
969: if (!nonumb)
970: numtab[LN].val = max(i, 0);
971: getnm(&ndf, 1);
972: getnm(&nms, 0);
973: getnm(&ni, 0);
974: noscale = 0;
975: nmbits = chbits;
976: }
977:
978:
979: getnm(p, min)
980: int *p, min;
981: {
982: register i;
983:
984: eat(' ');
985: if (skip())
986: return;
987: i = atoi();
988: if (nonumb)
989: return;
990: *p = max(i, min);
991: }
992:
993:
994: casenn()
995: {
996: noscale++;
997: skip();
998: nn = max(atoi(), 1);
999: noscale = 0;
1000: }
1001:
1002:
1003: caseab()
1004: {
1005: casetm(1);
1006: done3(0);
1007: }
1008:
1009: #ifdef NROFF
1010: /*
1011: * The following routines are concerned with setting terminal options.
1012: * The manner of doing this differs between research/Berkeley systems
1013: * and UNIX System V systems (i.e. DOCUMENTER'S WORKBENCH)
1014: * The distinction is controlled by the #define'd variable USG,
1015: * which must be set by System V users.
1016: */
1017:
1018:
1019: #ifdef USG
1020:
1021: #include <termio.h>
1022: #define ECHO_USG (ECHO | ECHOE | ECHOK | ECHONL)
1023: struct termio ttys;
1024:
1025: #else
1026:
1027: #include <sys/ttyio.h>
1028: /* #include <sgtty.h> */
1029: struct sgttyb ttys[2];
1030: #include "tw.h"
1031: extern struct t t;
1032:
1033: #endif USG
1034:
1035: int ttysave[2] = {-1, -1};
1036:
1037: save_tty() /*save any tty settings that may be changed*/
1038: {
1039:
1040: #ifdef USG
1041: if (ioctl(0, TCGETA, &ttys) >= 0)
1042: ttysave[0] = ttys.c_lflag;
1043: #else
1044: if (gtty(0, &ttys[0]) >= 0)
1045: ttysave[0] = ttys[0].sg_flags;
1046: if (gtty(1, &ttys[1]) >= 0)
1047: ttysave[1] = ttys[1].sg_flags;
1048: #endif USG
1049:
1050: }
1051:
1052:
1053: restore_tty() /*restore tty settings from beginning*/
1054: {
1055:
1056: if (ttysave[0] != -1) {
1057: #ifdef USG
1058: ttys.c_lflag = ttysave[0];
1059: ioctl(0, TCSETAW, &ttys);
1060: #else
1061: ttys[0].sg_flags = ttysave[0];
1062: stty(0, &ttys[0]);
1063: }
1064: if (ttysave[1] != -1) {
1065: ttys[1].sg_flags = ttysave[1];
1066: stty(1, &ttys[1]);
1067: #endif USG
1068: }
1069: }
1070:
1071:
1072: set_tty()
1073: {
1074:
1075: #ifndef USG
1076: if (t.bset || t.breset) {
1077: if (ttysave[1] == -1)
1078: save_tty();
1079: if (ttysave[1] != -1) {
1080: ttys[1].sg_flags &= ~t.breset;
1081: ttys[1].sg_flags |= t.bset;
1082: stty(1, &ttys[1]);
1083: }
1084: }
1085: #endif USG
1086:
1087: }
1088:
1089:
1090: echo_off() /*turn off ECHO for .rd in "-q" mode*/
1091: {
1092:
1093: #ifdef USG
1094: ttys.c_lflag &= ~ECHO_USG;
1095: ioctl(0, TCSETAW, &ttys);
1096: #else
1097: ttys[0].sg_flags &= ~ECHO;
1098: stty(0, &ttys[0]);
1099: #endif USG
1100:
1101: }
1102:
1103:
1104: echo_on() /*restore ECHO after .rd in "-q" mode*/
1105: {
1106:
1107: #ifdef USG
1108: ttys.c_lflag |= ECHO_USG;
1109: ioctl(0, TCSETAW, &ttys);
1110: #else
1111: ttys[0].sg_flags |= ECHO;
1112: stty(0, &ttys[0]);
1113: #endif USG
1114:
1115: }
1116: #endif NROFF
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.