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