17080Srrh #ifndef lint 2*37896Sbostic static char sccsid[] = "@(#)t6.c 4.3 05/11/89"; 37080Srrh #endif lint 47080Srrh 57080Srrh #include "tdef.h" 67080Srrh extern 77080Srrh #include "d.h" 87080Srrh extern 97080Srrh #include "v.h" 10*37896Sbostic #include "pathnames.h" 117080Srrh 127080Srrh /* 137080Srrh troff6.c 147080Srrh 157080Srrh width functions, sizes and fonts 167080Srrh */ 177080Srrh 187080Srrh extern int inchar[LNSIZE], *pinchar; /* XXX */ 197080Srrh extern int eschar; 207080Srrh extern int widthp; 217080Srrh extern int ohc; 227080Srrh extern int xpts; 237080Srrh extern int xfont; 247080Srrh extern int code; 257080Srrh extern int smnt; 267080Srrh extern int setwdf; 277080Srrh extern int cs; 287080Srrh extern int ccs; 297080Srrh extern int spacesz; 307080Srrh extern char trtab[]; 317080Srrh extern int xbitf; 327080Srrh extern int mfont; 337080Srrh extern int mpts; 347080Srrh extern int pfont; 357080Srrh extern int ppts; 367080Srrh extern int oldbits; 377080Srrh extern int chbits; 387080Srrh extern int spbits; 397080Srrh extern int nonumb; 407080Srrh extern int noscale; 417080Srrh extern int font; 427080Srrh extern int font1; 437080Srrh extern int pts; 447080Srrh extern int pts1; 457080Srrh extern int apts; 467080Srrh extern int apts1; 477080Srrh extern int sps; 487080Srrh extern int nlflg; 497080Srrh extern int nform; 507080Srrh extern int dfact; 517080Srrh extern int lss; 527080Srrh extern int lss1; 537080Srrh extern int vflag; 547080Srrh extern int ch0; 557080Srrh extern int lg; 56*37896Sbostic char *fontfile = _PATH_FONTS; 5711248Sshannon int ffi = 0; 587080Srrh extern int bd; 597080Srrh extern int level; 607080Srrh extern int ch; 617080Srrh extern int res; 627080Srrh extern int ptid; 637080Srrh extern char W1[],W2[],W3[],W4[]; 647080Srrh extern int xxx; 657080Srrh int trflg; 667080Srrh char *fontab[] = {W1,W2,W3,W4}; 677080Srrh int fontlab[] = {'R','I','B','S',0}; 687080Srrh char pstab[] = {6,7,8,9,10,11,12,14,16,18,20,22,24,28,36,0}; 697080Srrh char psctab[] = {010,000,001,007,002,003,004,005,0211,006, 707080Srrh 0212,0213,0214,0215,0216,0}; 717080Srrh int cstab[4], ccstab[4]; 727080Srrh int bdtab[4]; 737080Srrh int sbold = 0; 747080Srrh int spsz = 0; 757080Srrh struct fz { 767080Srrh char sign; 777080Srrh char size; 787080Srrh int inc; 797080Srrh } fz[4]; 807080Srrh 817080Srrh width(c) 827080Srrh int c; 837080Srrh { 847080Srrh register i,j,k; 857080Srrh 867080Srrh j = c; 877080Srrh k = 0; 887080Srrh if(j & MOT){ 897080Srrh if(j & VMOT)goto rtn; 907080Srrh k = j & ~MOTV; 917080Srrh if(j & NMOT)k = -k; 927080Srrh goto rtn; 937080Srrh } 947080Srrh if((i = (j & CMASK)) == 010){ 957080Srrh k = -widthp; 967080Srrh goto rtn; 977080Srrh } 987080Srrh if(i == PRESC)i = eschar; 997080Srrh if((i == ohc) || 1007080Srrh (i >= 0370))goto rtn; 1017080Srrh if((j>>BYTE) == oldbits){ 1027080Srrh xfont = pfont; 1037080Srrh xpts = ppts; 1047080Srrh }else xbits(j); 1057080Srrh if(j & ZBIT)goto rtn; 1067080Srrh if(!trflg)i = trtab[i] & BMASK; 1077080Srrh if((i -= 32) < 0)goto rtn; 1087080Srrh k = getcw(i); 1097080Srrh if(bd)k += bd - 1; 1107080Srrh if(cs)k = cs; 1117080Srrh widthp = k; 1127080Srrh rtn: 1137080Srrh xbitf = trflg = 0; 1147080Srrh return(k); 1157080Srrh } 1167080Srrh getcw(i) 1177080Srrh int i; 1187080Srrh { 1197080Srrh register j,k; 1207080Srrh register char *p; 1217080Srrh int x; 1227080Srrh extern char codetab[]; 1237080Srrh 1247080Srrh bd = 0; 1257080Srrh if((code = codetab[i]) & 0200){ 1267080Srrh if(smnt){ 1277080Srrh p = fontab[smnt-1]; 1287080Srrh if(xfont == (sbold-1))bd = bdtab[smnt-1]; 1297080Srrh goto g0; 1307080Srrh } 1317080Srrh code = 0; 1327080Srrh k = 36; 1337080Srrh goto g1; 1347080Srrh } 1357080Srrh p = fontab[xfont]; 1367080Srrh g0: 1377080Srrh if(!i)k = spacesz; 1387080Srrh else k = *(p + i) & BMASK; 1397080Srrh if(setwdf)v.ct |= ((k>>6) & 3); 1407080Srrh g1: 1417080Srrh k = (j = (k&077)*(xpts&077))/6; 1427080Srrh if((j%6) >= 3)k++; 1437080Srrh if(cs = cstab[xfont]){ 1447080Srrh if(ccs = ccstab[xfont])x = ccs; else x = xpts; 1457080Srrh cs = (j = (cs&077)*(x&077))/6; 1467080Srrh if((j%6) >= 3)cs++; 1477080Srrh } 1487080Srrh if(!bd)bd = bdtab[xfont]; 1497080Srrh return(k); 1507080Srrh } 1517080Srrh xbits(i) 1527080Srrh int i; 1537080Srrh { 1547080Srrh register j, k; 1557080Srrh 1567080Srrh /* 1577080Srrh if((j = i >> BYTE) == oldbits){ 1587080Srrh xfont = pfont; 1597080Srrh xpts = ppts; 1607080Srrh goto rtn; 1617080Srrh } 1627080Srrh */ 1637080Srrh j = i >> BYTE; 1647080Srrh xfont = (j>>1) & 03; 1657080Srrh if(k = (j>>3) & 017){ 1667080Srrh xpts = pstab[--k]; 1677080Srrh if(psctab[k] < 0)xpts |= DBL; 1687080Srrh oldbits = j; 1697080Srrh pfont = xfont; 1707080Srrh ppts = xpts; 1717080Srrh goto rtn; 1727080Srrh } 1737080Srrh switch(xbitf){ 1747080Srrh case 0: 1757080Srrh xfont = font; 1767080Srrh xpts = pts; 1777080Srrh break; 1787080Srrh case 1: 1797080Srrh xfont = pfont; 1807080Srrh xpts = ppts; 1817080Srrh break; 1827080Srrh case 2: 1837080Srrh xfont = mfont; 1847080Srrh xpts = mpts; 1857080Srrh } 1867080Srrh rtn: 1877080Srrh xbitf = 0; 1887080Srrh } 1897080Srrh setch(){ 1907080Srrh register i,*j,k; 1917080Srrh extern int chtab[]; 1927080Srrh 1937080Srrh if((i = getrq()) == 0)return(0); 1947080Srrh for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0); 1957080Srrh k = *(++j) | chbits; 1967080Srrh /* 1977080Srrh if((i & CMASK) == '*'){ 1987080Srrh if(((i = find('R',fontlab)) < 0) && 1997080Srrh ((i = find('G',fontlab)) < 0)) 2007080Srrh return(k); 2017080Srrh else return((k & ~(03<<(BYTE+1))) | (i<<(BYTE+1))); 2027080Srrh } 2037080Srrh */ 2047080Srrh return(k); 2057080Srrh } 2067080Srrh find(i,j) 2077080Srrh int i,j[]; 2087080Srrh { 2097080Srrh register k; 2107080Srrh 2117080Srrh if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k); 2127080Srrh for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1); 2137080Srrh return(k); 2147080Srrh } 2157080Srrh casefz(){ 2167080Srrh register i, j, k; 2177080Srrh int savinc; 2187080Srrh 2197080Srrh k = 0; 2207080Srrh fz0: 2217080Srrh if(skip() || !(i = getrq()) || 2227080Srrh ((j = find(i,fontlab)) == -1)){ 2237080Srrh if(k)goto fz1; 2247080Srrh else return; 2257080Srrh } 2267080Srrh if(j == (smnt-1)){ 2277080Srrh k = smnt; 2287080Srrh goto fz0; 2297080Srrh } 2307080Srrh if(k){ 2317080Srrh spsz = j + 1; 2327080Srrh j = k -1; 2337080Srrh } 2347080Srrh fz1: 2357080Srrh if((j==font) && fz[j].inc)savinc = fz[j].inc; 2367080Srrh else savinc = 0; 2377080Srrh fz[j].inc = fz[j].sign = fz[j].size = 0; 2387080Srrh if(skip()){ 2397080Srrh if(k)spsz = 0; 2407080Srrh goto fz2; 2417080Srrh } 2427080Srrh if(((i=((k=getch()) & CMASK)) == '+') || (i == '-'))fz[j].sign = i; 2437080Srrh else{ 2447080Srrh fz[j].sign = 0; 2457080Srrh ch = k; 2467080Srrh } 2477080Srrh noscale++; 2487080Srrh fz[j].size = atoi(); 2497080Srrh noscale = 0; 2507080Srrh fz2: 2517080Srrh if(j==font)casps1(apts + savinc); 2527080Srrh else if(j == smnt-1)mchbits(); 2537080Srrh } 2547080Srrh caseps(){ 2557080Srrh register i; 2567080Srrh 2577080Srrh if(skip())i = apts1; 2587080Srrh else{ 2597080Srrh noscale++; 2607080Srrh i = inumb(&apts); 2617080Srrh noscale = 0; 2627080Srrh if(nonumb)return; 2637080Srrh } 2647080Srrh casps1(i); 2657080Srrh } 2667080Srrh casps1(i) 2677080Srrh int i; 2687080Srrh { 2697080Srrh if(i <= 0)return; 2707080Srrh if(fz[font].size){ 2717080Srrh i = getfz(font, i); 2727080Srrh } 2737080Srrh apts1 = apts; 2747080Srrh apts = i; 2757080Srrh pts1 = pts; 2767080Srrh pts = findps(i & 077); 2777080Srrh mchbits(); 2787080Srrh } 2797080Srrh findps(i) 2807080Srrh int i; 2817080Srrh { 2827080Srrh register j, k; 2837080Srrh 2847080Srrh for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;} 2857080Srrh if(psctab[j] < 0)k |= DBL; 2867080Srrh return(k); 2877080Srrh } 2887080Srrh mchbits(){ 2897080Srrh register i, j, k; 2907080Srrh 2917080Srrh spbits = 0; 2927080Srrh i = pts & 077; 2937080Srrh for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;} 2947080Srrh chbits = (((++j)<<2) | font) << (BYTE + 1); 2957080Srrh sps = width(' ' | chbits); 2967080Srrh if(font == (spsz-1)){ 2977080Srrh i = findps(getfz(smnt-1, apts + fz[font].inc)); 2987080Srrh for(j=0; i > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;} 2997080Srrh spbits = (((++j)<<2) | font) << (BYTE + 1); 3007080Srrh } 3017080Srrh } 3027080Srrh getfz(x,y) 3037080Srrh int x, y; 3047080Srrh { 3057080Srrh register i, j, k; 3067080Srrh 3077080Srrh i = fz[x].size; 3087080Srrh j = fz[x].sign; 3097080Srrh if(i || j){ 3107080Srrh if(j == '+')i += y; 3117080Srrh else if(j == '-')i = y - i; 3127080Srrh } 3137080Srrh fz[x].inc = y - i; 3147080Srrh return(i); 3157080Srrh } 3167080Srrh setps(){ 3177080Srrh register i,j; 3187080Srrh 3197080Srrh if((((i=getch() & CMASK) == '+') || (i == '-')) && 3207080Srrh (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){ 3217080Srrh if(i == '-')j = -j; 3227080Srrh ch = 0; 3237080Srrh casps1(apts+j); 3247080Srrh return; 3257080Srrh } 3267080Srrh if((i -= '0') == 0){ 3277080Srrh casps1(apts1); 3287080Srrh return; 3297080Srrh } 3307080Srrh if((i > 0) && (i <= 9)){ 3317080Srrh if((i <= 3) && 3327080Srrh ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){ 3337080Srrh i = 10*i +j; 3347080Srrh ch = 0; 3357080Srrh } 3367080Srrh casps1(i); 3377080Srrh } 3387080Srrh } 3397080Srrh caseft(){ 3407080Srrh skip(); 3417080Srrh setfont(1); 3427080Srrh } 3437080Srrh setfont(a) 3447080Srrh int a; 3457080Srrh { 3467080Srrh register i,j; 3477080Srrh 3487080Srrh if(a)i = getrq(); 3497080Srrh else i = getsn(); 3507080Srrh if(!i || (i == 'P')){ 3517080Srrh j = font1; 3527080Srrh goto s0; 3537080Srrh } 3547080Srrh if(i == 'S')return; 3557080Srrh if((j = find(i,fontlab)) == -1)return; 3567080Srrh s0: 3577080Srrh font1 = font; 3587080Srrh font = j; 3597080Srrh i = 0; 3607080Srrh if(fz[font1].size){ 3617080Srrh i++; 3627080Srrh casps1(apts + fz[font1].inc); 3637080Srrh }else if(fz[font].size){ 3647080Srrh i++; 3657080Srrh casps1(apts); 3667080Srrh } 3677080Srrh if(!i)mchbits(); 3687080Srrh } 3697080Srrh setwd(){ 3707080Srrh register i, base, wid; 3717080Srrh int delim, em, k; 3727080Srrh int savlevel, savhp, savapts, savapts1, savfont, savfont1, 3737080Srrh savpts, savpts1; 3747080Srrh int *savpinchar, *p, *q, tempinchar[LNSIZE]; /* XXX */ 3757080Srrh 3767080Srrh base = v.st = v.sb = wid = v.ct = 0; 3777080Srrh if((delim = getch() & CMASK) & MOT)return; 3787080Srrh savhp = v.hp; 3797080Srrh savpinchar = pinchar; /* XXX */ 3807080Srrh for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */ 3817080Srrh *q++ = *p++; /* XXX */ 3827080Srrh pinchar = inchar; /* XXX */ 3837080Srrh savlevel = level; 3847080Srrh v.hp = level = 0; 3857080Srrh savapts = apts; 3867080Srrh savapts1 = apts1; 3877080Srrh savfont = font; 3887080Srrh savfont1 = font1; 3897080Srrh savpts = pts; 3907080Srrh savpts1 = pts1; 3917080Srrh setwdf++; 3927080Srrh while((((i = getch()) & CMASK) != delim) && !nlflg){ 3937080Srrh wid += width(i); 3947080Srrh if(!(i & MOT)){ 3957080Srrh em = (xpts & 077)*6; 3967080Srrh }else if(i & VMOT){ 3977080Srrh k = i & ~MOTV; 3987080Srrh if(i & NMOT)k = -k; 3997080Srrh base -= k; 4007080Srrh em = 0; 4017080Srrh }else continue; 4027080Srrh if(base < v.sb)v.sb = base; 4037080Srrh if((k=base + em) > v.st)v.st = k; 4047080Srrh } 4057080Srrh nform = 0; 4067080Srrh setn1(wid); 4077080Srrh v.hp = savhp; 4087080Srrh pinchar = savpinchar; /* XXX */ 4097080Srrh for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */ 4107080Srrh *p++ = *q++; /* XXX */ 4117080Srrh level = savlevel; 4127080Srrh apts = savapts; 4137080Srrh apts1 = savapts1; 4147080Srrh font = savfont; 4157080Srrh font1 = savfont1; 4167080Srrh pts = savpts; 4177080Srrh pts1 = savpts1; 4187080Srrh mchbits(); 4197080Srrh setwdf = 0; 4207080Srrh } 4217080Srrh vmot(){ 4227080Srrh dfact = lss; 4237080Srrh vflag++; 4247080Srrh return(mot()); 4257080Srrh } 4267080Srrh hmot(){ 4277080Srrh dfact = 6 * (pts & 077); 4287080Srrh return(mot()); 4297080Srrh } 4307080Srrh mot(){ 4317080Srrh register i, j; 4327080Srrh 4337080Srrh j = HOR; 4347080Srrh getch(); /*eat delim*/ 4357080Srrh if(i = atoi()){ 4367080Srrh if(vflag)j = VERT; 4377080Srrh i = makem(quant(i,j)); 4387080Srrh } 4397080Srrh getch(); 4407080Srrh vflag = 0; 4417080Srrh dfact = 1; 4427080Srrh return(i); 4437080Srrh } 4447080Srrh sethl(k) 4457080Srrh int k; 4467080Srrh { 4477080Srrh register i; 4487080Srrh 4497080Srrh i = 3 * (pts & 077); 4507080Srrh if(k == 'u')i = -i; 4517080Srrh else if(k == 'r')i = -2*i; 4527080Srrh vflag++; 4537080Srrh i = makem(i); 4547080Srrh vflag = 0; 4557080Srrh return(i); 4567080Srrh } 4577080Srrh makem(i) 4587080Srrh int i; 4597080Srrh { 4607080Srrh register j; 4617080Srrh 4627080Srrh if((j = i) < 0)j = -j; 4637080Srrh j = (j & ~MOTV) | MOT; 4647080Srrh if(i < 0)j |= NMOT; 4657080Srrh if(vflag)j |= VMOT; 4667080Srrh return(j); 4677080Srrh } 4687080Srrh getlg(i) 4697080Srrh int i; 4707080Srrh { 4717080Srrh register j, k; 4727080Srrh 4737080Srrh switch((j = getch0()) & CMASK){ 4747080Srrh case 'f': 4757080Srrh if(lg!=2){switch((k =getch0()) & CMASK){ 4767080Srrh case 'i': 4777080Srrh j = 0214; 4787080Srrh break; 4797080Srrh case 'l': 4807080Srrh j = 0215; 4817080Srrh break; 4827080Srrh default: 4837080Srrh ch0 = k; 4847080Srrh j = 0213; 4857080Srrh } 4867080Srrh }else j = 0213; 4877080Srrh break; 4887080Srrh case 'l': 4897080Srrh j = 0212; 4907080Srrh break; 4917080Srrh case 'i': 4927080Srrh j = 0211; 4937080Srrh break; 4947080Srrh default: 4957080Srrh ch0 = j; 4967080Srrh j = i; 4977080Srrh } 4987080Srrh return((i & ~CMASK) | j); 4997080Srrh } 5007080Srrh caselg(){ 5017080Srrh 5027080Srrh lg = 1; 5037080Srrh if(skip())return; 5047080Srrh lg = atoi(); 5057080Srrh } 5067080Srrh casefp(){ 5077080Srrh register i, j, k; 5087080Srrh int x; 5097080Srrh 51011248Sshannon if (ffi == 0) 51111248Sshannon while (fontfile[ffi] != 'X') 51211248Sshannon ffi++; 5137080Srrh skip(); 5147080Srrh if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)){prstr("fp: bad font position\n"); return;} 5157080Srrh if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;} 5167080Srrh fontfile[ffi] = j & BMASK; 5177080Srrh fontfile[ffi+1] = j>>BYTE; 5187080Srrh if((k = open(fontfile,0)) < 0){ 5197080Srrh prstr("Cannot open "); 5207080Srrh c0: 5217080Srrh prstr(fontfile); 5227080Srrh prstr("\n"); 5237080Srrh done(-1); 5247080Srrh } 5257080Srrh if(lseek(k,8L * sizeof(int),0) < 0)goto c1; 5267080Srrh if(read(k,fontab[i],256-32) != 256-32){ 5277080Srrh c1: 5287080Srrh prstr("Cannot read "); 5297080Srrh goto c0; 5307080Srrh } 5317080Srrh close(k); 5327080Srrh if(i == (smnt-1)){smnt = 0; sbold = 0; spsz = 0;} 5337080Srrh if((fontlab[i] = j) == 'S')smnt = i + 1; 5347080Srrh bdtab[i] = cstab[i] = ccstab[i] = 0; 5357080Srrh fz[i].inc = fz[i].sign = fz[i].size = 0; 5367080Srrh if(ptid != 1){ 5377080Srrh prstr("Mount font "); 5387080Srrh prstr(&fontfile[ffi]); 5397080Srrh prstr(" on "); 5407080Srrh x = PAIR((i + '1'),0); 5417080Srrh prstr((char *)&x); 5427080Srrh prstr("\n"); 5437080Srrh } 5447080Srrh } 5457080Srrh casecs(){ 5467080Srrh register i, j; 5477080Srrh 5487080Srrh noscale++; 5497080Srrh skip(); 5507080Srrh if(!(i=getrq()) || 5517080Srrh ((i = find(i,fontlab)) < 0))goto rtn; 5527080Srrh skip(); 5537080Srrh cstab[i] = atoi(); 5547080Srrh skip(); 5557080Srrh j = atoi(); 5567080Srrh if(!nonumb)ccstab[i] = findps(j); 5577080Srrh rtn: 5587080Srrh noscale = 0; 5597080Srrh } 5607080Srrh casebd(){ 5617080Srrh register i, j, k; 5627080Srrh 5637080Srrh k = 0; 5647080Srrh bd0: 5657080Srrh if(skip() || !(i = getrq()) || 5667080Srrh ((j = find(i,fontlab)) == -1)){ 5677080Srrh if(k)goto bd1; 5687080Srrh else return; 5697080Srrh } 5707080Srrh if(j == (smnt-1)){ 5717080Srrh k = smnt; 5727080Srrh goto bd0; 5737080Srrh } 5747080Srrh if(k){ 5757080Srrh sbold = j + 1; 5767080Srrh j = k -1; 5777080Srrh } 5787080Srrh bd1: 5797080Srrh skip(); 5807080Srrh noscale++; 5817080Srrh bdtab[j] = atoi(); 5827080Srrh noscale = 0; 5837080Srrh } 5847080Srrh casevs(){ 5857080Srrh register i; 5867080Srrh 5877080Srrh skip(); 5887080Srrh vflag++; 5897080Srrh dfact = 6; /*default scaling is points!*/ 5907080Srrh res = VERT; 5917080Srrh i = inumb(&lss); 5927080Srrh if(nonumb)i = lss1; 5937080Srrh if(i < VERT)i = VERT; 5947080Srrh lss1 = lss; 5957080Srrh lss = i; 5967080Srrh } 5977080Srrh casess(){ 5987080Srrh register i; 5997080Srrh 6007080Srrh noscale++; 6017080Srrh skip(); 6027080Srrh if(i = atoi()){ 6037080Srrh spacesz = i& 0177; 6047080Srrh sps = width(' ' | chbits); 6057080Srrh } 6067080Srrh noscale = 0; 6077080Srrh } 6087080Srrh xlss(){ 6097080Srrh register i, j; 6107080Srrh 6117080Srrh getch(); 6127080Srrh dfact = lss; 6137080Srrh i = quant(atoi(),VERT); 6147080Srrh dfact = 1; 6157080Srrh getch(); 6167080Srrh if((j = i) < 0)j = -j; 6177080Srrh ch0 = ((j & 03700)<<3) | HX; 6187080Srrh if(i < 0)ch0 |= 040000; 6197080Srrh return(((j & 077)<<9) | LX); 6207080Srrh } 621