13e12c5d1SDavid du Colombier #include "tdef.h"
23e12c5d1SDavid du Colombier #include "fns.h"
33e12c5d1SDavid du Colombier #include "ext.h"
43e12c5d1SDavid du Colombier
53e12c5d1SDavid du Colombier /*
63e12c5d1SDavid du Colombier * troff10.c
73e12c5d1SDavid du Colombier *
83e12c5d1SDavid du Colombier * typesetter interface
93e12c5d1SDavid du Colombier */
103e12c5d1SDavid du Colombier
113e12c5d1SDavid du Colombier int vpos = 0; /* absolute vertical position on page */
123e12c5d1SDavid du Colombier int hpos = 0; /* ditto horizontal */
133e12c5d1SDavid du Colombier
143e12c5d1SDavid du Colombier extern Font fonts[MAXFONTS+1];
153e12c5d1SDavid du Colombier
163e12c5d1SDavid du Colombier int Inch;
173e12c5d1SDavid du Colombier int Hor;
183e12c5d1SDavid du Colombier int Vert;
193e12c5d1SDavid du Colombier int Unitwidth;
203e12c5d1SDavid du Colombier int nfonts;
213e12c5d1SDavid du Colombier
223e12c5d1SDavid du Colombier
233e12c5d1SDavid du Colombier
t_ptinit(void)243e12c5d1SDavid du Colombier void t_ptinit(void)
253e12c5d1SDavid du Colombier {
263e12c5d1SDavid du Colombier int i;
273e12c5d1SDavid du Colombier char buf[100], *p;
283e12c5d1SDavid du Colombier
293e12c5d1SDavid du Colombier hmot = t_hmot;
303e12c5d1SDavid du Colombier makem = t_makem;
313e12c5d1SDavid du Colombier setabs = t_setabs;
323e12c5d1SDavid du Colombier setch = t_setch;
333e12c5d1SDavid du Colombier sethl = t_sethl;
343e12c5d1SDavid du Colombier setht = t_setht;
353e12c5d1SDavid du Colombier setslant = t_setslant;
363e12c5d1SDavid du Colombier vmot = t_vmot;
373e12c5d1SDavid du Colombier xlss = t_xlss;
383e12c5d1SDavid du Colombier findft = t_findft;
393e12c5d1SDavid du Colombier width = t_width;
403e12c5d1SDavid du Colombier mchbits = t_mchbits;
413e12c5d1SDavid du Colombier ptlead = t_ptlead;
423e12c5d1SDavid du Colombier ptout = t_ptout;
433e12c5d1SDavid du Colombier ptpause = t_ptpause;
443e12c5d1SDavid du Colombier setfont = t_setfont;
453e12c5d1SDavid du Colombier setps = t_setps;
463e12c5d1SDavid du Colombier setwd = t_setwd;
473e12c5d1SDavid du Colombier
483e12c5d1SDavid du Colombier /* open table for device, */
493e12c5d1SDavid du Colombier /* read in resolution, size info, font info, etc., set params */
504d44ba9bSDavid du Colombier if ((p = getenv("TYPESETTER")) != 0){
514d44ba9bSDavid du Colombier strncpy(devname, p, sizeof devname);
524d44ba9bSDavid du Colombier devname[sizeof devname-1] = 0;
534d44ba9bSDavid du Colombier }
543e12c5d1SDavid du Colombier if (termtab[0] == 0)
55219b2ee8SDavid du Colombier strcpy(termtab, DWBfontdir);
563e12c5d1SDavid du Colombier if (fontdir[0] == 0)
57219b2ee8SDavid du Colombier strcpy(fontdir, DWBfontdir);
583e12c5d1SDavid du Colombier if (devname[0] == 0)
593e12c5d1SDavid du Colombier strcpy(devname, TDEVNAME);
603e12c5d1SDavid du Colombier hyf = 1;
613e12c5d1SDavid du Colombier lg = 1;
623e12c5d1SDavid du Colombier
634d44ba9bSDavid du Colombier snprintf(buf, sizeof buf, "/dev%s/DESC", devname);
643e12c5d1SDavid du Colombier strcat(termtab, buf);
653e12c5d1SDavid du Colombier if (getdesc(termtab) < 0) {
663e12c5d1SDavid du Colombier ERROR "can't open DESC file %s", termtab WARN;
673e12c5d1SDavid du Colombier done3(1);
683e12c5d1SDavid du Colombier }
693e12c5d1SDavid du Colombier if (!ascii) {
703e12c5d1SDavid du Colombier OUT "x T %s\n", devname PUT;
713e12c5d1SDavid du Colombier OUT "x res %d %d %d\n", Inch, Hor, Vert PUT;
723e12c5d1SDavid du Colombier OUT "x init\n" PUT;
733e12c5d1SDavid du Colombier }
743e12c5d1SDavid du Colombier for (i = 1; i <= nfonts; i++)
753e12c5d1SDavid du Colombier setfp(i, fontlab[i], (char *) 0, 0);
763e12c5d1SDavid du Colombier sps = EM/3; /* space size */
773e12c5d1SDavid du Colombier ics = EM; /* insertion character space */
78219b2ee8SDavid du Colombier for (i = 0; i < (NTAB - 1) && DTAB * (i + 1) < TABMASK; i++)
793e12c5d1SDavid du Colombier tabtab[i] = DTAB * (i + 1);
809f2726c3SDavid du Colombier tabtab[NTAB-1] = 0;
813e12c5d1SDavid du Colombier pl = 11 * INCH; /* paper length */
823e12c5d1SDavid du Colombier po = PO; /* page offset */
833e12c5d1SDavid du Colombier spacesz = SS;
843e12c5d1SDavid du Colombier lss = lss1 = VS;
853e12c5d1SDavid du Colombier ll = ll1 = lt = lt1 = LL;
863e12c5d1SDavid du Colombier t_specnames(); /* install names like "hyphen", etc. */
873e12c5d1SDavid du Colombier }
883e12c5d1SDavid du Colombier
t_specnames(void)893e12c5d1SDavid du Colombier void t_specnames(void)
903e12c5d1SDavid du Colombier {
913e12c5d1SDavid du Colombier int i;
923e12c5d1SDavid du Colombier
933e12c5d1SDavid du Colombier for (i = 0; spnames[i].n; i++)
943e12c5d1SDavid du Colombier *spnames[i].n = chadd(spnames[i].v, Troffchar, Install);
953e12c5d1SDavid du Colombier }
963e12c5d1SDavid du Colombier
t_ptout(Tchar i)973e12c5d1SDavid du Colombier void t_ptout(Tchar i)
983e12c5d1SDavid du Colombier {
993e12c5d1SDavid du Colombier int dv;
1003e12c5d1SDavid du Colombier Tchar *k;
1013e12c5d1SDavid du Colombier int temp, a, b;
102219b2ee8SDavid du Colombier int diff;
1033e12c5d1SDavid du Colombier
1043e12c5d1SDavid du Colombier if (cbits(i) != '\n') {
105219b2ee8SDavid du Colombier if (olinep >= oline + olnsize) {
106219b2ee8SDavid du Colombier diff = olinep - oline;
107219b2ee8SDavid du Colombier olnsize += OLNSIZE;
108219b2ee8SDavid du Colombier if ((oline = (Tchar *)realloc((char *)oline, olnsize * sizeof(Tchar))) != NULL) {
109219b2ee8SDavid du Colombier if (diff && olinep)
110219b2ee8SDavid du Colombier olinep = oline + diff;
111219b2ee8SDavid du Colombier } else {
1123e12c5d1SDavid du Colombier ERROR "Output line overflow." WARN;
1133e12c5d1SDavid du Colombier done(2);
1143e12c5d1SDavid du Colombier }
115219b2ee8SDavid du Colombier }
1163e12c5d1SDavid du Colombier *olinep++ = i;
1173e12c5d1SDavid du Colombier return;
1183e12c5d1SDavid du Colombier }
1193e12c5d1SDavid du Colombier if (olinep == oline) {
1203e12c5d1SDavid du Colombier lead += lss;
1213e12c5d1SDavid du Colombier return;
1223e12c5d1SDavid du Colombier }
1233e12c5d1SDavid du Colombier
1243e12c5d1SDavid du Colombier hpos = po; /* ??? */
1253e12c5d1SDavid du Colombier esc = 0; /* ??? */
1263e12c5d1SDavid du Colombier ptesc(); /* the problem is to get back to the left end of the line */
1273e12c5d1SDavid du Colombier dv = 0;
1283e12c5d1SDavid du Colombier for (k = oline; k < olinep; k++) {
1293e12c5d1SDavid du Colombier if (ismot(*k) && isvmot(*k)) {
1303e12c5d1SDavid du Colombier temp = absmot(*k);
1313e12c5d1SDavid du Colombier if (isnmot(*k))
1323e12c5d1SDavid du Colombier temp = -temp;
1333e12c5d1SDavid du Colombier dv += temp;
1343e12c5d1SDavid du Colombier }
1353e12c5d1SDavid du Colombier }
1363e12c5d1SDavid du Colombier if (dv) {
1373e12c5d1SDavid du Colombier vflag++;
1383e12c5d1SDavid du Colombier *olinep++ = makem(-dv);
1393e12c5d1SDavid du Colombier vflag = 0;
1403e12c5d1SDavid du Colombier }
1413e12c5d1SDavid du Colombier
1423e12c5d1SDavid du Colombier b = dip->blss + lss;
1433e12c5d1SDavid du Colombier lead += dip->blss + lss;
1443e12c5d1SDavid du Colombier dip->blss = 0;
1453e12c5d1SDavid du Colombier for (k = oline; k < olinep; )
1463e12c5d1SDavid du Colombier k += ptout0(k); /* now passing a pointer! */
1473e12c5d1SDavid du Colombier olinep = oline;
1483e12c5d1SDavid du Colombier lead += dip->alss;
1493e12c5d1SDavid du Colombier a = dip->alss;
1503e12c5d1SDavid du Colombier dip->alss = 0;
1513e12c5d1SDavid du Colombier /*
1523e12c5d1SDavid du Colombier OUT "x xxx end of line: hpos=%d, vpos=%d\n", hpos, vpos PUT;
1533e12c5d1SDavid du Colombier */
1543e12c5d1SDavid du Colombier OUT "n%d %d\n", b, a PUT; /* be nice to chuck */
1553e12c5d1SDavid du Colombier }
1563e12c5d1SDavid du Colombier
ptout0(Tchar * pi)1573e12c5d1SDavid du Colombier int ptout0(Tchar *pi)
1583e12c5d1SDavid du Colombier {
159*14f51593SDavid du Colombier int j, k, w, z, dx, dy, dx2, dy2, n;
1603e12c5d1SDavid du Colombier int outsize; /* size of object being printed */
161*14f51593SDavid du Colombier Tchar i;
1623e12c5d1SDavid du Colombier
163*14f51593SDavid du Colombier w = 0;
1643e12c5d1SDavid du Colombier outsize = 1; /* default */
1653e12c5d1SDavid du Colombier i = *pi;
1663e12c5d1SDavid du Colombier k = cbits(i);
1673e12c5d1SDavid du Colombier if (ismot(i)) {
1683e12c5d1SDavid du Colombier j = absmot(i);
1693e12c5d1SDavid du Colombier if (isnmot(i))
1703e12c5d1SDavid du Colombier j = -j;
1713e12c5d1SDavid du Colombier if (isvmot(i))
1723e12c5d1SDavid du Colombier lead += j;
1733e12c5d1SDavid du Colombier else
1743e12c5d1SDavid du Colombier esc += j;
1753e12c5d1SDavid du Colombier return(outsize);
1763e12c5d1SDavid du Colombier }
1773e12c5d1SDavid du Colombier if (k == CHARHT) {
178219b2ee8SDavid du Colombier xpts = fbits(i); /* sneaky, font bits as size bits */
1793e12c5d1SDavid du Colombier if (xpts != mpts)
1803e12c5d1SDavid du Colombier ptps();
1813e12c5d1SDavid du Colombier OUT "x H %d\n", sbits(i) PUT;
1823e12c5d1SDavid du Colombier return(outsize);
1833e12c5d1SDavid du Colombier }
1843e12c5d1SDavid du Colombier if (k == SLANT) {
1853e12c5d1SDavid du Colombier OUT "x S %d\n", sfbits(i)-180 PUT;
1863e12c5d1SDavid du Colombier return(outsize);
1873e12c5d1SDavid du Colombier }
1883e12c5d1SDavid du Colombier if (k == WORDSP) {
1893e12c5d1SDavid du Colombier oput('w');
1903e12c5d1SDavid du Colombier return(outsize);
1913e12c5d1SDavid du Colombier }
1923e12c5d1SDavid du Colombier if (sfbits(i) == oldbits) {
1933e12c5d1SDavid du Colombier xfont = pfont;
1943e12c5d1SDavid du Colombier xpts = ppts;
1953e12c5d1SDavid du Colombier } else
1963e12c5d1SDavid du Colombier xbits(i, 2);
1973e12c5d1SDavid du Colombier if (k == XON) {
1983e12c5d1SDavid du Colombier extern int xon;
1993e12c5d1SDavid du Colombier ptflush(); /* guarantee that everything is out */
2003e12c5d1SDavid du Colombier if (esc)
2013e12c5d1SDavid du Colombier ptesc();
2023e12c5d1SDavid du Colombier if (xfont != mfont)
2033e12c5d1SDavid du Colombier ptfont();
2043e12c5d1SDavid du Colombier if (xpts != mpts)
2053e12c5d1SDavid du Colombier ptps();
2063e12c5d1SDavid du Colombier if (lead)
2073e12c5d1SDavid du Colombier ptlead();
2083e12c5d1SDavid du Colombier OUT "x X " PUT;
2093e12c5d1SDavid du Colombier xon++;
2103e12c5d1SDavid du Colombier for (j = 1; cbits(pi[j]) != XOFF; j++)
2113e12c5d1SDavid du Colombier outascii(pi[j]);
2123e12c5d1SDavid du Colombier oput('\n');
2133e12c5d1SDavid du Colombier xon--;
2143e12c5d1SDavid du Colombier return j+1;
2153e12c5d1SDavid du Colombier }
216219b2ee8SDavid du Colombier if (k < 040 && k != DRAWFCN)
2173e12c5d1SDavid du Colombier return(outsize);
2183e12c5d1SDavid du Colombier j = z = 0;
2193e12c5d1SDavid du Colombier if (k != DRAWFCN) {
2203e12c5d1SDavid du Colombier if (widcache[k].fontpts == (xfont<<8) + xpts && !setwdf) {
2213e12c5d1SDavid du Colombier w = widcache[k].width;
2223e12c5d1SDavid du Colombier bd = 0;
2233e12c5d1SDavid du Colombier cs = 0;
2243e12c5d1SDavid du Colombier } else
2253e12c5d1SDavid du Colombier w = getcw(k);
2263e12c5d1SDavid du Colombier if (cs) {
2273e12c5d1SDavid du Colombier if (bd)
2283e12c5d1SDavid du Colombier w += (bd - 1) * HOR;
2293e12c5d1SDavid du Colombier j = (cs - w) / 2;
2303e12c5d1SDavid du Colombier w = cs - j;
2313e12c5d1SDavid du Colombier if (bd)
2323e12c5d1SDavid du Colombier w -= (bd - 1) * HOR;
2333e12c5d1SDavid du Colombier }
2343e12c5d1SDavid du Colombier if (iszbit(i)) {
2353e12c5d1SDavid du Colombier if (cs)
2363e12c5d1SDavid du Colombier w = -j;
2373e12c5d1SDavid du Colombier else
2383e12c5d1SDavid du Colombier w = 0;
2393e12c5d1SDavid du Colombier z = 1;
2403e12c5d1SDavid du Colombier }
2413e12c5d1SDavid du Colombier }
2423e12c5d1SDavid du Colombier esc += j;
2433e12c5d1SDavid du Colombier if (xfont != mfont)
2443e12c5d1SDavid du Colombier ptfont();
2453e12c5d1SDavid du Colombier if (xpts != mpts)
2463e12c5d1SDavid du Colombier ptps();
2473e12c5d1SDavid du Colombier if (lead)
2483e12c5d1SDavid du Colombier ptlead();
2493e12c5d1SDavid du Colombier /* put out the real character here */
2503e12c5d1SDavid du Colombier if (k == DRAWFCN) {
2513e12c5d1SDavid du Colombier if (esc)
2523e12c5d1SDavid du Colombier ptesc();
2533e12c5d1SDavid du Colombier w = 0;
2543e12c5d1SDavid du Colombier dx = absmot(pi[3]);
2553e12c5d1SDavid du Colombier if (isnmot(pi[3]))
2563e12c5d1SDavid du Colombier dx = -dx;
2573e12c5d1SDavid du Colombier dy = absmot(pi[4]);
2583e12c5d1SDavid du Colombier if (isnmot(pi[4]))
2593e12c5d1SDavid du Colombier dy = -dy;
2603e12c5d1SDavid du Colombier switch (cbits(pi[1])) {
2613e12c5d1SDavid du Colombier case DRAWCIRCLE: /* circle */
2623e12c5d1SDavid du Colombier OUT "D%c %d\n", DRAWCIRCLE, dx PUT; /* dx is diameter */
2633e12c5d1SDavid du Colombier hpos += dx;
2643e12c5d1SDavid du Colombier break;
2653e12c5d1SDavid du Colombier case DRAWELLIPSE:
2663e12c5d1SDavid du Colombier OUT "D%c %d %d\n", DRAWELLIPSE, dx, dy PUT;
2673e12c5d1SDavid du Colombier hpos += dx;
2683e12c5d1SDavid du Colombier break;
269219b2ee8SDavid du Colombier case DRAWBUILD:
270219b2ee8SDavid du Colombier k = cbits(pi[2]);
271219b2ee8SDavid du Colombier OUT "D%c %d ", DRAWBUILD, dx PUT;
272219b2ee8SDavid du Colombier if (k < ALPHABET)
273219b2ee8SDavid du Colombier OUT "%c\n", k PUT;
274219b2ee8SDavid du Colombier else
275219b2ee8SDavid du Colombier ptchname(k);
276219b2ee8SDavid du Colombier hpos += dx;
277219b2ee8SDavid du Colombier break;
2783e12c5d1SDavid du Colombier case DRAWLINE: /* line */
2793e12c5d1SDavid du Colombier k = cbits(pi[2]);
2803e12c5d1SDavid du Colombier OUT "D%c %d %d ", DRAWLINE, dx, dy PUT;
2813e12c5d1SDavid du Colombier if (k < ALPHABET)
2823e12c5d1SDavid du Colombier OUT "%c\n", k PUT;
2833e12c5d1SDavid du Colombier else
2843e12c5d1SDavid du Colombier ptchname(k);
2853e12c5d1SDavid du Colombier hpos += dx;
2863e12c5d1SDavid du Colombier vpos += dy;
2873e12c5d1SDavid du Colombier break;
2883e12c5d1SDavid du Colombier case DRAWARC: /* arc */
2893e12c5d1SDavid du Colombier dx2 = absmot(pi[5]);
2903e12c5d1SDavid du Colombier if (isnmot(pi[5]))
2913e12c5d1SDavid du Colombier dx2 = -dx2;
2923e12c5d1SDavid du Colombier dy2 = absmot(pi[6]);
2933e12c5d1SDavid du Colombier if (isnmot(pi[6]))
2943e12c5d1SDavid du Colombier dy2 = -dy2;
2953e12c5d1SDavid du Colombier OUT "D%c %d %d %d %d\n", DRAWARC,
2963e12c5d1SDavid du Colombier dx, dy, dx2, dy2 PUT;
2973e12c5d1SDavid du Colombier hpos += dx + dx2;
2983e12c5d1SDavid du Colombier vpos += dy + dy2;
2993e12c5d1SDavid du Colombier break;
3003e12c5d1SDavid du Colombier
3013e12c5d1SDavid du Colombier case 's': /* using 's' internally to avoid .tr ~ */
3023e12c5d1SDavid du Colombier pi[1] = '~';
3033e12c5d1SDavid du Colombier case DRAWSPLINE: /* spline */
3043e12c5d1SDavid du Colombier default: /* something else; copy it like spline */
3053e12c5d1SDavid du Colombier OUT "D%c %d %d", cbits(pi[1]), dx, dy PUT;
3063e12c5d1SDavid du Colombier hpos += dx;
3073e12c5d1SDavid du Colombier vpos += dy;
3083e12c5d1SDavid du Colombier if (cbits(pi[3]) == DRAWFCN || cbits(pi[4]) == DRAWFCN) {
3093e12c5d1SDavid du Colombier /* it was somehow defective */
3103e12c5d1SDavid du Colombier OUT "\n" PUT;
3113e12c5d1SDavid du Colombier break;
3123e12c5d1SDavid du Colombier }
3133e12c5d1SDavid du Colombier for (n = 5; cbits(pi[n]) != DRAWFCN; n += 2) {
3143e12c5d1SDavid du Colombier dx = absmot(pi[n]);
3153e12c5d1SDavid du Colombier if (isnmot(pi[n]))
3163e12c5d1SDavid du Colombier dx = -dx;
3173e12c5d1SDavid du Colombier dy = absmot(pi[n+1]);
3183e12c5d1SDavid du Colombier if (isnmot(pi[n+1]))
3193e12c5d1SDavid du Colombier dy = -dy;
3203e12c5d1SDavid du Colombier OUT " %d %d", dx, dy PUT;
3213e12c5d1SDavid du Colombier hpos += dx;
3223e12c5d1SDavid du Colombier vpos += dy;
3233e12c5d1SDavid du Colombier }
3243e12c5d1SDavid du Colombier OUT "\n" PUT;
3253e12c5d1SDavid du Colombier break;
3263e12c5d1SDavid du Colombier }
3273e12c5d1SDavid du Colombier for (n = 3; cbits(pi[n]) != DRAWFCN; n++)
3283e12c5d1SDavid du Colombier ;
3293e12c5d1SDavid du Colombier outsize = n + 1;
3303e12c5d1SDavid du Colombier } else if (k < ALPHABET) {
3313e12c5d1SDavid du Colombier /* try to go faster and compress output */
3323e12c5d1SDavid du Colombier /* by printing nnc for small positive motion followed by c */
3333e12c5d1SDavid du Colombier /* kludgery; have to make sure set all the vars too */
3343e12c5d1SDavid du Colombier if (esc > 0 && esc < 100) {
3353e12c5d1SDavid du Colombier oput(esc / 10 + '0');
3363e12c5d1SDavid du Colombier oput(esc % 10 + '0');
3373e12c5d1SDavid du Colombier oput(k);
3383e12c5d1SDavid du Colombier hpos += esc;
3393e12c5d1SDavid du Colombier esc = 0;
3403e12c5d1SDavid du Colombier } else {
3413e12c5d1SDavid du Colombier if (esc)
3423e12c5d1SDavid du Colombier ptesc();
3433e12c5d1SDavid du Colombier oput('c');
3443e12c5d1SDavid du Colombier oput(k);
3453e12c5d1SDavid du Colombier oput('\n');
3463e12c5d1SDavid du Colombier }
3473e12c5d1SDavid du Colombier } else {
3483e12c5d1SDavid du Colombier if (esc)
3493e12c5d1SDavid du Colombier ptesc();
3503e12c5d1SDavid du Colombier ptchname(k);
3513e12c5d1SDavid du Colombier }
3523e12c5d1SDavid du Colombier if (bd) {
3533e12c5d1SDavid du Colombier bd -= HOR;
3543e12c5d1SDavid du Colombier if (esc += bd)
3553e12c5d1SDavid du Colombier ptesc();
3563e12c5d1SDavid du Colombier if (k < ALPHABET)
3573e12c5d1SDavid du Colombier OUT "c%c\n", k PUT;
3583e12c5d1SDavid du Colombier else
3593e12c5d1SDavid du Colombier ptchname(k);
3603e12c5d1SDavid du Colombier if (z)
3613e12c5d1SDavid du Colombier esc -= bd;
3623e12c5d1SDavid du Colombier }
3633e12c5d1SDavid du Colombier esc += w;
3643e12c5d1SDavid du Colombier return(outsize);
3653e12c5d1SDavid du Colombier }
3663e12c5d1SDavid du Colombier
ptchname(int k)3673e12c5d1SDavid du Colombier void ptchname(int k)
3683e12c5d1SDavid du Colombier {
3693e12c5d1SDavid du Colombier char *chn = chname(k);
3703e12c5d1SDavid du Colombier
3713e12c5d1SDavid du Colombier switch (chn[0]) {
3723e12c5d1SDavid du Colombier case MBchar:
3733e12c5d1SDavid du Colombier OUT "c%s\n", chn+1 PUT; /* \n not needed? */
3743e12c5d1SDavid du Colombier break;
3753e12c5d1SDavid du Colombier case Number:
3763e12c5d1SDavid du Colombier OUT "N%s\n", chn+1 PUT;
3773e12c5d1SDavid du Colombier break;
3783e12c5d1SDavid du Colombier case Troffchar:
3793e12c5d1SDavid du Colombier OUT "C%s\n", chn+1 PUT;
3803e12c5d1SDavid du Colombier break;
3813e12c5d1SDavid du Colombier default:
3823e12c5d1SDavid du Colombier ERROR "illegal char type %s", chn WARN;
3833e12c5d1SDavid du Colombier break;
3843e12c5d1SDavid du Colombier }
3853e12c5d1SDavid du Colombier }
3863e12c5d1SDavid du Colombier
ptflush(void)3873e12c5d1SDavid du Colombier void ptflush(void) /* get us to a clean output state */
3883e12c5d1SDavid du Colombier {
3893e12c5d1SDavid du Colombier if (TROFF) {
3903e12c5d1SDavid du Colombier /* ptesc(); but always H, no h */
3913e12c5d1SDavid du Colombier hpos += esc;
3923e12c5d1SDavid du Colombier OUT "\nH%d\n", hpos PUT;
3933e12c5d1SDavid du Colombier esc = 0;
3943e12c5d1SDavid du Colombier ptps();
3953e12c5d1SDavid du Colombier ptfont();
3963e12c5d1SDavid du Colombier ptlead();
3973e12c5d1SDavid du Colombier }
3983e12c5d1SDavid du Colombier }
3993e12c5d1SDavid du Colombier
ptps(void)4003e12c5d1SDavid du Colombier void ptps(void)
4013e12c5d1SDavid du Colombier {
4023e12c5d1SDavid du Colombier int i, j, k;
4033e12c5d1SDavid du Colombier
4043e12c5d1SDavid du Colombier i = xpts;
4053e12c5d1SDavid du Colombier for (j = 0; i > (k = pstab[j]); j++)
4063e12c5d1SDavid du Colombier if (!k) {
4073e12c5d1SDavid du Colombier k = pstab[--j];
4083e12c5d1SDavid du Colombier break;
4093e12c5d1SDavid du Colombier }
410219b2ee8SDavid du Colombier if (!ascii)
4113e12c5d1SDavid du Colombier OUT "s%d\n", k PUT; /* really should put out string rep of size */
4123e12c5d1SDavid du Colombier mpts = i;
4133e12c5d1SDavid du Colombier }
4143e12c5d1SDavid du Colombier
ptfont(void)4153e12c5d1SDavid du Colombier void ptfont(void)
4163e12c5d1SDavid du Colombier {
4173e12c5d1SDavid du Colombier mfont = xfont;
418219b2ee8SDavid du Colombier if (ascii)
419219b2ee8SDavid du Colombier return;
4203e12c5d1SDavid du Colombier if (xfont > nfonts) {
4213e12c5d1SDavid du Colombier ptfpcmd(0, fonts[xfont].longname, 0); /* Put the desired font in the
4223e12c5d1SDavid du Colombier * fontcache of the filter */
4233e12c5d1SDavid du Colombier OUT "f0\n" PUT; /* make sure that it gets noticed */
4243e12c5d1SDavid du Colombier } else
4253e12c5d1SDavid du Colombier OUT "f%d\n", xfont PUT;
4263e12c5d1SDavid du Colombier }
4273e12c5d1SDavid du Colombier
ptfpcmd(int f,char * s,char * longname)4283e12c5d1SDavid du Colombier void ptfpcmd(int f, char *s, char *longname)
4293e12c5d1SDavid du Colombier {
4303e12c5d1SDavid du Colombier if (f > nfonts) /* a bit risky? */
4313e12c5d1SDavid du Colombier f = 0;
4323e12c5d1SDavid du Colombier if (longname) {
4333e12c5d1SDavid du Colombier OUT "x font %d %s %s\n", f, s, longname PUT;
4343e12c5d1SDavid du Colombier } else {
4353e12c5d1SDavid du Colombier OUT "x font %d %s\n", f, s PUT;
4363e12c5d1SDavid du Colombier }
4373e12c5d1SDavid du Colombier /* OUT "f%d\n", xfont PUT; /* need this for buggy version of adobe transcript */
4383e12c5d1SDavid du Colombier /* which apparently believes that x font means */
4393e12c5d1SDavid du Colombier /* to set the font, not just the position. */
4403e12c5d1SDavid du Colombier }
4413e12c5d1SDavid du Colombier
t_ptlead(void)4423e12c5d1SDavid du Colombier void t_ptlead(void)
4433e12c5d1SDavid du Colombier {
4443e12c5d1SDavid du Colombier vpos += lead;
4453e12c5d1SDavid du Colombier if (!ascii)
4463e12c5d1SDavid du Colombier OUT "V%d\n", vpos PUT;
4473e12c5d1SDavid du Colombier lead = 0;
4483e12c5d1SDavid du Colombier }
4493e12c5d1SDavid du Colombier
ptesc(void)4503e12c5d1SDavid du Colombier void ptesc(void)
4513e12c5d1SDavid du Colombier {
4523e12c5d1SDavid du Colombier hpos += esc;
453219b2ee8SDavid du Colombier if (!ascii)
4543e12c5d1SDavid du Colombier if (esc > 0) {
4553e12c5d1SDavid du Colombier oput('h');
4563e12c5d1SDavid du Colombier if (esc>=10 && esc<100) {
4573e12c5d1SDavid du Colombier oput(esc/10 + '0');
4583e12c5d1SDavid du Colombier oput(esc%10 + '0');
4593e12c5d1SDavid du Colombier } else
4603e12c5d1SDavid du Colombier OUT "%d", esc PUT;
4613e12c5d1SDavid du Colombier } else
4623e12c5d1SDavid du Colombier OUT "H%d\n", hpos PUT;
4633e12c5d1SDavid du Colombier esc = 0;
4643e12c5d1SDavid du Colombier }
4653e12c5d1SDavid du Colombier
ptpage(int n)4663e12c5d1SDavid du Colombier void ptpage(int n) /* called at end of each output page, we hope */
4673e12c5d1SDavid du Colombier {
4683e12c5d1SDavid du Colombier int i;
4693e12c5d1SDavid du Colombier
4703e12c5d1SDavid du Colombier if (NROFF)
4713e12c5d1SDavid du Colombier return;
4723e12c5d1SDavid du Colombier ptlead();
4733e12c5d1SDavid du Colombier vpos = 0;
4743e12c5d1SDavid du Colombier if (ascii)
4753e12c5d1SDavid du Colombier return;
4763e12c5d1SDavid du Colombier OUT "p%d\n", n PUT; /* new page */
4773e12c5d1SDavid du Colombier for (i = 0; i <= nfonts; i++)
4783e12c5d1SDavid du Colombier if (fontlab[i]) {
4793e12c5d1SDavid du Colombier if (fonts[i].truename)
4803e12c5d1SDavid du Colombier OUT "x font %d %s %s\n", i, fonts[i].longname, fonts[i].truename PUT;
4813e12c5d1SDavid du Colombier else
4823e12c5d1SDavid du Colombier OUT "x font %d %s\n", i, fonts[i].longname PUT;
4833e12c5d1SDavid du Colombier }
4843e12c5d1SDavid du Colombier ptps();
4853e12c5d1SDavid du Colombier ptfont();
4863e12c5d1SDavid du Colombier }
4873e12c5d1SDavid du Colombier
pttrailer(void)4883e12c5d1SDavid du Colombier void pttrailer(void)
4893e12c5d1SDavid du Colombier {
4903e12c5d1SDavid du Colombier if (TROFF)
4913e12c5d1SDavid du Colombier OUT "x trailer\n" PUT;
4923e12c5d1SDavid du Colombier }
4933e12c5d1SDavid du Colombier
ptstop(void)4943e12c5d1SDavid du Colombier void ptstop(void)
4953e12c5d1SDavid du Colombier {
4963e12c5d1SDavid du Colombier if (TROFF)
4973e12c5d1SDavid du Colombier OUT "x stop\n" PUT;
4983e12c5d1SDavid du Colombier }
4993e12c5d1SDavid du Colombier
t_ptpause(void)5003e12c5d1SDavid du Colombier void t_ptpause(void)
5013e12c5d1SDavid du Colombier {
5023e12c5d1SDavid du Colombier if (ascii)
5033e12c5d1SDavid du Colombier return;
5043e12c5d1SDavid du Colombier ptlead();
5053e12c5d1SDavid du Colombier vpos = 0;
5063e12c5d1SDavid du Colombier pttrailer();
5073e12c5d1SDavid du Colombier ptlead();
5083e12c5d1SDavid du Colombier OUT "x pause\n" PUT;
5093e12c5d1SDavid du Colombier flusho();
5103e12c5d1SDavid du Colombier mpts = mfont = 0;
5113e12c5d1SDavid du Colombier ptesc();
5123e12c5d1SDavid du Colombier esc = po;
5133e12c5d1SDavid du Colombier hpos = vpos = 0; /* probably in wrong place */
5143e12c5d1SDavid du Colombier }
515