-F option for multiple fontfiles
[unix-history] / usr / src / old / roff / troff / t6.c
CommitLineData
346e7ddd 1#ifndef lint
5673b9a7 2static char sccsid[] = "@(#)t6.c 4.2 %G%";
346e7ddd
RH
3#endif lint
4
5#include "tdef.h"
6extern
7#include "d.h"
8extern
9#include "v.h"
10
11/*
12troff6.c
13
14width functions, sizes and fonts
15*/
16
17extern int inchar[LNSIZE], *pinchar; /* XXX */
18extern int eschar;
19extern int widthp;
20extern int ohc;
21extern int xpts;
22extern int xfont;
23extern int code;
24extern int smnt;
25extern int setwdf;
26extern int cs;
27extern int ccs;
28extern int spacesz;
29extern char trtab[];
30extern int xbitf;
31extern int mfont;
32extern int mpts;
33extern int pfont;
34extern int ppts;
35extern int oldbits;
36extern int chbits;
37extern int spbits;
38extern int nonumb;
39extern int noscale;
40extern int font;
41extern int font1;
42extern int pts;
43extern int pts1;
44extern int apts;
45extern int apts1;
46extern int sps;
47extern int nlflg;
48extern int nform;
49extern int dfact;
50extern int lss;
51extern int lss1;
52extern int vflag;
53extern int ch0;
54extern int lg;
5673b9a7
BS
55char *fontfile = "/usr/lib/font/ftXX";
56int ffi = 0;
346e7ddd
RH
57extern int bd;
58extern int level;
59extern int ch;
60extern int res;
61extern int ptid;
62extern char W1[],W2[],W3[],W4[];
63extern int xxx;
64int trflg;
65char *fontab[] = {W1,W2,W3,W4};
66int fontlab[] = {'R','I','B','S',0};
67char pstab[] = {6,7,8,9,10,11,12,14,16,18,20,22,24,28,36,0};
68char psctab[] = {010,000,001,007,002,003,004,005,0211,006,
69 0212,0213,0214,0215,0216,0};
70int cstab[4], ccstab[4];
71int bdtab[4];
72int sbold = 0;
73int spsz = 0;
74struct fz {
75 char sign;
76 char size;
77 int inc;
78 } fz[4];
79
80width(c)
81int c;
82{
83 register i,j,k;
84
85 j = c;
86 k = 0;
87 if(j & MOT){
88 if(j & VMOT)goto rtn;
89 k = j & ~MOTV;
90 if(j & NMOT)k = -k;
91 goto rtn;
92 }
93 if((i = (j & CMASK)) == 010){
94 k = -widthp;
95 goto rtn;
96 }
97 if(i == PRESC)i = eschar;
98 if((i == ohc) ||
99 (i >= 0370))goto rtn;
100 if((j>>BYTE) == oldbits){
101 xfont = pfont;
102 xpts = ppts;
103 }else xbits(j);
104 if(j & ZBIT)goto rtn;
105 if(!trflg)i = trtab[i] & BMASK;
106 if((i -= 32) < 0)goto rtn;
107 k = getcw(i);
108 if(bd)k += bd - 1;
109 if(cs)k = cs;
110 widthp = k;
111rtn:
112 xbitf = trflg = 0;
113 return(k);
114}
115getcw(i)
116int i;
117{
118 register j,k;
119 register char *p;
120 int x;
121 extern char codetab[];
122
123 bd = 0;
124 if((code = codetab[i]) & 0200){
125 if(smnt){
126 p = fontab[smnt-1];
127 if(xfont == (sbold-1))bd = bdtab[smnt-1];
128 goto g0;
129 }
130 code = 0;
131 k = 36;
132 goto g1;
133 }
134 p = fontab[xfont];
135g0:
136 if(!i)k = spacesz;
137 else k = *(p + i) & BMASK;
138 if(setwdf)v.ct |= ((k>>6) & 3);
139g1:
140 k = (j = (k&077)*(xpts&077))/6;
141 if((j%6) >= 3)k++;
142 if(cs = cstab[xfont]){
143 if(ccs = ccstab[xfont])x = ccs; else x = xpts;
144 cs = (j = (cs&077)*(x&077))/6;
145 if((j%6) >= 3)cs++;
146 }
147 if(!bd)bd = bdtab[xfont];
148 return(k);
149}
150xbits(i)
151int i;
152{
153 register j, k;
154
155/*
156 if((j = i >> BYTE) == oldbits){
157 xfont = pfont;
158 xpts = ppts;
159 goto rtn;
160 }
161*/
162 j = i >> BYTE;
163 xfont = (j>>1) & 03;
164 if(k = (j>>3) & 017){
165 xpts = pstab[--k];
166 if(psctab[k] < 0)xpts |= DBL;
167 oldbits = j;
168 pfont = xfont;
169 ppts = xpts;
170 goto rtn;
171 }
172 switch(xbitf){
173 case 0:
174 xfont = font;
175 xpts = pts;
176 break;
177 case 1:
178 xfont = pfont;
179 xpts = ppts;
180 break;
181 case 2:
182 xfont = mfont;
183 xpts = mpts;
184 }
185rtn:
186 xbitf = 0;
187}
188setch(){
189 register i,*j,k;
190 extern int chtab[];
191
192 if((i = getrq()) == 0)return(0);
193 for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0);
194 k = *(++j) | chbits;
195/*
196 if((i & CMASK) == '*'){
197 if(((i = find('R',fontlab)) < 0) &&
198 ((i = find('G',fontlab)) < 0))
199 return(k);
200 else return((k & ~(03<<(BYTE+1))) | (i<<(BYTE+1)));
201 }
202*/
203 return(k);
204}
205find(i,j)
206int i,j[];
207{
208 register k;
209
210 if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k);
211 for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1);
212 return(k);
213}
214casefz(){
215 register i, j, k;
216 int savinc;
217
218 k = 0;
219fz0:
220 if(skip() || !(i = getrq()) ||
221 ((j = find(i,fontlab)) == -1)){
222 if(k)goto fz1;
223 else return;
224 }
225 if(j == (smnt-1)){
226 k = smnt;
227 goto fz0;
228 }
229 if(k){
230 spsz = j + 1;
231 j = k -1;
232 }
233fz1:
234 if((j==font) && fz[j].inc)savinc = fz[j].inc;
235 else savinc = 0;
236 fz[j].inc = fz[j].sign = fz[j].size = 0;
237 if(skip()){
238 if(k)spsz = 0;
239 goto fz2;
240 }
241 if(((i=((k=getch()) & CMASK)) == '+') || (i == '-'))fz[j].sign = i;
242 else{
243 fz[j].sign = 0;
244 ch = k;
245 }
246 noscale++;
247 fz[j].size = atoi();
248 noscale = 0;
249fz2:
250 if(j==font)casps1(apts + savinc);
251 else if(j == smnt-1)mchbits();
252}
253caseps(){
254 register i;
255
256 if(skip())i = apts1;
257 else{
258 noscale++;
259 i = inumb(&apts);
260 noscale = 0;
261 if(nonumb)return;
262 }
263 casps1(i);
264}
265casps1(i)
266int i;
267{
268 if(i <= 0)return;
269 if(fz[font].size){
270 i = getfz(font, i);
271 }
272 apts1 = apts;
273 apts = i;
274 pts1 = pts;
275 pts = findps(i & 077);
276 mchbits();
277}
278findps(i)
279int i;
280{
281 register j, k;
282
283 for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
284 if(psctab[j] < 0)k |= DBL;
285 return(k);
286}
287mchbits(){
288 register i, j, k;
289
290 spbits = 0;
291 i = pts & 077;
292 for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
293 chbits = (((++j)<<2) | font) << (BYTE + 1);
294 sps = width(' ' | chbits);
295 if(font == (spsz-1)){
296 i = findps(getfz(smnt-1, apts + fz[font].inc));
297 for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
298 spbits = (((++j)<<2) | font) << (BYTE + 1);
299 }
300}
301getfz(x,y)
302int x, y;
303{
304 register i, j, k;
305
306 i = fz[x].size;
307 j = fz[x].sign;
308 if(i || j){
309 if(j == '+')i += y;
310 else if(j == '-')i = y - i;
311 }
312 fz[x].inc = y - i;
313 return(i);
314}
315setps(){
316 register i,j;
317
318 if((((i=getch() & CMASK) == '+') || (i == '-')) &&
319 (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){
320 if(i == '-')j = -j;
321 ch = 0;
322 casps1(apts+j);
323 return;
324 }
325 if((i -= '0') == 0){
326 casps1(apts1);
327 return;
328 }
329 if((i > 0) && (i <= 9)){
330 if((i <= 3) &&
331 ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){
332 i = 10*i +j;
333 ch = 0;
334 }
335 casps1(i);
336 }
337}
338caseft(){
339 skip();
340 setfont(1);
341}
342setfont(a)
343int a;
344{
345 register i,j;
346
347 if(a)i = getrq();
348 else i = getsn();
349 if(!i || (i == 'P')){
350 j = font1;
351 goto s0;
352 }
353 if(i == 'S')return;
354 if((j = find(i,fontlab)) == -1)return;
355s0:
356 font1 = font;
357 font = j;
358 i = 0;
359 if(fz[font1].size){
360 i++;
361 casps1(apts + fz[font1].inc);
362 }else if(fz[font].size){
363 i++;
364 casps1(apts);
365 }
366 if(!i)mchbits();
367}
368setwd(){
369 register i, base, wid;
370 int delim, em, k;
371 int savlevel, savhp, savapts, savapts1, savfont, savfont1,
372 savpts, savpts1;
373 int *savpinchar, *p, *q, tempinchar[LNSIZE]; /* XXX */
374
375 base = v.st = v.sb = wid = v.ct = 0;
376 if((delim = getch() & CMASK) & MOT)return;
377 savhp = v.hp;
378 savpinchar = pinchar; /* XXX */
379 for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */
380 *q++ = *p++; /* XXX */
381 pinchar = inchar; /* XXX */
382 savlevel = level;
383 v.hp = level = 0;
384 savapts = apts;
385 savapts1 = apts1;
386 savfont = font;
387 savfont1 = font1;
388 savpts = pts;
389 savpts1 = pts1;
390 setwdf++;
391 while((((i = getch()) & CMASK) != delim) && !nlflg){
392 wid += width(i);
393 if(!(i & MOT)){
394 em = (xpts & 077)*6;
395 }else if(i & VMOT){
396 k = i & ~MOTV;
397 if(i & NMOT)k = -k;
398 base -= k;
399 em = 0;
400 }else continue;
401 if(base < v.sb)v.sb = base;
402 if((k=base + em) > v.st)v.st = k;
403 }
404 nform = 0;
405 setn1(wid);
406 v.hp = savhp;
407 pinchar = savpinchar; /* XXX */
408 for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */
409 *p++ = *q++; /* XXX */
410 level = savlevel;
411 apts = savapts;
412 apts1 = savapts1;
413 font = savfont;
414 font1 = savfont1;
415 pts = savpts;
416 pts1 = savpts1;
417 mchbits();
418 setwdf = 0;
419}
420vmot(){
421 dfact = lss;
422 vflag++;
423 return(mot());
424}
425hmot(){
426 dfact = 6 * (pts & 077);
427 return(mot());
428}
429mot(){
430 register i, j;
431
432 j = HOR;
433 getch(); /*eat delim*/
434 if(i = atoi()){
435 if(vflag)j = VERT;
436 i = makem(quant(i,j));
437 }
438 getch();
439 vflag = 0;
440 dfact = 1;
441 return(i);
442}
443sethl(k)
444int k;
445{
446 register i;
447
448 i = 3 * (pts & 077);
449 if(k == 'u')i = -i;
450 else if(k == 'r')i = -2*i;
451 vflag++;
452 i = makem(i);
453 vflag = 0;
454 return(i);
455}
456makem(i)
457int i;
458{
459 register j;
460
461 if((j = i) < 0)j = -j;
462 j = (j & ~MOTV) | MOT;
463 if(i < 0)j |= NMOT;
464 if(vflag)j |= VMOT;
465 return(j);
466}
467getlg(i)
468int i;
469{
470 register j, k;
471
472 switch((j = getch0()) & CMASK){
473 case 'f':
474 if(lg!=2){switch((k =getch0()) & CMASK){
475 case 'i':
476 j = 0214;
477 break;
478 case 'l':
479 j = 0215;
480 break;
481 default:
482 ch0 = k;
483 j = 0213;
484 }
485 }else j = 0213;
486 break;
487 case 'l':
488 j = 0212;
489 break;
490 case 'i':
491 j = 0211;
492 break;
493 default:
494 ch0 = j;
495 j = i;
496 }
497 return((i & ~CMASK) | j);
498}
499caselg(){
500
501 lg = 1;
502 if(skip())return;
503 lg = atoi();
504}
505casefp(){
506 register i, j, k;
507 int x;
508
5673b9a7
BS
509 if (ffi == 0)
510 while (fontfile[ffi] != 'X')
511 ffi++;
346e7ddd
RH
512 skip();
513 if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)){prstr("fp: bad font position\n"); return;}
514 if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;}
515 fontfile[ffi] = j & BMASK;
516 fontfile[ffi+1] = j>>BYTE;
517 if((k = open(fontfile,0)) < 0){
518 prstr("Cannot open ");
519 c0:
520 prstr(fontfile);
521 prstr("\n");
522 done(-1);
523 }
524 if(lseek(k,8L * sizeof(int),0) < 0)goto c1;
525 if(read(k,fontab[i],256-32) != 256-32){
526 c1:
527 prstr("Cannot read ");
528 goto c0;
529 }
530 close(k);
531 if(i == (smnt-1)){smnt = 0; sbold = 0; spsz = 0;}
532 if((fontlab[i] = j) == 'S')smnt = i + 1;
533 bdtab[i] = cstab[i] = ccstab[i] = 0;
534 fz[i].inc = fz[i].sign = fz[i].size = 0;
535 if(ptid != 1){
536 prstr("Mount font ");
537 prstr(&fontfile[ffi]);
538 prstr(" on ");
539 x = PAIR((i + '1'),0);
540 prstr((char *)&x);
541 prstr("\n");
542 }
543}
544casecs(){
545 register i, j;
546
547 noscale++;
548 skip();
549 if(!(i=getrq()) ||
550 ((i = find(i,fontlab)) < 0))goto rtn;
551 skip();
552 cstab[i] = atoi();
553 skip();
554 j = atoi();
555 if(!nonumb)ccstab[i] = findps(j);
556rtn:
557 noscale = 0;
558}
559casebd(){
560 register i, j, k;
561
562 k = 0;
563bd0:
564 if(skip() || !(i = getrq()) ||
565 ((j = find(i,fontlab)) == -1)){
566 if(k)goto bd1;
567 else return;
568 }
569 if(j == (smnt-1)){
570 k = smnt;
571 goto bd0;
572 }
573 if(k){
574 sbold = j + 1;
575 j = k -1;
576 }
577bd1:
578 skip();
579 noscale++;
580 bdtab[j] = atoi();
581 noscale = 0;
582}
583casevs(){
584 register i;
585
586 skip();
587 vflag++;
588 dfact = 6; /*default scaling is points!*/
589 res = VERT;
590 i = inumb(&lss);
591 if(nonumb)i = lss1;
592 if(i < VERT)i = VERT;
593 lss1 = lss;
594 lss = i;
595}
596casess(){
597 register i;
598
599 noscale++;
600 skip();
601 if(i = atoi()){
602 spacesz = i& 0177;
603 sps = width(' ' | chbits);
604 }
605 noscale = 0;
606}
607xlss(){
608 register i, j;
609
610 getch();
611 dfact = lss;
612 i = quant(atoi(),VERT);
613 dfact = 1;
614 getch();
615 if((j = i) < 0)j = -j;
616 ch0 = ((j & 03700)<<3) | HX;
617 if(i < 0)ch0 |= 040000;
618 return(((j & 077)<<9) | LX);
619}