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