1 #include "tdef.h"
2 extern
3 #include "d.h"
4 extern
5 #include "v.h"
6 #ifdef NROFF
7 extern
8 #include "tw.h"
9 #endif
10 
11 /*
12 troff6.c
13 
14 width functions, sizes and fonts
15 */
16 
17 extern int eschar;
18 extern int widthp;
19 extern int ohc;
20 extern int xfont;
21 extern int setwdf;
22 extern char trtab[];
23 extern int chbits;
24 extern int nonumb;
25 extern int noscale;
26 extern int font;
27 extern int font1;
28 extern int pts;
29 extern int sps;
30 extern int nlflg;
31 extern int nform;
32 extern int dfact;
33 extern int dfactd;
34 extern int lss;
35 extern int lss1;
36 extern int vflag;
37 extern int ch0;
38 extern int level;
39 extern int ch;
40 extern int res;
41 extern int xxx;
42 int fontlab[] = {'R','I','B','S',0};
43 
44 width(c)
45 int c;
46 {
47 	register i,j,k;
48 
49 	j = c;
50 	k = 0;
51 	if(j & MOT){
52 		if(j & VMOT)goto rtn;
53 		k = j & ~MOTV;
54 		if(j & NMOT)k = -k;
55 		goto rtn;
56 	}
57 	if((i = (j & CMASK)) == '\b'){
58 		k = -widthp;
59 		goto rtn;
60 	}
61 	if(i == PRESC)i = eschar;
62 	if((i == ohc) ||
63 	   (i >= 0370))goto rtn;
64 	if(j & ZBIT)goto rtn;
65 	i = trtab[i] & BMASK;
66 	if(i < 040)goto rtn;
67 	k = (*(t.codetab[i-32]) & 0177) * t.Char;
68 	widthp = k;
69 rtn:
70 	return(k);
71 }
72 setch(){
73 	register i,*j,k;
74 	extern int chtab[];
75 
76 	if((i = getrq()) == 0)return(0);
77 	for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0);
78 	k = *(++j) | chbits;
79 	return(k);
80 }
81 find(i,j)
82 int i,j[];
83 {
84 	register k;
85 
86 	if(((k = i-'0') >= 1) && (k <= 4))return(--k);
87 	for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1);
88 	return(k);
89 }
90 mchbits(){
91 	chbits = (((pts)<<2) | font) << (BYTE + 1);
92 	sps = width(' ' | chbits);
93 }
94 setps(){
95 	register i,j;
96 
97 	if((((i=getch() & CMASK) == '+')  || (i == '-')) &&
98 	  (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){
99 		ch = 0;
100 		return;
101 	}
102 	if((i -= '0') == 0){
103 		return;
104 	}
105 	if((i > 0) && (i <= 9)){
106 		if((i <= 3) &&
107 		  ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){
108 			i = 10*i +j;
109 			ch = 0;
110 		}
111 	}
112 }
113 caseft(){
114 	skip();
115 	setfont(1);
116 }
117 setfont(a)
118 int a;
119 {
120 	register i,j;
121 
122 	if(a)i = getrq();
123 		else i = getsn();
124 	if(!i || (i == 'P')){
125 		j = font1;
126 		goto s0;
127 	}
128 	if(i == 'S')return;
129 	if((j = find(i,fontlab))  == -1)return;
130 s0:
131 	font1 = font;
132 	font = j;
133 	mchbits();
134 }
135 setwd(){
136 	register i, base, wid;
137 	int delim, em, k;
138 	int savlevel, savhp, savfont, savfont1;
139 
140 	base = v.st = v.sb = wid = v.ct = 0;
141 	if((delim = getch() & CMASK) & MOT)return;
142 	savhp = v.hp;
143 	savlevel = level;
144 	v.hp = level = 0;
145 	savfont = font;
146 	savfont1 = font1;
147 	setwdf++;
148 	while((((i = getch()) & CMASK) != delim) && !nlflg){
149 		wid += width(i);
150 		if(!(i & MOT)){
151 			em = 2*t.Halfline;
152 		}else if(i & VMOT){
153 			k = i & ~MOTV;
154 			if(i & NMOT)k = -k;
155 			base -= k;
156 			em = 0;
157 		}else continue;
158 		if(base < v.sb)v.sb = base;
159 		if((k=base + em) > v.st)v.st = k;
160 	}
161 	nform = 0;
162 	setn1(wid);
163 	v.hp = savhp;
164 	level = savlevel;
165 	font = savfont;
166 	font1 = savfont1;
167 	mchbits();
168 	setwdf = 0;
169 }
170 vmot(){
171 	dfact = lss;
172 	vflag++;
173 	return(mot());
174 }
175 hmot(){
176 	dfact = EM;
177 	return(mot());
178 }
179 mot(){
180 	register i, j;
181 
182 	j = HOR;
183 	getch(); /*eat delim*/
184 	if(i = atoi()){
185 		if(vflag)j = VERT;
186 		i = makem(quant(i,j));
187 	}
188 	getch();
189 	vflag = 0;
190 	dfact = 1;
191 	return(i);
192 }
193 sethl(k)
194 int k;
195 {
196 	register i;
197 
198 	i = t.Halfline;
199 	if(k == 'u')i = -i;
200 	else if(k == 'r')i = -2*i;
201 	vflag++;
202 	i = makem(i);
203 	vflag = 0;
204 	return(i);
205 }
206 makem(i)
207 int i;
208 {
209 	register j;
210 
211 	if((j = i) < 0)j = -j;
212 	j = (j & ~MOTV) | MOT;
213 	if(i < 0)j |= NMOT;
214 	if(vflag)j |= VMOT;
215 	return(j);
216 }
217 casefp(){
218 	register i, j;
219 
220 	skip();
221 	if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3))return;
222 	if(skip() || !(j = getrq()))return;
223 	fontlab[i] = j;
224 }
225 casevs(){
226 	register i;
227 
228 	skip();
229 	vflag++;
230 	dfact = INCH; /*default scaling is points!*/
231 	dfactd = 72;
232 	res = VERT;
233 	i = inumb(&lss);
234 	if(nonumb)i = lss1;
235 	if(i < VERT)i = VERT;
236 	lss1 = lss;
237 	lss = i;
238 }
239 xlss(){
240 	register i, j;
241 
242 	getch();
243 	dfact = lss;
244 	i = quant(atoi(),VERT);
245 	dfact = 1;
246 	getch();
247 	if((j = i) < 0)j = -j;
248 	ch0 = ((j & 03700)<<3) | HX;
249 	if(i < 0)ch0 |= 040000;
250 	return(((j & 077)<<9) | LX);
251 }
252 casefz(){}
253 caseps(){}
254 caselg(){}
255 casecs(){}
256 casebd(){}
257 casess(){}
258 getlg(i)
259 int i;
260 {
261 	return(i);
262 }
263