1*836b5e86Sbostic /*-
2*836b5e86Sbostic * %sccs.include.proprietary.c%
3*836b5e86Sbostic */
4*836b5e86Sbostic
548aa087fSmckusick #ifndef lint
6*836b5e86Sbostic static char sccsid[] = "@(#)t10.c 4.2 (Berkeley) 04/18/91";
7*836b5e86Sbostic #endif /* not lint */
848aa087fSmckusick
948aa087fSmckusick #include "tdef.h"
1048aa087fSmckusick extern
1148aa087fSmckusick #include "d.h"
1248aa087fSmckusick extern
1348aa087fSmckusick #include "v.h"
1448aa087fSmckusick /*
1548aa087fSmckusick troff10.c
1648aa087fSmckusick
1748aa087fSmckusick CAT interface
1848aa087fSmckusick */
1948aa087fSmckusick
2048aa087fSmckusick extern int *olinep;
2148aa087fSmckusick extern int oline[];
2248aa087fSmckusick extern int *pslp;
2348aa087fSmckusick extern int back;
2448aa087fSmckusick extern int xpts;
2548aa087fSmckusick extern int mpts;
2648aa087fSmckusick extern int po;
2748aa087fSmckusick extern int xflg;
2848aa087fSmckusick extern int line[];
2948aa087fSmckusick extern int lss;
3048aa087fSmckusick extern int xbitf;
3148aa087fSmckusick extern char obuf[];
3248aa087fSmckusick extern char *obufp;
3348aa087fSmckusick extern int esct;
3448aa087fSmckusick extern int trflg;
3548aa087fSmckusick extern int cs;
3648aa087fSmckusick extern int smnt;
3748aa087fSmckusick extern int mfont;
3848aa087fSmckusick extern int xfont;
3948aa087fSmckusick extern int code;
4048aa087fSmckusick extern int mcase;
4148aa087fSmckusick extern int esc;
4248aa087fSmckusick extern int lead;
4348aa087fSmckusick extern int paper;
4448aa087fSmckusick extern int cps;
4548aa087fSmckusick extern int psflg;
4648aa087fSmckusick extern int ptid;
4748aa087fSmckusick extern int verm;
4848aa087fSmckusick extern int escm;
4948aa087fSmckusick extern char pstab[], psctab[];
5048aa087fSmckusick extern int dpn;
5148aa087fSmckusick extern int ascii;
5248aa087fSmckusick int mrail = 0; /*0=LR,1=UR*/
5348aa087fSmckusick int mmag = 1; /*0=UM,1=LM*/
5448aa087fSmckusick extern int nofeed;
5548aa087fSmckusick extern int gflag;
5648aa087fSmckusick extern int fontlab[];
5748aa087fSmckusick int papflg;
5848aa087fSmckusick extern int pfont;
5948aa087fSmckusick extern int ppts;
6048aa087fSmckusick extern int oldbits;
6148aa087fSmckusick extern int bd;
6248aa087fSmckusick extern int vflag;
6348aa087fSmckusick extern int stopmesg;
6448aa087fSmckusick extern int xxx;
6548aa087fSmckusick
ptinit()6648aa087fSmckusick ptinit(){
6748aa087fSmckusick
6848aa087fSmckusick if(ascii || gflag)return;
6948aa087fSmckusick oput(T_INIT);
7048aa087fSmckusick esc = T_IESC;
7148aa087fSmckusick ptesc();
7248aa087fSmckusick esct = 0;
7348aa087fSmckusick esc = po;
7448aa087fSmckusick oput(0140); /*some initial lead*/
7548aa087fSmckusick }
ptout(i)7648aa087fSmckusick ptout(i)
7748aa087fSmckusick int i;
7848aa087fSmckusick {
7948aa087fSmckusick register *k, lw, *j;
8048aa087fSmckusick int ds, de, inith, temp, *slp, dv;
8148aa087fSmckusick int psl[16];
8248aa087fSmckusick
8348aa087fSmckusick if((i & CMASK) != '\n'){
8448aa087fSmckusick *olinep++ = i;
8548aa087fSmckusick return;
8648aa087fSmckusick }
8748aa087fSmckusick if(olinep == oline){
8848aa087fSmckusick lead += lss;
8948aa087fSmckusick return;
9048aa087fSmckusick }
9148aa087fSmckusick pslp = psl;
9248aa087fSmckusick *pslp = lw = inith = dv = 0;
9348aa087fSmckusick for(k=oline; k<olinep; k++){
9448aa087fSmckusick trflg++;
9548aa087fSmckusick xbitf = 1;
9648aa087fSmckusick lw += width(*k);
9748aa087fSmckusick if((*k & (MOT | VMOT)) == (MOT | VMOT)){
9848aa087fSmckusick temp = *k & ~MOTV;
9948aa087fSmckusick if(*k & NMOT)temp = -temp;
10048aa087fSmckusick dv += temp;
10148aa087fSmckusick }
10248aa087fSmckusick if(!(*k & MOT) && xflg)for(j=psl; j<=pslp; j++){
10348aa087fSmckusick if(xpts == *j)break;
10448aa087fSmckusick if(j == pslp){
10548aa087fSmckusick *j = xpts;
10648aa087fSmckusick *++pslp = 0;
10748aa087fSmckusick break;
10848aa087fSmckusick }
10948aa087fSmckusick }
11048aa087fSmckusick }
11148aa087fSmckusick if(dv){
11248aa087fSmckusick vflag++;
11348aa087fSmckusick *olinep++ = makem(-dv);
11448aa087fSmckusick vflag = 0;
11548aa087fSmckusick }
11648aa087fSmckusick if(xflg){
11748aa087fSmckusick --pslp;
11848aa087fSmckusick for(j=psl; j<=pslp; j++){
11948aa087fSmckusick if(*j == mpts){
12048aa087fSmckusick temp = *j;
12148aa087fSmckusick *j = *pslp;
12248aa087fSmckusick *pslp = temp;
12348aa087fSmckusick break;
12448aa087fSmckusick }
12548aa087fSmckusick }
12648aa087fSmckusick }
12748aa087fSmckusick for(k=oline; k<olinep; k++){
12848aa087fSmckusick if(!(*k & MOT) || (*k & VMOT))break;
12948aa087fSmckusick *k &= ~MOT;
13048aa087fSmckusick if(*k & NMOT){
13148aa087fSmckusick *k &= ~NMOT;
13248aa087fSmckusick *k = -*k;
13348aa087fSmckusick }
13448aa087fSmckusick inith += *k;
13548aa087fSmckusick }
13648aa087fSmckusick lead += dip->blss + lss;
13748aa087fSmckusick dip->blss = 0;
13848aa087fSmckusick slp = k;
13948aa087fSmckusick scan:
14048aa087fSmckusick temp = esct - po;
14148aa087fSmckusick if(mpts & DBL)temp -= 55;
14248aa087fSmckusick ds = temp - inith;
14348aa087fSmckusick de = lw - temp;
14448aa087fSmckusick if(de >= ds){
14548aa087fSmckusick back = 0;
14648aa087fSmckusick esc = -ds;
14748aa087fSmckusick for(k=slp; k<olinep; k++)ptout0(*k);
14848aa087fSmckusick }else{
14948aa087fSmckusick back = 1;
15048aa087fSmckusick esc = de;
15148aa087fSmckusick for(k = olinep-1; k>=slp; --k)ptout0(*k);
15248aa087fSmckusick }
15348aa087fSmckusick if(xflg && (--pslp >= psl))goto scan;
15448aa087fSmckusick olinep = oline;
15548aa087fSmckusick lead += dip->alss;
15648aa087fSmckusick dip->alss = 0;
15748aa087fSmckusick }
ptout0(i)15848aa087fSmckusick ptout0(i)
15948aa087fSmckusick int i;
16048aa087fSmckusick {
16148aa087fSmckusick register j, k, w;
16248aa087fSmckusick int z;
16348aa087fSmckusick
16448aa087fSmckusick if(i & MOT){
16548aa087fSmckusick j = i & ~MOTV;
16648aa087fSmckusick if(i & NMOT)j = -j;
16748aa087fSmckusick if(back)j = -j;
16848aa087fSmckusick if(i & VMOT)lead += j;
16948aa087fSmckusick else esc += j;
17048aa087fSmckusick return;
17148aa087fSmckusick }
17248aa087fSmckusick xbitf = 2;
17348aa087fSmckusick if((i>>BYTE) == oldbits){
17448aa087fSmckusick xfont = pfont;
17548aa087fSmckusick xpts = ppts;
17648aa087fSmckusick xbitf = 0;
17748aa087fSmckusick }else xbits(i);
17848aa087fSmckusick if((k = (i & CMASK)) < 040){
17948aa087fSmckusick return;
18048aa087fSmckusick }
18148aa087fSmckusick w = getcw(k-32);
18248aa087fSmckusick if(cs){
18348aa087fSmckusick if(bd)w += bd - 1;
18448aa087fSmckusick j = (cs-w)/2;
18548aa087fSmckusick w = cs - j;
18648aa087fSmckusick if(bd)w -= bd - 1;
18748aa087fSmckusick }else j = 0;
18848aa087fSmckusick if(i & ZBIT){
18948aa087fSmckusick if(cs)w = -j; else w = 0;
19048aa087fSmckusick z = 1;
19148aa087fSmckusick }else z = 0;
19248aa087fSmckusick if(back){
19348aa087fSmckusick k = j;
19448aa087fSmckusick j = -w;
19548aa087fSmckusick w = -k;
19648aa087fSmckusick }
19748aa087fSmckusick esc += j;
19848aa087fSmckusick if((!xflg || (xpts == *pslp)) && (code & 077)){
19948aa087fSmckusick if(code & 0200){
20048aa087fSmckusick if(smnt)xfont = smnt -1;
20148aa087fSmckusick else goto p1;
20248aa087fSmckusick }
20348aa087fSmckusick if((k=(code>>6)&01)^mcase)oput((mcase=k)+0105);
20448aa087fSmckusick if(xfont != mfont){
20548aa087fSmckusick mfont = xfont;
20648aa087fSmckusick if(mrail != (xfont&01))
20748aa087fSmckusick oput(0101 + (mrail=xfont&01));
20848aa087fSmckusick if(mmag != (xfont<2))
20948aa087fSmckusick oput(0103 + (mmag=(xfont<2)));
21048aa087fSmckusick }
21148aa087fSmckusick if(xpts != mpts)ptps();
21248aa087fSmckusick if(lead)ptlead();
21348aa087fSmckusick if(esc)ptesc();
21448aa087fSmckusick /*
21548aa087fSmckusick oput(code & 077);
21648aa087fSmckusick */
21748aa087fSmckusick *obufp++ = code & 077;
21848aa087fSmckusick if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
21948aa087fSmckusick if(bd){
22048aa087fSmckusick bd -= 1;
22148aa087fSmckusick if(back && !z)bd = -bd;
22248aa087fSmckusick if(esc += bd)ptesc();
22348aa087fSmckusick oput(code & 077);
22448aa087fSmckusick if(z)esc -= bd;
22548aa087fSmckusick }
22648aa087fSmckusick }else if(bd && !z){
22748aa087fSmckusick bd -= 1;
22848aa087fSmckusick if(back)bd = -bd;
22948aa087fSmckusick esc += bd;
23048aa087fSmckusick }
23148aa087fSmckusick p1:
23248aa087fSmckusick esc += w;
23348aa087fSmckusick return;
23448aa087fSmckusick }
ptps()23548aa087fSmckusick ptps(){
23648aa087fSmckusick register i, j, k;
23748aa087fSmckusick
23848aa087fSmckusick if(psflg)return;
23948aa087fSmckusick if(cps){
24048aa087fSmckusick psflg++;
24148aa087fSmckusick i = findps(cps);
24248aa087fSmckusick }else i = xpts;
24348aa087fSmckusick for(j=0; (i&077) > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
24448aa087fSmckusick j = psctab[j];
24548aa087fSmckusick oput((j & ~0200) | 0120);
24648aa087fSmckusick if((!(mpts & DBL))^(!(j & 0200))){
24748aa087fSmckusick if(j & 0200)k = 55;
24848aa087fSmckusick else k = -55;
24948aa087fSmckusick esc += k;
25048aa087fSmckusick }
25148aa087fSmckusick mpts = i;
25248aa087fSmckusick }
ptlead()25348aa087fSmckusick ptlead(){
25448aa087fSmckusick register i, k;
25548aa087fSmckusick
25648aa087fSmckusick if(k = lead < 0)lead = -lead;
25748aa087fSmckusick if(k^verm)oput(0112 + ((verm=k)<<1));
25848aa087fSmckusick if(((k=lead)%3) == 2)k++;
25948aa087fSmckusick k /= 3;
26048aa087fSmckusick while(k > 0){
26148aa087fSmckusick if((i=31) > k)i = k;
26248aa087fSmckusick if(verm)paper -= i;
26348aa087fSmckusick else paper += i;
26448aa087fSmckusick oput(((~i) & 037) | 0140);
26548aa087fSmckusick if((paper > (11*144*15)) && !papflg && ptid != 1){
26648aa087fSmckusick prstr("Excessive paper use.\n");
26748aa087fSmckusick papflg++;
26848aa087fSmckusick if(ptid != 1){
26948aa087fSmckusick lead = 0;
27048aa087fSmckusick done2(0200);
27148aa087fSmckusick }
27248aa087fSmckusick }
27348aa087fSmckusick k -= i;
27448aa087fSmckusick }
27548aa087fSmckusick lead = 0;
27648aa087fSmckusick }
ptesc()27748aa087fSmckusick ptesc(){
27848aa087fSmckusick register i, j, k;
27948aa087fSmckusick
28048aa087fSmckusick if(k = esc < 0)esc = -esc;
28148aa087fSmckusick if(k^escm)oput(0107 + (escm=k));
28248aa087fSmckusick k = esc;
28348aa087fSmckusick while(k > 0){
28448aa087fSmckusick if((i=127) > k)i = k;
28548aa087fSmckusick if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) ||
28648aa087fSmckusick (j < 0))break;
28748aa087fSmckusick /*
28848aa087fSmckusick oput(~i);
28948aa087fSmckusick */
29048aa087fSmckusick *obufp++ = ~i;
29148aa087fSmckusick if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
29248aa087fSmckusick esct = j;
29348aa087fSmckusick k -= i;
29448aa087fSmckusick }
29548aa087fSmckusick esc = 0;
29648aa087fSmckusick }
dostop()29748aa087fSmckusick dostop(){
29848aa087fSmckusick register i;
29948aa087fSmckusick
30048aa087fSmckusick if(ascii)return;
30148aa087fSmckusick if(!nofeed && !gflag)lead += TRAILER;
30248aa087fSmckusick ptlead();
30348aa087fSmckusick flusho();
30448aa087fSmckusick oput(T_INIT);
30548aa087fSmckusick oput(T_STOP);
30648aa087fSmckusick if(gflag){
30748aa087fSmckusick oput('f');
30848aa087fSmckusick for(i=0; i<4; i++){
30948aa087fSmckusick oput(fontlab[i] & BMASK);
31048aa087fSmckusick oput((fontlab[i]>>BYTE) & BMASK);
31148aa087fSmckusick }
31248aa087fSmckusick }else for(i=8; i>0; i--)oput(T_PAD);
31348aa087fSmckusick flusho();
31448aa087fSmckusick if(stopmesg)prstr("Pages finished.\n");
31548aa087fSmckusick mcase = mpts = mfont = mrail = verm = escm = 0;
31648aa087fSmckusick mmag = 1;
31748aa087fSmckusick report();
31848aa087fSmckusick paper = 0;
31948aa087fSmckusick esc = T_IESC;
32048aa087fSmckusick ptesc();
32148aa087fSmckusick esct = 0;
32248aa087fSmckusick esc = po;
32348aa087fSmckusick }
324