Research V7 development
[unix-history] / usr / src / cmd / troff / t10.c
#include "tdef.h"
extern
#include "d.h"
extern
#include "v.h"
/*
troff10.c
CAT interface
*/
extern int *olinep;
extern int oline[];
extern int *pslp;
extern int back;
extern int xpts;
extern int mpts;
extern int po;
extern int xflg;
extern int line[];
extern int lss;
extern int xbitf;
extern char obuf[];
extern char *obufp;
extern int esct;
extern int trflg;
extern int cs;
extern int smnt;
extern int mfont;
extern int xfont;
extern int code;
extern int mcase;
extern int esc;
extern int lead;
extern int paper;
extern int cps;
extern int psflg;
extern int ptid;
extern int verm;
extern int escm;
extern char pstab[], psctab[];
extern int dpn;
extern int ascii;
int mrail = 0; /*0=LR,1=UR*/
int mmag = 1; /*0=UM,1=LM*/
extern int nofeed;
extern int gflag;
extern int fontlab[];
int papflg;
extern int pfont;
extern int ppts;
extern int oldbits;
extern int bd;
extern int vflag;
extern int stopmesg;
extern int xxx;
ptinit(){
if(ascii || gflag)return;
oput(T_INIT);
esc = T_IESC;
ptesc();
esct = 0;
esc = po;
oput(0140); /*some initial lead*/
}
ptout(i)
int i;
{
register *k, lw, *j;
int ds, de, inith, temp, *slp, dv;
int psl[16];
if((i & CMASK) != '\n'){
*olinep++ = i;
return;
}
if(olinep == oline){
lead += lss;
return;
}
pslp = psl;
*pslp = lw = inith = dv = 0;
for(k=oline; k<olinep; k++){
trflg++;
xbitf = 1;
lw += width(*k);
if((*k & (MOT | VMOT)) == (MOT | VMOT)){
temp = *k & ~MOTV;
if(*k & NMOT)temp = -temp;
dv += temp;
}
if(!(*k & MOT) && xflg)for(j=psl; j<=pslp; j++){
if(xpts == *j)break;
if(j == pslp){
*j = xpts;
*++pslp = 0;
break;
}
}
}
if(dv){
vflag++;
*olinep++ = makem(-dv);
vflag = 0;
}
if(xflg){
--pslp;
for(j=psl; j<=pslp; j++){
if(*j == mpts){
temp = *j;
*j = *pslp;
*pslp = temp;
break;
}
}
}
for(k=oline; k<olinep; k++){
if(!(*k & MOT) || (*k & VMOT))break;
*k &= ~MOT;
if(*k & NMOT){
*k &= ~NMOT;
*k = -*k;
}
inith += *k;
}
lead += dip->blss + lss;
dip->blss = 0;
slp = k;
scan:
temp = esct - po;
if(mpts & DBL)temp -= 55;
ds = temp - inith;
de = lw - temp;
if(de >= ds){
back = 0;
esc = -ds;
for(k=slp; k<olinep; k++)ptout0(*k);
}else{
back = 1;
esc = de;
for(k = olinep-1; k>=slp; --k)ptout0(*k);
}
if(xflg && (--pslp >= psl))goto scan;
olinep = oline;
lead += dip->alss;
dip->alss = 0;
}
ptout0(i)
int i;
{
register j, k, w;
int z;
if(i & MOT){
j = i & ~MOTV;
if(i & NMOT)j = -j;
if(back)j = -j;
if(i & VMOT)lead += j;
else esc += j;
return;
}
xbitf = 2;
if((i>>BYTE) == oldbits){
xfont = pfont;
xpts = ppts;
xbitf = 0;
}else xbits(i);
if((k = (i & CMASK)) < 040){
return;
}
w = getcw(k-32);
if(cs){
if(bd)w += bd - 1;
j = (cs-w)/2;
w = cs - j;
if(bd)w -= bd - 1;
}else j = 0;
if(i & ZBIT){
if(cs)w = -j; else w = 0;
z = 1;
}else z = 0;
if(back){
k = j;
j = -w;
w = -k;
}
esc += j;
if((!xflg || (xpts == *pslp)) && (code & 077)){
if(code & 0200){
if(smnt)xfont = smnt -1;
else goto p1;
}
if((k=(code>>6)&01)^mcase)oput((mcase=k)+0105);
if(xfont != mfont){
mfont = xfont;
if(mrail != (xfont&01))
oput(0101 + (mrail=xfont&01));
if(mmag != (xfont<2))
oput(0103 + (mmag=(xfont<2)));
}
if(xpts != mpts)ptps();
if(lead)ptlead();
if(esc)ptesc();
/*
oput(code & 077);
*/
*obufp++ = code & 077;
if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
if(bd){
bd -= 1;
if(back && !z)bd = -bd;
if(esc += bd)ptesc();
oput(code & 077);
if(z)esc -= bd;
}
}else if(bd && !z){
bd -= 1;
if(back)bd = -bd;
esc += bd;
}
p1:
esc += w;
return;
}
ptps(){
register i, j, k;
if(psflg)return;
if(cps){
psflg++;
i = findps(cps);
}else i = xpts;
for(j=0; (i&077) > (k = pstab[j]);j++)if(!k){k=pstab[--j];break;}
j = psctab[j];
oput((j & ~0200) | 0120);
if((!(mpts & DBL))^(!(j & 0200))){
if(j & 0200)k = 55;
else k = -55;
esc += k;
}
mpts = i;
}
ptlead(){
register i, k;
if(k = lead < 0)lead = -lead;
if(k^verm)oput(0112 + ((verm=k)<<1));
if(((k=lead)%3) == 2)k++;
k /= 3;
while(k > 0){
if((i=31) > k)i = k;
if(verm)paper -= i;
else paper += i;
oput(((~i) & 037) | 0140);
if((paper > (11*144*15)) && !papflg && ptid != 1){
prstr("Excessive paper use.\n");
papflg++;
if(ptid != 1){
lead = 0;
done2(0200);
}
}
k -= i;
}
lead = 0;
}
ptesc(){
register i, j, k;
if(k = esc < 0)esc = -esc;
if(k^escm)oput(0107 + (escm=k));
k = esc;
while(k > 0){
if((i=127) > k)i = k;
if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) ||
(j < 0))break;
/*
oput(~i);
*/
*obufp++ = ~i;
if(obufp == (obuf + OBUFSZ + ascii - 1))flusho();
esct = j;
k -= i;
}
esc = 0;
}
dostop(){
register i;
if(ascii)return;
if(!nofeed && !gflag)lead += TRAILER;
ptlead();
flusho();
oput(T_INIT);
oput(T_STOP);
if(gflag){
oput('f');
for(i=0; i<4; i++){
oput(fontlab[i] & BMASK);
oput((fontlab[i]>>BYTE) & BMASK);
}
}else for(i=8; i>0; i--)oput(T_PAD);
flusho();
if(stopmesg)prstr("Pages finished.\n");
mcase = mpts = mfont = mrail = verm = escm = 0;
mmag = 1;
report();
paper = 0;
esc = T_IESC;
ptesc();
esct = 0;
esc = po;
}