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