1: #ifndef lint 2: static char sccsid[] = "@(#)t6.c 4.2 2/23/83"; 3: #endif lint 4: 5: #include "tdef.h" 6: extern 7: #include "d.h" 8: extern 9: #include "v.h" 10: 11: /* 12: troff6.c 13: 14: width functions, sizes and fonts 15: */ 16: 17: extern int inchar[LNSIZE], *pinchar; /* XXX */ 18: extern int eschar; 19: extern int widthp; 20: extern int ohc; 21: extern int xpts; 22: extern int xfont; 23: extern int code; 24: extern int smnt; 25: extern int setwdf; 26: extern int cs; 27: extern int ccs; 28: extern int spacesz; 29: extern char trtab[]; 30: extern int xbitf; 31: extern int mfont; 32: extern int mpts; 33: extern int pfont; 34: extern int ppts; 35: extern int oldbits; 36: extern int chbits; 37: extern int spbits; 38: extern int nonumb; 39: extern int noscale; 40: extern int font; 41: extern int font1; 42: extern int pts; 43: extern int pts1; 44: extern int apts; 45: extern int apts1; 46: extern int sps; 47: extern int nlflg; 48: extern int nform; 49: extern int dfact; 50: extern int lss; 51: extern int lss1; 52: extern int vflag; 53: extern int ch0; 54: extern int lg; 55: char *fontfile = "/usr/lib/font/ftXX"; 56: int ffi = 0; 57: extern int bd; 58: extern int level; 59: extern int ch; 60: extern int res; 61: extern int ptid; 62: extern char W1[],W2[],W3[],W4[]; 63: extern int xxx; 64: int trflg; 65: char *fontab[] = {W1,W2,W3,W4}; 66: int fontlab[] = {'R','I','B','S',0}; 67: char pstab[] = {6,7,8,9,10,11,12,14,16,18,20,22,24,28,36,0}; 68: char psctab[] = {010,000,001,007,002,003,004,005,0211,006, 69: 0212,0213,0214,0215,0216,0}; 70: int cstab[4], ccstab[4]; 71: int bdtab[4]; 72: int sbold = 0; 73: int spsz = 0; 74: struct fz { 75: char sign; 76: char size; 77: int inc; 78: } fz[4]; 79: 80: width(c) 81: int 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; 111: rtn: 112: xbitf = trflg = 0; 113: return(k); 114: } 115: getcw(i) 116: int 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]; 135: g0: 136: if(!i)k = spacesz; 137: else k = *(p + i) & BMASK; 138: if(setwdf)v.ct |= ((k>>6) & 3); 139: g1: 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: } 150: xbits(i) 151: int 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: } 185: rtn: 186: xbitf = 0; 187: } 188: setch(){ 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: } 205: find(i,j) 206: int 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: } 214: casefz(){ 215: register i, j, k; 216: int savinc; 217: 218: k = 0; 219: fz0: 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: } 233: fz1: 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; 249: fz2: 250: if(j==font)casps1(apts + savinc); 251: else if(j == smnt-1)mchbits(); 252: } 253: caseps(){ 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: } 265: casps1(i) 266: int 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: } 278: findps(i) 279: int 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: } 287: mchbits(){ 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: } 301: getfz(x,y) 302: int 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: } 315: setps(){ 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: } 338: caseft(){ 339: skip(); 340: setfont(1); 341: } 342: setfont(a) 343: int 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; 355: s0: 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: } 368: setwd(){ 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: } 420: vmot(){ 421: dfact = lss; 422: vflag++; 423: return(mot()); 424: } 425: hmot(){ 426: dfact = 6 * (pts & 077); 427: return(mot()); 428: } 429: mot(){ 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: } 443: sethl(k) 444: int 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: } 456: makem(i) 457: int 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: } 467: getlg(i) 468: int 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: } 499: caselg(){ 500: 501: lg = 1; 502: if(skip())return; 503: lg = atoi(); 504: } 505: casefp(){ 506: register i, j, k; 507: int x; 508: 509: if (ffi == 0) 510: while (fontfile[ffi] != 'X') 511: ffi++; 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: } 544: casecs(){ 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); 556: rtn: 557: noscale = 0; 558: } 559: casebd(){ 560: register i, j, k; 561: 562: k = 0; 563: bd0: 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: } 577: bd1: 578: skip(); 579: noscale++; 580: bdtab[j] = atoi(); 581: noscale = 0; 582: } 583: casevs(){ 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: } 596: casess(){ 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: } 607: xlss(){ 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: }