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