|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)t10.c 4.1 (Berkeley) 82/12/03"; ! 3: #endif ! 4: ! 5: #include "tdef.h" ! 6: extern ! 7: #include "d.h" ! 8: extern ! 9: #include "v.h" ! 10: /* ! 11: troff10.c ! 12: ! 13: CAT interface ! 14: */ ! 15: ! 16: extern int *olinep; ! 17: extern int oline[]; ! 18: extern int *pslp; ! 19: extern int back; ! 20: extern int xpts; ! 21: extern int mpts; ! 22: extern int po; ! 23: extern int xflg; ! 24: extern int line[]; ! 25: extern int lss; ! 26: extern int xbitf; ! 27: extern char obuf[]; ! 28: extern char *obufp; ! 29: extern int esct; ! 30: extern int trflg; ! 31: extern int cs; ! 32: extern int smnt; ! 33: extern int mfont; ! 34: extern int xfont; ! 35: extern int code; ! 36: extern int mcase; ! 37: extern int esc; ! 38: extern int lead; ! 39: extern int paper; ! 40: extern int cps; ! 41: extern int psflg; ! 42: extern int ptid; ! 43: extern int verm; ! 44: extern int escm; ! 45: extern char pstab[], psctab[]; ! 46: extern int dpn; ! 47: extern int ascii; ! 48: int mrail = 0; /*0=LR,1=UR*/ ! 49: int mmag = 1; /*0=UM,1=LM*/ ! 50: extern int nofeed; ! 51: extern int gflag; ! 52: extern int fontlab[]; ! 53: int papflg; ! 54: extern int pfont; ! 55: extern int ppts; ! 56: extern int oldbits; ! 57: extern int bd; ! 58: extern int vflag; ! 59: extern int stopmesg; ! 60: extern int xxx; ! 61: ! 62: ptinit(){ ! 63: ! 64: if(ascii || gflag)return; ! 65: oput(T_INIT); ! 66: esc = T_IESC; ! 67: ptesc(); ! 68: esct = 0; ! 69: esc = po; ! 70: oput(0140); /*some initial lead*/ ! 71: } ! 72: ptout(i) ! 73: int i; ! 74: { ! 75: register *k, lw, *j; ! 76: int ds, de, inith, temp, *slp, dv; ! 77: int psl[16]; ! 78: ! 79: if((i & CMASK) != '\n'){ ! 80: *olinep++ = i; ! 81: return; ! 82: } ! 83: if(olinep == oline){ ! 84: lead += lss; ! 85: return; ! 86: } ! 87: pslp = psl; ! 88: *pslp = lw = inith = dv = 0; ! 89: for(k=oline; k<olinep; k++){ ! 90: trflg++; ! 91: xbitf = 1; ! 92: lw += width(*k); ! 93: if((*k & (MOT | VMOT)) == (MOT | VMOT)){ ! 94: temp = *k & ~MOTV; ! 95: if(*k & NMOT)temp = -temp; ! 96: dv += temp; ! 97: } ! 98: if(!(*k & MOT) && xflg)for(j=psl; j<=pslp; j++){ ! 99: if(xpts == *j)break; ! 100: if(j == pslp){ ! 101: *j = xpts; ! 102: *++pslp = 0; ! 103: break; ! 104: } ! 105: } ! 106: } ! 107: if(dv){ ! 108: vflag++; ! 109: *olinep++ = makem(-dv); ! 110: vflag = 0; ! 111: } ! 112: if(xflg){ ! 113: --pslp; ! 114: for(j=psl; j<=pslp; j++){ ! 115: if(*j == mpts){ ! 116: temp = *j; ! 117: *j = *pslp; ! 118: *pslp = temp; ! 119: break; ! 120: } ! 121: } ! 122: } ! 123: for(k=oline; k<olinep; k++){ ! 124: if(!(*k & MOT) || (*k & VMOT))break; ! 125: *k &= ~MOT; ! 126: if(*k & NMOT){ ! 127: *k &= ~NMOT; ! 128: *k = -*k; ! 129: } ! 130: inith += *k; ! 131: } ! 132: lead += dip->blss + lss; ! 133: dip->blss = 0; ! 134: slp = k; ! 135: scan: ! 136: temp = esct - po; ! 137: if(mpts & DBL)temp -= 55; ! 138: ds = temp - inith; ! 139: de = lw - temp; ! 140: if(de >= ds){ ! 141: back = 0; ! 142: esc = -ds; ! 143: for(k=slp; k<olinep; k++)ptout0(*k); ! 144: }else{ ! 145: back = 1; ! 146: esc = de; ! 147: for(k = olinep-1; k>=slp; --k)ptout0(*k); ! 148: } ! 149: if(xflg && (--pslp >= psl))goto scan; ! 150: olinep = oline; ! 151: lead += dip->alss; ! 152: dip->alss = 0; ! 153: } ! 154: ptout0(i) ! 155: int i; ! 156: { ! 157: register j, k, w; ! 158: int z; ! 159: ! 160: if(i & MOT){ ! 161: j = i & ~MOTV; ! 162: if(i & NMOT)j = -j; ! 163: if(back)j = -j; ! 164: if(i & VMOT)lead += j; ! 165: else esc += j; ! 166: return; ! 167: } ! 168: xbitf = 2; ! 169: if((i>>BYTE) == oldbits){ ! 170: xfont = pfont; ! 171: xpts = ppts; ! 172: xbitf = 0; ! 173: }else xbits(i); ! 174: if((k = (i & CMASK)) < 040){ ! 175: return; ! 176: } ! 177: w = getcw(k-32); ! 178: if(cs){ ! 179: if(bd)w += bd - 1; ! 180: j = (cs-w)/2; ! 181: w = cs - j; ! 182: if(bd)w -= bd - 1; ! 183: }else j = 0; ! 184: if(i & ZBIT){ ! 185: if(cs)w = -j; else w = 0; ! 186: z = 1; ! 187: }else z = 0; ! 188: if(back){ ! 189: k = j; ! 190: j = -w; ! 191: w = -k; ! 192: } ! 193: esc += j; ! 194: if((!xflg || (xpts == *pslp)) && (code & 077)){ ! 195: if(code & 0200){ ! 196: if(smnt)xfont = smnt -1; ! 197: else goto p1; ! 198: } ! 199: if((k=(code>>6)&01)^mcase)oput((mcase=k)+0105); ! 200: if(xfont != mfont){ ! 201: mfont = xfont; ! 202: if(mrail != (xfont&01)) ! 203: oput(0101 + (mrail=xfont&01)); ! 204: if(mmag != (xfont<2)) ! 205: oput(0103 + (mmag=(xfont<2))); ! 206: } ! 207: if(xpts != mpts)ptps(); ! 208: if(lead)ptlead(); ! 209: if(esc)ptesc(); ! 210: /* ! 211: oput(code & 077); ! 212: */ ! 213: *obufp++ = code & 077; ! 214: if(obufp == (obuf + OBUFSZ + ascii - 1))flusho(); ! 215: if(bd){ ! 216: bd -= 1; ! 217: if(back && !z)bd = -bd; ! 218: if(esc += bd)ptesc(); ! 219: oput(code & 077); ! 220: if(z)esc -= bd; ! 221: } ! 222: }else if(bd && !z){ ! 223: bd -= 1; ! 224: if(back)bd = -bd; ! 225: esc += bd; ! 226: } ! 227: p1: ! 228: esc += w; ! 229: return; ! 230: } ! 231: ptps(){ ! 232: register i, j, k; ! 233: ! 234: if(psflg)return; ! 235: if(cps){ ! 236: psflg++; ! 237: i = findps(cps); ! 238: }else i = xpts; ! 239: for(j=0; (i&077) > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;} ! 240: j = psctab[j]; ! 241: oput((j & ~0200) | 0120); ! 242: if((!(mpts & DBL))^(!(j & 0200))){ ! 243: if(j & 0200)k = 55; ! 244: else k = -55; ! 245: esc += k; ! 246: } ! 247: mpts = i; ! 248: } ! 249: ptlead(){ ! 250: register i, k; ! 251: ! 252: if(k = lead < 0)lead = -lead; ! 253: if(k^verm)oput(0112 + ((verm=k)<<1)); ! 254: if(((k=lead)%3) == 2)k++; ! 255: k /= 3; ! 256: while(k > 0){ ! 257: if((i=31) > k)i = k; ! 258: if(verm)paper -= i; ! 259: else paper += i; ! 260: oput(((~i) & 037) | 0140); ! 261: if((paper > (11*144*15)) && !papflg && ptid != 1){ ! 262: prstr("Excessive paper use.\n"); ! 263: papflg++; ! 264: if(ptid != 1){ ! 265: lead = 0; ! 266: done2(0200); ! 267: } ! 268: } ! 269: k -= i; ! 270: } ! 271: lead = 0; ! 272: } ! 273: ptesc(){ ! 274: register i, j, k; ! 275: ! 276: if(k = esc < 0)esc = -esc; ! 277: if(k^escm)oput(0107 + (escm=k)); ! 278: k = esc; ! 279: while(k > 0){ ! 280: if((i=127) > k)i = k; ! 281: if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) || ! 282: (j < 0))break; ! 283: /* ! 284: oput(~i); ! 285: */ ! 286: *obufp++ = ~i; ! 287: if(obufp == (obuf + OBUFSZ + ascii - 1))flusho(); ! 288: esct = j; ! 289: k -= i; ! 290: } ! 291: esc = 0; ! 292: } ! 293: dostop(){ ! 294: register i; ! 295: ! 296: if(ascii)return; ! 297: if(!nofeed && !gflag)lead += TRAILER; ! 298: ptlead(); ! 299: flusho(); ! 300: oput(T_INIT); ! 301: oput(T_STOP); ! 302: if(gflag){ ! 303: oput('f'); ! 304: for(i=0; i<4; i++){ ! 305: oput(fontlab[i] & BMASK); ! 306: oput((fontlab[i]>>BYTE) & BMASK); ! 307: } ! 308: }else for(i=8; i>0; i--)oput(T_PAD); ! 309: flusho(); ! 310: if(stopmesg)prstr("Pages finished.\n"); ! 311: mcase = mpts = mfont = mrail = verm = escm = 0; ! 312: mmag = 1; ! 313: report(); ! 314: paper = 0; ! 315: esc = T_IESC; ! 316: ptesc(); ! 317: esct = 0; ! 318: esc = po; ! 319: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.