2004-05-15 23:24:00 +00:00
|
|
|
#include "tdef.h"
|
|
|
|
#include "fns.h"
|
|
|
|
#include "ext.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* troff10.c
|
|
|
|
*
|
|
|
|
* typesetter interface
|
|
|
|
*/
|
|
|
|
|
|
|
|
int vpos = 0; /* absolute vertical position on page */
|
|
|
|
int hpos = 0; /* ditto horizontal */
|
|
|
|
|
|
|
|
extern Font fonts[MAXFONTS+1];
|
|
|
|
|
|
|
|
int Inch;
|
|
|
|
int Hor;
|
|
|
|
int Vert;
|
|
|
|
int Unitwidth;
|
|
|
|
int nfonts;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void t_ptinit(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
char buf[100], *p;
|
|
|
|
|
|
|
|
hmot = t_hmot;
|
|
|
|
makem = t_makem;
|
|
|
|
setabs = t_setabs;
|
|
|
|
setch = t_setch;
|
|
|
|
sethl = t_sethl;
|
|
|
|
setht = t_setht;
|
|
|
|
setslant = t_setslant;
|
|
|
|
vmot = t_vmot;
|
|
|
|
xlss = t_xlss;
|
|
|
|
findft = t_findft;
|
|
|
|
width = t_width;
|
|
|
|
mchbits = t_mchbits;
|
|
|
|
ptlead = t_ptlead;
|
|
|
|
ptout = t_ptout;
|
|
|
|
ptpause = t_ptpause;
|
|
|
|
setfont = t_setfont;
|
|
|
|
setps = t_setps;
|
|
|
|
setwd = t_setwd;
|
|
|
|
|
|
|
|
/* open table for device, */
|
|
|
|
/* read in resolution, size info, font info, etc., set params */
|
|
|
|
if ((p = getenv("TYPESETTER")) != 0)
|
|
|
|
strcpy(devname, p);
|
|
|
|
if (termtab[0] == 0)
|
|
|
|
strcpy(termtab, DWBfontdir);
|
|
|
|
if (fontdir[0] == 0)
|
|
|
|
strcpy(fontdir, DWBfontdir);
|
|
|
|
if (devname[0] == 0)
|
|
|
|
strcpy(devname, TDEVNAME);
|
|
|
|
hyf = 1;
|
|
|
|
lg = 1;
|
|
|
|
|
|
|
|
sprintf(buf, "/dev%s/DESC", devname);
|
|
|
|
strcat(termtab, buf);
|
|
|
|
if (getdesc(termtab) < 0) {
|
|
|
|
ERROR "can't open DESC file %s", termtab WARN;
|
|
|
|
done3(1);
|
|
|
|
}
|
|
|
|
if (!ascii) {
|
|
|
|
OUT "x T %s\n", devname PUT;
|
|
|
|
OUT "x res %d %d %d\n", Inch, Hor, Vert PUT;
|
|
|
|
OUT "x init\n" PUT;
|
|
|
|
}
|
|
|
|
for (i = 1; i <= nfonts; i++)
|
|
|
|
setfp(i, fontlab[i], (char *) 0, 0);
|
|
|
|
sps = EM/3; /* space size */
|
|
|
|
ics = EM; /* insertion character space */
|
|
|
|
for (i = 0; i < (NTAB - 1) && DTAB * (i + 1) < TABMASK; i++)
|
|
|
|
tabtab[i] = DTAB * (i + 1);
|
|
|
|
tabtab[NTAB] = 0;
|
|
|
|
pl = 11 * INCH; /* paper length */
|
|
|
|
po = PO; /* page offset */
|
|
|
|
spacesz = SS;
|
|
|
|
lss = lss1 = VS;
|
|
|
|
ll = ll1 = lt = lt1 = LL;
|
|
|
|
t_specnames(); /* install names like "hyphen", etc. */
|
|
|
|
}
|
|
|
|
|
|
|
|
void t_specnames(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; spnames[i].n; i++)
|
|
|
|
*spnames[i].n = chadd(spnames[i].v, Troffchar, Install);
|
|
|
|
}
|
|
|
|
|
|
|
|
void t_ptout(Tchar i)
|
|
|
|
{
|
|
|
|
int dv;
|
|
|
|
Tchar *k;
|
|
|
|
int temp, a, b;
|
|
|
|
int diff;
|
|
|
|
|
|
|
|
if (cbits(i) != '\n') {
|
|
|
|
if (olinep >= oline + olnsize) {
|
|
|
|
diff = olinep - oline;
|
|
|
|
olnsize += OLNSIZE;
|
|
|
|
if ((oline = (Tchar *)realloc((char *)oline, olnsize * sizeof(Tchar))) != NULL) {
|
|
|
|
if (diff && olinep)
|
|
|
|
olinep = oline + diff;
|
|
|
|
} else {
|
|
|
|
ERROR "Output line overflow." WARN;
|
|
|
|
done(2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*olinep++ = i;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (olinep == oline) {
|
|
|
|
lead += lss;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
hpos = po; /* ??? */
|
|
|
|
esc = 0; /* ??? */
|
|
|
|
ptesc(); /* the problem is to get back to the left end of the line */
|
|
|
|
dv = 0;
|
|
|
|
for (k = oline; k < olinep; k++) {
|
|
|
|
if (ismot(*k) && isvmot(*k)) {
|
|
|
|
temp = absmot(*k);
|
|
|
|
if (isnmot(*k))
|
|
|
|
temp = -temp;
|
|
|
|
dv += temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (dv) {
|
|
|
|
vflag++;
|
|
|
|
*olinep++ = makem(-dv);
|
|
|
|
vflag = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
b = dip->blss + lss;
|
|
|
|
lead += dip->blss + lss;
|
|
|
|
dip->blss = 0;
|
|
|
|
for (k = oline; k < olinep; )
|
|
|
|
k += ptout0(k); /* now passing a pointer! */
|
|
|
|
olinep = oline;
|
|
|
|
lead += dip->alss;
|
|
|
|
a = dip->alss;
|
|
|
|
dip->alss = 0;
|
|
|
|
/*
|
|
|
|
OUT "x xxx end of line: hpos=%d, vpos=%d\n", hpos, vpos PUT;
|
|
|
|
*/
|
|
|
|
OUT "n%d %d\n", b, a PUT; /* be nice to chuck */
|
|
|
|
}
|
|
|
|
|
|
|
|
int ptout0(Tchar *pi)
|
|
|
|
{
|
|
|
|
int j, k, w;
|
|
|
|
int z, dx, dy, dx2, dy2, n;
|
|
|
|
Tchar i;
|
|
|
|
int outsize; /* size of object being printed */
|
|
|
|
|
2004-05-16 07:55:57 +00:00
|
|
|
w = 0;
|
2004-05-15 23:24:00 +00:00
|
|
|
outsize = 1; /* default */
|
|
|
|
i = *pi;
|
|
|
|
k = cbits(i);
|
|
|
|
if (ismot(i)) {
|
|
|
|
j = absmot(i);
|
|
|
|
if (isnmot(i))
|
|
|
|
j = -j;
|
|
|
|
if (isvmot(i))
|
|
|
|
lead += j;
|
|
|
|
else
|
|
|
|
esc += j;
|
|
|
|
return(outsize);
|
|
|
|
}
|
|
|
|
if (k == CHARHT) {
|
|
|
|
xpts = fbits(i); /* sneaky, font bits as size bits */
|
|
|
|
if (xpts != mpts)
|
|
|
|
ptps();
|
2004-05-16 07:55:57 +00:00
|
|
|
OUT "x H %ld\n", sbits(i) PUT;
|
2004-05-15 23:24:00 +00:00
|
|
|
return(outsize);
|
|
|
|
}
|
|
|
|
if (k == SLANT) {
|
2004-05-16 07:55:57 +00:00
|
|
|
OUT "x S %ld\n", sfbits(i)-180 PUT;
|
2004-05-15 23:24:00 +00:00
|
|
|
return(outsize);
|
|
|
|
}
|
|
|
|
if (k == WORDSP) {
|
|
|
|
oput('w');
|
|
|
|
return(outsize);
|
|
|
|
}
|
|
|
|
if (sfbits(i) == oldbits) {
|
|
|
|
xfont = pfont;
|
|
|
|
xpts = ppts;
|
|
|
|
} else
|
|
|
|
xbits(i, 2);
|
|
|
|
if (k == XON) {
|
|
|
|
extern int xon;
|
|
|
|
ptflush(); /* guarantee that everything is out */
|
|
|
|
if (esc)
|
|
|
|
ptesc();
|
|
|
|
if (xfont != mfont)
|
|
|
|
ptfont();
|
|
|
|
if (xpts != mpts)
|
|
|
|
ptps();
|
|
|
|
if (lead)
|
|
|
|
ptlead();
|
|
|
|
OUT "x X " PUT;
|
|
|
|
xon++;
|
|
|
|
for (j = 1; cbits(pi[j]) != XOFF; j++)
|
|
|
|
outascii(pi[j]);
|
|
|
|
oput('\n');
|
|
|
|
xon--;
|
|
|
|
return j+1;
|
|
|
|
}
|
|
|
|
if (k < 040 && k != DRAWFCN)
|
|
|
|
return(outsize);
|
|
|
|
j = z = 0;
|
|
|
|
if (k != DRAWFCN) {
|
|
|
|
if (widcache[k].fontpts == (xfont<<8) + xpts && !setwdf) {
|
|
|
|
w = widcache[k].width;
|
|
|
|
bd = 0;
|
|
|
|
cs = 0;
|
|
|
|
} else
|
|
|
|
w = getcw(k);
|
|
|
|
if (cs) {
|
|
|
|
if (bd)
|
|
|
|
w += (bd - 1) * HOR;
|
|
|
|
j = (cs - w) / 2;
|
|
|
|
w = cs - j;
|
|
|
|
if (bd)
|
|
|
|
w -= (bd - 1) * HOR;
|
|
|
|
}
|
|
|
|
if (iszbit(i)) {
|
|
|
|
if (cs)
|
|
|
|
w = -j;
|
|
|
|
else
|
|
|
|
w = 0;
|
|
|
|
z = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
esc += j;
|
|
|
|
if (xfont != mfont)
|
|
|
|
ptfont();
|
|
|
|
if (xpts != mpts)
|
|
|
|
ptps();
|
|
|
|
if (lead)
|
|
|
|
ptlead();
|
|
|
|
/* put out the real character here */
|
|
|
|
if (k == DRAWFCN) {
|
|
|
|
if (esc)
|
|
|
|
ptesc();
|
|
|
|
w = 0;
|
|
|
|
dx = absmot(pi[3]);
|
|
|
|
if (isnmot(pi[3]))
|
|
|
|
dx = -dx;
|
|
|
|
dy = absmot(pi[4]);
|
|
|
|
if (isnmot(pi[4]))
|
|
|
|
dy = -dy;
|
|
|
|
switch (cbits(pi[1])) {
|
|
|
|
case DRAWCIRCLE: /* circle */
|
|
|
|
OUT "D%c %d\n", DRAWCIRCLE, dx PUT; /* dx is diameter */
|
|
|
|
hpos += dx;
|
|
|
|
break;
|
|
|
|
case DRAWELLIPSE:
|
|
|
|
OUT "D%c %d %d\n", DRAWELLIPSE, dx, dy PUT;
|
|
|
|
hpos += dx;
|
|
|
|
break;
|
|
|
|
case DRAWBUILD:
|
|
|
|
k = cbits(pi[2]);
|
|
|
|
OUT "D%c %d ", DRAWBUILD, dx PUT;
|
|
|
|
if (k < ALPHABET)
|
|
|
|
OUT "%c\n", k PUT;
|
|
|
|
else
|
|
|
|
ptchname(k);
|
|
|
|
hpos += dx;
|
|
|
|
break;
|
|
|
|
case DRAWLINE: /* line */
|
|
|
|
k = cbits(pi[2]);
|
|
|
|
OUT "D%c %d %d ", DRAWLINE, dx, dy PUT;
|
|
|
|
if (k < ALPHABET)
|
|
|
|
OUT "%c\n", k PUT;
|
|
|
|
else
|
|
|
|
ptchname(k);
|
|
|
|
hpos += dx;
|
|
|
|
vpos += dy;
|
|
|
|
break;
|
|
|
|
case DRAWARC: /* arc */
|
|
|
|
dx2 = absmot(pi[5]);
|
|
|
|
if (isnmot(pi[5]))
|
|
|
|
dx2 = -dx2;
|
|
|
|
dy2 = absmot(pi[6]);
|
|
|
|
if (isnmot(pi[6]))
|
|
|
|
dy2 = -dy2;
|
|
|
|
OUT "D%c %d %d %d %d\n", DRAWARC,
|
|
|
|
dx, dy, dx2, dy2 PUT;
|
|
|
|
hpos += dx + dx2;
|
|
|
|
vpos += dy + dy2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 's': /* using 's' internally to avoid .tr ~ */
|
|
|
|
pi[1] = '~';
|
|
|
|
case DRAWSPLINE: /* spline */
|
|
|
|
default: /* something else; copy it like spline */
|
2004-11-03 14:27:30 +00:00
|
|
|
OUT "D%c %d %d", (char)cbits(pi[1]), dx, dy PUT;
|
2004-05-15 23:24:00 +00:00
|
|
|
hpos += dx;
|
|
|
|
vpos += dy;
|
|
|
|
if (cbits(pi[3]) == DRAWFCN || cbits(pi[4]) == DRAWFCN) {
|
|
|
|
/* it was somehow defective */
|
|
|
|
OUT "\n" PUT;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
for (n = 5; cbits(pi[n]) != DRAWFCN; n += 2) {
|
|
|
|
dx = absmot(pi[n]);
|
|
|
|
if (isnmot(pi[n]))
|
|
|
|
dx = -dx;
|
|
|
|
dy = absmot(pi[n+1]);
|
|
|
|
if (isnmot(pi[n+1]))
|
|
|
|
dy = -dy;
|
|
|
|
OUT " %d %d", dx, dy PUT;
|
|
|
|
hpos += dx;
|
|
|
|
vpos += dy;
|
|
|
|
}
|
|
|
|
OUT "\n" PUT;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
for (n = 3; cbits(pi[n]) != DRAWFCN; n++)
|
|
|
|
;
|
|
|
|
outsize = n + 1;
|
|
|
|
} else if (k < ALPHABET) {
|
|
|
|
/* try to go faster and compress output */
|
|
|
|
/* by printing nnc for small positive motion followed by c */
|
|
|
|
/* kludgery; have to make sure set all the vars too */
|
|
|
|
if (esc > 0 && esc < 100) {
|
|
|
|
oput(esc / 10 + '0');
|
|
|
|
oput(esc % 10 + '0');
|
|
|
|
oput(k);
|
|
|
|
hpos += esc;
|
|
|
|
esc = 0;
|
|
|
|
} else {
|
|
|
|
if (esc)
|
|
|
|
ptesc();
|
|
|
|
oput('c');
|
|
|
|
oput(k);
|
|
|
|
oput('\n');
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (esc)
|
|
|
|
ptesc();
|
|
|
|
ptchname(k);
|
|
|
|
}
|
|
|
|
if (bd) {
|
|
|
|
bd -= HOR;
|
|
|
|
if (esc += bd)
|
|
|
|
ptesc();
|
|
|
|
if (k < ALPHABET)
|
|
|
|
OUT "c%c\n", k PUT;
|
|
|
|
else
|
|
|
|
ptchname(k);
|
|
|
|
if (z)
|
|
|
|
esc -= bd;
|
|
|
|
}
|
|
|
|
esc += w;
|
|
|
|
return(outsize);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ptchname(int k)
|
|
|
|
{
|
|
|
|
char *chn = chname(k);
|
|
|
|
|
|
|
|
switch (chn[0]) {
|
|
|
|
case MBchar:
|
|
|
|
OUT "c%s\n", chn+1 PUT; /* \n not needed? */
|
|
|
|
break;
|
|
|
|
case Number:
|
|
|
|
OUT "N%s\n", chn+1 PUT;
|
|
|
|
break;
|
|
|
|
case Troffchar:
|
|
|
|
OUT "C%s\n", chn+1 PUT;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
ERROR "illegal char type %s", chn WARN;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ptflush(void) /* get us to a clean output state */
|
|
|
|
{
|
|
|
|
if (TROFF) {
|
|
|
|
/* ptesc(); but always H, no h */
|
|
|
|
hpos += esc;
|
|
|
|
OUT "\nH%d\n", hpos PUT;
|
|
|
|
esc = 0;
|
|
|
|
ptps();
|
|
|
|
ptfont();
|
|
|
|
ptlead();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ptps(void)
|
|
|
|
{
|
|
|
|
int i, j, k;
|
|
|
|
|
|
|
|
i = xpts;
|
|
|
|
for (j = 0; i > (k = pstab[j]); j++)
|
|
|
|
if (!k) {
|
|
|
|
k = pstab[--j];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!ascii)
|
|
|
|
OUT "s%d\n", k PUT; /* really should put out string rep of size */
|
|
|
|
mpts = i;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ptfont(void)
|
|
|
|
{
|
|
|
|
mfont = xfont;
|
|
|
|
if (ascii)
|
|
|
|
return;
|
|
|
|
if (xfont > nfonts) {
|
|
|
|
ptfpcmd(0, fonts[xfont].longname, 0); /* Put the desired font in the
|
|
|
|
* fontcache of the filter */
|
|
|
|
OUT "f0\n" PUT; /* make sure that it gets noticed */
|
|
|
|
} else
|
|
|
|
OUT "f%d\n", xfont PUT;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ptfpcmd(int f, char *s, char *longname)
|
|
|
|
{
|
|
|
|
if (f > nfonts) /* a bit risky? */
|
|
|
|
f = 0;
|
|
|
|
if (longname) {
|
|
|
|
OUT "x font %d %s %s\n", f, s, longname PUT;
|
|
|
|
} else {
|
|
|
|
OUT "x font %d %s\n", f, s PUT;
|
|
|
|
}
|
|
|
|
/* OUT "f%d\n", xfont PUT; /* need this for buggy version of adobe transcript */
|
|
|
|
/* which apparently believes that x font means */
|
|
|
|
/* to set the font, not just the position. */
|
|
|
|
}
|
|
|
|
|
|
|
|
void t_ptlead(void)
|
|
|
|
{
|
|
|
|
vpos += lead;
|
|
|
|
if (!ascii)
|
|
|
|
OUT "V%d\n", vpos PUT;
|
|
|
|
lead = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ptesc(void)
|
|
|
|
{
|
|
|
|
hpos += esc;
|
|
|
|
if (!ascii)
|
|
|
|
if (esc > 0) {
|
|
|
|
oput('h');
|
|
|
|
if (esc>=10 && esc<100) {
|
|
|
|
oput(esc/10 + '0');
|
|
|
|
oput(esc%10 + '0');
|
|
|
|
} else
|
|
|
|
OUT "%d", esc PUT;
|
|
|
|
} else
|
|
|
|
OUT "H%d\n", hpos PUT;
|
|
|
|
esc = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ptpage(int n) /* called at end of each output page, we hope */
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (NROFF)
|
|
|
|
return;
|
|
|
|
ptlead();
|
|
|
|
vpos = 0;
|
|
|
|
if (ascii)
|
|
|
|
return;
|
|
|
|
OUT "p%d\n", n PUT; /* new page */
|
|
|
|
for (i = 0; i <= nfonts; i++)
|
|
|
|
if (fontlab[i]) {
|
|
|
|
if (fonts[i].truename)
|
|
|
|
OUT "x font %d %s %s\n", i, fonts[i].longname, fonts[i].truename PUT;
|
|
|
|
else
|
|
|
|
OUT "x font %d %s\n", i, fonts[i].longname PUT;
|
|
|
|
}
|
|
|
|
ptps();
|
|
|
|
ptfont();
|
|
|
|
}
|
|
|
|
|
|
|
|
void pttrailer(void)
|
|
|
|
{
|
|
|
|
if (TROFF)
|
|
|
|
OUT "x trailer\n" PUT;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ptstop(void)
|
|
|
|
{
|
|
|
|
if (TROFF)
|
|
|
|
OUT "x stop\n" PUT;
|
|
|
|
}
|
|
|
|
|
|
|
|
void t_ptpause(void)
|
|
|
|
{
|
|
|
|
if (ascii)
|
|
|
|
return;
|
|
|
|
ptlead();
|
|
|
|
vpos = 0;
|
|
|
|
pttrailer();
|
|
|
|
ptlead();
|
|
|
|
OUT "x pause\n" PUT;
|
|
|
|
flusho();
|
|
|
|
mpts = mfont = 0;
|
|
|
|
ptesc();
|
|
|
|
esc = po;
|
|
|
|
hpos = vpos = 0; /* probably in wrong place */
|
|
|
|
}
|