Blame


1 5cedca1b 2004-05-15 devnull /*
2 5cedca1b 2004-05-15 devnull * t6.c
3 5cedca1b 2004-05-15 devnull *
4 5cedca1b 2004-05-15 devnull * width functions, sizes and fonts
5 5cedca1b 2004-05-15 devnull */
6 5cedca1b 2004-05-15 devnull
7 5cedca1b 2004-05-15 devnull #include "tdef.h"
8 5cedca1b 2004-05-15 devnull #include "fns.h"
9 5cedca1b 2004-05-15 devnull #include "ext.h"
10 5cedca1b 2004-05-15 devnull
11 5cedca1b 2004-05-15 devnull int fontlab[MAXFONTS+1];
12 5cedca1b 2004-05-15 devnull int cstab[MAXFONTS+1];
13 5cedca1b 2004-05-15 devnull int ccstab[MAXFONTS+1];
14 5cedca1b 2004-05-15 devnull int bdtab[MAXFONTS+1];
15 5cedca1b 2004-05-15 devnull int sbold = 0;
16 5cedca1b 2004-05-15 devnull
17 c5561c23 2004-05-16 devnull int
18 5cedca1b 2004-05-15 devnull t_width(Tchar j)
19 5cedca1b 2004-05-15 devnull {
20 5cedca1b 2004-05-15 devnull int i, k;
21 5cedca1b 2004-05-15 devnull
22 5cedca1b 2004-05-15 devnull if (iszbit(j))
23 5cedca1b 2004-05-15 devnull return 0;
24 5cedca1b 2004-05-15 devnull if (ismot(j)) {
25 5cedca1b 2004-05-15 devnull if (isvmot(j))
26 5cedca1b 2004-05-15 devnull return(0);
27 5cedca1b 2004-05-15 devnull k = absmot(j);
28 5cedca1b 2004-05-15 devnull if (isnmot(j))
29 5cedca1b 2004-05-15 devnull k = -k;
30 5cedca1b 2004-05-15 devnull return(k);
31 5cedca1b 2004-05-15 devnull }
32 5cedca1b 2004-05-15 devnull i = cbits(j);
33 5cedca1b 2004-05-15 devnull if (i < ' ') {
34 5cedca1b 2004-05-15 devnull if (i == '\b')
35 5cedca1b 2004-05-15 devnull return(-widthp);
36 5cedca1b 2004-05-15 devnull if (i == PRESC)
37 5cedca1b 2004-05-15 devnull i = eschar;
38 5cedca1b 2004-05-15 devnull else if (i == HX)
39 5cedca1b 2004-05-15 devnull return(0);
40 5cedca1b 2004-05-15 devnull }
41 5cedca1b 2004-05-15 devnull if (i == ohc)
42 5cedca1b 2004-05-15 devnull return(0);
43 5cedca1b 2004-05-15 devnull i = trtab[i];
44 5cedca1b 2004-05-15 devnull if (i < ' ')
45 5cedca1b 2004-05-15 devnull return(0);
46 5cedca1b 2004-05-15 devnull if (sfbits(j) == oldbits) {
47 5cedca1b 2004-05-15 devnull xfont = pfont;
48 5cedca1b 2004-05-15 devnull xpts = ppts;
49 5cedca1b 2004-05-15 devnull } else
50 5cedca1b 2004-05-15 devnull xbits(j, 0);
51 5cedca1b 2004-05-15 devnull if (i < nchnames + ALPHABET && widcache[i].fontpts == (xfont<<8) + xpts && !setwdf)
52 5cedca1b 2004-05-15 devnull k = widcache[i].width;
53 5cedca1b 2004-05-15 devnull else {
54 5cedca1b 2004-05-15 devnull k = getcw(i);
55 5cedca1b 2004-05-15 devnull if (bd)
56 5cedca1b 2004-05-15 devnull k += (bd - 1) * HOR;
57 5cedca1b 2004-05-15 devnull if (cs)
58 5cedca1b 2004-05-15 devnull k = cs;
59 5cedca1b 2004-05-15 devnull }
60 5cedca1b 2004-05-15 devnull widthp = k;
61 5cedca1b 2004-05-15 devnull return(k);
62 5cedca1b 2004-05-15 devnull }
63 5cedca1b 2004-05-15 devnull
64 5cedca1b 2004-05-15 devnull /*
65 5cedca1b 2004-05-15 devnull * clear width cache-- s means just space
66 5cedca1b 2004-05-15 devnull */
67 5cedca1b 2004-05-15 devnull void zapwcache(int s)
68 5cedca1b 2004-05-15 devnull {
69 5cedca1b 2004-05-15 devnull int i;
70 5cedca1b 2004-05-15 devnull
71 5cedca1b 2004-05-15 devnull if (s) {
72 5cedca1b 2004-05-15 devnull widcache[' '].fontpts = 0;
73 5cedca1b 2004-05-15 devnull return;
74 5cedca1b 2004-05-15 devnull }
75 5cedca1b 2004-05-15 devnull for (i=0; i<NWIDCACHE; i++)
76 5cedca1b 2004-05-15 devnull widcache[i].fontpts = 0;
77 5cedca1b 2004-05-15 devnull }
78 5cedca1b 2004-05-15 devnull
79 c5561c23 2004-05-16 devnull int
80 5cedca1b 2004-05-15 devnull onfont(int n, int f) /* is char n on font f? */
81 5cedca1b 2004-05-15 devnull {
82 5cedca1b 2004-05-15 devnull int i;
83 5cedca1b 2004-05-15 devnull Font *fp = &fonts[f];
84 5cedca1b 2004-05-15 devnull Chwid *cp, *ep;
85 5cedca1b 2004-05-15 devnull char *np;
86 5cedca1b 2004-05-15 devnull
87 5cedca1b 2004-05-15 devnull if (n < ALPHABET) {
88 5cedca1b 2004-05-15 devnull if (fp->wp[n].num == n) /* ascii at front */
89 5cedca1b 2004-05-15 devnull return n;
90 5cedca1b 2004-05-15 devnull else
91 5cedca1b 2004-05-15 devnull return -1;
92 5cedca1b 2004-05-15 devnull }
93 5cedca1b 2004-05-15 devnull cp = &fp->wp[ALPHABET];
94 5cedca1b 2004-05-15 devnull ep = &fp->wp[fp->nchars];
95 5cedca1b 2004-05-15 devnull for ( ; cp < ep; cp++) /* search others */
96 5cedca1b 2004-05-15 devnull if (cp->num == n)
97 5cedca1b 2004-05-15 devnull return cp - &fp->wp[0];
98 5cedca1b 2004-05-15 devnull /* maybe it was a \N... */
99 5cedca1b 2004-05-15 devnull np = chname(n);
100 5cedca1b 2004-05-15 devnull if (*np == Number) {
101 5cedca1b 2004-05-15 devnull i = atoi(np+1); /* sscanf(np+1, "%d", &i); */
102 5cedca1b 2004-05-15 devnull cp = &fp->wp[0];
103 5cedca1b 2004-05-15 devnull ep = &fp->wp[fp->nchars];
104 5cedca1b 2004-05-15 devnull for ( ; cp < ep; cp++) { /* search others */
105 5cedca1b 2004-05-15 devnull if (cp->code == i)
106 5cedca1b 2004-05-15 devnull return cp - &fp->wp[0];
107 5cedca1b 2004-05-15 devnull }
108 5cedca1b 2004-05-15 devnull return -2; /* a \N that doesn't have an entry */
109 5cedca1b 2004-05-15 devnull }
110 5cedca1b 2004-05-15 devnull return -1; /* vanilla not found */
111 5cedca1b 2004-05-15 devnull }
112 5cedca1b 2004-05-15 devnull
113 c5561c23 2004-05-16 devnull int
114 5cedca1b 2004-05-15 devnull getcw(int i)
115 5cedca1b 2004-05-15 devnull {
116 5cedca1b 2004-05-15 devnull int k, n, x;
117 5cedca1b 2004-05-15 devnull Font *fp;
118 5cedca1b 2004-05-15 devnull int nocache = 0;
119 5cedca1b 2004-05-15 devnull if (i < ' ')
120 5cedca1b 2004-05-15 devnull return 0;
121 5cedca1b 2004-05-15 devnull bd = 0;
122 5cedca1b 2004-05-15 devnull fp = &fonts[xfont];
123 5cedca1b 2004-05-15 devnull if (i == ' ') { /* a blank */
124 5cedca1b 2004-05-15 devnull k = (fp->spacewidth * spacesz + 6) / 12;
125 5cedca1b 2004-05-15 devnull /* this nonsense because .ss cmd uses 1/36 em as its units */
126 5cedca1b 2004-05-15 devnull /* and default is 12 */
127 5cedca1b 2004-05-15 devnull } else if ((n = onfont(i, xfont)) >= 0) { /* on this font at n */
128 5cedca1b 2004-05-15 devnull k = fp->wp[n].wid;
129 5cedca1b 2004-05-15 devnull if (setwdf)
130 5cedca1b 2004-05-15 devnull numtabp[CT].val |= fp->wp[n].kern;
131 5cedca1b 2004-05-15 devnull } else if (n == -2) { /* \N with default width */
132 5cedca1b 2004-05-15 devnull
133 5cedca1b 2004-05-15 devnull k = fp->defaultwidth;
134 5cedca1b 2004-05-15 devnull } else { /* not on current font */
135 5cedca1b 2004-05-15 devnull nocache = 1;
136 5cedca1b 2004-05-15 devnull k = fp->defaultwidth; /* default-size space */
137 5cedca1b 2004-05-15 devnull if (smnt) {
138 5cedca1b 2004-05-15 devnull int ii, jj;
139 5cedca1b 2004-05-15 devnull for (ii=smnt, jj=0; jj < nfonts; jj++, ii=ii % nfonts + 1) {
140 5cedca1b 2004-05-15 devnull if ((n = onfont(i, ii)) >= 0) {
141 5cedca1b 2004-05-15 devnull k = fonts[ii].wp[n].wid;
142 5cedca1b 2004-05-15 devnull if (xfont == sbold)
143 5cedca1b 2004-05-15 devnull bd = bdtab[ii];
144 5cedca1b 2004-05-15 devnull if (setwdf)
145 5cedca1b 2004-05-15 devnull numtabp[CT].val |= fonts[ii].wp[n].kern;
146 5cedca1b 2004-05-15 devnull break;
147 5cedca1b 2004-05-15 devnull }
148 5cedca1b 2004-05-15 devnull }
149 5cedca1b 2004-05-15 devnull }
150 5cedca1b 2004-05-15 devnull }
151 5cedca1b 2004-05-15 devnull if (!bd)
152 5cedca1b 2004-05-15 devnull bd = bdtab[xfont];
153 5cedca1b 2004-05-15 devnull if (cs = cstab[xfont]) {
154 5cedca1b 2004-05-15 devnull nocache = 1;
155 5cedca1b 2004-05-15 devnull if (ccs = ccstab[xfont])
156 5cedca1b 2004-05-15 devnull x = ccs;
157 5cedca1b 2004-05-15 devnull else
158 5cedca1b 2004-05-15 devnull x = xpts;
159 5cedca1b 2004-05-15 devnull cs = (cs * EMPTS(x)) / 36;
160 5cedca1b 2004-05-15 devnull }
161 5cedca1b 2004-05-15 devnull /* was (k & BYTEMASK); since .wid is unsigned, should never happen */
162 5cedca1b 2004-05-15 devnull if (k < 0)
163 5cedca1b 2004-05-15 devnull ERROR "can't happen: negative width %d in getcw %d\n", k, i WARN;
164 5cedca1b 2004-05-15 devnull k = (k * xpts + (Unitwidth / 2)) / Unitwidth;
165 5cedca1b 2004-05-15 devnull if (nocache|bd)
166 5cedca1b 2004-05-15 devnull widcache[i].fontpts = 0;
167 5cedca1b 2004-05-15 devnull else {
168 5cedca1b 2004-05-15 devnull widcache[i].fontpts = (xfont<<8) + xpts;
169 5cedca1b 2004-05-15 devnull widcache[i].width = k;
170 5cedca1b 2004-05-15 devnull }
171 5cedca1b 2004-05-15 devnull return(k);
172 5cedca1b 2004-05-15 devnull /* Unitwidth is Units/Point, where
173 5cedca1b 2004-05-15 devnull /* Units is the fundamental digitization
174 5cedca1b 2004-05-15 devnull /* of the character set widths, and
175 5cedca1b 2004-05-15 devnull /* Point is the number of goobies in a point
176 5cedca1b 2004-05-15 devnull /* e.g., for cat, Units=36, Point=6, so Unitwidth=36/6=6
177 5cedca1b 2004-05-15 devnull /* In effect, it's the size at which the widths
178 5cedca1b 2004-05-15 devnull /* translate directly into units.
179 5cedca1b 2004-05-15 devnull */
180 5cedca1b 2004-05-15 devnull }
181 5cedca1b 2004-05-15 devnull
182 5cedca1b 2004-05-15 devnull void xbits(Tchar i, int bitf)
183 5cedca1b 2004-05-15 devnull {
184 5cedca1b 2004-05-15 devnull int k;
185 5cedca1b 2004-05-15 devnull
186 5cedca1b 2004-05-15 devnull if(TROFF) {
187 5cedca1b 2004-05-15 devnull xfont = fbits(i);
188 5cedca1b 2004-05-15 devnull k = sbits(i);
189 5cedca1b 2004-05-15 devnull if(k) {
190 5cedca1b 2004-05-15 devnull xpts = pstab[k-1];
191 5cedca1b 2004-05-15 devnull oldbits = sfbits(i);
192 5cedca1b 2004-05-15 devnull pfont = xfont;
193 5cedca1b 2004-05-15 devnull ppts = xpts;
194 5cedca1b 2004-05-15 devnull return;
195 5cedca1b 2004-05-15 devnull }
196 5cedca1b 2004-05-15 devnull switch(bitf) {
197 5cedca1b 2004-05-15 devnull case 0:
198 5cedca1b 2004-05-15 devnull xfont = font;
199 5cedca1b 2004-05-15 devnull xpts = pts;
200 5cedca1b 2004-05-15 devnull break;
201 5cedca1b 2004-05-15 devnull case 1:
202 5cedca1b 2004-05-15 devnull xfont = pfont;
203 5cedca1b 2004-05-15 devnull xpts = ppts;
204 5cedca1b 2004-05-15 devnull break;
205 5cedca1b 2004-05-15 devnull case 2:
206 5cedca1b 2004-05-15 devnull xfont = mfont;
207 5cedca1b 2004-05-15 devnull xpts = mpts;
208 5cedca1b 2004-05-15 devnull }
209 5cedca1b 2004-05-15 devnull }
210 5cedca1b 2004-05-15 devnull }
211 5cedca1b 2004-05-15 devnull
212 5cedca1b 2004-05-15 devnull
213 5cedca1b 2004-05-15 devnull /* these next two functions ought to be the same in troff and nroff, */
214 5cedca1b 2004-05-15 devnull /* but the data structures they search are different. */
215 5cedca1b 2004-05-15 devnull /* silly historical problem. */
216 5cedca1b 2004-05-15 devnull
217 5cedca1b 2004-05-15 devnull
218 5cedca1b 2004-05-15 devnull Tchar t_setch(int c)
219 5cedca1b 2004-05-15 devnull {
220 5cedca1b 2004-05-15 devnull int j;
221 5cedca1b 2004-05-15 devnull char temp[50];
222 5cedca1b 2004-05-15 devnull char *s;
223 5cedca1b 2004-05-15 devnull
224 c5561c23 2004-05-16 devnull j = 0;
225 5cedca1b 2004-05-15 devnull s = temp;
226 5cedca1b 2004-05-15 devnull if (c == '(') { /* \(xx */
227 5cedca1b 2004-05-15 devnull if ((*s++ = getach()) == 0 || (*s++ = getach()) == 0)
228 5cedca1b 2004-05-15 devnull return(0);
229 5cedca1b 2004-05-15 devnull } else { /* \C'...' */
230 5cedca1b 2004-05-15 devnull c = getach();
231 5cedca1b 2004-05-15 devnull while ((*s = getach()) != c && *s != 0 && s < temp + sizeof(temp) - 1)
232 5cedca1b 2004-05-15 devnull s++;
233 5cedca1b 2004-05-15 devnull }
234 5cedca1b 2004-05-15 devnull *s = '\0';
235 5cedca1b 2004-05-15 devnull #ifdef UNICODE
236 5cedca1b 2004-05-15 devnull return chadd(temp, Troffchar, Install) | chbits; /* add name even if haven't seen it */
237 5cedca1b 2004-05-15 devnull #else
238 5cedca1b 2004-05-15 devnull if (NROFF) {
239 5cedca1b 2004-05-15 devnull j = chadd(temp, Troffchar, Lookup);
240 5cedca1b 2004-05-15 devnull if ( j == -1)
241 5cedca1b 2004-05-15 devnull return 0;
242 5cedca1b 2004-05-15 devnull else
243 5cedca1b 2004-05-15 devnull return j | chbits;
244 5cedca1b 2004-05-15 devnull } else
245 5cedca1b 2004-05-15 devnull return chadd(temp, Troffchar, Install) | chbits; /* add name even if haven't seen it */
246 5cedca1b 2004-05-15 devnull
247 5cedca1b 2004-05-15 devnull #endif /*UNICODE*/
248 5cedca1b 2004-05-15 devnull }
249 5cedca1b 2004-05-15 devnull
250 5cedca1b 2004-05-15 devnull Tchar t_setabs(void) /* set absolute char from \N'...' */
251 5cedca1b 2004-05-15 devnull {
252 5cedca1b 2004-05-15 devnull int n;
253 5cedca1b 2004-05-15 devnull char temp[10];
254 5cedca1b 2004-05-15 devnull
255 5cedca1b 2004-05-15 devnull getch(); /* delim */
256 5cedca1b 2004-05-15 devnull n = 0;
257 5cedca1b 2004-05-15 devnull n = inumb(&n);
258 5cedca1b 2004-05-15 devnull getch(); /* delim */
259 5cedca1b 2004-05-15 devnull if (nonumb)
260 5cedca1b 2004-05-15 devnull return 0;
261 5cedca1b 2004-05-15 devnull sprintf(temp, "%d", n); /* convert into "#n" */
262 5cedca1b 2004-05-15 devnull n = chadd(temp, Number, Install);
263 5cedca1b 2004-05-15 devnull return n | chbits;
264 5cedca1b 2004-05-15 devnull }
265 5cedca1b 2004-05-15 devnull
266 5cedca1b 2004-05-15 devnull
267 5cedca1b 2004-05-15 devnull /*
268 5cedca1b 2004-05-15 devnull * fontlab[] is a cache that contains font information
269 5cedca1b 2004-05-15 devnull * for each font.
270 5cedca1b 2004-05-15 devnull * fontlab[] contains the 1- or 2-character name of the
271 5cedca1b 2004-05-15 devnull * font current associated with that font.
272 5cedca1b 2004-05-15 devnull * fonts 1..nfonts correspond to the mounted fonts;
273 5cedca1b 2004-05-15 devnull * the last of these are the special fonts.
274 5cedca1b 2004-05-15 devnull * If we don't use the (named) font in one of the
275 5cedca1b 2004-05-15 devnull * standard positions, we install the name in the next
276 5cedca1b 2004-05-15 devnull * free slot of fontlab[] and font[].
277 5cedca1b 2004-05-15 devnull * Whenever we need info about the font, we
278 5cedca1b 2004-05-15 devnull * read in the data into the next free slot with getfont.
279 5cedca1b 2004-05-15 devnull * The ptfont() (t10.c) routine will tell
280 5cedca1b 2004-05-15 devnull * the device filter to put the font always at position
281 5cedca1b 2004-05-15 devnull * zero if xfont > nfonts, so no need to change these filters.
282 5cedca1b 2004-05-15 devnull * Yes, this is a bit kludgy.
283 5cedca1b 2004-05-15 devnull *
284 5cedca1b 2004-05-15 devnull * This gives the new specs of findft:
285 5cedca1b 2004-05-15 devnull * find the font name i, where i also can be a number.
286 5cedca1b 2004-05-15 devnull * Installs the font(name) i when not present
287 5cedca1b 2004-05-15 devnull * returns -1 on error
288 5cedca1b 2004-05-15 devnull */
289 5cedca1b 2004-05-15 devnull
290 c5561c23 2004-05-16 devnull int
291 5cedca1b 2004-05-15 devnull t_findft(int i)
292 5cedca1b 2004-05-15 devnull {
293 5cedca1b 2004-05-15 devnull int k;
294 5cedca1b 2004-05-15 devnull Uchar *p;
295 5cedca1b 2004-05-15 devnull
296 5cedca1b 2004-05-15 devnull p = unpair(i);
297 5cedca1b 2004-05-15 devnull
298 5cedca1b 2004-05-15 devnull if (isdigit(p[0])) { /* first look for numbers */
299 5cedca1b 2004-05-15 devnull k = p[0] - '0';
300 5cedca1b 2004-05-15 devnull if (p[1] > 0 && isdigit(p[1]))
301 5cedca1b 2004-05-15 devnull k = 10 * k + p[1] - '0';
302 5cedca1b 2004-05-15 devnull if (k > 0 && k <= nfonts && k < smnt)
303 5cedca1b 2004-05-15 devnull return(k); /* mounted font: .ft 3 */
304 5cedca1b 2004-05-15 devnull if (fontlab[k] && k <= MAXFONTS) { /* translate */
305 5cedca1b 2004-05-15 devnull return(k); /*number to a name */
306 5cedca1b 2004-05-15 devnull } else {
307 5cedca1b 2004-05-15 devnull fprintf(stderr, "troff: no font at position %d\n", k);
308 5cedca1b 2004-05-15 devnull return(-1); /* wild number */
309 5cedca1b 2004-05-15 devnull }
310 5cedca1b 2004-05-15 devnull }
311 5cedca1b 2004-05-15 devnull
312 5cedca1b 2004-05-15 devnull /*
313 5cedca1b 2004-05-15 devnull * Now we look for font names
314 5cedca1b 2004-05-15 devnull */
315 5cedca1b 2004-05-15 devnull for (k = 1; fontlab[k] != i; k++) {
316 5cedca1b 2004-05-15 devnull if (k > MAXFONTS)
317 5cedca1b 2004-05-15 devnull return(-1); /* running out of fontlab space */
318 5cedca1b 2004-05-15 devnull if (fontlab[k] == 0) { /* passed all existing names */
319 5cedca1b 2004-05-15 devnull if (setfp(k, i, (char *) 0, 1) == -1)
320 5cedca1b 2004-05-15 devnull return(-1);
321 5cedca1b 2004-05-15 devnull else {
322 5cedca1b 2004-05-15 devnull fontlab[k] = i; /* install the name */
323 5cedca1b 2004-05-15 devnull return(k);
324 5cedca1b 2004-05-15 devnull }
325 5cedca1b 2004-05-15 devnull }
326 5cedca1b 2004-05-15 devnull }
327 5cedca1b 2004-05-15 devnull return(k); /* was one of the existing names */
328 5cedca1b 2004-05-15 devnull }
329 5cedca1b 2004-05-15 devnull
330 5cedca1b 2004-05-15 devnull
331 5cedca1b 2004-05-15 devnull void caseps(void)
332 5cedca1b 2004-05-15 devnull {
333 5cedca1b 2004-05-15 devnull int i;
334 5cedca1b 2004-05-15 devnull
335 5cedca1b 2004-05-15 devnull if (TROFF) {
336 5cedca1b 2004-05-15 devnull if(skip())
337 5cedca1b 2004-05-15 devnull i = apts1;
338 5cedca1b 2004-05-15 devnull else {
339 5cedca1b 2004-05-15 devnull noscale++;
340 5cedca1b 2004-05-15 devnull i = inumb(&apts); /* this is a disaster for fractional point sizes */
341 5cedca1b 2004-05-15 devnull noscale = 0;
342 5cedca1b 2004-05-15 devnull if(nonumb)
343 5cedca1b 2004-05-15 devnull i = apts1;
344 5cedca1b 2004-05-15 devnull }
345 5cedca1b 2004-05-15 devnull casps1(i);
346 5cedca1b 2004-05-15 devnull }
347 5cedca1b 2004-05-15 devnull }
348 5cedca1b 2004-05-15 devnull
349 5cedca1b 2004-05-15 devnull
350 5cedca1b 2004-05-15 devnull void casps1(int i)
351 5cedca1b 2004-05-15 devnull {
352 5cedca1b 2004-05-15 devnull
353 5cedca1b 2004-05-15 devnull /*
354 5cedca1b 2004-05-15 devnull * in olden times, it used to ignore changes to 0 or negative.
355 5cedca1b 2004-05-15 devnull * this is meant to allow the requested size to be anything,
356 5cedca1b 2004-05-15 devnull * in particular so eqn can generate lots of \s-3's and still
357 5cedca1b 2004-05-15 devnull * get back by matching \s+3's.
358 5cedca1b 2004-05-15 devnull
359 5cedca1b 2004-05-15 devnull if (i <= 0)
360 5cedca1b 2004-05-15 devnull return;
361 5cedca1b 2004-05-15 devnull */
362 5cedca1b 2004-05-15 devnull apts1 = apts;
363 5cedca1b 2004-05-15 devnull apts = i;
364 5cedca1b 2004-05-15 devnull pts1 = pts;
365 5cedca1b 2004-05-15 devnull pts = findps(i);
366 5cedca1b 2004-05-15 devnull mchbits();
367 5cedca1b 2004-05-15 devnull }
368 5cedca1b 2004-05-15 devnull
369 c5561c23 2004-05-16 devnull int
370 5cedca1b 2004-05-15 devnull findps(int i)
371 5cedca1b 2004-05-15 devnull {
372 5cedca1b 2004-05-15 devnull int j, k;
373 5cedca1b 2004-05-15 devnull
374 5cedca1b 2004-05-15 devnull for (j=k=0 ; pstab[j] != 0 ; j++)
375 5cedca1b 2004-05-15 devnull if (abs(pstab[j]-i) < abs(pstab[k]-i))
376 5cedca1b 2004-05-15 devnull k = j;
377 5cedca1b 2004-05-15 devnull
378 5cedca1b 2004-05-15 devnull return(pstab[k]);
379 5cedca1b 2004-05-15 devnull }
380 5cedca1b 2004-05-15 devnull
381 5cedca1b 2004-05-15 devnull
382 5cedca1b 2004-05-15 devnull void t_mchbits(void)
383 5cedca1b 2004-05-15 devnull {
384 5cedca1b 2004-05-15 devnull int i, j, k;
385 5cedca1b 2004-05-15 devnull
386 5cedca1b 2004-05-15 devnull i = pts;
387 5cedca1b 2004-05-15 devnull for (j = 0; i > (k = pstab[j]); j++)
388 5cedca1b 2004-05-15 devnull if (!k) {
389 5cedca1b 2004-05-15 devnull j--;
390 5cedca1b 2004-05-15 devnull break;
391 5cedca1b 2004-05-15 devnull }
392 5cedca1b 2004-05-15 devnull chbits = 0;
393 5cedca1b 2004-05-15 devnull setsbits(chbits, ++j);
394 5cedca1b 2004-05-15 devnull setfbits(chbits, font);
395 5cedca1b 2004-05-15 devnull sps = width(' ' | chbits);
396 5cedca1b 2004-05-15 devnull zapwcache(1);
397 5cedca1b 2004-05-15 devnull }
398 5cedca1b 2004-05-15 devnull
399 5cedca1b 2004-05-15 devnull void t_setps(void)
400 5cedca1b 2004-05-15 devnull {
401 5cedca1b 2004-05-15 devnull int i, j;
402 5cedca1b 2004-05-15 devnull
403 c5561c23 2004-05-16 devnull j = 0;
404 5cedca1b 2004-05-15 devnull i = cbits(getch());
405 5cedca1b 2004-05-15 devnull if (isdigit(i)) { /* \sd or \sdd */
406 5cedca1b 2004-05-15 devnull i -= '0';
407 5cedca1b 2004-05-15 devnull if (i == 0) /* \s0 */
408 5cedca1b 2004-05-15 devnull j = apts1;
409 5cedca1b 2004-05-15 devnull else if (i <= 3 && (ch=getch()) && isdigit(j = cbits(ch))) { /* \sdd */
410 5cedca1b 2004-05-15 devnull j = 10 * i + j - '0';
411 5cedca1b 2004-05-15 devnull ch = 0;
412 5cedca1b 2004-05-15 devnull } else /* \sd */
413 5cedca1b 2004-05-15 devnull j = i;
414 5cedca1b 2004-05-15 devnull } else if (i == '(') { /* \s(dd */
415 5cedca1b 2004-05-15 devnull j = cbits(getch()) - '0';
416 5cedca1b 2004-05-15 devnull j = 10 * j + cbits(getch()) - '0';
417 5cedca1b 2004-05-15 devnull if (j == 0) /* \s(00 */
418 5cedca1b 2004-05-15 devnull j = apts1;
419 5cedca1b 2004-05-15 devnull } else if (i == '+' || i == '-') { /* \s+, \s- */
420 5cedca1b 2004-05-15 devnull j = cbits(getch());
421 5cedca1b 2004-05-15 devnull if (isdigit(j)) { /* \s+d, \s-d */
422 5cedca1b 2004-05-15 devnull j -= '0';
423 5cedca1b 2004-05-15 devnull } else if (j == '(') { /* \s+(dd, \s-(dd */
424 5cedca1b 2004-05-15 devnull j = cbits(getch()) - '0';
425 5cedca1b 2004-05-15 devnull j = 10 * j + cbits(getch()) - '0';
426 5cedca1b 2004-05-15 devnull }
427 5cedca1b 2004-05-15 devnull if (i == '-')
428 5cedca1b 2004-05-15 devnull j = -j;
429 5cedca1b 2004-05-15 devnull j += apts;
430 5cedca1b 2004-05-15 devnull }
431 5cedca1b 2004-05-15 devnull casps1(j);
432 5cedca1b 2004-05-15 devnull }
433 5cedca1b 2004-05-15 devnull
434 5cedca1b 2004-05-15 devnull
435 5cedca1b 2004-05-15 devnull Tchar t_setht(void) /* set character height from \H'...' */
436 5cedca1b 2004-05-15 devnull {
437 5cedca1b 2004-05-15 devnull int n;
438 5cedca1b 2004-05-15 devnull Tchar c;
439 5cedca1b 2004-05-15 devnull
440 5cedca1b 2004-05-15 devnull getch();
441 5cedca1b 2004-05-15 devnull n = inumb(&apts);
442 5cedca1b 2004-05-15 devnull getch();
443 5cedca1b 2004-05-15 devnull if (n == 0 || nonumb)
444 5cedca1b 2004-05-15 devnull n = apts; /* does this work? */
445 5cedca1b 2004-05-15 devnull c = CHARHT;
446 5cedca1b 2004-05-15 devnull c |= ZBIT;
447 5cedca1b 2004-05-15 devnull setsbits(c, n);
448 5cedca1b 2004-05-15 devnull setfbits(c, pts); /* sneaky, CHARHT font bits are size bits */
449 5cedca1b 2004-05-15 devnull return(c);
450 5cedca1b 2004-05-15 devnull }
451 5cedca1b 2004-05-15 devnull
452 5cedca1b 2004-05-15 devnull Tchar t_setslant(void) /* set slant from \S'...' */
453 5cedca1b 2004-05-15 devnull {
454 5cedca1b 2004-05-15 devnull int n;
455 5cedca1b 2004-05-15 devnull Tchar c;
456 5cedca1b 2004-05-15 devnull
457 5cedca1b 2004-05-15 devnull getch();
458 5cedca1b 2004-05-15 devnull n = 0;
459 5cedca1b 2004-05-15 devnull n = inumb(&n);
460 5cedca1b 2004-05-15 devnull getch();
461 5cedca1b 2004-05-15 devnull if (nonumb)
462 5cedca1b 2004-05-15 devnull n = 0;
463 5cedca1b 2004-05-15 devnull c = SLANT;
464 5cedca1b 2004-05-15 devnull c |= ZBIT;
465 5cedca1b 2004-05-15 devnull setsfbits(c, n+180);
466 5cedca1b 2004-05-15 devnull return(c);
467 5cedca1b 2004-05-15 devnull }
468 5cedca1b 2004-05-15 devnull
469 5cedca1b 2004-05-15 devnull
470 5cedca1b 2004-05-15 devnull void caseft(void)
471 5cedca1b 2004-05-15 devnull {
472 5cedca1b 2004-05-15 devnull if (!TROFF) {
473 5cedca1b 2004-05-15 devnull n_caseft();
474 5cedca1b 2004-05-15 devnull return;
475 5cedca1b 2004-05-15 devnull }
476 5cedca1b 2004-05-15 devnull skip();
477 5cedca1b 2004-05-15 devnull setfont(1);
478 5cedca1b 2004-05-15 devnull }
479 5cedca1b 2004-05-15 devnull
480 5cedca1b 2004-05-15 devnull
481 5cedca1b 2004-05-15 devnull void t_setfont(int a)
482 5cedca1b 2004-05-15 devnull {
483 5cedca1b 2004-05-15 devnull int i, j;
484 5cedca1b 2004-05-15 devnull
485 5cedca1b 2004-05-15 devnull if (a)
486 5cedca1b 2004-05-15 devnull i = getrq();
487 5cedca1b 2004-05-15 devnull else
488 5cedca1b 2004-05-15 devnull i = getsn();
489 5cedca1b 2004-05-15 devnull if (!i || i == 'P') {
490 5cedca1b 2004-05-15 devnull j = font1;
491 5cedca1b 2004-05-15 devnull goto s0;
492 5cedca1b 2004-05-15 devnull }
493 5cedca1b 2004-05-15 devnull if (/* i == 'S' || */ i == '0') /* an experiment -- why can't we change to it? */
494 5cedca1b 2004-05-15 devnull return;
495 5cedca1b 2004-05-15 devnull if ((j = findft(i)) == -1)
496 5cedca1b 2004-05-15 devnull if ((j = setfp(0, i, (char*) 0, 1)) == -1) /* try to put it in position 0 */
497 5cedca1b 2004-05-15 devnull return;
498 5cedca1b 2004-05-15 devnull s0:
499 5cedca1b 2004-05-15 devnull font1 = font;
500 5cedca1b 2004-05-15 devnull font = j;
501 5cedca1b 2004-05-15 devnull mchbits();
502 5cedca1b 2004-05-15 devnull }
503 5cedca1b 2004-05-15 devnull
504 5cedca1b 2004-05-15 devnull
505 5cedca1b 2004-05-15 devnull void t_setwd(void)
506 5cedca1b 2004-05-15 devnull {
507 5cedca1b 2004-05-15 devnull int base, wid;
508 5cedca1b 2004-05-15 devnull Tchar i;
509 5cedca1b 2004-05-15 devnull int delim, emsz, k;
510 5cedca1b 2004-05-15 devnull int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
511 5cedca1b 2004-05-15 devnull
512 5cedca1b 2004-05-15 devnull base = numtabp[ST].val = numtabp[SB].val = wid = numtabp[CT].val = 0;
513 5cedca1b 2004-05-15 devnull if (ismot(i = getch()))
514 5cedca1b 2004-05-15 devnull return;
515 5cedca1b 2004-05-15 devnull delim = cbits(i);
516 5cedca1b 2004-05-15 devnull savhp = numtabp[HP].val;
517 5cedca1b 2004-05-15 devnull numtabp[HP].val = 0;
518 5cedca1b 2004-05-15 devnull savapts = apts;
519 5cedca1b 2004-05-15 devnull savapts1 = apts1;
520 5cedca1b 2004-05-15 devnull savfont = font;
521 5cedca1b 2004-05-15 devnull savfont1 = font1;
522 5cedca1b 2004-05-15 devnull savpts = pts;
523 5cedca1b 2004-05-15 devnull savpts1 = pts1;
524 5cedca1b 2004-05-15 devnull setwdf++;
525 5cedca1b 2004-05-15 devnull while (cbits(i = getch()) != delim && !nlflg) {
526 5cedca1b 2004-05-15 devnull k = width(i);
527 5cedca1b 2004-05-15 devnull wid += k;
528 5cedca1b 2004-05-15 devnull numtabp[HP].val += k;
529 5cedca1b 2004-05-15 devnull if (!ismot(i)) {
530 5cedca1b 2004-05-15 devnull emsz = (INCH/72) * xpts;
531 5cedca1b 2004-05-15 devnull } else if (isvmot(i)) {
532 5cedca1b 2004-05-15 devnull k = absmot(i);
533 5cedca1b 2004-05-15 devnull if (isnmot(i))
534 5cedca1b 2004-05-15 devnull k = -k;
535 5cedca1b 2004-05-15 devnull base -= k;
536 5cedca1b 2004-05-15 devnull emsz = 0;
537 5cedca1b 2004-05-15 devnull } else
538 5cedca1b 2004-05-15 devnull continue;
539 5cedca1b 2004-05-15 devnull if (base < numtabp[SB].val)
540 5cedca1b 2004-05-15 devnull numtabp[SB].val = base;
541 5cedca1b 2004-05-15 devnull if ((k = base + emsz) > numtabp[ST].val)
542 5cedca1b 2004-05-15 devnull numtabp[ST].val = k;
543 5cedca1b 2004-05-15 devnull }
544 5cedca1b 2004-05-15 devnull setn1(wid, 0, (Tchar) 0);
545 5cedca1b 2004-05-15 devnull numtabp[HP].val = savhp;
546 5cedca1b 2004-05-15 devnull apts = savapts;
547 5cedca1b 2004-05-15 devnull apts1 = savapts1;
548 5cedca1b 2004-05-15 devnull font = savfont;
549 5cedca1b 2004-05-15 devnull font1 = savfont1;
550 5cedca1b 2004-05-15 devnull pts = savpts;
551 5cedca1b 2004-05-15 devnull pts1 = savpts1;
552 5cedca1b 2004-05-15 devnull mchbits();
553 5cedca1b 2004-05-15 devnull setwdf = 0;
554 5cedca1b 2004-05-15 devnull }
555 5cedca1b 2004-05-15 devnull
556 5cedca1b 2004-05-15 devnull
557 5cedca1b 2004-05-15 devnull Tchar t_vmot(void)
558 5cedca1b 2004-05-15 devnull {
559 5cedca1b 2004-05-15 devnull dfact = lss;
560 5cedca1b 2004-05-15 devnull vflag++;
561 5cedca1b 2004-05-15 devnull return t_mot();
562 5cedca1b 2004-05-15 devnull }
563 5cedca1b 2004-05-15 devnull
564 5cedca1b 2004-05-15 devnull
565 5cedca1b 2004-05-15 devnull Tchar t_hmot(void)
566 5cedca1b 2004-05-15 devnull {
567 5cedca1b 2004-05-15 devnull dfact = EM;
568 5cedca1b 2004-05-15 devnull return t_mot();
569 5cedca1b 2004-05-15 devnull }
570 5cedca1b 2004-05-15 devnull
571 5cedca1b 2004-05-15 devnull
572 5cedca1b 2004-05-15 devnull Tchar t_mot(void)
573 5cedca1b 2004-05-15 devnull {
574 5cedca1b 2004-05-15 devnull int j, n;
575 5cedca1b 2004-05-15 devnull Tchar i;
576 5cedca1b 2004-05-15 devnull
577 5cedca1b 2004-05-15 devnull j = HOR;
578 5cedca1b 2004-05-15 devnull getch(); /*eat delim*/
579 5cedca1b 2004-05-15 devnull if (n = atoi0()) {
580 5cedca1b 2004-05-15 devnull if (vflag)
581 5cedca1b 2004-05-15 devnull j = VERT;
582 5cedca1b 2004-05-15 devnull i = makem(quant(n, j));
583 5cedca1b 2004-05-15 devnull } else
584 5cedca1b 2004-05-15 devnull i = 0;
585 5cedca1b 2004-05-15 devnull getch();
586 5cedca1b 2004-05-15 devnull vflag = 0;
587 5cedca1b 2004-05-15 devnull dfact = 1;
588 5cedca1b 2004-05-15 devnull return(i);
589 5cedca1b 2004-05-15 devnull }
590 5cedca1b 2004-05-15 devnull
591 5cedca1b 2004-05-15 devnull
592 5cedca1b 2004-05-15 devnull Tchar t_sethl(int k)
593 5cedca1b 2004-05-15 devnull {
594 5cedca1b 2004-05-15 devnull int j;
595 5cedca1b 2004-05-15 devnull Tchar i;
596 5cedca1b 2004-05-15 devnull
597 5cedca1b 2004-05-15 devnull j = EM / 2;
598 5cedca1b 2004-05-15 devnull if (k == 'u')
599 5cedca1b 2004-05-15 devnull j = -j;
600 5cedca1b 2004-05-15 devnull else if (k == 'r')
601 5cedca1b 2004-05-15 devnull j = -2 * j;
602 5cedca1b 2004-05-15 devnull vflag++;
603 5cedca1b 2004-05-15 devnull i = makem(j);
604 5cedca1b 2004-05-15 devnull vflag = 0;
605 5cedca1b 2004-05-15 devnull return(i);
606 5cedca1b 2004-05-15 devnull }
607 5cedca1b 2004-05-15 devnull
608 5cedca1b 2004-05-15 devnull
609 5cedca1b 2004-05-15 devnull Tchar t_makem(int i)
610 5cedca1b 2004-05-15 devnull {
611 5cedca1b 2004-05-15 devnull Tchar j;
612 5cedca1b 2004-05-15 devnull
613 5cedca1b 2004-05-15 devnull if (i >= 0)
614 5cedca1b 2004-05-15 devnull j = i;
615 5cedca1b 2004-05-15 devnull else
616 5cedca1b 2004-05-15 devnull j = -i;
617 5cedca1b 2004-05-15 devnull if (Hor > 1 && !vflag)
618 5cedca1b 2004-05-15 devnull j = (j + Hor/2)/Hor * Hor;
619 5cedca1b 2004-05-15 devnull j |= MOT;
620 5cedca1b 2004-05-15 devnull if (i < 0)
621 5cedca1b 2004-05-15 devnull j |= NMOT;
622 5cedca1b 2004-05-15 devnull if (vflag)
623 5cedca1b 2004-05-15 devnull j |= VMOT;
624 5cedca1b 2004-05-15 devnull return(j);
625 5cedca1b 2004-05-15 devnull }
626 5cedca1b 2004-05-15 devnull
627 5cedca1b 2004-05-15 devnull
628 5cedca1b 2004-05-15 devnull Tchar getlg(Tchar i)
629 5cedca1b 2004-05-15 devnull {
630 5cedca1b 2004-05-15 devnull Tchar j, k;
631 5cedca1b 2004-05-15 devnull int lf;
632 5cedca1b 2004-05-15 devnull
633 5cedca1b 2004-05-15 devnull if (!TROFF)
634 5cedca1b 2004-05-15 devnull return i;
635 5cedca1b 2004-05-15 devnull if ((lf = fonts[fbits(i)].ligfont) == 0) /* font lacks ligatures */
636 5cedca1b 2004-05-15 devnull return(i);
637 5cedca1b 2004-05-15 devnull j = getch0();
638 5cedca1b 2004-05-15 devnull if (cbits(j) == 'i' && (lf & LFI))
639 5cedca1b 2004-05-15 devnull j = LIG_FI;
640 5cedca1b 2004-05-15 devnull else if (cbits(j) == 'l' && (lf & LFL))
641 5cedca1b 2004-05-15 devnull j = LIG_FL;
642 5cedca1b 2004-05-15 devnull else if (cbits(j) == 'f' && (lf & LFF)) {
643 5cedca1b 2004-05-15 devnull if ((lf & (LFFI|LFFL)) && lg != 2) {
644 5cedca1b 2004-05-15 devnull k = getch0();
645 5cedca1b 2004-05-15 devnull if (cbits(k)=='i' && (lf&LFFI))
646 5cedca1b 2004-05-15 devnull j = LIG_FFI;
647 5cedca1b 2004-05-15 devnull else if (cbits(k)=='l' && (lf&LFFL))
648 5cedca1b 2004-05-15 devnull j = LIG_FFL;
649 5cedca1b 2004-05-15 devnull else {
650 5cedca1b 2004-05-15 devnull *pbp++ = k;
651 5cedca1b 2004-05-15 devnull j = LIG_FF;
652 5cedca1b 2004-05-15 devnull }
653 5cedca1b 2004-05-15 devnull } else
654 5cedca1b 2004-05-15 devnull j = LIG_FF;
655 5cedca1b 2004-05-15 devnull } else {
656 5cedca1b 2004-05-15 devnull *pbp++ = j;
657 5cedca1b 2004-05-15 devnull j = i;
658 5cedca1b 2004-05-15 devnull }
659 5cedca1b 2004-05-15 devnull return(i & SFMASK | j);
660 5cedca1b 2004-05-15 devnull }
661 5cedca1b 2004-05-15 devnull
662 5cedca1b 2004-05-15 devnull
663 5cedca1b 2004-05-15 devnull void caselg(void)
664 5cedca1b 2004-05-15 devnull {
665 5cedca1b 2004-05-15 devnull
666 5cedca1b 2004-05-15 devnull if(TROFF) {
667 5cedca1b 2004-05-15 devnull skip();
668 5cedca1b 2004-05-15 devnull lg = atoi0();
669 5cedca1b 2004-05-15 devnull if (nonumb)
670 5cedca1b 2004-05-15 devnull lg = 1;
671 5cedca1b 2004-05-15 devnull }
672 5cedca1b 2004-05-15 devnull }
673 5cedca1b 2004-05-15 devnull
674 5cedca1b 2004-05-15 devnull void casefp(void)
675 5cedca1b 2004-05-15 devnull {
676 5cedca1b 2004-05-15 devnull int i, j;
677 5cedca1b 2004-05-15 devnull
678 5cedca1b 2004-05-15 devnull if (!TROFF) {
679 5cedca1b 2004-05-15 devnull n_casefp();
680 5cedca1b 2004-05-15 devnull return;
681 5cedca1b 2004-05-15 devnull }
682 5cedca1b 2004-05-15 devnull skip();
683 5cedca1b 2004-05-15 devnull i = cbits(getch());
684 5cedca1b 2004-05-15 devnull if (isdigit(i)) {
685 5cedca1b 2004-05-15 devnull i -= '0';
686 5cedca1b 2004-05-15 devnull j = cbits(getch());
687 5cedca1b 2004-05-15 devnull if (isdigit(j))
688 5cedca1b 2004-05-15 devnull i = 10 * i + j - '0';
689 5cedca1b 2004-05-15 devnull }
690 5cedca1b 2004-05-15 devnull if (i <= 0 || i > nfonts)
691 5cedca1b 2004-05-15 devnull ERROR "fp: bad font position %d", i WARN;
692 5cedca1b 2004-05-15 devnull else if (skip() || !(j = getrq()))
693 5cedca1b 2004-05-15 devnull ERROR "fp: no font name" WARN;
694 5cedca1b 2004-05-15 devnull else if (skip() || !getname())
695 5cedca1b 2004-05-15 devnull setfp(i, j, (char*) 0, 1);
696 5cedca1b 2004-05-15 devnull else /* 3rd argument = filename */
697 5cedca1b 2004-05-15 devnull setfp(i, j, nextf, 1);
698 5cedca1b 2004-05-15 devnull }
699 5cedca1b 2004-05-15 devnull
700 5cedca1b 2004-05-15 devnull char *strdupl(const char *s) /* make a copy of s */
701 5cedca1b 2004-05-15 devnull {
702 5cedca1b 2004-05-15 devnull char *t;
703 5cedca1b 2004-05-15 devnull
704 5cedca1b 2004-05-15 devnull t = (char *) malloc(strlen(s) + 1);
705 5cedca1b 2004-05-15 devnull if (t == NULL)
706 5cedca1b 2004-05-15 devnull ERROR "out of space in strdupl(%s)", s FATAL;
707 5cedca1b 2004-05-15 devnull strcpy(t, s);
708 5cedca1b 2004-05-15 devnull return t;
709 5cedca1b 2004-05-15 devnull }
710 5cedca1b 2004-05-15 devnull
711 c5561c23 2004-05-16 devnull int
712 5cedca1b 2004-05-15 devnull setfp(int pos, int f, char *truename, int print) /* mount font f at position pos[0...nfonts] */
713 5cedca1b 2004-05-15 devnull {
714 5cedca1b 2004-05-15 devnull char pathname[NS], shortname[NS], *sl;
715 5cedca1b 2004-05-15 devnull
716 c5561c23 2004-05-16 devnull sl = (char*)0;
717 5cedca1b 2004-05-15 devnull zapwcache(0);
718 5cedca1b 2004-05-15 devnull if (truename)
719 5cedca1b 2004-05-15 devnull strcpy(shortname, truename);
720 5cedca1b 2004-05-15 devnull else
721 5cedca1b 2004-05-15 devnull strcpy(shortname, (char *) unpair(f));
722 5cedca1b 2004-05-15 devnull if (truename && strrchr(truename, '/')) { /* .fp 1 R dir/file: use verbatim */
723 5cedca1b 2004-05-15 devnull sprintf(pathname, "%s", truename);
724 5cedca1b 2004-05-15 devnull if (fonts[pos].truename)
725 5cedca1b 2004-05-15 devnull free(fonts[pos].truename);
726 5cedca1b 2004-05-15 devnull fonts[pos].truename = strdupl(truename);
727 5cedca1b 2004-05-15 devnull } else if (truename) { /* synonym: .fp 1 R Avant */
728 5cedca1b 2004-05-15 devnull sprintf(pathname, "%s/dev%s/%s", fontdir, devname, truename);
729 5cedca1b 2004-05-15 devnull truename = 0; /* so doesn't get repeated by ptfpcmd */
730 5cedca1b 2004-05-15 devnull } else /* vanilla: .fp 5 XX */
731 5cedca1b 2004-05-15 devnull sprintf(pathname, "%s/dev%s/%s", fontdir, devname, shortname);
732 5cedca1b 2004-05-15 devnull if (truename == 0 && fonts[pos].truename != 0) {
733 5cedca1b 2004-05-15 devnull free(fonts[pos].truename);
734 5cedca1b 2004-05-15 devnull fonts[pos].truename = 0;
735 5cedca1b 2004-05-15 devnull }
736 5cedca1b 2004-05-15 devnull if (getfont(pathname, pos) < 0) {
737 5cedca1b 2004-05-15 devnull ERROR "Can't open font file %s", pathname WARN;
738 5cedca1b 2004-05-15 devnull return -1;
739 5cedca1b 2004-05-15 devnull }
740 5cedca1b 2004-05-15 devnull if (print && !ascii) {
741 5cedca1b 2004-05-15 devnull ptfpcmd(pos, fonts[pos].longname, truename);
742 5cedca1b 2004-05-15 devnull ptfont();
743 5cedca1b 2004-05-15 devnull }
744 5cedca1b 2004-05-15 devnull if (pos == smnt) {
745 5cedca1b 2004-05-15 devnull smnt = 0;
746 5cedca1b 2004-05-15 devnull sbold = 0;
747 5cedca1b 2004-05-15 devnull }
748 5cedca1b 2004-05-15 devnull fontlab[pos] = f;
749 5cedca1b 2004-05-15 devnull if (smnt == 0 && fonts[pos].specfont)
750 5cedca1b 2004-05-15 devnull smnt = pos;
751 5cedca1b 2004-05-15 devnull bdtab[pos] = cstab[pos] = ccstab[pos] = 0;
752 5cedca1b 2004-05-15 devnull return pos;
753 5cedca1b 2004-05-15 devnull }
754 5cedca1b 2004-05-15 devnull
755 5cedca1b 2004-05-15 devnull /*
756 5cedca1b 2004-05-15 devnull * .cs request; don't check legality of optional arguments
757 5cedca1b 2004-05-15 devnull */
758 5cedca1b 2004-05-15 devnull void casecs(void)
759 5cedca1b 2004-05-15 devnull {
760 5cedca1b 2004-05-15 devnull int i, j;
761 5cedca1b 2004-05-15 devnull
762 5cedca1b 2004-05-15 devnull if (TROFF) {
763 5cedca1b 2004-05-15 devnull int savtr = trace;
764 5cedca1b 2004-05-15 devnull
765 5cedca1b 2004-05-15 devnull trace = 0;
766 5cedca1b 2004-05-15 devnull noscale++;
767 5cedca1b 2004-05-15 devnull skip();
768 5cedca1b 2004-05-15 devnull if (!(i = getrq()) || (i = findft(i)) < 0)
769 5cedca1b 2004-05-15 devnull goto rtn;
770 5cedca1b 2004-05-15 devnull skip();
771 5cedca1b 2004-05-15 devnull cstab[i] = atoi0();
772 5cedca1b 2004-05-15 devnull skip();
773 5cedca1b 2004-05-15 devnull j = atoi0();
774 5cedca1b 2004-05-15 devnull if(nonumb)
775 5cedca1b 2004-05-15 devnull ccstab[i] = 0;
776 5cedca1b 2004-05-15 devnull else
777 5cedca1b 2004-05-15 devnull ccstab[i] = findps(j);
778 5cedca1b 2004-05-15 devnull rtn:
779 5cedca1b 2004-05-15 devnull zapwcache(0);
780 5cedca1b 2004-05-15 devnull noscale = 0;
781 5cedca1b 2004-05-15 devnull trace = savtr;
782 5cedca1b 2004-05-15 devnull }
783 5cedca1b 2004-05-15 devnull }
784 5cedca1b 2004-05-15 devnull
785 5cedca1b 2004-05-15 devnull
786 5cedca1b 2004-05-15 devnull void casebd(void)
787 5cedca1b 2004-05-15 devnull {
788 5cedca1b 2004-05-15 devnull int i, j, k;
789 5cedca1b 2004-05-15 devnull
790 c5561c23 2004-05-16 devnull j=0;
791 5cedca1b 2004-05-15 devnull if (!TROFF) {
792 5cedca1b 2004-05-15 devnull n_casebd();
793 5cedca1b 2004-05-15 devnull return;
794 5cedca1b 2004-05-15 devnull }
795 5cedca1b 2004-05-15 devnull zapwcache(0);
796 5cedca1b 2004-05-15 devnull k = 0;
797 5cedca1b 2004-05-15 devnull bd0:
798 5cedca1b 2004-05-15 devnull if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
799 5cedca1b 2004-05-15 devnull if (k)
800 5cedca1b 2004-05-15 devnull goto bd1;
801 5cedca1b 2004-05-15 devnull else
802 5cedca1b 2004-05-15 devnull return;
803 5cedca1b 2004-05-15 devnull }
804 5cedca1b 2004-05-15 devnull if (j == smnt) {
805 5cedca1b 2004-05-15 devnull k = smnt;
806 5cedca1b 2004-05-15 devnull goto bd0;
807 5cedca1b 2004-05-15 devnull }
808 5cedca1b 2004-05-15 devnull if (k) {
809 5cedca1b 2004-05-15 devnull sbold = j;
810 5cedca1b 2004-05-15 devnull j = k;
811 5cedca1b 2004-05-15 devnull }
812 5cedca1b 2004-05-15 devnull bd1:
813 5cedca1b 2004-05-15 devnull skip();
814 5cedca1b 2004-05-15 devnull noscale++;
815 5cedca1b 2004-05-15 devnull bdtab[j] = atoi0();
816 5cedca1b 2004-05-15 devnull noscale = 0;
817 5cedca1b 2004-05-15 devnull }
818 5cedca1b 2004-05-15 devnull
819 5cedca1b 2004-05-15 devnull
820 5cedca1b 2004-05-15 devnull void casevs(void)
821 5cedca1b 2004-05-15 devnull {
822 5cedca1b 2004-05-15 devnull int i;
823 5cedca1b 2004-05-15 devnull
824 5cedca1b 2004-05-15 devnull if (!TROFF) {
825 5cedca1b 2004-05-15 devnull n_casevs();
826 5cedca1b 2004-05-15 devnull return;
827 5cedca1b 2004-05-15 devnull }
828 5cedca1b 2004-05-15 devnull skip();
829 5cedca1b 2004-05-15 devnull vflag++;
830 5cedca1b 2004-05-15 devnull dfact = INCH; /* default scaling is points! */
831 5cedca1b 2004-05-15 devnull dfactd = 72;
832 5cedca1b 2004-05-15 devnull res = VERT;
833 5cedca1b 2004-05-15 devnull i = inumb(&lss);
834 5cedca1b 2004-05-15 devnull if (nonumb)
835 5cedca1b 2004-05-15 devnull i = lss1;
836 5cedca1b 2004-05-15 devnull if (i < VERT)
837 5cedca1b 2004-05-15 devnull i = VERT;
838 5cedca1b 2004-05-15 devnull lss1 = lss;
839 5cedca1b 2004-05-15 devnull lss = i;
840 5cedca1b 2004-05-15 devnull }
841 5cedca1b 2004-05-15 devnull
842 5cedca1b 2004-05-15 devnull
843 5cedca1b 2004-05-15 devnull void casess(void)
844 5cedca1b 2004-05-15 devnull {
845 5cedca1b 2004-05-15 devnull int i;
846 5cedca1b 2004-05-15 devnull
847 5cedca1b 2004-05-15 devnull if(TROFF) {
848 5cedca1b 2004-05-15 devnull noscale++;
849 5cedca1b 2004-05-15 devnull skip();
850 5cedca1b 2004-05-15 devnull if(i = atoi0()) {
851 5cedca1b 2004-05-15 devnull spacesz = i & 0177;
852 5cedca1b 2004-05-15 devnull zapwcache(0);
853 5cedca1b 2004-05-15 devnull sps = width(' ' | chbits);
854 5cedca1b 2004-05-15 devnull }
855 5cedca1b 2004-05-15 devnull noscale = 0;
856 5cedca1b 2004-05-15 devnull }
857 5cedca1b 2004-05-15 devnull }
858 5cedca1b 2004-05-15 devnull
859 5cedca1b 2004-05-15 devnull
860 5cedca1b 2004-05-15 devnull Tchar t_xlss(void)
861 5cedca1b 2004-05-15 devnull {
862 5cedca1b 2004-05-15 devnull /* stores \x'...' into two successive Tchars.
863 5cedca1b 2004-05-15 devnull /* the first contains HX, the second the value,
864 5cedca1b 2004-05-15 devnull /* encoded as a vertical motion.
865 5cedca1b 2004-05-15 devnull /* decoding is done in n2.c by pchar().
866 5cedca1b 2004-05-15 devnull */
867 5cedca1b 2004-05-15 devnull int i;
868 5cedca1b 2004-05-15 devnull
869 5cedca1b 2004-05-15 devnull getch();
870 5cedca1b 2004-05-15 devnull dfact = lss;
871 5cedca1b 2004-05-15 devnull i = quant(atoi0(), VERT);
872 5cedca1b 2004-05-15 devnull dfact = 1;
873 5cedca1b 2004-05-15 devnull getch();
874 5cedca1b 2004-05-15 devnull if (i >= 0)
875 5cedca1b 2004-05-15 devnull *pbp++ = MOT | VMOT | i;
876 5cedca1b 2004-05-15 devnull else
877 5cedca1b 2004-05-15 devnull *pbp++ = MOT | VMOT | NMOT | -i;
878 5cedca1b 2004-05-15 devnull return(HX);
879 5cedca1b 2004-05-15 devnull }
880 5cedca1b 2004-05-15 devnull
881 5cedca1b 2004-05-15 devnull Uchar *unpair(int i)
882 5cedca1b 2004-05-15 devnull {
883 5cedca1b 2004-05-15 devnull static Uchar name[3];
884 5cedca1b 2004-05-15 devnull
885 5cedca1b 2004-05-15 devnull name[0] = i & SHORTMASK;
886 5cedca1b 2004-05-15 devnull name[1] = (i >> SHORT) & SHORTMASK;
887 5cedca1b 2004-05-15 devnull name[2] = 0;
888 5cedca1b 2004-05-15 devnull return name;
889 5cedca1b 2004-05-15 devnull }