|
|
1.1 ! root 1: #include "tdef.h" ! 2: #include "fns.h" ! 3: #include "ext.h" ! 4: ! 5: /* ! 6: * troff10.c ! 7: * ! 8: * typesetter interface ! 9: */ ! 10: ! 11: int vpos = 0; /* absolute vertical position on page */ ! 12: int hpos = 0; /* ditto horizontal */ ! 13: ! 14: extern Font fonts[MAXFONTS+1]; ! 15: ! 16: int Inch; ! 17: int Hor; ! 18: int Vert; ! 19: int Unitwidth; ! 20: int nfonts; ! 21: ! 22: ! 23: ! 24: void t_ptinit(void) ! 25: { ! 26: int i; ! 27: char buf[100], *p; ! 28: ! 29: hmot = t_hmot; ! 30: makem = t_makem; ! 31: setabs = t_setabs; ! 32: setch = t_setch; ! 33: sethl = t_sethl; ! 34: setht = t_setht; ! 35: setslant = t_setslant; ! 36: vmot = t_vmot; ! 37: xlss = t_xlss; ! 38: findft = t_findft; ! 39: width = t_width; ! 40: mchbits = t_mchbits; ! 41: ptlead = t_ptlead; ! 42: ptout = t_ptout; ! 43: ptpause = t_ptpause; ! 44: setfont = t_setfont; ! 45: setps = t_setps; ! 46: setwd = t_setwd; ! 47: ! 48: /* open table for device, */ ! 49: /* read in resolution, size info, font info, etc., set params */ ! 50: if (termtab[0] == 0) ! 51: strcpy(termtab, FONTDIR); ! 52: if (fontdir[0] == 0) ! 53: strcpy(fontdir, FONTDIR); ! 54: if (devname[0] == 0) ! 55: strcpy(devname, TDEVNAME); ! 56: hyf = 1; ! 57: lg = 1; ! 58: ! 59: sprintf(buf, "/dev%s/DESC", devname); ! 60: strcat(termtab, buf); ! 61: if (getdesc(termtab) < 0) { ! 62: ERROR "can't open DESC file %s", termtab WARN; ! 63: done3(1); ! 64: } ! 65: if (!ascii) { ! 66: OUT "x T %s\n", devname PUT; ! 67: OUT "x res %d %d %d\n", Inch, Hor, Vert PUT; ! 68: OUT "x init\n" PUT; ! 69: } ! 70: for (i = 1; i <= nfonts; i++) ! 71: setfp(i, fontlab[i], (char *) 0, 0); ! 72: sps = EM/3; /* space size */ ! 73: ics = EM; /* insertion character space */ ! 74: for (i = 0; i < NTAB && DTAB * (i + 1) < TABMASK; i++) ! 75: tabtab[i] = DTAB * (i + 1); ! 76: pl = 11 * INCH; /* paper length */ ! 77: po = PO; /* page offset */ ! 78: spacesz = SS; ! 79: lss = lss1 = VS; ! 80: ll = ll1 = lt = lt1 = LL; ! 81: t_specnames(); /* install names like "hyphen", etc. */ ! 82: } ! 83: ! 84: void t_specnames(void) ! 85: { ! 86: int i; ! 87: ! 88: for (i = 0; spnames[i].n; i++) ! 89: *spnames[i].n = chindex(spnames[i].v); ! 90: } ! 91: ! 92: void t_ptout(Tchar i) ! 93: { ! 94: int dv; ! 95: Tchar *k; ! 96: int temp, a, b; ! 97: ! 98: if (cbits(i) != '\n') { ! 99: if (olinep >= oline + OLNSIZE) { ! 100: ERROR "Output line overflow." WARN; ! 101: done(2); ! 102: } ! 103: *olinep++ = i; ! 104: return; ! 105: } ! 106: if (olinep == oline) { ! 107: lead += lss; ! 108: return; ! 109: } ! 110: ! 111: hpos = po; /* ??? */ ! 112: esc = 0; /* ??? */ ! 113: ptesc(); /* the problem is to get back to the left end of the line */ ! 114: dv = 0; ! 115: for (k = oline; k < olinep; k++) { ! 116: if (ismot(*k) && isvmot(*k)) { ! 117: temp = absmot(*k); ! 118: if (isnmot(*k)) ! 119: temp = -temp; ! 120: dv += temp; ! 121: } ! 122: } ! 123: if (dv) { ! 124: vflag++; ! 125: *olinep++ = makem(-dv); ! 126: vflag = 0; ! 127: } ! 128: ! 129: b = dip->blss + lss; ! 130: lead += dip->blss + lss; ! 131: dip->blss = 0; ! 132: for (k = oline; k < olinep; ) ! 133: k += ptout0(k); /* now passing a pointer! */ ! 134: olinep = oline; ! 135: lead += dip->alss; ! 136: a = dip->alss; ! 137: dip->alss = 0; ! 138: /* ! 139: OUT "x xxx end of line: hpos=%d, vpos=%d\n", hpos, vpos PUT; ! 140: */ ! 141: OUT "n%d %d\n", b, a PUT; /* be nice to chuck */ ! 142: } ! 143: ! 144: int ptout0(Tchar *pi) ! 145: { ! 146: int j, k, w; ! 147: int z, dx, dy, dx2, dy2, n; ! 148: Tchar i; ! 149: int outsize; /* size of object being printed */ ! 150: ! 151: outsize = 1; /* default */ ! 152: i = *pi; ! 153: k = cbits(i); ! 154: if (ismot(i)) { ! 155: j = absmot(i); ! 156: if (isnmot(i)) ! 157: j = -j; ! 158: if (isvmot(i)) ! 159: lead += j; ! 160: else ! 161: esc += j; ! 162: return(outsize); ! 163: } ! 164: if (k == CHARHT) { ! 165: if (xpts != mpts) ! 166: ptps(); ! 167: OUT "x H %d\n", sbits(i) PUT; ! 168: return(outsize); ! 169: } ! 170: if (k == SLANT) { ! 171: OUT "x S %d\n", sfbits(i)-180 PUT; ! 172: return(outsize); ! 173: } ! 174: if (k == WORDSP) { ! 175: oput('w'); ! 176: return(outsize); ! 177: } ! 178: if (sfbits(i) == oldbits) { ! 179: xfont = pfont; ! 180: xpts = ppts; ! 181: } else ! 182: xbits(i, 2); ! 183: if (k == XON) { ! 184: extern int xon; ! 185: ptflush(); /* guarantee that everything is out */ ! 186: if (esc) ! 187: ptesc(); ! 188: if (xfont != mfont) ! 189: ptfont(); ! 190: if (xpts != mpts) ! 191: ptps(); ! 192: if (lead) ! 193: ptlead(); ! 194: OUT "x X " PUT; ! 195: xon++; ! 196: for (j = 1; cbits(pi[j]) != XOFF; j++) ! 197: outascii(pi[j]); ! 198: oput('\n'); ! 199: xon--; ! 200: return j+1; ! 201: } ! 202: if (k < 040 && k != DRAWFCN) ! 203: return(outsize); ! 204: j = z = 0; ! 205: if (k != DRAWFCN) { ! 206: if (widcache[k].fontpts == (xfont<<8) + xpts && !setwdf) { ! 207: w = widcache[k].width; ! 208: bd = 0; ! 209: cs = 0; ! 210: } else ! 211: w = getcw(k); ! 212: if (cs) { ! 213: if (bd) ! 214: w += (bd - 1) * HOR; ! 215: j = (cs - w) / 2; ! 216: w = cs - j; ! 217: if (bd) ! 218: w -= (bd - 1) * HOR; ! 219: } ! 220: if (iszbit(i)) { ! 221: if (cs) ! 222: w = -j; ! 223: else ! 224: w = 0; ! 225: z = 1; ! 226: } ! 227: } ! 228: esc += j; ! 229: if (xfont != mfont) ! 230: ptfont(); ! 231: if (xpts != mpts) ! 232: ptps(); ! 233: if (lead) ! 234: ptlead(); ! 235: /* put out the real character here */ ! 236: if (k == DRAWFCN) { ! 237: if (esc) ! 238: ptesc(); ! 239: w = 0; ! 240: dx = absmot(pi[3]); ! 241: if (isnmot(pi[3])) ! 242: dx = -dx; ! 243: dy = absmot(pi[4]); ! 244: if (isnmot(pi[4])) ! 245: dy = -dy; ! 246: switch (cbits(pi[1])) { ! 247: case DRAWCIRCLE: /* circle */ ! 248: OUT "D%c %d\n", DRAWCIRCLE, dx PUT; /* dx is diameter */ ! 249: hpos += dx; ! 250: break; ! 251: case DRAWELLIPSE: ! 252: OUT "D%c %d %d\n", DRAWELLIPSE, dx, dy PUT; ! 253: hpos += dx; ! 254: break; ! 255: case DRAWBUILD: ! 256: k = cbits(pi[2]); ! 257: OUT "D%c %d ", DRAWBUILD, dx PUT; ! 258: if (k < ALPHABET) ! 259: OUT "%c\n", k PUT; ! 260: else ! 261: OUT "%s\n", chnames[k - ALPHABET] PUT; ! 262: hpos += dx; ! 263: break; ! 264: case DRAWLINE: /* line */ ! 265: k = cbits(pi[2]); ! 266: OUT "D%c %d %d ", DRAWLINE, dx, dy PUT; ! 267: if (k < ALPHABET) ! 268: OUT "%c\n", k PUT; ! 269: else ! 270: OUT "%s\n", chnames[k - ALPHABET] PUT; ! 271: hpos += dx; ! 272: vpos += dy; ! 273: break; ! 274: case DRAWARC: /* arc */ ! 275: dx2 = absmot(pi[5]); ! 276: if (isnmot(pi[5])) ! 277: dx2 = -dx2; ! 278: dy2 = absmot(pi[6]); ! 279: if (isnmot(pi[6])) ! 280: dy2 = -dy2; ! 281: OUT "D%c %d %d %d %d\n", DRAWARC, ! 282: dx, dy, dx2, dy2 PUT; ! 283: hpos += dx + dx2; ! 284: vpos += dy + dy2; ! 285: break; ! 286: ! 287: case 's': /* using 's' internally to avoid .tr ~ */ ! 288: pi[1] = '~'; ! 289: case DRAWSPLINE: /* spline */ ! 290: default: /* something else; copy it like spline */ ! 291: OUT "D%c %d %d", cbits(pi[1]), dx, dy PUT; ! 292: hpos += dx; ! 293: vpos += dy; ! 294: if (cbits(pi[3]) == DRAWFCN || cbits(pi[4]) == DRAWFCN) { ! 295: /* it was somehow defective */ ! 296: OUT "\n" PUT; ! 297: break; ! 298: } ! 299: for (n = 5; cbits(pi[n]) != DRAWFCN; n += 2) { ! 300: dx = absmot(pi[n]); ! 301: if (isnmot(pi[n])) ! 302: dx = -dx; ! 303: dy = absmot(pi[n+1]); ! 304: if (isnmot(pi[n+1])) ! 305: dy = -dy; ! 306: OUT " %d %d", dx, dy PUT; ! 307: hpos += dx; ! 308: vpos += dy; ! 309: } ! 310: OUT "\n" PUT; ! 311: break; ! 312: } ! 313: for (n = 3; cbits(pi[n]) != DRAWFCN; n++) ! 314: ; ! 315: outsize = n + 1; ! 316: } else if (k < ALPHABET) { ! 317: /* try to go faster and compress output */ ! 318: /* by printing nnc for small positive motion followed by c */ ! 319: /* kludgery; have to make sure set all the vars too */ ! 320: if (esc > 0 && esc < 100) { ! 321: oput(esc / 10 + '0'); ! 322: oput(esc % 10 + '0'); ! 323: oput(k); ! 324: hpos += esc; ! 325: esc = 0; ! 326: } else { ! 327: if (esc) ! 328: ptesc(); ! 329: oput('c'); ! 330: oput(k); ! 331: oput('\n'); ! 332: } ! 333: } else { ! 334: if (esc) ! 335: ptesc(); ! 336: if (chnames[k-ALPHABET][0] == '#') /* DOESN'T WORK: name not nec #dnn */ ! 337: OUT "N%s\n", &chnames[k-ALPHABET][1] PUT; ! 338: else ! 339: OUT "C%s\n", chnames[k - ALPHABET] PUT; ! 340: } ! 341: if (bd) { ! 342: bd -= HOR; ! 343: if (esc += bd) ! 344: ptesc(); ! 345: if (k < ALPHABET) { ! 346: OUT "c%c\n", k PUT; ! 347: } else if (chnames[k-ALPHABET][0] == '#') { /* DOESN'T WORK: name not nec #dnn */ ! 348: OUT "N%s\n", &chnames[k-ALPHABET][1] PUT; ! 349: } else ! 350: OUT "C%s\n", chnames[k - ALPHABET] PUT; ! 351: if (z) ! 352: esc -= bd; ! 353: } ! 354: esc += w; ! 355: return(outsize); ! 356: } ! 357: ! 358: void ptflush(void) /* get us to a clean output state */ ! 359: { ! 360: if (TROFF) { ! 361: /* ptesc(); but always H, no h */ ! 362: hpos += esc; ! 363: OUT "\nH%d\n", hpos PUT; ! 364: esc = 0; ! 365: ptps(); ! 366: ptfont(); ! 367: ptlead(); ! 368: } ! 369: } ! 370: ! 371: void ptps(void) ! 372: { ! 373: int i, j, k; ! 374: ! 375: i = xpts; ! 376: for (j = 0; i > (k = pstab[j]); j++) ! 377: if (!k) { ! 378: k = pstab[--j]; ! 379: break; ! 380: } ! 381: OUT "s%d\n", k PUT; /* really should put out string rep of size */ ! 382: mpts = i; ! 383: } ! 384: ! 385: void ptfont(void) ! 386: { ! 387: mfont = xfont; ! 388: if (xfont > nfonts) { ! 389: ptfpcmd(0, fonts[xfont].longname, 0); /* Put the desired font in the ! 390: * fontcache of the filter */ ! 391: OUT "f0\n" PUT; /* make sure that it gets noticed */ ! 392: } else ! 393: OUT "f%d\n", xfont PUT; ! 394: } ! 395: ! 396: void ptfpcmd(int f, char *s, char *longname) ! 397: { ! 398: if (ascii) ! 399: return; ! 400: if (f > nfonts) /* a bit risky? */ ! 401: f = 0; ! 402: if (longname) { ! 403: OUT "x font %d %s %s\n", f, s, longname PUT; ! 404: } else { ! 405: OUT "x font %d %s\n", f, s PUT; ! 406: } ! 407: /* OUT "f%d\n", xfont PUT; /* need this for buggy version of adobe transcript */ ! 408: /* which apparently believes that x font means */ ! 409: /* to set the font, not just the position. */ ! 410: } ! 411: ! 412: void t_ptlead(void) ! 413: { ! 414: vpos += lead; ! 415: if (!ascii) ! 416: OUT "V%d\n", vpos PUT; ! 417: lead = 0; ! 418: } ! 419: ! 420: void ptesc(void) ! 421: { ! 422: hpos += esc; ! 423: if (esc > 0) { ! 424: oput('h'); ! 425: if (esc>=10 && esc<100) { ! 426: oput(esc/10 + '0'); ! 427: oput(esc%10 + '0'); ! 428: } else ! 429: OUT "%d", esc PUT; ! 430: } else ! 431: OUT "H%d\n", hpos PUT; ! 432: esc = 0; ! 433: } ! 434: ! 435: void ptpage(int n) /* called at end of each output page, we hope */ ! 436: { ! 437: int i; ! 438: ! 439: if (NROFF) ! 440: return; ! 441: ptlead(); ! 442: vpos = 0; ! 443: if (ascii) ! 444: return; ! 445: OUT "p%d\n", n PUT; /* new page */ ! 446: for (i = 0; i <= nfonts; i++) ! 447: if (fontlab[i]) { ! 448: if (fonts[i].truename) ! 449: OUT "x font %d %s %s\n", i, fonts[i].longname, fonts[i].truename PUT; ! 450: else ! 451: OUT "x font %d %s\n", i, fonts[i].longname PUT; ! 452: } ! 453: ptps(); ! 454: ptfont(); ! 455: } ! 456: ! 457: void pttrailer(void) ! 458: { ! 459: if (TROFF) ! 460: OUT "x trailer\n" PUT; ! 461: } ! 462: ! 463: void ptstop(void) ! 464: { ! 465: if (TROFF) ! 466: OUT "x stop\n" PUT; ! 467: } ! 468: ! 469: void t_ptpause(void) ! 470: { ! 471: if (ascii) ! 472: return; ! 473: ptlead(); ! 474: vpos = 0; ! 475: pttrailer(); ! 476: ptlead(); ! 477: OUT "x pause\n" PUT; ! 478: flusho(); ! 479: mpts = mfont = 0; ! 480: ptesc(); ! 481: esc = po; ! 482: hpos = vpos = 0; /* probably in wrong place */ ! 483: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.