Blame


1 5cedca1b 2004-05-15 devnull /*
2 5cedca1b 2004-05-15 devnull * t6.c
3 fa325e9b 2020-01-10 cross *
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 fa325e9b 2020-01-10 cross } 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 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross x = ccs;
157 fa325e9b 2020-01-10 cross 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 c5bfba48 2012-10-21 rsc #ifndef UNICODE
221 5cedca1b 2004-05-15 devnull int j;
222 c5bfba48 2012-10-21 rsc #endif
223 5cedca1b 2004-05-15 devnull char temp[50];
224 5cedca1b 2004-05-15 devnull char *s;
225 5cedca1b 2004-05-15 devnull
226 c5bfba48 2012-10-21 rsc #ifndef UNICODE
227 c5561c23 2004-05-16 devnull j = 0;
228 c5bfba48 2012-10-21 rsc #endif
229 5cedca1b 2004-05-15 devnull s = temp;
230 5cedca1b 2004-05-15 devnull if (c == '(') { /* \(xx */
231 5cedca1b 2004-05-15 devnull if ((*s++ = getach()) == 0 || (*s++ = getach()) == 0)
232 5cedca1b 2004-05-15 devnull return(0);
233 5cedca1b 2004-05-15 devnull } else { /* \C'...' */
234 5cedca1b 2004-05-15 devnull c = getach();
235 5cedca1b 2004-05-15 devnull while ((*s = getach()) != c && *s != 0 && s < temp + sizeof(temp) - 1)
236 5cedca1b 2004-05-15 devnull s++;
237 5cedca1b 2004-05-15 devnull }
238 5cedca1b 2004-05-15 devnull *s = '\0';
239 5cedca1b 2004-05-15 devnull #ifdef UNICODE
240 5cedca1b 2004-05-15 devnull return chadd(temp, Troffchar, Install) | chbits; /* add name even if haven't seen it */
241 5cedca1b 2004-05-15 devnull #else
242 5cedca1b 2004-05-15 devnull if (NROFF) {
243 5cedca1b 2004-05-15 devnull j = chadd(temp, Troffchar, Lookup);
244 5cedca1b 2004-05-15 devnull if ( j == -1)
245 5cedca1b 2004-05-15 devnull return 0;
246 5cedca1b 2004-05-15 devnull else
247 5cedca1b 2004-05-15 devnull return j | chbits;
248 5cedca1b 2004-05-15 devnull } else
249 5cedca1b 2004-05-15 devnull return chadd(temp, Troffchar, Install) | chbits; /* add name even if haven't seen it */
250 fa325e9b 2020-01-10 cross
251 5cedca1b 2004-05-15 devnull #endif /*UNICODE*/
252 5cedca1b 2004-05-15 devnull }
253 5cedca1b 2004-05-15 devnull
254 5cedca1b 2004-05-15 devnull Tchar t_setabs(void) /* set absolute char from \N'...' */
255 5cedca1b 2004-05-15 devnull {
256 5cedca1b 2004-05-15 devnull int n;
257 5cedca1b 2004-05-15 devnull char temp[10];
258 5cedca1b 2004-05-15 devnull
259 5cedca1b 2004-05-15 devnull getch(); /* delim */
260 5cedca1b 2004-05-15 devnull n = 0;
261 5cedca1b 2004-05-15 devnull n = inumb(&n);
262 5cedca1b 2004-05-15 devnull getch(); /* delim */
263 5cedca1b 2004-05-15 devnull if (nonumb)
264 5cedca1b 2004-05-15 devnull return 0;
265 5cedca1b 2004-05-15 devnull sprintf(temp, "%d", n); /* convert into "#n" */
266 5cedca1b 2004-05-15 devnull n = chadd(temp, Number, Install);
267 5cedca1b 2004-05-15 devnull return n | chbits;
268 5cedca1b 2004-05-15 devnull }
269 5cedca1b 2004-05-15 devnull
270 5cedca1b 2004-05-15 devnull
271 5cedca1b 2004-05-15 devnull /*
272 5cedca1b 2004-05-15 devnull * fontlab[] is a cache that contains font information
273 5cedca1b 2004-05-15 devnull * for each font.
274 5cedca1b 2004-05-15 devnull * fontlab[] contains the 1- or 2-character name of the
275 5cedca1b 2004-05-15 devnull * font current associated with that font.
276 5cedca1b 2004-05-15 devnull * fonts 1..nfonts correspond to the mounted fonts;
277 5cedca1b 2004-05-15 devnull * the last of these are the special fonts.
278 5cedca1b 2004-05-15 devnull * If we don't use the (named) font in one of the
279 5cedca1b 2004-05-15 devnull * standard positions, we install the name in the next
280 5cedca1b 2004-05-15 devnull * free slot of fontlab[] and font[].
281 5cedca1b 2004-05-15 devnull * Whenever we need info about the font, we
282 5cedca1b 2004-05-15 devnull * read in the data into the next free slot with getfont.
283 5cedca1b 2004-05-15 devnull * The ptfont() (t10.c) routine will tell
284 5cedca1b 2004-05-15 devnull * the device filter to put the font always at position
285 5cedca1b 2004-05-15 devnull * zero if xfont > nfonts, so no need to change these filters.
286 5cedca1b 2004-05-15 devnull * Yes, this is a bit kludgy.
287 5cedca1b 2004-05-15 devnull *
288 5cedca1b 2004-05-15 devnull * This gives the new specs of findft:
289 5cedca1b 2004-05-15 devnull * find the font name i, where i also can be a number.
290 5cedca1b 2004-05-15 devnull * Installs the font(name) i when not present
291 5cedca1b 2004-05-15 devnull * returns -1 on error
292 5cedca1b 2004-05-15 devnull */
293 5cedca1b 2004-05-15 devnull
294 c5561c23 2004-05-16 devnull int
295 5cedca1b 2004-05-15 devnull t_findft(int i)
296 5cedca1b 2004-05-15 devnull {
297 5cedca1b 2004-05-15 devnull int k;
298 5cedca1b 2004-05-15 devnull Uchar *p;
299 5cedca1b 2004-05-15 devnull
300 5cedca1b 2004-05-15 devnull p = unpair(i);
301 5cedca1b 2004-05-15 devnull
302 5cedca1b 2004-05-15 devnull if (isdigit(p[0])) { /* first look for numbers */
303 5cedca1b 2004-05-15 devnull k = p[0] - '0';
304 5cedca1b 2004-05-15 devnull if (p[1] > 0 && isdigit(p[1]))
305 5cedca1b 2004-05-15 devnull k = 10 * k + p[1] - '0';
306 5cedca1b 2004-05-15 devnull if (k > 0 && k <= nfonts && k < smnt)
307 5cedca1b 2004-05-15 devnull return(k); /* mounted font: .ft 3 */
308 5cedca1b 2004-05-15 devnull if (fontlab[k] && k <= MAXFONTS) { /* translate */
309 5cedca1b 2004-05-15 devnull return(k); /*number to a name */
310 5cedca1b 2004-05-15 devnull } else {
311 5cedca1b 2004-05-15 devnull fprintf(stderr, "troff: no font at position %d\n", k);
312 5cedca1b 2004-05-15 devnull return(-1); /* wild number */
313 5cedca1b 2004-05-15 devnull }
314 5cedca1b 2004-05-15 devnull }
315 5cedca1b 2004-05-15 devnull
316 5cedca1b 2004-05-15 devnull /*
317 5cedca1b 2004-05-15 devnull * Now we look for font names
318 5cedca1b 2004-05-15 devnull */
319 5cedca1b 2004-05-15 devnull for (k = 1; fontlab[k] != i; k++) {
320 5cedca1b 2004-05-15 devnull if (k > MAXFONTS)
321 5cedca1b 2004-05-15 devnull return(-1); /* running out of fontlab space */
322 5cedca1b 2004-05-15 devnull if (fontlab[k] == 0) { /* passed all existing names */
323 5cedca1b 2004-05-15 devnull if (setfp(k, i, (char *) 0, 1) == -1)
324 5cedca1b 2004-05-15 devnull return(-1);
325 5cedca1b 2004-05-15 devnull else {
326 5cedca1b 2004-05-15 devnull fontlab[k] = i; /* install the name */
327 5cedca1b 2004-05-15 devnull return(k);
328 5cedca1b 2004-05-15 devnull }
329 5cedca1b 2004-05-15 devnull }
330 5cedca1b 2004-05-15 devnull }
331 5cedca1b 2004-05-15 devnull return(k); /* was one of the existing names */
332 5cedca1b 2004-05-15 devnull }
333 5cedca1b 2004-05-15 devnull
334 5cedca1b 2004-05-15 devnull
335 5cedca1b 2004-05-15 devnull void caseps(void)
336 5cedca1b 2004-05-15 devnull {
337 5cedca1b 2004-05-15 devnull int i;
338 5cedca1b 2004-05-15 devnull
339 5cedca1b 2004-05-15 devnull if (TROFF) {
340 5cedca1b 2004-05-15 devnull if(skip())
341 5cedca1b 2004-05-15 devnull i = apts1;
342 5cedca1b 2004-05-15 devnull else {
343 5cedca1b 2004-05-15 devnull noscale++;
344 5cedca1b 2004-05-15 devnull i = inumb(&apts); /* this is a disaster for fractional point sizes */
345 5cedca1b 2004-05-15 devnull noscale = 0;
346 5cedca1b 2004-05-15 devnull if(nonumb)
347 5cedca1b 2004-05-15 devnull i = apts1;
348 5cedca1b 2004-05-15 devnull }
349 5cedca1b 2004-05-15 devnull casps1(i);
350 5cedca1b 2004-05-15 devnull }
351 5cedca1b 2004-05-15 devnull }
352 5cedca1b 2004-05-15 devnull
353 5cedca1b 2004-05-15 devnull
354 5cedca1b 2004-05-15 devnull void casps1(int i)
355 5cedca1b 2004-05-15 devnull {
356 5cedca1b 2004-05-15 devnull
357 5cedca1b 2004-05-15 devnull /*
358 5cedca1b 2004-05-15 devnull * in olden times, it used to ignore changes to 0 or negative.
359 5cedca1b 2004-05-15 devnull * this is meant to allow the requested size to be anything,
360 5cedca1b 2004-05-15 devnull * in particular so eqn can generate lots of \s-3's and still
361 5cedca1b 2004-05-15 devnull * get back by matching \s+3's.
362 5cedca1b 2004-05-15 devnull
363 5cedca1b 2004-05-15 devnull if (i <= 0)
364 5cedca1b 2004-05-15 devnull return;
365 5cedca1b 2004-05-15 devnull */
366 5cedca1b 2004-05-15 devnull apts1 = apts;
367 5cedca1b 2004-05-15 devnull apts = i;
368 5cedca1b 2004-05-15 devnull pts1 = pts;
369 5cedca1b 2004-05-15 devnull pts = findps(i);
370 5cedca1b 2004-05-15 devnull mchbits();
371 5cedca1b 2004-05-15 devnull }
372 5cedca1b 2004-05-15 devnull
373 c5561c23 2004-05-16 devnull int
374 5cedca1b 2004-05-15 devnull findps(int i)
375 5cedca1b 2004-05-15 devnull {
376 5cedca1b 2004-05-15 devnull int j, k;
377 5cedca1b 2004-05-15 devnull
378 5cedca1b 2004-05-15 devnull for (j=k=0 ; pstab[j] != 0 ; j++)
379 5cedca1b 2004-05-15 devnull if (abs(pstab[j]-i) < abs(pstab[k]-i))
380 5cedca1b 2004-05-15 devnull k = j;
381 5cedca1b 2004-05-15 devnull
382 5cedca1b 2004-05-15 devnull return(pstab[k]);
383 5cedca1b 2004-05-15 devnull }
384 5cedca1b 2004-05-15 devnull
385 5cedca1b 2004-05-15 devnull
386 5cedca1b 2004-05-15 devnull void t_mchbits(void)
387 5cedca1b 2004-05-15 devnull {
388 5cedca1b 2004-05-15 devnull int i, j, k;
389 5cedca1b 2004-05-15 devnull
390 5cedca1b 2004-05-15 devnull i = pts;
391 5cedca1b 2004-05-15 devnull for (j = 0; i > (k = pstab[j]); j++)
392 5cedca1b 2004-05-15 devnull if (!k) {
393 5cedca1b 2004-05-15 devnull j--;
394 5cedca1b 2004-05-15 devnull break;
395 5cedca1b 2004-05-15 devnull }
396 5cedca1b 2004-05-15 devnull chbits = 0;
397 5cedca1b 2004-05-15 devnull setsbits(chbits, ++j);
398 5cedca1b 2004-05-15 devnull setfbits(chbits, font);
399 5cedca1b 2004-05-15 devnull sps = width(' ' | chbits);
400 5cedca1b 2004-05-15 devnull zapwcache(1);
401 5cedca1b 2004-05-15 devnull }
402 5cedca1b 2004-05-15 devnull
403 5cedca1b 2004-05-15 devnull void t_setps(void)
404 5cedca1b 2004-05-15 devnull {
405 5cedca1b 2004-05-15 devnull int i, j;
406 5cedca1b 2004-05-15 devnull
407 c5561c23 2004-05-16 devnull j = 0;
408 5cedca1b 2004-05-15 devnull i = cbits(getch());
409 5cedca1b 2004-05-15 devnull if (isdigit(i)) { /* \sd or \sdd */
410 5cedca1b 2004-05-15 devnull i -= '0';
411 5cedca1b 2004-05-15 devnull if (i == 0) /* \s0 */
412 5cedca1b 2004-05-15 devnull j = apts1;
413 5cedca1b 2004-05-15 devnull else if (i <= 3 && (ch=getch()) && isdigit(j = cbits(ch))) { /* \sdd */
414 5cedca1b 2004-05-15 devnull j = 10 * i + j - '0';
415 5cedca1b 2004-05-15 devnull ch = 0;
416 5cedca1b 2004-05-15 devnull } else /* \sd */
417 5cedca1b 2004-05-15 devnull j = i;
418 5cedca1b 2004-05-15 devnull } else if (i == '(') { /* \s(dd */
419 5cedca1b 2004-05-15 devnull j = cbits(getch()) - '0';
420 5cedca1b 2004-05-15 devnull j = 10 * j + cbits(getch()) - '0';
421 5cedca1b 2004-05-15 devnull if (j == 0) /* \s(00 */
422 5cedca1b 2004-05-15 devnull j = apts1;
423 5cedca1b 2004-05-15 devnull } else if (i == '+' || i == '-') { /* \s+, \s- */
424 5cedca1b 2004-05-15 devnull j = cbits(getch());
425 5cedca1b 2004-05-15 devnull if (isdigit(j)) { /* \s+d, \s-d */
426 5cedca1b 2004-05-15 devnull j -= '0';
427 5cedca1b 2004-05-15 devnull } else if (j == '(') { /* \s+(dd, \s-(dd */
428 5cedca1b 2004-05-15 devnull j = cbits(getch()) - '0';
429 5cedca1b 2004-05-15 devnull j = 10 * j + cbits(getch()) - '0';
430 5cedca1b 2004-05-15 devnull }
431 5cedca1b 2004-05-15 devnull if (i == '-')
432 5cedca1b 2004-05-15 devnull j = -j;
433 5cedca1b 2004-05-15 devnull j += apts;
434 5cedca1b 2004-05-15 devnull }
435 5cedca1b 2004-05-15 devnull casps1(j);
436 5cedca1b 2004-05-15 devnull }
437 5cedca1b 2004-05-15 devnull
438 5cedca1b 2004-05-15 devnull
439 5cedca1b 2004-05-15 devnull Tchar t_setht(void) /* set character height from \H'...' */
440 5cedca1b 2004-05-15 devnull {
441 5cedca1b 2004-05-15 devnull int n;
442 5cedca1b 2004-05-15 devnull Tchar c;
443 5cedca1b 2004-05-15 devnull
444 5cedca1b 2004-05-15 devnull getch();
445 5cedca1b 2004-05-15 devnull n = inumb(&apts);
446 5cedca1b 2004-05-15 devnull getch();
447 5cedca1b 2004-05-15 devnull if (n == 0 || nonumb)
448 5cedca1b 2004-05-15 devnull n = apts; /* does this work? */
449 5cedca1b 2004-05-15 devnull c = CHARHT;
450 5cedca1b 2004-05-15 devnull c |= ZBIT;
451 5cedca1b 2004-05-15 devnull setsbits(c, n);
452 5cedca1b 2004-05-15 devnull setfbits(c, pts); /* sneaky, CHARHT font bits are size bits */
453 5cedca1b 2004-05-15 devnull return(c);
454 5cedca1b 2004-05-15 devnull }
455 5cedca1b 2004-05-15 devnull
456 5cedca1b 2004-05-15 devnull Tchar t_setslant(void) /* set slant from \S'...' */
457 5cedca1b 2004-05-15 devnull {
458 5cedca1b 2004-05-15 devnull int n;
459 5cedca1b 2004-05-15 devnull Tchar c;
460 5cedca1b 2004-05-15 devnull
461 5cedca1b 2004-05-15 devnull getch();
462 5cedca1b 2004-05-15 devnull n = 0;
463 5cedca1b 2004-05-15 devnull n = inumb(&n);
464 5cedca1b 2004-05-15 devnull getch();
465 5cedca1b 2004-05-15 devnull if (nonumb)
466 5cedca1b 2004-05-15 devnull n = 0;
467 5cedca1b 2004-05-15 devnull c = SLANT;
468 5cedca1b 2004-05-15 devnull c |= ZBIT;
469 5cedca1b 2004-05-15 devnull setsfbits(c, n+180);
470 5cedca1b 2004-05-15 devnull return(c);
471 5cedca1b 2004-05-15 devnull }
472 5cedca1b 2004-05-15 devnull
473 5cedca1b 2004-05-15 devnull
474 5cedca1b 2004-05-15 devnull void caseft(void)
475 5cedca1b 2004-05-15 devnull {
476 5cedca1b 2004-05-15 devnull if (!TROFF) {
477 5cedca1b 2004-05-15 devnull n_caseft();
478 5cedca1b 2004-05-15 devnull return;
479 5cedca1b 2004-05-15 devnull }
480 5cedca1b 2004-05-15 devnull skip();
481 5cedca1b 2004-05-15 devnull setfont(1);
482 5cedca1b 2004-05-15 devnull }
483 5cedca1b 2004-05-15 devnull
484 5cedca1b 2004-05-15 devnull
485 5cedca1b 2004-05-15 devnull void t_setfont(int a)
486 5cedca1b 2004-05-15 devnull {
487 5cedca1b 2004-05-15 devnull int i, j;
488 5cedca1b 2004-05-15 devnull
489 5cedca1b 2004-05-15 devnull if (a)
490 5cedca1b 2004-05-15 devnull i = getrq();
491 fa325e9b 2020-01-10 cross else
492 5cedca1b 2004-05-15 devnull i = getsn();
493 5cedca1b 2004-05-15 devnull if (!i || i == 'P') {
494 5cedca1b 2004-05-15 devnull j = font1;
495 5cedca1b 2004-05-15 devnull goto s0;
496 5cedca1b 2004-05-15 devnull }
497 5cedca1b 2004-05-15 devnull if (/* i == 'S' || */ i == '0') /* an experiment -- why can't we change to it? */
498 5cedca1b 2004-05-15 devnull return;
499 5cedca1b 2004-05-15 devnull if ((j = findft(i)) == -1)
500 5cedca1b 2004-05-15 devnull if ((j = setfp(0, i, (char*) 0, 1)) == -1) /* try to put it in position 0 */
501 5cedca1b 2004-05-15 devnull return;
502 5cedca1b 2004-05-15 devnull s0:
503 5cedca1b 2004-05-15 devnull font1 = font;
504 5cedca1b 2004-05-15 devnull font = j;
505 5cedca1b 2004-05-15 devnull mchbits();
506 5cedca1b 2004-05-15 devnull }
507 5cedca1b 2004-05-15 devnull
508 5cedca1b 2004-05-15 devnull
509 5cedca1b 2004-05-15 devnull void t_setwd(void)
510 5cedca1b 2004-05-15 devnull {
511 5cedca1b 2004-05-15 devnull int base, wid;
512 5cedca1b 2004-05-15 devnull Tchar i;
513 5cedca1b 2004-05-15 devnull int delim, emsz, k;
514 5cedca1b 2004-05-15 devnull int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
515 5cedca1b 2004-05-15 devnull
516 5cedca1b 2004-05-15 devnull base = numtabp[ST].val = numtabp[SB].val = wid = numtabp[CT].val = 0;
517 5cedca1b 2004-05-15 devnull if (ismot(i = getch()))
518 5cedca1b 2004-05-15 devnull return;
519 5cedca1b 2004-05-15 devnull delim = cbits(i);
520 5cedca1b 2004-05-15 devnull savhp = numtabp[HP].val;
521 5cedca1b 2004-05-15 devnull numtabp[HP].val = 0;
522 5cedca1b 2004-05-15 devnull savapts = apts;
523 5cedca1b 2004-05-15 devnull savapts1 = apts1;
524 5cedca1b 2004-05-15 devnull savfont = font;
525 5cedca1b 2004-05-15 devnull savfont1 = font1;
526 5cedca1b 2004-05-15 devnull savpts = pts;
527 5cedca1b 2004-05-15 devnull savpts1 = pts1;
528 5cedca1b 2004-05-15 devnull setwdf++;
529 5cedca1b 2004-05-15 devnull while (cbits(i = getch()) != delim && !nlflg) {
530 5cedca1b 2004-05-15 devnull k = width(i);
531 5cedca1b 2004-05-15 devnull wid += k;
532 5cedca1b 2004-05-15 devnull numtabp[HP].val += k;
533 5cedca1b 2004-05-15 devnull if (!ismot(i)) {
534 5cedca1b 2004-05-15 devnull emsz = (INCH/72) * xpts;
535 5cedca1b 2004-05-15 devnull } else if (isvmot(i)) {
536 5cedca1b 2004-05-15 devnull k = absmot(i);
537 5cedca1b 2004-05-15 devnull if (isnmot(i))
538 5cedca1b 2004-05-15 devnull k = -k;
539 5cedca1b 2004-05-15 devnull base -= k;
540 5cedca1b 2004-05-15 devnull emsz = 0;
541 fa325e9b 2020-01-10 cross } else
542 5cedca1b 2004-05-15 devnull continue;
543 5cedca1b 2004-05-15 devnull if (base < numtabp[SB].val)
544 5cedca1b 2004-05-15 devnull numtabp[SB].val = base;
545 5cedca1b 2004-05-15 devnull if ((k = base + emsz) > numtabp[ST].val)
546 5cedca1b 2004-05-15 devnull numtabp[ST].val = k;
547 5cedca1b 2004-05-15 devnull }
548 5cedca1b 2004-05-15 devnull setn1(wid, 0, (Tchar) 0);
549 5cedca1b 2004-05-15 devnull numtabp[HP].val = savhp;
550 5cedca1b 2004-05-15 devnull apts = savapts;
551 5cedca1b 2004-05-15 devnull apts1 = savapts1;
552 5cedca1b 2004-05-15 devnull font = savfont;
553 5cedca1b 2004-05-15 devnull font1 = savfont1;
554 5cedca1b 2004-05-15 devnull pts = savpts;
555 5cedca1b 2004-05-15 devnull pts1 = savpts1;
556 5cedca1b 2004-05-15 devnull mchbits();
557 5cedca1b 2004-05-15 devnull setwdf = 0;
558 5cedca1b 2004-05-15 devnull }
559 5cedca1b 2004-05-15 devnull
560 5cedca1b 2004-05-15 devnull
561 5cedca1b 2004-05-15 devnull Tchar t_vmot(void)
562 5cedca1b 2004-05-15 devnull {
563 5cedca1b 2004-05-15 devnull dfact = lss;
564 5cedca1b 2004-05-15 devnull vflag++;
565 5cedca1b 2004-05-15 devnull return t_mot();
566 5cedca1b 2004-05-15 devnull }
567 5cedca1b 2004-05-15 devnull
568 5cedca1b 2004-05-15 devnull
569 5cedca1b 2004-05-15 devnull Tchar t_hmot(void)
570 5cedca1b 2004-05-15 devnull {
571 5cedca1b 2004-05-15 devnull dfact = EM;
572 5cedca1b 2004-05-15 devnull return t_mot();
573 5cedca1b 2004-05-15 devnull }
574 5cedca1b 2004-05-15 devnull
575 5cedca1b 2004-05-15 devnull
576 5cedca1b 2004-05-15 devnull Tchar t_mot(void)
577 5cedca1b 2004-05-15 devnull {
578 5cedca1b 2004-05-15 devnull int j, n;
579 5cedca1b 2004-05-15 devnull Tchar i;
580 5cedca1b 2004-05-15 devnull
581 5cedca1b 2004-05-15 devnull j = HOR;
582 5cedca1b 2004-05-15 devnull getch(); /*eat delim*/
583 5cedca1b 2004-05-15 devnull if (n = atoi0()) {
584 5cedca1b 2004-05-15 devnull if (vflag)
585 5cedca1b 2004-05-15 devnull j = VERT;
586 5cedca1b 2004-05-15 devnull i = makem(quant(n, j));
587 5cedca1b 2004-05-15 devnull } else
588 5cedca1b 2004-05-15 devnull i = 0;
589 5cedca1b 2004-05-15 devnull getch();
590 5cedca1b 2004-05-15 devnull vflag = 0;
591 5cedca1b 2004-05-15 devnull dfact = 1;
592 5cedca1b 2004-05-15 devnull return(i);
593 5cedca1b 2004-05-15 devnull }
594 5cedca1b 2004-05-15 devnull
595 5cedca1b 2004-05-15 devnull
596 5cedca1b 2004-05-15 devnull Tchar t_sethl(int k)
597 5cedca1b 2004-05-15 devnull {
598 5cedca1b 2004-05-15 devnull int j;
599 5cedca1b 2004-05-15 devnull Tchar i;
600 5cedca1b 2004-05-15 devnull
601 5cedca1b 2004-05-15 devnull j = EM / 2;
602 5cedca1b 2004-05-15 devnull if (k == 'u')
603 5cedca1b 2004-05-15 devnull j = -j;
604 5cedca1b 2004-05-15 devnull else if (k == 'r')
605 5cedca1b 2004-05-15 devnull j = -2 * j;
606 5cedca1b 2004-05-15 devnull vflag++;
607 5cedca1b 2004-05-15 devnull i = makem(j);
608 5cedca1b 2004-05-15 devnull vflag = 0;
609 5cedca1b 2004-05-15 devnull return(i);
610 5cedca1b 2004-05-15 devnull }
611 5cedca1b 2004-05-15 devnull
612 5cedca1b 2004-05-15 devnull
613 5cedca1b 2004-05-15 devnull Tchar t_makem(int i)
614 5cedca1b 2004-05-15 devnull {
615 5cedca1b 2004-05-15 devnull Tchar j;
616 5cedca1b 2004-05-15 devnull
617 5cedca1b 2004-05-15 devnull if (i >= 0)
618 5cedca1b 2004-05-15 devnull j = i;
619 5cedca1b 2004-05-15 devnull else
620 5cedca1b 2004-05-15 devnull j = -i;
621 5cedca1b 2004-05-15 devnull if (Hor > 1 && !vflag)
622 5cedca1b 2004-05-15 devnull j = (j + Hor/2)/Hor * Hor;
623 5cedca1b 2004-05-15 devnull j |= MOT;
624 5cedca1b 2004-05-15 devnull if (i < 0)
625 5cedca1b 2004-05-15 devnull j |= NMOT;
626 5cedca1b 2004-05-15 devnull if (vflag)
627 5cedca1b 2004-05-15 devnull j |= VMOT;
628 5cedca1b 2004-05-15 devnull return(j);
629 5cedca1b 2004-05-15 devnull }
630 5cedca1b 2004-05-15 devnull
631 5cedca1b 2004-05-15 devnull
632 5cedca1b 2004-05-15 devnull Tchar getlg(Tchar i)
633 5cedca1b 2004-05-15 devnull {
634 5cedca1b 2004-05-15 devnull Tchar j, k;
635 5cedca1b 2004-05-15 devnull int lf;
636 5cedca1b 2004-05-15 devnull
637 5cedca1b 2004-05-15 devnull if (!TROFF)
638 5cedca1b 2004-05-15 devnull return i;
639 5cedca1b 2004-05-15 devnull if ((lf = fonts[fbits(i)].ligfont) == 0) /* font lacks ligatures */
640 5cedca1b 2004-05-15 devnull return(i);
641 5cedca1b 2004-05-15 devnull j = getch0();
642 5cedca1b 2004-05-15 devnull if (cbits(j) == 'i' && (lf & LFI))
643 5cedca1b 2004-05-15 devnull j = LIG_FI;
644 5cedca1b 2004-05-15 devnull else if (cbits(j) == 'l' && (lf & LFL))
645 5cedca1b 2004-05-15 devnull j = LIG_FL;
646 5cedca1b 2004-05-15 devnull else if (cbits(j) == 'f' && (lf & LFF)) {
647 5cedca1b 2004-05-15 devnull if ((lf & (LFFI|LFFL)) && lg != 2) {
648 5cedca1b 2004-05-15 devnull k = getch0();
649 5cedca1b 2004-05-15 devnull if (cbits(k)=='i' && (lf&LFFI))
650 5cedca1b 2004-05-15 devnull j = LIG_FFI;
651 5cedca1b 2004-05-15 devnull else if (cbits(k)=='l' && (lf&LFFL))
652 5cedca1b 2004-05-15 devnull j = LIG_FFL;
653 5cedca1b 2004-05-15 devnull else {
654 5cedca1b 2004-05-15 devnull *pbp++ = k;
655 5cedca1b 2004-05-15 devnull j = LIG_FF;
656 5cedca1b 2004-05-15 devnull }
657 fa325e9b 2020-01-10 cross } else
658 5cedca1b 2004-05-15 devnull j = LIG_FF;
659 5cedca1b 2004-05-15 devnull } else {
660 5cedca1b 2004-05-15 devnull *pbp++ = j;
661 5cedca1b 2004-05-15 devnull j = i;
662 5cedca1b 2004-05-15 devnull }
663 5cedca1b 2004-05-15 devnull return(i & SFMASK | j);
664 5cedca1b 2004-05-15 devnull }
665 5cedca1b 2004-05-15 devnull
666 5cedca1b 2004-05-15 devnull
667 5cedca1b 2004-05-15 devnull void caselg(void)
668 5cedca1b 2004-05-15 devnull {
669 5cedca1b 2004-05-15 devnull
670 5cedca1b 2004-05-15 devnull if(TROFF) {
671 5cedca1b 2004-05-15 devnull skip();
672 5cedca1b 2004-05-15 devnull lg = atoi0();
673 5cedca1b 2004-05-15 devnull if (nonumb)
674 5cedca1b 2004-05-15 devnull lg = 1;
675 5cedca1b 2004-05-15 devnull }
676 5cedca1b 2004-05-15 devnull }
677 5cedca1b 2004-05-15 devnull
678 5cedca1b 2004-05-15 devnull void casefp(void)
679 5cedca1b 2004-05-15 devnull {
680 5cedca1b 2004-05-15 devnull int i, j;
681 5cedca1b 2004-05-15 devnull
682 5cedca1b 2004-05-15 devnull if (!TROFF) {
683 5cedca1b 2004-05-15 devnull n_casefp();
684 5cedca1b 2004-05-15 devnull return;
685 5cedca1b 2004-05-15 devnull }
686 5cedca1b 2004-05-15 devnull skip();
687 5cedca1b 2004-05-15 devnull i = cbits(getch());
688 5cedca1b 2004-05-15 devnull if (isdigit(i)) {
689 5cedca1b 2004-05-15 devnull i -= '0';
690 5cedca1b 2004-05-15 devnull j = cbits(getch());
691 5cedca1b 2004-05-15 devnull if (isdigit(j))
692 5cedca1b 2004-05-15 devnull i = 10 * i + j - '0';
693 5cedca1b 2004-05-15 devnull }
694 5cedca1b 2004-05-15 devnull if (i <= 0 || i > nfonts)
695 5cedca1b 2004-05-15 devnull ERROR "fp: bad font position %d", i WARN;
696 5cedca1b 2004-05-15 devnull else if (skip() || !(j = getrq()))
697 fa325e9b 2020-01-10 cross ERROR "fp: no font name" WARN;
698 5cedca1b 2004-05-15 devnull else if (skip() || !getname())
699 5cedca1b 2004-05-15 devnull setfp(i, j, (char*) 0, 1);
700 5cedca1b 2004-05-15 devnull else /* 3rd argument = filename */
701 5cedca1b 2004-05-15 devnull setfp(i, j, nextf, 1);
702 5cedca1b 2004-05-15 devnull }
703 5cedca1b 2004-05-15 devnull
704 5cedca1b 2004-05-15 devnull char *strdupl(const char *s) /* make a copy of s */
705 5cedca1b 2004-05-15 devnull {
706 5cedca1b 2004-05-15 devnull char *t;
707 5cedca1b 2004-05-15 devnull
708 5cedca1b 2004-05-15 devnull t = (char *) malloc(strlen(s) + 1);
709 5cedca1b 2004-05-15 devnull if (t == NULL)
710 5cedca1b 2004-05-15 devnull ERROR "out of space in strdupl(%s)", s FATAL;
711 5cedca1b 2004-05-15 devnull strcpy(t, s);
712 5cedca1b 2004-05-15 devnull return t;
713 5cedca1b 2004-05-15 devnull }
714 5cedca1b 2004-05-15 devnull
715 c5561c23 2004-05-16 devnull int
716 5cedca1b 2004-05-15 devnull setfp(int pos, int f, char *truename, int print) /* mount font f at position pos[0...nfonts] */
717 5cedca1b 2004-05-15 devnull {
718 c5bfba48 2012-10-21 rsc char pathname[NS], shortname[NS];
719 5cedca1b 2004-05-15 devnull
720 5cedca1b 2004-05-15 devnull zapwcache(0);
721 5cedca1b 2004-05-15 devnull if (truename)
722 5cedca1b 2004-05-15 devnull strcpy(shortname, truename);
723 5cedca1b 2004-05-15 devnull else
724 5cedca1b 2004-05-15 devnull strcpy(shortname, (char *) unpair(f));
725 5cedca1b 2004-05-15 devnull if (truename && strrchr(truename, '/')) { /* .fp 1 R dir/file: use verbatim */
726 fafa622a 2020-01-12 rsc snprintf(pathname, NS, "%s", truename);
727 5cedca1b 2004-05-15 devnull if (fonts[pos].truename)
728 5cedca1b 2004-05-15 devnull free(fonts[pos].truename);
729 5cedca1b 2004-05-15 devnull fonts[pos].truename = strdupl(truename);
730 5cedca1b 2004-05-15 devnull } else if (truename) { /* synonym: .fp 1 R Avant */
731 fafa622a 2020-01-12 rsc snprintf(pathname, NS, "%s/dev%s/%s", fontdir, devname, truename);
732 5cedca1b 2004-05-15 devnull truename = 0; /* so doesn't get repeated by ptfpcmd */
733 5cedca1b 2004-05-15 devnull } else /* vanilla: .fp 5 XX */
734 fafa622a 2020-01-12 rsc snprintf(pathname, NS, "%s/dev%s/%s", fontdir, devname, shortname);
735 5cedca1b 2004-05-15 devnull if (truename == 0 && fonts[pos].truename != 0) {
736 5cedca1b 2004-05-15 devnull free(fonts[pos].truename);
737 5cedca1b 2004-05-15 devnull fonts[pos].truename = 0;
738 5cedca1b 2004-05-15 devnull }
739 5cedca1b 2004-05-15 devnull if (getfont(pathname, pos) < 0) {
740 5cedca1b 2004-05-15 devnull ERROR "Can't open font file %s", pathname WARN;
741 5cedca1b 2004-05-15 devnull return -1;
742 5cedca1b 2004-05-15 devnull }
743 5cedca1b 2004-05-15 devnull if (print && !ascii) {
744 5cedca1b 2004-05-15 devnull ptfpcmd(pos, fonts[pos].longname, truename);
745 5cedca1b 2004-05-15 devnull ptfont();
746 5cedca1b 2004-05-15 devnull }
747 5cedca1b 2004-05-15 devnull if (pos == smnt) {
748 fa325e9b 2020-01-10 cross smnt = 0;
749 fa325e9b 2020-01-10 cross sbold = 0;
750 5cedca1b 2004-05-15 devnull }
751 5cedca1b 2004-05-15 devnull fontlab[pos] = f;
752 5cedca1b 2004-05-15 devnull if (smnt == 0 && fonts[pos].specfont)
753 5cedca1b 2004-05-15 devnull smnt = pos;
754 5cedca1b 2004-05-15 devnull bdtab[pos] = cstab[pos] = ccstab[pos] = 0;
755 5cedca1b 2004-05-15 devnull return pos;
756 5cedca1b 2004-05-15 devnull }
757 5cedca1b 2004-05-15 devnull
758 5cedca1b 2004-05-15 devnull /*
759 5cedca1b 2004-05-15 devnull * .cs request; don't check legality of optional arguments
760 5cedca1b 2004-05-15 devnull */
761 5cedca1b 2004-05-15 devnull void casecs(void)
762 5cedca1b 2004-05-15 devnull {
763 5cedca1b 2004-05-15 devnull int i, j;
764 5cedca1b 2004-05-15 devnull
765 5cedca1b 2004-05-15 devnull if (TROFF) {
766 5cedca1b 2004-05-15 devnull int savtr = trace;
767 5cedca1b 2004-05-15 devnull
768 5cedca1b 2004-05-15 devnull trace = 0;
769 5cedca1b 2004-05-15 devnull noscale++;
770 5cedca1b 2004-05-15 devnull skip();
771 5cedca1b 2004-05-15 devnull if (!(i = getrq()) || (i = findft(i)) < 0)
772 5cedca1b 2004-05-15 devnull goto rtn;
773 5cedca1b 2004-05-15 devnull skip();
774 5cedca1b 2004-05-15 devnull cstab[i] = atoi0();
775 5cedca1b 2004-05-15 devnull skip();
776 5cedca1b 2004-05-15 devnull j = atoi0();
777 5cedca1b 2004-05-15 devnull if(nonumb)
778 5cedca1b 2004-05-15 devnull ccstab[i] = 0;
779 5cedca1b 2004-05-15 devnull else
780 5cedca1b 2004-05-15 devnull ccstab[i] = findps(j);
781 5cedca1b 2004-05-15 devnull rtn:
782 5cedca1b 2004-05-15 devnull zapwcache(0);
783 5cedca1b 2004-05-15 devnull noscale = 0;
784 5cedca1b 2004-05-15 devnull trace = savtr;
785 5cedca1b 2004-05-15 devnull }
786 5cedca1b 2004-05-15 devnull }
787 5cedca1b 2004-05-15 devnull
788 5cedca1b 2004-05-15 devnull
789 5cedca1b 2004-05-15 devnull void casebd(void)
790 5cedca1b 2004-05-15 devnull {
791 5cedca1b 2004-05-15 devnull int i, j, k;
792 5cedca1b 2004-05-15 devnull
793 c5561c23 2004-05-16 devnull j=0;
794 5cedca1b 2004-05-15 devnull if (!TROFF) {
795 5cedca1b 2004-05-15 devnull n_casebd();
796 5cedca1b 2004-05-15 devnull return;
797 5cedca1b 2004-05-15 devnull }
798 5cedca1b 2004-05-15 devnull zapwcache(0);
799 5cedca1b 2004-05-15 devnull k = 0;
800 5cedca1b 2004-05-15 devnull bd0:
801 5cedca1b 2004-05-15 devnull if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
802 5cedca1b 2004-05-15 devnull if (k)
803 5cedca1b 2004-05-15 devnull goto bd1;
804 fa325e9b 2020-01-10 cross else
805 5cedca1b 2004-05-15 devnull return;
806 5cedca1b 2004-05-15 devnull }
807 5cedca1b 2004-05-15 devnull if (j == smnt) {
808 5cedca1b 2004-05-15 devnull k = smnt;
809 5cedca1b 2004-05-15 devnull goto bd0;
810 5cedca1b 2004-05-15 devnull }
811 5cedca1b 2004-05-15 devnull if (k) {
812 5cedca1b 2004-05-15 devnull sbold = j;
813 5cedca1b 2004-05-15 devnull j = k;
814 5cedca1b 2004-05-15 devnull }
815 5cedca1b 2004-05-15 devnull bd1:
816 5cedca1b 2004-05-15 devnull skip();
817 5cedca1b 2004-05-15 devnull noscale++;
818 5cedca1b 2004-05-15 devnull bdtab[j] = atoi0();
819 5cedca1b 2004-05-15 devnull noscale = 0;
820 5cedca1b 2004-05-15 devnull }
821 5cedca1b 2004-05-15 devnull
822 5cedca1b 2004-05-15 devnull
823 5cedca1b 2004-05-15 devnull void casevs(void)
824 5cedca1b 2004-05-15 devnull {
825 5cedca1b 2004-05-15 devnull int i;
826 5cedca1b 2004-05-15 devnull
827 5cedca1b 2004-05-15 devnull if (!TROFF) {
828 5cedca1b 2004-05-15 devnull n_casevs();
829 5cedca1b 2004-05-15 devnull return;
830 5cedca1b 2004-05-15 devnull }
831 5cedca1b 2004-05-15 devnull skip();
832 5cedca1b 2004-05-15 devnull vflag++;
833 5cedca1b 2004-05-15 devnull dfact = INCH; /* default scaling is points! */
834 5cedca1b 2004-05-15 devnull dfactd = 72;
835 5cedca1b 2004-05-15 devnull res = VERT;
836 5cedca1b 2004-05-15 devnull i = inumb(&lss);
837 5cedca1b 2004-05-15 devnull if (nonumb)
838 5cedca1b 2004-05-15 devnull i = lss1;
839 fa325e9b 2020-01-10 cross if (i < VERT)
840 5cedca1b 2004-05-15 devnull i = VERT;
841 5cedca1b 2004-05-15 devnull lss1 = lss;
842 5cedca1b 2004-05-15 devnull lss = i;
843 5cedca1b 2004-05-15 devnull }
844 5cedca1b 2004-05-15 devnull
845 5cedca1b 2004-05-15 devnull
846 5cedca1b 2004-05-15 devnull void casess(void)
847 5cedca1b 2004-05-15 devnull {
848 5cedca1b 2004-05-15 devnull int i;
849 5cedca1b 2004-05-15 devnull
850 5cedca1b 2004-05-15 devnull if(TROFF) {
851 5cedca1b 2004-05-15 devnull noscale++;
852 5cedca1b 2004-05-15 devnull skip();
853 5cedca1b 2004-05-15 devnull if(i = atoi0()) {
854 5cedca1b 2004-05-15 devnull spacesz = i & 0177;
855 5cedca1b 2004-05-15 devnull zapwcache(0);
856 5cedca1b 2004-05-15 devnull sps = width(' ' | chbits);
857 5cedca1b 2004-05-15 devnull }
858 5cedca1b 2004-05-15 devnull noscale = 0;
859 5cedca1b 2004-05-15 devnull }
860 5cedca1b 2004-05-15 devnull }
861 5cedca1b 2004-05-15 devnull
862 5cedca1b 2004-05-15 devnull
863 5cedca1b 2004-05-15 devnull Tchar t_xlss(void)
864 5cedca1b 2004-05-15 devnull {
865 5cedca1b 2004-05-15 devnull /* stores \x'...' into two successive Tchars.
866 5cedca1b 2004-05-15 devnull /* the first contains HX, the second the value,
867 5cedca1b 2004-05-15 devnull /* encoded as a vertical motion.
868 5cedca1b 2004-05-15 devnull /* decoding is done in n2.c by pchar().
869 5cedca1b 2004-05-15 devnull */
870 5cedca1b 2004-05-15 devnull int i;
871 5cedca1b 2004-05-15 devnull
872 5cedca1b 2004-05-15 devnull getch();
873 5cedca1b 2004-05-15 devnull dfact = lss;
874 5cedca1b 2004-05-15 devnull i = quant(atoi0(), VERT);
875 5cedca1b 2004-05-15 devnull dfact = 1;
876 5cedca1b 2004-05-15 devnull getch();
877 5cedca1b 2004-05-15 devnull if (i >= 0)
878 5cedca1b 2004-05-15 devnull *pbp++ = MOT | VMOT | i;
879 5cedca1b 2004-05-15 devnull else
880 5cedca1b 2004-05-15 devnull *pbp++ = MOT | VMOT | NMOT | -i;
881 5cedca1b 2004-05-15 devnull return(HX);
882 5cedca1b 2004-05-15 devnull }
883 5cedca1b 2004-05-15 devnull
884 5cedca1b 2004-05-15 devnull Uchar *unpair(int i)
885 5cedca1b 2004-05-15 devnull {
886 5cedca1b 2004-05-15 devnull static Uchar name[3];
887 5cedca1b 2004-05-15 devnull
888 5cedca1b 2004-05-15 devnull name[0] = i & SHORTMASK;
889 5cedca1b 2004-05-15 devnull name[1] = (i >> SHORT) & SHORTMASK;
890 5cedca1b 2004-05-15 devnull name[2] = 0;
891 5cedca1b 2004-05-15 devnull return name;
892 5cedca1b 2004-05-15 devnull }