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