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