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