1*48307Sbostic /*-
2*48307Sbostic * %sccs.include.proprietary.c%
3*48307Sbostic */
4*48307Sbostic
59410Smckusick #ifndef lint
6*48307Sbostic static char sccsid[] = "@(#)t10.c 4.2 (Berkeley) 04/18/91";
7*48307Sbostic #endif /* not lint */
89410Smckusick
99410Smckusick #include "tdef.h"
109410Smckusick extern
119410Smckusick #include "d.h"
129410Smckusick extern
139410Smckusick #include "v.h"
149410Smckusick /*
159410Smckusick troff10.c
169410Smckusick
179410Smckusick CAT interface
189410Smckusick */
199410Smckusick
209410Smckusick extern int *olinep;
219410Smckusick extern int oline[];
229410Smckusick extern int *pslp;
239410Smckusick extern int back;
249410Smckusick extern int xpts;
259410Smckusick extern int mpts;
269410Smckusick extern int po;
279410Smckusick extern int xflg;
289410Smckusick extern int line[];
299410Smckusick extern int lss;
309410Smckusick extern int xbitf;
319410Smckusick extern char obuf[];
329410Smckusick extern char *obufp;
339410Smckusick extern int esct;
349410Smckusick extern int trflg;
359410Smckusick extern int cs;
369410Smckusick extern int smnt;
379410Smckusick extern int mfont;
389410Smckusick extern int xfont;
399410Smckusick extern int code;
409410Smckusick extern int mcase;
419410Smckusick extern int esc;
429410Smckusick extern int lead;
439410Smckusick extern int paper;
449410Smckusick extern int cps;
459410Smckusick extern int psflg;
469410Smckusick extern int ptid;
479410Smckusick extern int verm;
489410Smckusick extern int escm;
499410Smckusick extern char pstab[], psctab[];
509410Smckusick extern int dpn;
519410Smckusick extern int ascii;
529410Smckusick int mrail = 0; /*0=LR,1=UR*/
539410Smckusick int mmag = 1; /*0=UM,1=LM*/
549410Smckusick extern int nofeed;
559410Smckusick extern int gflag;
569410Smckusick extern int fontlab[];
579410Smckusick int papflg;
589410Smckusick extern int pfont;
599410Smckusick extern int ppts;
609410Smckusick extern int oldbits;
619410Smckusick extern int bd;
629410Smckusick extern int vflag;
639410Smckusick extern int stopmesg;
649410Smckusick extern int xxx;
659410Smckusick
ptinit()669410Smckusick ptinit(){
679410Smckusick
689410Smckusick if(ascii || gflag)return;
699410Smckusick oput(T_INIT);
709410Smckusick esc = T_IESC;
719410Smckusick ptesc();
729410Smckusick esct = 0;
739410Smckusick esc = po;
749410Smckusick oput(0140); /*some initial lead*/
759410Smckusick }
ptout(i)769410Smckusick ptout(i)
779410Smckusick int i;
789410Smckusick {
799410Smckusick register *k, lw, *j;
809410Smckusick int ds, de, inith, temp, *slp, dv;
819410Smckusick int psl[16];
829410Smckusick
839410Smckusick if((i & CMASK) != '\n'){
849410Smckusick *olinep++ = i;
859410Smckusick return;
869410Smckusick }
879410Smckusick if(olinep == oline){
889410Smckusick lead += lss;
899410Smckusick return;
909410Smckusick }
919410Smckusick pslp = psl;
929410Smckusick *pslp = lw = inith = dv = 0;
939410Smckusick for(k=oline; k<olinep; k++){
949410Smckusick trflg++;
959410Smckusick xbitf = 1;
969410Smckusick lw += width(*k);
979410Smckusick if((*k & (MOT | VMOT)) == (MOT | VMOT)){
989410Smckusick temp = *k & ~MOTV;
999410Smckusick if(*k & NMOT)temp = -temp;
1009410Smckusick dv += temp;
1019410Smckusick }
1029410Smckusick if(!(*k & MOT) && xflg)for(j=psl; j<=pslp; j++){
1039410Smckusick if(xpts == *j)break;
1049410Smckusick if(j == pslp){
1059410Smckusick *j = xpts;
1069410Smckusick *++pslp = 0;
1079410Smckusick break;
1089410Smckusick }
1099410Smckusick }
1109410Smckusick }
1119410Smckusick if(dv){
1129410Smckusick vflag++;
1139410Smckusick *olinep++ = makem(-dv);
1149410Smckusick vflag = 0;
1159410Smckusick }
1169410Smckusick if(xflg){
1179410Smckusick --pslp;
1189410Smckusick for(j=psl; j<=pslp; j++){
1199410Smckusick if(*j == mpts){
1209410Smckusick temp = *j;
1219410Smckusick *j = *pslp;
1229410Smckusick *pslp = temp;
1239410Smckusick break;
1249410Smckusick }
1259410Smckusick }
1269410Smckusick }
1279410Smckusick for(k=oline; k<olinep; k++){
1289410Smckusick if(!(*k & MOT) || (*k & VMOT))break;
1299410Smckusick *k &= ~MOT;
1309410Smckusick if(*k & NMOT){
1319410Smckusick *k &= ~NMOT;
1329410Smckusick *k = -*k;
1339410Smckusick }
1349410Smckusick inith += *k;
1359410Smckusick }
1369410Smckusick lead += dip->blss + lss;
1379410Smckusick dip->blss = 0;
1389410Smckusick slp = k;
1399410Smckusick scan:
1409410Smckusick temp = esct - po;
1419410Smckusick if(mpts & DBL)temp -= 55;
1429410Smckusick ds = temp - inith;
1439410Smckusick de = lw - temp;
1449410Smckusick if(de >= ds){
1459410Smckusick back = 0;
1469410Smckusick esc = -ds;
1479410Smckusick for(k=slp; k<olinep; k++)ptout0(*k);
1489410Smckusick }else{
1499410Smckusick back = 1;
1509410Smckusick esc = de;
1519410Smckusick for(k = olinep-1; k>=slp; --k)ptout0(*k);
1529410Smckusick }
1539410Smckusick if(xflg && (--pslp >= psl))goto scan;
1549410Smckusick olinep = oline;
1559410Smckusick lead += dip->alss;
1569410Smckusick dip->alss = 0;
1579410Smckusick }
ptout0(i)1589410Smckusick ptout0(i)
1599410Smckusick int i;
1609410Smckusick {
1619410Smckusick register j, k, w;
1629410Smckusick int z;
1639410Smckusick
1649410Smckusick if(i & MOT){
1659410Smckusick j = i & ~MOTV;
1669410Smckusick if(i & NMOT)j = -j;
1679410Smckusick if(back)j = -j;
1689410Smckusick if(i & VMOT)lead += j;
1699410Smckusick else esc += j;
1709410Smckusick return;
1719410Smckusick }
1729410Smckusick xbitf = 2;
1739410Smckusick if((i>>BYTE) == oldbits){
1749410Smckusick xfont = pfont;
1759410Smckusick xpts = ppts;
1769410Smckusick xbitf = 0;
1779410Smckusick }else xbits(i);
1789410Smckusick if((k = (i & CMASK)) < 040){
1799410Smckusick return;
1809410Smckusick }
1819410Smckusick w = getcw(k-32);
1829410Smckusick if(cs){
1839410Smckusick if(bd)w += bd - 1;
1849410Smckusick j = (cs-w)/2;
1859410Smckusick w = cs - j;
1869410Smckusick if(bd)w -= bd - 1;
1879410Smckusick }else j = 0;
1889410Smckusick if(i & ZBIT){
1899410Smckusick if(cs)w = -j; else w = 0;
1909410Smckusick z = 1;
1919410Smckusick }else z = 0;
1929410Smckusick if(back){
1939410Smckusick k = j;
1949410Smckusick j = -w;
1959410Smckusick w = -k;
1969410Smckusick }
1979410Smckusick esc += j;
1989410Smckusick if((!xflg || (xpts == *pslp)) && (code & 077)){
1999410Smckusick if(code & 0200){
2009410Smckusick if(smnt)xfont = smnt -1;
2019410Smckusick else goto p1;
2029410Smckusick }
2039410Smckusick if((k=(code>>6)&01)^mcase)oput((mcase=k)+0105);
2049410Smckusick if(xfont != mfont){
2059410Smckusick mfont = xfont;
2069410Smckusick if(mrail != (xfont&01))
2079410Smckusick oput(0101 + (mrail=xfont&01));
2089410Smckusick if(mmag != (xfont<2))
2099410Smckusick oput(0103 + (mmag=(xfont<2)));
2109410Smckusick }
2119410Smckusick if(xpts != mpts)ptps();
2129410Smckusick if(lead)ptlead();
2139410Smckusick if(esc)ptesc();
2149410Smckusick /*
2159410Smckusick oput(code & 077);
2169410Smckusick */
2179410Smckusick *obufp++ = code & 077;
2189410Smckusick if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
2199410Smckusick if(bd){
2209410Smckusick bd -= 1;
2219410Smckusick if(back && !z)bd = -bd;
2229410Smckusick if(esc += bd)ptesc();
2239410Smckusick oput(code & 077);
2249410Smckusick if(z)esc -= bd;
2259410Smckusick }
2269410Smckusick }else if(bd && !z){
2279410Smckusick bd -= 1;
2289410Smckusick if(back)bd = -bd;
2299410Smckusick esc += bd;
2309410Smckusick }
2319410Smckusick p1:
2329410Smckusick esc += w;
2339410Smckusick return;
2349410Smckusick }
ptps()2359410Smckusick ptps(){
2369410Smckusick register i, j, k;
2379410Smckusick
2389410Smckusick if(psflg)return;
2399410Smckusick if(cps){
2409410Smckusick psflg++;
2419410Smckusick i = findps(cps);
2429410Smckusick }else i = xpts;
2439410Smckusick for(j=0; (i&077) > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
2449410Smckusick j = psctab[j];
2459410Smckusick oput((j & ~0200) | 0120);
2469410Smckusick if((!(mpts & DBL))^(!(j & 0200))){
2479410Smckusick if(j & 0200)k = 55;
2489410Smckusick else k = -55;
2499410Smckusick esc += k;
2509410Smckusick }
2519410Smckusick mpts = i;
2529410Smckusick }
ptlead()2539410Smckusick ptlead(){
2549410Smckusick register i, k;
2559410Smckusick
2569410Smckusick if(k = lead < 0)lead = -lead;
2579410Smckusick if(k^verm)oput(0112 + ((verm=k)<<1));
2589410Smckusick if(((k=lead)%3) == 2)k++;
2599410Smckusick k /= 3;
2609410Smckusick while(k > 0){
2619410Smckusick if((i=31) > k)i = k;
2629410Smckusick if(verm)paper -= i;
2639410Smckusick else paper += i;
2649410Smckusick oput(((~i) & 037) | 0140);
2659410Smckusick if((paper > (11*144*15)) && !papflg && ptid != 1){
2669410Smckusick prstr("Excessive paper use.\n");
2679410Smckusick papflg++;
2689410Smckusick if(ptid != 1){
2699410Smckusick lead = 0;
2709410Smckusick done2(0200);
2719410Smckusick }
2729410Smckusick }
2739410Smckusick k -= i;
2749410Smckusick }
2759410Smckusick lead = 0;
2769410Smckusick }
ptesc()2779410Smckusick ptesc(){
2789410Smckusick register i, j, k;
2799410Smckusick
2809410Smckusick if(k = esc < 0)esc = -esc;
2819410Smckusick if(k^escm)oput(0107 + (escm=k));
2829410Smckusick k = esc;
2839410Smckusick while(k > 0){
2849410Smckusick if((i=127) > k)i = k;
2859410Smckusick if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) ||
2869410Smckusick (j < 0))break;
2879410Smckusick /*
2889410Smckusick oput(~i);
2899410Smckusick */
2909410Smckusick *obufp++ = ~i;
2919410Smckusick if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
2929410Smckusick esct = j;
2939410Smckusick k -= i;
2949410Smckusick }
2959410Smckusick esc = 0;
2969410Smckusick }
dostop()2979410Smckusick dostop(){
2989410Smckusick register i;
2999410Smckusick
3009410Smckusick if(ascii)return;
3019410Smckusick if(!nofeed && !gflag)lead += TRAILER;
3029410Smckusick ptlead();
3039410Smckusick flusho();
3049410Smckusick oput(T_INIT);
3059410Smckusick oput(T_STOP);
3069410Smckusick if(gflag){
3079410Smckusick oput('f');
3089410Smckusick for(i=0; i<4; i++){
3099410Smckusick oput(fontlab[i] & BMASK);
3109410Smckusick oput((fontlab[i]>>BYTE) & BMASK);
3119410Smckusick }
3129410Smckusick }else for(i=8; i>0; i--)oput(T_PAD);
3139410Smckusick flusho();
3149410Smckusick if(stopmesg)prstr("Pages finished.\n");
3159410Smckusick mcase = mpts = mfont = mrail = verm = escm = 0;
3169410Smckusick mmag = 1;
3179410Smckusick report();
3189410Smckusick paper = 0;
3199410Smckusick esc = T_IESC;
3209410Smckusick ptesc();
3219410Smckusick esct = 0;
3229410Smckusick esc = po;
3239410Smckusick }
324