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