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