4 5cedca1b 2004-05-15 devnull * width functions, sizes and fonts
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"
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;
18 5cedca1b 2004-05-15 devnull t_width(Tchar j)
20 5cedca1b 2004-05-15 devnull int i, k;
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))
30 5cedca1b 2004-05-15 devnull return(k);
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);
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;
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;
54 5cedca1b 2004-05-15 devnull k = getcw(i);
56 5cedca1b 2004-05-15 devnull k += (bd - 1) * HOR;
60 5cedca1b 2004-05-15 devnull widthp = k;
61 5cedca1b 2004-05-15 devnull return(k);
65 5cedca1b 2004-05-15 devnull * clear width cache-- s means just space
67 5cedca1b 2004-05-15 devnull void zapwcache(int s)
72 5cedca1b 2004-05-15 devnull widcache[' '].fontpts = 0;
75 5cedca1b 2004-05-15 devnull for (i=0; i<NWIDCACHE; i++)
76 5cedca1b 2004-05-15 devnull widcache[i].fontpts = 0;
80 5cedca1b 2004-05-15 devnull onfont(int n, int f) /* is char n on font f? */
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;
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;
91 5cedca1b 2004-05-15 devnull return -1;
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];
108 5cedca1b 2004-05-15 devnull return -2; /* a \N that doesn't have an entry */
110 5cedca1b 2004-05-15 devnull return -1; /* vanilla not found */
114 5cedca1b 2004-05-15 devnull getcw(int i)
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;
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 */
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;
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;
158 5cedca1b 2004-05-15 devnull x = xpts;
159 5cedca1b 2004-05-15 devnull cs = (cs * EMPTS(x)) / 36;
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;
168 5cedca1b 2004-05-15 devnull widcache[i].fontpts = (xfont<<8) + xpts;
169 5cedca1b 2004-05-15 devnull widcache[i].width = k;
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.
182 5cedca1b 2004-05-15 devnull void xbits(Tchar i, int bitf)
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);
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;
196 5cedca1b 2004-05-15 devnull switch(bitf) {
198 5cedca1b 2004-05-15 devnull xfont = font;
199 5cedca1b 2004-05-15 devnull xpts = pts;
202 5cedca1b 2004-05-15 devnull xfont = pfont;
203 5cedca1b 2004-05-15 devnull xpts = ppts;
206 5cedca1b 2004-05-15 devnull xfont = mfont;
207 5cedca1b 2004-05-15 devnull xpts = mpts;
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. */
218 5cedca1b 2004-05-15 devnull Tchar t_setch(int c)
221 5cedca1b 2004-05-15 devnull char temp[50];
222 5cedca1b 2004-05-15 devnull char *s;
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)
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 */
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;
243 5cedca1b 2004-05-15 devnull return j | chbits;
245 5cedca1b 2004-05-15 devnull return chadd(temp, Troffchar, Install) | chbits; /* add name even if haven't seen it */
247 5cedca1b 2004-05-15 devnull #endif /*UNICODE*/
250 5cedca1b 2004-05-15 devnull Tchar t_setabs(void) /* set absolute char from \N'...' */
253 5cedca1b 2004-05-15 devnull char temp[10];
255 5cedca1b 2004-05-15 devnull getch(); /* delim */
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;
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.
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
291 5cedca1b 2004-05-15 devnull t_findft(int i)
294 5cedca1b 2004-05-15 devnull Uchar *p;
296 5cedca1b 2004-05-15 devnull p = unpair(i);
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 */
313 5cedca1b 2004-05-15 devnull * Now we look for font names
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);
322 5cedca1b 2004-05-15 devnull fontlab[k] = i; /* install the name */
323 5cedca1b 2004-05-15 devnull return(k);
327 5cedca1b 2004-05-15 devnull return(k); /* was one of the existing names */
331 5cedca1b 2004-05-15 devnull void caseps(void)
335 5cedca1b 2004-05-15 devnull if (TROFF) {
336 5cedca1b 2004-05-15 devnull if(skip())
337 5cedca1b 2004-05-15 devnull i = apts1;
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;
345 5cedca1b 2004-05-15 devnull casps1(i);
350 5cedca1b 2004-05-15 devnull void casps1(int i)
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.
359 5cedca1b 2004-05-15 devnull if (i <= 0)
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();
370 5cedca1b 2004-05-15 devnull findps(int i)
372 5cedca1b 2004-05-15 devnull int j, k;
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))
378 5cedca1b 2004-05-15 devnull return(pstab[k]);
382 5cedca1b 2004-05-15 devnull void t_mchbits(void)
384 5cedca1b 2004-05-15 devnull int i, j, k;
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) {
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);
399 5cedca1b 2004-05-15 devnull void t_setps(void)
401 5cedca1b 2004-05-15 devnull int i, j;
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';
412 5cedca1b 2004-05-15 devnull } else /* \sd */
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';
427 5cedca1b 2004-05-15 devnull if (i == '-')
429 5cedca1b 2004-05-15 devnull j += apts;
431 5cedca1b 2004-05-15 devnull casps1(j);
435 5cedca1b 2004-05-15 devnull Tchar t_setht(void) /* set character height from \H'...' */
438 5cedca1b 2004-05-15 devnull Tchar c;
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);
452 5cedca1b 2004-05-15 devnull Tchar t_setslant(void) /* set slant from \S'...' */
455 5cedca1b 2004-05-15 devnull Tchar c;
457 5cedca1b 2004-05-15 devnull getch();
459 5cedca1b 2004-05-15 devnull n = inumb(&n);
460 5cedca1b 2004-05-15 devnull getch();
461 5cedca1b 2004-05-15 devnull if (nonumb)
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);
470 5cedca1b 2004-05-15 devnull void caseft(void)
472 5cedca1b 2004-05-15 devnull if (!TROFF) {
473 5cedca1b 2004-05-15 devnull n_caseft();
477 5cedca1b 2004-05-15 devnull setfont(1);
481 5cedca1b 2004-05-15 devnull void t_setfont(int a)
483 5cedca1b 2004-05-15 devnull int i, j;
486 5cedca1b 2004-05-15 devnull i = getrq();
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;
493 5cedca1b 2004-05-15 devnull if (/* i == 'S' || */ i == '0') /* an experiment -- why can't we change to it? */
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 */
499 5cedca1b 2004-05-15 devnull font1 = font;
500 5cedca1b 2004-05-15 devnull font = j;
501 5cedca1b 2004-05-15 devnull mchbits();
505 5cedca1b 2004-05-15 devnull void t_setwd(void)
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;
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()))
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))
535 5cedca1b 2004-05-15 devnull base -= k;
536 5cedca1b 2004-05-15 devnull emsz = 0;
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;
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;
557 5cedca1b 2004-05-15 devnull Tchar t_vmot(void)
559 5cedca1b 2004-05-15 devnull dfact = lss;
560 5cedca1b 2004-05-15 devnull vflag++;
561 5cedca1b 2004-05-15 devnull return t_mot();
565 5cedca1b 2004-05-15 devnull Tchar t_hmot(void)
567 5cedca1b 2004-05-15 devnull dfact = EM;
568 5cedca1b 2004-05-15 devnull return t_mot();
572 5cedca1b 2004-05-15 devnull Tchar t_mot(void)
574 5cedca1b 2004-05-15 devnull int j, n;
575 5cedca1b 2004-05-15 devnull Tchar i;
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));
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);
592 5cedca1b 2004-05-15 devnull Tchar t_sethl(int k)
595 5cedca1b 2004-05-15 devnull Tchar i;
597 5cedca1b 2004-05-15 devnull j = EM / 2;
598 5cedca1b 2004-05-15 devnull if (k == 'u')
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);
609 5cedca1b 2004-05-15 devnull Tchar t_makem(int i)
611 5cedca1b 2004-05-15 devnull Tchar j;
613 5cedca1b 2004-05-15 devnull if (i >= 0)
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);
628 5cedca1b 2004-05-15 devnull Tchar getlg(Tchar i)
630 5cedca1b 2004-05-15 devnull Tchar j, k;
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;
650 5cedca1b 2004-05-15 devnull *pbp++ = k;
651 5cedca1b 2004-05-15 devnull j = LIG_FF;
654 5cedca1b 2004-05-15 devnull j = LIG_FF;
655 5cedca1b 2004-05-15 devnull } else {
656 5cedca1b 2004-05-15 devnull *pbp++ = j;
659 5cedca1b 2004-05-15 devnull return(i & SFMASK | j);
663 5cedca1b 2004-05-15 devnull void caselg(void)
666 5cedca1b 2004-05-15 devnull if(TROFF) {
668 5cedca1b 2004-05-15 devnull lg = atoi0();
669 5cedca1b 2004-05-15 devnull if (nonumb)
674 5cedca1b 2004-05-15 devnull void casefp(void)
676 5cedca1b 2004-05-15 devnull int i, j;
678 5cedca1b 2004-05-15 devnull if (!TROFF) {
679 5cedca1b 2004-05-15 devnull n_casefp();
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';
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);
700 5cedca1b 2004-05-15 devnull char *strdupl(const char *s) /* make a copy of s */
702 5cedca1b 2004-05-15 devnull char *t;
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;
712 5cedca1b 2004-05-15 devnull setfp(int pos, int f, char *truename, int print) /* mount font f at position pos[0...nfonts] */
714 5cedca1b 2004-05-15 devnull char pathname[NS], shortname[NS], *sl;
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);
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;
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;
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();
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;
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;
756 5cedca1b 2004-05-15 devnull * .cs request; don't check legality of optional arguments
758 5cedca1b 2004-05-15 devnull void casecs(void)
760 5cedca1b 2004-05-15 devnull int i, j;
762 5cedca1b 2004-05-15 devnull if (TROFF) {
763 5cedca1b 2004-05-15 devnull int savtr = trace;
765 5cedca1b 2004-05-15 devnull trace = 0;
766 5cedca1b 2004-05-15 devnull noscale++;
768 5cedca1b 2004-05-15 devnull if (!(i = getrq()) || (i = findft(i)) < 0)
769 5cedca1b 2004-05-15 devnull goto rtn;
771 5cedca1b 2004-05-15 devnull cstab[i] = atoi0();
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;
777 5cedca1b 2004-05-15 devnull ccstab[i] = findps(j);
779 5cedca1b 2004-05-15 devnull zapwcache(0);
780 5cedca1b 2004-05-15 devnull noscale = 0;
781 5cedca1b 2004-05-15 devnull trace = savtr;
786 5cedca1b 2004-05-15 devnull void casebd(void)
788 5cedca1b 2004-05-15 devnull int i, j, k;
791 5cedca1b 2004-05-15 devnull if (!TROFF) {
792 5cedca1b 2004-05-15 devnull n_casebd();
795 5cedca1b 2004-05-15 devnull zapwcache(0);
798 5cedca1b 2004-05-15 devnull if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
800 5cedca1b 2004-05-15 devnull goto bd1;
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;
808 5cedca1b 2004-05-15 devnull if (k) {
809 5cedca1b 2004-05-15 devnull sbold = j;
814 5cedca1b 2004-05-15 devnull noscale++;
815 5cedca1b 2004-05-15 devnull bdtab[j] = atoi0();
816 5cedca1b 2004-05-15 devnull noscale = 0;
820 5cedca1b 2004-05-15 devnull void casevs(void)
824 5cedca1b 2004-05-15 devnull if (!TROFF) {
825 5cedca1b 2004-05-15 devnull n_casevs();
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;
843 5cedca1b 2004-05-15 devnull void casess(void)
847 5cedca1b 2004-05-15 devnull if(TROFF) {
848 5cedca1b 2004-05-15 devnull noscale++;
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);
855 5cedca1b 2004-05-15 devnull noscale = 0;
860 5cedca1b 2004-05-15 devnull Tchar t_xlss(void)
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().
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;
877 5cedca1b 2004-05-15 devnull *pbp++ = MOT | VMOT | NMOT | -i;
878 5cedca1b 2004-05-15 devnull return(HX);
881 5cedca1b 2004-05-15 devnull Uchar *unpair(int i)
883 5cedca1b 2004-05-15 devnull static Uchar name[3];
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;