|
|
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.