BSD 3 development
[unix-history] / usr / src / cmd / troff / n5.c
CommitLineData
8f6d64d2
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 struct s *frame;
16extern struct s *litlev;
17extern filep ip;
18extern filep offset;
19
20extern int ascii;
21extern int nonumb;
22extern int admod;
23extern int ad;
24extern int fi;
25extern int cc;
26extern int c2;
27extern int ohc;
28extern int tabc;
29extern int dotc;
30extern int pendnf;
31extern int hyf;
32extern int ce;
33extern int po;
34extern int po1;
35extern int nc;
36extern int in;
37extern int un;
38extern int un1;
39extern int in1;
40extern int ll;
41extern int ll1;
42extern int lt;
43extern int lt1;
44extern int nlist[NTRAP];
45extern int mlist[NTRAP];
46extern int lgf;
47extern int pl;
48extern int npn;
49extern int npnflg;
50extern int copyf;
51extern char nextf[];
52extern int trap;
53extern int lss;
54extern int em;
55extern int evlist[EVLSZ];
56extern int evi;
57extern int ibf;
58extern int ev;
59extern int ch;
60extern int nflush;
61extern int tty;
62extern struct sgttyb ttys;
63extern int quiet;
64extern int iflg;
65extern int eschar;
66extern int lit;
67extern int ls;
68extern int ls1;
69extern int tabtab[];
70extern char trtab[];
71extern int ul;
72extern int cu;
73extern int sfont;
74extern int font;
75extern int fontlab[];
76extern int it;
77extern int itmac;
78extern int noscale;
79extern int ic;
80extern int icf;
81extern int ics;
82extern int *vlist;
83extern int sv;
84extern int esc;
85extern int nn;
86extern int nms;
87extern int ndf;
88extern int lnmod;
89extern int ni;
90extern int lnsize;
91extern int nb;
92extern int nlflg;
93extern int apts, apts1, pts, pts1, font, font1;
94extern int ulfont;
95extern int ulbit;
96extern int error;
97extern int nmbits;
98extern int chbits;
99extern int tdelim;
100extern int xxx;
101int iflist[NIF];
102int ifx;
103
104casead(){
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}
129casena(){
130 ad = 0;
131}
132casefi(){
133 tbreak();
134 fi++;
135 pendnf = 0;
136 lnsize = LNSIZE;
137}
138casenf(){
139 tbreak();
140 fi = 0;
141/* can't do while oline is only LNSIZE
142 lnsize = LNSIZE + WDSIZE;
143*/
144}
145casers(){
146 dip->nls = 0;
147}
148casens(){
149 dip->nls++;
150}
151chget(c)
152int 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}
164casecc(){
165 cc = chget('.');
166}
167casec2(){
168 c2 = chget('\'');
169}
170casehc(){
171 ohc = chget(OHC);
172}
173casetc(){
174 tabc = chget(0);
175}
176caselc(){
177 dotc = chget(0);
178}
179casehy(){
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}
190casenh(){
191 hyf = 0;
192}
193max(aa,bb)
194int aa,bb;
195{
196 if(aa>bb)return(aa);
197 else return(bb);
198}
199casece(){
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}
210casein(){
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}
223casell(){
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}
232caselt(){
233 register i;
234
235 if(skip())i = lt1;
236 else i = max(hnumb(&lt),0);
237 lt1 = lt;
238 lt = i;
239}
240caseti(){
241 register i;
242
243 if(skip())return;
244 i = max(hnumb(&in),0);
245 tbreak();
246 un1 = i;
247 setnel();
248}
249casels(){
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}
259casepo(){
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}
270casepl(){
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}
278casewh(){
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}
299casech(){
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}
312findn(i)
313int 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}
321casepn(){
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}
333casebp(){
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}
348casetm(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}
361casesp(a)
362int 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}
383casert(){
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}
394caseem(){
395 lgf++;
396 skip();
397 em = getrq();
398}
399casefl(){
400 tbreak();
401 flusho();
402}
403caseev(){
404 register nxev;
405 extern int block;
406
407 if(skip()){
408e0:
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;
424e1:
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}
432caseel(){
433 if(--ifx < 0){
434 ifx = 0;
435 iflist[0] = 0;
436 }
437 caseif(2);
438}
439caseie(){
440 if(ifx >= NIF){
441 prstr("if-else overflow.\n");
442 ifx = 0;
443 edone(040);
444 }
445 caseif(1);
446 ifx++;
447}
448caseif(x)
449int 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 }
493i1:
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}
513eatblk(right,left)
514int right,left;
515{
516 register i;
517
518e0:
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}
528cmpstr(delim)
529int 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 }
577rtn:
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}
589caserd(){
590
591 lgf++;
592 skip();
593 getname();
594 if(!iflg){
595 if(quiet){
596 ttys.sg_flags &= ~ECHO;
597 stty(0, &ttys);
598 prstrfl("\a"); /*bell*/
599 }else{
600 if(nextf[0]){
601 prstr(nextf);
602 prstr(":");
603 }else{
604 prstr("\a"); /*bell*/
605 }
606 }
607 }
608 collect();
609 tty++;
610 pushi((filep)-1);
611}
612rdtty(){
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}
629caseec(){
630 eschar = chget('\\');
631}
632caseeo(){
633 eschar = 0;
634}
635caseli(){
636
637 skip();
638 lit = max(inumb((int *)0),1);
639 litlev = frame;
640 if((dip == d) && (v.nl == -1))newline(1);
641}
642caseta(){
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}
663casene(){
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}
677casetr(){
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}
688casecu(){
689 cu++;
690 caseul();
691}
692caseul(){
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}
712caseuf(){
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}
724caseit(){
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}
736casemc(){
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}
748casemk(){
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}
759casesv(){
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}
768caseos(){
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}
779casenm(){
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}
794getnm(p,min)
795int *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}
805casenn(){
806 noscale++;
807 skip();
808 nn = max(atoi(),1);
809 noscale = 0;
810}
811caseab(){
812 dummy();
813 casetm(1);
814 done2(0);
815}