BSD 4 development
[unix-history] / usr / src / cmd / troff / n5.c
CommitLineData
f2217188
BJ
1#include "tdef.h"
2#include <sgtty.h>
3extern
4#include "d.h"
5extern
6#include "v.h"
7#include "s.h"
8
9/*
10troff5.c
11
12misc processing requests
13*/
14
15extern int inchar[LNSIZE], *pinchar; /* XXX */
16extern struct s *frame;
17extern struct s *litlev;
18extern filep ip;
19extern filep offset;
20
21extern int ascii;
22extern int nonumb;
23extern int admod;
24extern int ad;
25extern int fi;
26extern int cc;
27extern int c2;
28extern int ohc;
29extern int tabc;
30extern int dotc;
31extern int pendnf;
32extern int hyf;
33extern int ce;
34extern int po;
35extern int po1;
36extern int nc;
37extern int in;
38extern int un;
39extern int un1;
40extern int in1;
41extern int ll;
42extern int ll1;
43extern int lt;
44extern int lt1;
45extern int nlist[NTRAP];
46extern int mlist[NTRAP];
47extern int lgf;
48extern int pl;
49extern int npn;
50extern int npnflg;
51extern int copyf;
52extern char nextf[];
53extern int trap;
54extern int lss;
55extern int em;
56extern int evlist[EVLSZ];
57extern int evi;
58extern int ibf;
59extern int ev;
60extern int ch;
61extern int nflush;
62extern int tty;
63extern struct sgttyb ttys;
64extern int quiet;
65extern int iflg;
66extern int eschar;
67extern int lit;
68extern int ls;
69extern int ls1;
70extern int tabtab[];
71extern char trtab[];
72extern int ul;
73extern int cu;
74extern int sfont;
75extern int font;
76extern int fontlab[];
77extern int it;
78extern int itmac;
79extern int noscale;
80extern int ic;
81extern int icf;
82extern int ics;
83extern int *vlist;
84extern int sv;
85extern int esc;
86extern int nn;
87extern int nms;
88extern int ndf;
89extern int lnmod;
90extern int ni;
91extern int lnsize;
92extern int nb;
93extern int nlflg;
94extern int apts, apts1, pts, pts1, font, font1;
95extern int ulfont;
96extern int ulbit;
97extern int error;
98extern int nmbits;
99extern int chbits;
100extern int tdelim;
101extern int xxx;
102int iflist[NIF];
103int ifx;
104
105casead(){
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}
130casena(){
131 ad = 0;
132}
133casefi(){
134 tbreak();
135 fi++;
136 pendnf = 0;
137 lnsize = LNSIZE;
138}
139casenf(){
140 tbreak();
141 fi = 0;
142/* can't do while oline is only LNSIZE
143 lnsize = LNSIZE + WDSIZE;
144*/
145}
146casers(){
147 dip->nls = 0;
148}
149casens(){
150 dip->nls++;
151}
152chget(c)
153int 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}
165casecc(){
166 cc = chget('.');
167}
168casec2(){
169 c2 = chget('\'');
170}
171casehc(){
172 ohc = chget(OHC);
173}
174casetc(){
175 tabc = chget(0);
176}
177caselc(){
178 dotc = chget(0);
179}
180casehy(){
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}
191casenh(){
192 hyf = 0;
193}
194max(aa,bb)
195int aa,bb;
196{
197 if(aa>bb)return(aa);
198 else return(bb);
199}
200casece(){
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}
211casein(){
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}
224casell(){
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}
233caselt(){
234 register i;
235
236 if(skip())i = lt1;
237 else i = max(hnumb(&lt),0);
238 lt1 = lt;
239 lt = i;
240}
241caseti(){
242 register i;
243
244 if(skip())return;
245 i = max(hnumb(&in),0);
246 tbreak();
247 un1 = i;
248 setnel();
249}
250casels(){
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}
260casepo(){
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}
271casepl(){
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}
279casewh(){
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}
300casech(){
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}
313findn(i)
314int 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}
322casepn(){
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}
334casebp(){
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}
349casetm(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}
362casesp(a)
363int 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}
384casert(){
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}
395caseem(){
396 lgf++;
397 skip();
398 em = getrq();
399}
400casefl(){
401 tbreak();
402 flusho();
403}
404caseev(){
405 register nxev;
406 extern int block;
407
408 if(skip()){
409e0:
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;
425e1:
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}
433caseel(){
434 if(--ifx < 0){
435 ifx = 0;
436 iflist[0] = 0;
437 }
438 caseif(2);
439}
440caseie(){
441 if(ifx >= NIF){
442 prstr("if-else overflow.\n");
443 ifx = 0;
444 edone(040);
445 }
446 caseif(1);
447 ifx++;
448}
449caseif(x)
450int 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 }
494i1:
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}
515eatblk(right,left)
516int right,left;
517{
518 register i;
519
520e0:
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}
530cmpstr(delim)
531int 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 }
581rtn:
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}
593caserd(){
594
595 lgf++;
596 skip();
597 getname();
598 if(!iflg){
599 if(quiet){
600 ttys.sg_flags &= ~ECHO;
601 stty(0, &ttys);
602 prstrfl("\a"); /*bell*/
603 }else{
604 if(nextf[0]){
605 prstr(nextf);
606 prstr(":");
607 }else{
608 prstr("\a"); /*bell*/
609 }
610 }
611 }
612 collect();
613 tty++;
614 pushi((filep)-1);
615}
616rdtty(){
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}
633caseec(){
634 eschar = chget('\\');
635}
636caseeo(){
637 eschar = 0;
638}
639caseli(){
640
641 skip();
642 lit = max(inumb((int *)0),1);
643 litlev = frame;
644 if((dip == d) && (v.nl == -1))newline(1);
645}
646caseta(){
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}
667casene(){
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}
681casetr(){
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}
692casecu(){
693 cu++;
694 caseul();
695}
696caseul(){
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}
716caseuf(){
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}
728caseit(){
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}
740casemc(){
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}
752casemk(){
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}
763casesv(){
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}
772caseos(){
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}
783casenm(){
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}
798getnm(p,min)
799int *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}
809casenn(){
810 noscale++;
811 skip();
812 nn = max(atoi(),1);
813 noscale = 0;
814}
815caseab(){
816 dummy();
817 casetm(1);
818 done2(0);
819}