|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.