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])
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)
220 c5bfba48 2012-10-21 rsc #ifndef UNICODE
223 5cedca1b 2004-05-15 devnull char temp[50];
224 5cedca1b 2004-05-15 devnull char *s;
226 c5bfba48 2012-10-21 rsc #ifndef UNICODE
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)
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 */
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;
247 5cedca1b 2004-05-15 devnull return j | chbits;
249 5cedca1b 2004-05-15 devnull return chadd(temp, Troffchar, Install) | chbits; /* add name even if haven't seen it */
251 5cedca1b 2004-05-15 devnull #endif /*UNICODE*/
254 5cedca1b 2004-05-15 devnull Tchar t_setabs(void) /* set absolute char from \N'...' */
257 5cedca1b 2004-05-15 devnull char temp[10];
259 5cedca1b 2004-05-15 devnull getch(); /* delim */
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;
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.
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
295 5cedca1b 2004-05-15 devnull t_findft(int i)
298 5cedca1b 2004-05-15 devnull Uchar *p;
300 5cedca1b 2004-05-15 devnull p = unpair(i);
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 */
317 5cedca1b 2004-05-15 devnull * Now we look for font names
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);
326 5cedca1b 2004-05-15 devnull fontlab[k] = i; /* install the name */
327 5cedca1b 2004-05-15 devnull return(k);
331 5cedca1b 2004-05-15 devnull return(k); /* was one of the existing names */
335 5cedca1b 2004-05-15 devnull void caseps(void)
339 5cedca1b 2004-05-15 devnull if (TROFF) {
340 5cedca1b 2004-05-15 devnull if(skip())
341 5cedca1b 2004-05-15 devnull i = apts1;
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;
349 5cedca1b 2004-05-15 devnull casps1(i);
354 5cedca1b 2004-05-15 devnull void casps1(int i)
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.
363 5cedca1b 2004-05-15 devnull if (i <= 0)
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();
374 5cedca1b 2004-05-15 devnull findps(int i)
376 5cedca1b 2004-05-15 devnull int j, k;
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))
382 5cedca1b 2004-05-15 devnull return(pstab[k]);
386 5cedca1b 2004-05-15 devnull void t_mchbits(void)
388 5cedca1b 2004-05-15 devnull int i, j, k;
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) {
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);
403 5cedca1b 2004-05-15 devnull void t_setps(void)
405 5cedca1b 2004-05-15 devnull int i, j;
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';
416 5cedca1b 2004-05-15 devnull } else /* \sd */
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';
431 5cedca1b 2004-05-15 devnull if (i == '-')
433 5cedca1b 2004-05-15 devnull j += apts;
435 5cedca1b 2004-05-15 devnull casps1(j);
439 5cedca1b 2004-05-15 devnull Tchar t_setht(void) /* set character height from \H'...' */
442 5cedca1b 2004-05-15 devnull Tchar c;
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);
456 5cedca1b 2004-05-15 devnull Tchar t_setslant(void) /* set slant from \S'...' */
459 5cedca1b 2004-05-15 devnull Tchar c;
461 5cedca1b 2004-05-15 devnull getch();
463 5cedca1b 2004-05-15 devnull n = inumb(&n);
464 5cedca1b 2004-05-15 devnull getch();
465 5cedca1b 2004-05-15 devnull if (nonumb)
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);
474 5cedca1b 2004-05-15 devnull void caseft(void)
476 5cedca1b 2004-05-15 devnull if (!TROFF) {
477 5cedca1b 2004-05-15 devnull n_caseft();
481 5cedca1b 2004-05-15 devnull setfont(1);
485 5cedca1b 2004-05-15 devnull void t_setfont(int a)
487 5cedca1b 2004-05-15 devnull int i, j;
490 5cedca1b 2004-05-15 devnull i = getrq();
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;
497 5cedca1b 2004-05-15 devnull if (/* i == 'S' || */ i == '0') /* an experiment -- why can't we change to it? */
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 */
503 5cedca1b 2004-05-15 devnull font1 = font;
504 5cedca1b 2004-05-15 devnull font = j;
505 5cedca1b 2004-05-15 devnull mchbits();
509 5cedca1b 2004-05-15 devnull void t_setwd(void)
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;
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()))
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))
539 5cedca1b 2004-05-15 devnull base -= k;
540 5cedca1b 2004-05-15 devnull emsz = 0;
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;
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;
561 5cedca1b 2004-05-15 devnull Tchar t_vmot(void)
563 5cedca1b 2004-05-15 devnull dfact = lss;
564 5cedca1b 2004-05-15 devnull vflag++;
565 5cedca1b 2004-05-15 devnull return t_mot();
569 5cedca1b 2004-05-15 devnull Tchar t_hmot(void)
571 5cedca1b 2004-05-15 devnull dfact = EM;
572 5cedca1b 2004-05-15 devnull return t_mot();
576 5cedca1b 2004-05-15 devnull Tchar t_mot(void)
578 5cedca1b 2004-05-15 devnull int j, n;
579 5cedca1b 2004-05-15 devnull Tchar i;
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));
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);
596 5cedca1b 2004-05-15 devnull Tchar t_sethl(int k)
599 5cedca1b 2004-05-15 devnull Tchar i;
601 5cedca1b 2004-05-15 devnull j = EM / 2;
602 5cedca1b 2004-05-15 devnull if (k == 'u')
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);
613 5cedca1b 2004-05-15 devnull Tchar t_makem(int i)
615 5cedca1b 2004-05-15 devnull Tchar j;
617 5cedca1b 2004-05-15 devnull if (i >= 0)
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);
632 5cedca1b 2004-05-15 devnull Tchar getlg(Tchar i)
634 5cedca1b 2004-05-15 devnull Tchar j, k;
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;
654 5cedca1b 2004-05-15 devnull *pbp++ = k;
655 5cedca1b 2004-05-15 devnull j = LIG_FF;
658 5cedca1b 2004-05-15 devnull j = LIG_FF;
659 5cedca1b 2004-05-15 devnull } else {
660 5cedca1b 2004-05-15 devnull *pbp++ = j;
663 5cedca1b 2004-05-15 devnull return(i & SFMASK | j);
667 5cedca1b 2004-05-15 devnull void caselg(void)
670 5cedca1b 2004-05-15 devnull if(TROFF) {
672 5cedca1b 2004-05-15 devnull lg = atoi0();
673 5cedca1b 2004-05-15 devnull if (nonumb)
678 5cedca1b 2004-05-15 devnull void casefp(void)
680 5cedca1b 2004-05-15 devnull int i, j;
682 5cedca1b 2004-05-15 devnull if (!TROFF) {
683 5cedca1b 2004-05-15 devnull n_casefp();
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';
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);
704 5cedca1b 2004-05-15 devnull char *strdupl(const char *s) /* make a copy of s */
706 5cedca1b 2004-05-15 devnull char *t;
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;
716 5cedca1b 2004-05-15 devnull setfp(int pos, int f, char *truename, int print) /* mount font f at position pos[0...nfonts] */
718 c5bfba48 2012-10-21 rsc char pathname[NS], shortname[NS];
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);
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;
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;
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();
747 5cedca1b 2004-05-15 devnull if (pos == smnt) {
749 fa325e9b 2020-01-10 cross sbold = 0;
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;
759 5cedca1b 2004-05-15 devnull * .cs request; don't check legality of optional arguments
761 5cedca1b 2004-05-15 devnull void casecs(void)
763 5cedca1b 2004-05-15 devnull int i, j;
765 5cedca1b 2004-05-15 devnull if (TROFF) {
766 5cedca1b 2004-05-15 devnull int savtr = trace;
768 5cedca1b 2004-05-15 devnull trace = 0;
769 5cedca1b 2004-05-15 devnull noscale++;
771 5cedca1b 2004-05-15 devnull if (!(i = getrq()) || (i = findft(i)) < 0)
772 5cedca1b 2004-05-15 devnull goto rtn;
774 5cedca1b 2004-05-15 devnull cstab[i] = atoi0();
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;
780 5cedca1b 2004-05-15 devnull ccstab[i] = findps(j);
782 5cedca1b 2004-05-15 devnull zapwcache(0);
783 5cedca1b 2004-05-15 devnull noscale = 0;
784 5cedca1b 2004-05-15 devnull trace = savtr;
789 5cedca1b 2004-05-15 devnull void casebd(void)
791 5cedca1b 2004-05-15 devnull int i, j, k;
794 5cedca1b 2004-05-15 devnull if (!TROFF) {
795 5cedca1b 2004-05-15 devnull n_casebd();
798 5cedca1b 2004-05-15 devnull zapwcache(0);
801 5cedca1b 2004-05-15 devnull if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
803 5cedca1b 2004-05-15 devnull goto bd1;
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;
811 5cedca1b 2004-05-15 devnull if (k) {
812 5cedca1b 2004-05-15 devnull sbold = j;
817 5cedca1b 2004-05-15 devnull noscale++;
818 5cedca1b 2004-05-15 devnull bdtab[j] = atoi0();
819 5cedca1b 2004-05-15 devnull noscale = 0;
823 5cedca1b 2004-05-15 devnull void casevs(void)
827 5cedca1b 2004-05-15 devnull if (!TROFF) {
828 5cedca1b 2004-05-15 devnull n_casevs();
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;
846 5cedca1b 2004-05-15 devnull void casess(void)
850 5cedca1b 2004-05-15 devnull if(TROFF) {
851 5cedca1b 2004-05-15 devnull noscale++;
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);
858 5cedca1b 2004-05-15 devnull noscale = 0;
863 5cedca1b 2004-05-15 devnull Tchar t_xlss(void)
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().
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;
880 5cedca1b 2004-05-15 devnull *pbp++ = MOT | VMOT | NMOT | -i;
881 5cedca1b 2004-05-15 devnull return(HX);
884 5cedca1b 2004-05-15 devnull Uchar *unpair(int i)
886 5cedca1b 2004-05-15 devnull static Uchar name[3];
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;