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