1*48307Sbostic /*-
2*48307Sbostic * %sccs.include.proprietary.c%
3*48307Sbostic */
4*48307Sbostic
57079Srrh #ifndef lint
6*48307Sbostic static char sccsid[] = "@(#)svt6.c 4.3 (Berkeley) 04/18/91";
7*48307Sbostic #endif /* not lint */
87079Srrh
97079Srrh #include "tdef.h"
107079Srrh extern
117079Srrh #include "d.h"
127079Srrh extern
137079Srrh #include "v.h"
1437896Sbostic #include "pathnames.h"
157079Srrh
167079Srrh /*
177079Srrh troff6.c
187079Srrh
197079Srrh width functions, sizes and fonts
207079Srrh */
217079Srrh
227079Srrh extern int inchar[LNSIZE], *pinchar; /* XXX */
237079Srrh extern int eschar;
247079Srrh extern int widthp;
257079Srrh extern int ohc;
267079Srrh extern int xpts;
277079Srrh extern int xfont;
287079Srrh extern int code;
297079Srrh extern int smnt;
307079Srrh extern int setwdf;
317079Srrh extern int cs;
327079Srrh extern int ccs;
337079Srrh extern int spacesz;
347079Srrh extern char trtab[];
357079Srrh extern int xbitf;
367079Srrh extern int mfont;
377079Srrh extern int mpts;
387079Srrh extern int pfont;
397079Srrh extern int ppts;
407079Srrh extern int oldbits;
417079Srrh extern int chbits;
427079Srrh extern int spbits;
437079Srrh extern int nonumb;
447079Srrh extern int noscale;
457079Srrh extern int font;
467079Srrh extern int font1;
477079Srrh extern int pts;
487079Srrh extern int pts1;
497079Srrh extern int apts;
507079Srrh extern int apts1;
517079Srrh extern int sps;
527079Srrh extern int nlflg;
537079Srrh extern int nform;
547079Srrh extern int dfact;
557079Srrh extern int lss;
567079Srrh extern int lss1;
577079Srrh extern int vflag;
587079Srrh extern int ch0;
597079Srrh extern int lg;
6037896Sbostic char fontfile[] = _PATH_FONTS;
617079Srrh int ffi = 16;
627079Srrh extern int bd;
637079Srrh extern int level;
647079Srrh extern int ch;
657079Srrh extern int res;
667079Srrh extern int ptid;
677079Srrh extern char W1[],W2[],W3[],W4[];
687079Srrh extern int xxx;
697079Srrh int trflg;
707079Srrh char *fontab[] = {W1,W2,W3,W4};
717079Srrh int fontlab[] = {'R','I','B','S',0};
727079Srrh char pstab[] = {6,7,8,9,10,11,12,14,16,18,20,22,24,28,36,0};
737079Srrh char psctab[] = {010,000,001,007,002,003,004,005,0211,006,
747079Srrh 0212,0213,0214,0215,0216,0};
757079Srrh int cstab[4], ccstab[4];
767079Srrh int bdtab[4];
777079Srrh int sbold = 0;
787079Srrh int spsz = 0;
797079Srrh struct fz {
807079Srrh char sign;
817079Srrh char size;
827079Srrh int inc;
837079Srrh } fz[4];
847079Srrh
width(c)857079Srrh width(c)
867079Srrh int c;
877079Srrh {
887079Srrh register i,j,k;
897079Srrh
907079Srrh j = c;
917079Srrh k = 0;
927079Srrh if(j & MOT){
937079Srrh if(j & VMOT)goto rtn;
947079Srrh k = j & ~MOTV;
957079Srrh if(j & NMOT)k = -k;
967079Srrh goto rtn;
977079Srrh }
987079Srrh if((i = (j & CMASK)) == 010){
997079Srrh k = -widthp;
1007079Srrh goto rtn;
1017079Srrh }
1027079Srrh if(i == PRESC)i = eschar;
1037079Srrh if((i == ohc) ||
1047079Srrh (i >= 0370))goto rtn;
1057079Srrh if((j>>BYTE) == oldbits){
1067079Srrh xfont = pfont;
1077079Srrh xpts = ppts;
1087079Srrh }else xbits(j);
1097079Srrh if(j & ZBIT)goto rtn;
1107079Srrh if(!trflg)i = trtab[i] & BMASK;
1117079Srrh if((i -= 32) < 0)goto rtn;
1127079Srrh k = getcw(i);
1137079Srrh if(bd)k += bd - 1;
1147079Srrh if(cs)k = cs;
1157079Srrh widthp = k;
1167079Srrh rtn:
1177079Srrh xbitf = trflg = 0;
1187079Srrh return(k);
1197079Srrh }
getcw(i)1207079Srrh getcw(i)
1217079Srrh int i;
1227079Srrh {
1237079Srrh register j,k;
1247079Srrh register char *p;
1257079Srrh int x;
1267079Srrh extern char codetab[];
1277079Srrh
1287079Srrh bd = 0;
1297079Srrh if((code = codetab[i]) & 0200){
1307079Srrh if(smnt){
1317079Srrh p = fontab[smnt-1];
1327079Srrh if(xfont == (sbold-1))bd = bdtab[smnt-1];
1337079Srrh goto g0;
1347079Srrh }
1357079Srrh code = 0;
1367079Srrh k = 36;
1377079Srrh goto g1;
1387079Srrh }
1397079Srrh p = fontab[xfont];
1407079Srrh g0:
1417079Srrh if(!i)k = spacesz;
1427079Srrh else k = *(p + i) & BMASK;
1437079Srrh if(setwdf)v.ct |= ((k>>6) & 3);
1447079Srrh g1:
1457079Srrh k = (j = (k&077)*(xpts&077))/6;
1467079Srrh if((j%6) >= 3)k++;
1477079Srrh if(cs = cstab[xfont]){
1487079Srrh if(ccs = ccstab[xfont])x = ccs; else x = xpts;
1497079Srrh cs = (j = (cs&077)*(x&077))/6;
1507079Srrh if((j%6) >= 3)cs++;
1517079Srrh }
1527079Srrh if(!bd)bd = bdtab[xfont];
1537079Srrh return(k);
1547079Srrh }
xbits(i)1557079Srrh xbits(i)
1567079Srrh int i;
1577079Srrh {
1587079Srrh register j, k;
1597079Srrh
1607079Srrh /*
1617079Srrh if((j = i >> BYTE) == oldbits){
1627079Srrh xfont = pfont;
1637079Srrh xpts = ppts;
1647079Srrh goto rtn;
1657079Srrh }
1667079Srrh */
1677079Srrh j = i >> BYTE;
1687079Srrh xfont = (j>>1) & 03;
1697079Srrh if(k = (j>>3) & 017){
1707079Srrh xpts = pstab[--k];
1717079Srrh if(psctab[k] < 0)xpts |= DBL;
1727079Srrh oldbits = j;
1737079Srrh pfont = xfont;
1747079Srrh ppts = xpts;
1757079Srrh goto rtn;
1767079Srrh }
1777079Srrh switch(xbitf){
1787079Srrh case 0:
1797079Srrh xfont = font;
1807079Srrh xpts = pts;
1817079Srrh break;
1827079Srrh case 1:
1837079Srrh xfont = pfont;
1847079Srrh xpts = ppts;
1857079Srrh break;
1867079Srrh case 2:
1877079Srrh xfont = mfont;
1887079Srrh xpts = mpts;
1897079Srrh }
1907079Srrh rtn:
1917079Srrh xbitf = 0;
1927079Srrh }
setch()1937079Srrh setch(){
1947079Srrh register i,*j,k;
1957079Srrh extern int chtab[];
1967079Srrh
1977079Srrh if((i = getrq()) == 0)return(0);
1987079Srrh for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0);
1997079Srrh k = *(++j) | chbits;
2007079Srrh /*
2017079Srrh if((i & CMASK) == '*'){
2027079Srrh if(((i = find('R',fontlab)) < 0) &&
2037079Srrh ((i = find('G',fontlab)) < 0))
2047079Srrh return(k);
2057079Srrh else return((k & ~(03<<(BYTE+1))) | (i<<(BYTE+1)));
2067079Srrh }
2077079Srrh */
2087079Srrh return(k);
2097079Srrh }
find(i,j)2107079Srrh find(i,j)
2117079Srrh int i,j[];
2127079Srrh {
2137079Srrh register k;
2147079Srrh
2157079Srrh if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k);
2167079Srrh for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1);
2177079Srrh return(k);
2187079Srrh }
casefz()2197079Srrh casefz(){
2207079Srrh register i, j, k;
2217079Srrh int savinc;
2227079Srrh
2237079Srrh k = 0;
2247079Srrh fz0:
2257079Srrh if(skip() || !(i = getrq()) ||
2267079Srrh ((j = find(i,fontlab)) == -1)){
2277079Srrh if(k)goto fz1;
2287079Srrh else return;
2297079Srrh }
2307079Srrh if(j == (smnt-1)){
2317079Srrh k = smnt;
2327079Srrh goto fz0;
2337079Srrh }
2347079Srrh if(k){
2357079Srrh spsz = j + 1;
2367079Srrh j = k -1;
2377079Srrh }
2387079Srrh fz1:
2397079Srrh if((j==font) && fz[j].inc)savinc = fz[j].inc;
2407079Srrh else savinc = 0;
2417079Srrh fz[j].inc = fz[j].sign = fz[j].size = 0;
2427079Srrh if(skip()){
2437079Srrh if(k)spsz = 0;
2447079Srrh goto fz2;
2457079Srrh }
2467079Srrh if(((i=((k=getch()) & CMASK)) == '+') || (i == '-'))fz[j].sign = i;
2477079Srrh else{
2487079Srrh fz[j].sign = 0;
2497079Srrh ch = k;
2507079Srrh }
2517079Srrh noscale++;
2527079Srrh fz[j].size = atoi();
2537079Srrh noscale = 0;
2547079Srrh fz2:
2557079Srrh if(j==font)casps1(apts + savinc);
2567079Srrh else if(j == smnt-1)mchbits();
2577079Srrh }
caseps()2587079Srrh caseps(){
2597079Srrh register i;
2607079Srrh
2617079Srrh if(skip())i = apts1;
2627079Srrh else{
2637079Srrh noscale++;
2647079Srrh i = inumb(&apts);
2657079Srrh noscale = 0;
2667079Srrh if(nonumb)return;
2677079Srrh }
2687079Srrh casps1(i);
2697079Srrh }
casps1(i)2707079Srrh casps1(i)
2717079Srrh int i;
2727079Srrh {
2737079Srrh if(i <= 0)return;
2747079Srrh if(fz[font].size){
2757079Srrh i = getfz(font, i);
2767079Srrh }
2777079Srrh apts1 = apts;
2787079Srrh apts = i;
2797079Srrh pts1 = pts;
2807079Srrh pts = findps(i & 077);
2817079Srrh mchbits();
2827079Srrh }
findps(i)2837079Srrh findps(i)
2847079Srrh int i;
2857079Srrh {
2867079Srrh register j, k;
2877079Srrh
2887079Srrh for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
2897079Srrh if(psctab[j] < 0)k |= DBL;
2907079Srrh return(k);
2917079Srrh }
mchbits()2927079Srrh mchbits(){
2937079Srrh register i, j, k;
2947079Srrh
2957079Srrh spbits = 0;
2967079Srrh i = pts & 077;
2977079Srrh for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
2987079Srrh chbits = (((++j)<<2) | font) << (BYTE + 1);
2997079Srrh sps = width(' ' | chbits);
3007079Srrh if(font == (spsz-1)){
3017079Srrh i = findps(getfz(smnt-1, apts + fz[font].inc));
3027079Srrh for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
3037079Srrh spbits = (((++j)<<2) | font) << (BYTE + 1);
3047079Srrh }
3057079Srrh }
getfz(x,y)3067079Srrh getfz(x,y)
3077079Srrh int x, y;
3087079Srrh {
3097079Srrh register i, j, k;
3107079Srrh
3117079Srrh i = fz[x].size;
3127079Srrh j = fz[x].sign;
3137079Srrh if(i || j){
3147079Srrh if(j == '+')i += y;
3157079Srrh else if(j == '-')i = y - i;
3167079Srrh }
3177079Srrh fz[x].inc = y - i;
3187079Srrh return(i);
3197079Srrh }
setps()3207079Srrh setps(){
3217079Srrh register i,j;
3227079Srrh
3237079Srrh if((((i=getch() & CMASK) == '+') || (i == '-')) &&
3247079Srrh (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){
3257079Srrh if(i == '-')j = -j;
3267079Srrh ch = 0;
3277079Srrh casps1(apts+j);
3287079Srrh return;
3297079Srrh }
3307079Srrh if((i -= '0') == 0){
3317079Srrh casps1(apts1);
3327079Srrh return;
3337079Srrh }
3347079Srrh if((i > 0) && (i <= 9)){
3357079Srrh if((i <= 3) &&
3367079Srrh ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){
3377079Srrh i = 10*i +j;
3387079Srrh ch = 0;
3397079Srrh }
3407079Srrh casps1(i);
3417079Srrh }
3427079Srrh }
caseft()3437079Srrh caseft(){
3447079Srrh skip();
3457079Srrh setfont(1);
3467079Srrh }
setfont(a)3477079Srrh setfont(a)
3487079Srrh int a;
3497079Srrh {
3507079Srrh register i,j;
3517079Srrh
3527079Srrh if(a)i = getrq();
3537079Srrh else i = getsn();
3547079Srrh if(!i || (i == 'P')){
3557079Srrh j = font1;
3567079Srrh goto s0;
3577079Srrh }
3587079Srrh if(i == 'S')return;
3597079Srrh if((j = find(i,fontlab)) == -1)return;
3607079Srrh s0:
3617079Srrh font1 = font;
3627079Srrh font = j;
3637079Srrh i = 0;
3647079Srrh if(fz[font1].size){
3657079Srrh i++;
3667079Srrh casps1(apts + fz[font1].inc);
3677079Srrh }else if(fz[font].size){
3687079Srrh i++;
3697079Srrh casps1(apts);
3707079Srrh }
3717079Srrh if(!i)mchbits();
3727079Srrh }
setwd()3737079Srrh setwd(){
3747079Srrh register i, base, wid;
3757079Srrh int delim, em, k;
3767079Srrh int savlevel, savhp, savapts, savapts1, savfont, savfont1,
3777079Srrh savpts, savpts1;
3787079Srrh
3797079Srrh base = v.st = v.sb = wid = v.ct = 0;
3807079Srrh if((delim = getch() & CMASK) & MOT)return;
3817079Srrh savhp = v.hp;
3827079Srrh savlevel = level;
3837079Srrh v.hp = level = 0;
3847079Srrh savapts = apts;
3857079Srrh savapts1 = apts1;
3867079Srrh savfont = font;
3877079Srrh savfont1 = font1;
3887079Srrh savpts = pts;
3897079Srrh savpts1 = pts1;
3907079Srrh setwdf++;
3917079Srrh while((((i = getch()) & CMASK) != delim) && !nlflg){
3927079Srrh wid += width(i);
3937079Srrh if(!(i & MOT)){
3947079Srrh em = (xpts & 077)*6;
3957079Srrh }else if(i & VMOT){
3967079Srrh k = i & ~MOTV;
3977079Srrh if(i & NMOT)k = -k;
3987079Srrh base -= k;
3997079Srrh em = 0;
4007079Srrh }else continue;
4017079Srrh if(base < v.sb)v.sb = base;
4027079Srrh if((k=base + em) > v.st)v.st = k;
4037079Srrh }
4047079Srrh nform = 0;
4057079Srrh setn1(wid);
4067079Srrh v.hp = savhp;
4077079Srrh level = savlevel;
4087079Srrh apts = savapts;
4097079Srrh apts1 = savapts1;
4107079Srrh font = savfont;
4117079Srrh font1 = savfont1;
4127079Srrh pts = savpts;
4137079Srrh pts1 = savpts1;
4147079Srrh mchbits();
4157079Srrh setwdf = 0;
4167079Srrh }
vmot()4177079Srrh vmot(){
4187079Srrh dfact = lss;
4197079Srrh vflag++;
4207079Srrh return(mot());
4217079Srrh }
hmot()4227079Srrh hmot(){
4237079Srrh dfact = 6 * (pts & 077);
4247079Srrh return(mot());
4257079Srrh }
mot()4267079Srrh mot(){
4277079Srrh register i, j;
4287079Srrh
4297079Srrh j = HOR;
4307079Srrh getch(); /*eat delim*/
4317079Srrh if(i = atoi()){
4327079Srrh if(vflag)j = VERT;
4337079Srrh i = makem(quant(i,j));
4347079Srrh }
4357079Srrh getch();
4367079Srrh vflag = 0;
4377079Srrh dfact = 1;
4387079Srrh return(i);
4397079Srrh }
sethl(k)4407079Srrh sethl(k)
4417079Srrh int k;
4427079Srrh {
4437079Srrh register i;
4447079Srrh
4457079Srrh i = 3 * (pts & 077);
4467079Srrh if(k == 'u')i = -i;
4477079Srrh else if(k == 'r')i = -2*i;
4487079Srrh vflag++;
4497079Srrh i = makem(i);
4507079Srrh vflag = 0;
4517079Srrh return(i);
4527079Srrh }
makem(i)4537079Srrh makem(i)
4547079Srrh int i;
4557079Srrh {
4567079Srrh register j;
4577079Srrh
4587079Srrh if((j = i) < 0)j = -j;
4597079Srrh j = (j & ~MOTV) | MOT;
4607079Srrh if(i < 0)j |= NMOT;
4617079Srrh if(vflag)j |= VMOT;
4627079Srrh return(j);
4637079Srrh }
getlg(i)4647079Srrh getlg(i)
4657079Srrh int i;
4667079Srrh {
4677079Srrh register j, k;
4687079Srrh
4697079Srrh switch((j = getch0()) & CMASK){
4707079Srrh case 'f':
4717079Srrh if(lg!=2){switch((k =getch0()) & CMASK){
4727079Srrh case 'i':
4737079Srrh j = 0214;
4747079Srrh break;
4757079Srrh case 'l':
4767079Srrh j = 0215;
4777079Srrh break;
4787079Srrh default:
4797079Srrh ch0 = k;
4807079Srrh j = 0213;
4817079Srrh }
4827079Srrh }else j = 0213;
4837079Srrh break;
4847079Srrh case 'l':
4857079Srrh j = 0212;
4867079Srrh break;
4877079Srrh case 'i':
4887079Srrh j = 0211;
4897079Srrh break;
4907079Srrh default:
4917079Srrh ch0 = j;
4927079Srrh j = i;
4937079Srrh }
4947079Srrh return((i & ~CMASK) | j);
4957079Srrh }
caselg()4967079Srrh caselg(){
4977079Srrh
4987079Srrh lg = 1;
4997079Srrh if(skip())return;
5007079Srrh lg = atoi();
5017079Srrh }
casefp()5027079Srrh casefp(){
5037079Srrh register i, j, k;
5047079Srrh int x;
5057079Srrh
5067079Srrh skip();
5077079Srrh if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)){prstr("fp: bad font position\n"); return;}
5087079Srrh if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;}
5097079Srrh fontfile[ffi] = j & BMASK;
5107079Srrh fontfile[ffi+1] = j>>BYTE;
5117079Srrh if((k = open(fontfile,0)) < 0){
5127079Srrh prstr("Cannot open ");
5137079Srrh c0:
5147079Srrh prstr(fontfile);
5157079Srrh prstr("\n");
5167079Srrh done(-1);
5177079Srrh }
5187079Srrh if(lseek(k,8L * sizeof(int),0) < 0)goto c1;
5197079Srrh if(read(k,fontab[i],256-32) != 256-32){
5207079Srrh c1:
5217079Srrh prstr("Cannot read ");
5227079Srrh goto c0;
5237079Srrh }
5247079Srrh close(k);
5257079Srrh if(i == (smnt-1)){smnt = 0; sbold = 0; spsz = 0;}
5267079Srrh if((fontlab[i] = j) == 'S')smnt = i + 1;
5277079Srrh bdtab[i] = cstab[i] = ccstab[i] = 0;
5287079Srrh fz[i].inc = fz[i].sign = fz[i].size = 0;
5297079Srrh if(ptid != 1){
5307079Srrh prstr("Mount font ");
5317079Srrh prstr(&fontfile[ffi]);
5327079Srrh prstr(" on ");
5337079Srrh x = PAIR((i + '1'),0);
5347079Srrh prstr((char *)&x);
5357079Srrh prstr("\n");
5367079Srrh }
5377079Srrh }
casecs()5387079Srrh casecs(){
5397079Srrh register i, j;
5407079Srrh
5417079Srrh noscale++;
5427079Srrh skip();
5437079Srrh if(!(i=getrq()) ||
5447079Srrh ((i = find(i,fontlab)) < 0))goto rtn;
5457079Srrh skip();
5467079Srrh cstab[i] = atoi();
5477079Srrh skip();
5487079Srrh j = atoi();
5497079Srrh if(!nonumb)ccstab[i] = findps(j);
5507079Srrh rtn:
5517079Srrh noscale = 0;
5527079Srrh }
casebd()5537079Srrh casebd(){
5547079Srrh register i, j, k;
5557079Srrh
5567079Srrh k = 0;
5577079Srrh bd0:
5587079Srrh if(skip() || !(i = getrq()) ||
5597079Srrh ((j = find(i,fontlab)) == -1)){
5607079Srrh if(k)goto bd1;
5617079Srrh else return;
5627079Srrh }
5637079Srrh if(j == (smnt-1)){
5647079Srrh k = smnt;
5657079Srrh goto bd0;
5667079Srrh }
5677079Srrh if(k){
5687079Srrh sbold = j + 1;
5697079Srrh j = k -1;
5707079Srrh }
5717079Srrh bd1:
5727079Srrh skip();
5737079Srrh noscale++;
5747079Srrh bdtab[j] = atoi();
5757079Srrh noscale = 0;
5767079Srrh }
casevs()5777079Srrh casevs(){
5787079Srrh register i;
5797079Srrh
5807079Srrh skip();
5817079Srrh vflag++;
5827079Srrh dfact = 6; /*default scaling is points!*/
5837079Srrh res = VERT;
5847079Srrh i = inumb(&lss);
5857079Srrh if(nonumb)i = lss1;
5867079Srrh if(i < VERT)i = VERT;
5877079Srrh lss1 = lss;
5887079Srrh lss = i;
5897079Srrh }
casess()5907079Srrh casess(){
5917079Srrh register i;
5927079Srrh
5937079Srrh noscale++;
5947079Srrh skip();
5957079Srrh if(i = atoi()){
5967079Srrh spacesz = i& 0177;
5977079Srrh sps = width(' ' | chbits);
5987079Srrh }
5997079Srrh noscale = 0;
6007079Srrh }
xlss()6017079Srrh xlss(){
6027079Srrh register i, j;
6037079Srrh
6047079Srrh getch();
6057079Srrh dfact = lss;
6067079Srrh i = quant(atoi(),VERT);
6077079Srrh dfact = 1;
6087079Srrh getch();
6097079Srrh if((j = i) < 0)j = -j;
6107079Srrh ch0 = ((j & 03700)<<3) | HX;
6117079Srrh if(i < 0)ch0 |= 040000;
6127079Srrh return(((j & 077)<<9) | LX);
6137079Srrh }
614