BSD 3 development
[unix-history] / usr / src / cmd / troff / n5.c
#include "tdef.h"
#include <sgtty.h>
extern
#include "d.h"
extern
#include "v.h"
#include "s.h"
/*
troff5.c
misc processing requests
*/
extern struct s *frame;
extern struct s *litlev;
extern filep ip;
extern filep offset;
extern int ascii;
extern int nonumb;
extern int admod;
extern int ad;
extern int fi;
extern int cc;
extern int c2;
extern int ohc;
extern int tabc;
extern int dotc;
extern int pendnf;
extern int hyf;
extern int ce;
extern int po;
extern int po1;
extern int nc;
extern int in;
extern int un;
extern int un1;
extern int in1;
extern int ll;
extern int ll1;
extern int lt;
extern int lt1;
extern int nlist[NTRAP];
extern int mlist[NTRAP];
extern int lgf;
extern int pl;
extern int npn;
extern int npnflg;
extern int copyf;
extern char nextf[];
extern int trap;
extern int lss;
extern int em;
extern int evlist[EVLSZ];
extern int evi;
extern int ibf;
extern int ev;
extern int ch;
extern int nflush;
extern int tty;
extern struct sgttyb ttys;
extern int quiet;
extern int iflg;
extern int eschar;
extern int lit;
extern int ls;
extern int ls1;
extern int tabtab[];
extern char trtab[];
extern int ul;
extern int cu;
extern int sfont;
extern int font;
extern int fontlab[];
extern int it;
extern int itmac;
extern int noscale;
extern int ic;
extern int icf;
extern int ics;
extern int *vlist;
extern int sv;
extern int esc;
extern int nn;
extern int nms;
extern int ndf;
extern int lnmod;
extern int ni;
extern int lnsize;
extern int nb;
extern int nlflg;
extern int apts, apts1, pts, pts1, font, font1;
extern int ulfont;
extern int ulbit;
extern int error;
extern int nmbits;
extern int chbits;
extern int tdelim;
extern int xxx;
int iflist[NIF];
int ifx;
casead(){
register i;
ad = 1;
/*leave admod alone*/
if(skip())return;
switch(i = getch() & CMASK){
case 'r': /*right adj, left ragged*/
admod = 2;
break;
case 'l': /*left adj, right ragged*/
admod = ad = 0; /*same as casena*/
break;
case 'c': /*centered adj*/
admod = 1;
break;
case 'b': case 'n':
admod = 0;
break;
case '0': case '2': case '4':
ad = 0;
case '1': case '3': case '5':
admod = (i - '0')/2;
}
}
casena(){
ad = 0;
}
casefi(){
tbreak();
fi++;
pendnf = 0;
lnsize = LNSIZE;
}
casenf(){
tbreak();
fi = 0;
/* can't do while oline is only LNSIZE
lnsize = LNSIZE + WDSIZE;
*/
}
casers(){
dip->nls = 0;
}
casens(){
dip->nls++;
}
chget(c)
int c;
{
register i;
if(skip() ||
((i = getch()) & MOT) ||
((i&CMASK) == ' ') ||
((i&CMASK) == '\n')){
ch = i;
return(c);
}else return(i & BMASK);
}
casecc(){
cc = chget('.');
}
casec2(){
c2 = chget('\'');
}
casehc(){
ohc = chget(OHC);
}
casetc(){
tabc = chget(0);
}
caselc(){
dotc = chget(0);
}
casehy(){
register i;
hyf = 1;
if(skip())return;
noscale++;
i = atoi();
noscale = 0;
if(nonumb)return;
hyf = max(i,0);
}
casenh(){
hyf = 0;
}
max(aa,bb)
int aa,bb;
{
if(aa>bb)return(aa);
else return(bb);
}
casece(){
register i;
noscale++;
skip();
i = max(atoi(),0);
if(nonumb)i = 1;
tbreak();
ce = i;
noscale = 0;
}
casein(){
register i;
if(skip())i = in1;
else i = max(hnumb(&in),0);
tbreak();
in1 = in;
in = i;
if(!nc){
un = in;
setnel();
}
}
casell(){
register i;
if(skip())i = ll1;
else i = max(hnumb(&ll),INCH/10);
ll1 = ll;
ll = i;
setnel();
}
caselt(){
register i;
if(skip())i = lt1;
else i = max(hnumb(&lt),0);
lt1 = lt;
lt = i;
}
caseti(){
register i;
if(skip())return;
i = max(hnumb(&in),0);
tbreak();
un1 = i;
setnel();
}
casels(){
register i;
noscale++;
if(skip())i = ls1;
else i = max(inumb(&ls),1);
ls1 = ls;
ls = i;
noscale = 0;
}
casepo(){
register i;
if(skip())i = po1;
else i = max(hnumb(&po),0);
po1 = po;
po = i;
#ifndef NROFF
if(!ascii)esc += po - po1;
#endif
}
casepl(){
register i;
skip();
if((i = vnumb(&pl)) == 0)pl = 11 * INCH; /*11in*/
else pl = i;
if(v.nl > pl)v.nl = pl;
}
casewh(){
register i, j, k;
lgf++;
skip();
i = vnumb((int *)0);
if(nonumb)return;
skip();
j = getrq();
if((k=findn(i)) != NTRAP){
mlist[k] = j;
return;
}
for(k=0; k<NTRAP; k++)if(mlist[k] == 0)break;
if(k == NTRAP){
prstrfl("Cannot plant trap.\n");
return;
}
mlist[k] = j;
nlist[k] = i;
}
casech(){
register i, j, k;
lgf++;
skip();
if(!(j=getrq()))return;
else for(k=0; k<NTRAP; k++)if(mlist[k] == j)break;
if(k == NTRAP)return;
skip();
i = vnumb((int *)0);
if(nonumb)mlist[k] = 0;
nlist[k] = i;
}
findn(i)
int i;
{
register k;
for(k=0; k<NTRAP; k++)
if((nlist[k] == i) && (mlist[k] != 0))break;
return(k);
}
casepn(){
register i;
skip();
noscale++;
i = max(inumb(&v.pn),0);
noscale = 0;
if(!nonumb){
npn = i;
npnflg++;
}
}
casebp(){
register i;
register struct s *savframe;
if(dip != d)return;
savframe = frame;
skip();
if((i = inumb(&v.pn)) < 0)i = 0;
tbreak();
if(!nonumb){
npn = i;
npnflg++;
}else if(dip->nls)return;
eject(savframe);
}
casetm(x) int x;{
register i;
char tmbuf[NTM];
lgf++;
copyf++;
if(skip() && x)prstrfl("User Abort.");
for(i=0; i<NTM-2;)if((tmbuf[i++]=getch()) == '\n')break;
if(i == NTM-2)tmbuf[i++] = '\n';
tmbuf[i] = 0;
prstrfl(tmbuf);
copyf--;
}
casesp(a)
int a;
{
register i, j, savlss;
tbreak();
if(dip->nls || trap)return;
i = findt1();
if(!a){
skip();
j = vnumb((int *)0);
if(nonumb)j = lss;
}else j = a;
if(j == 0)return;
if(i < j)j = i;
savlss = lss;
if(dip != d)i = dip->dnl; else i = v.nl;
if((i + j) < 0)j = -i;
lss = j;
newline(0);
lss = savlss;
}
casert(){
register a, *p;
skip();
if(dip != d)p = &dip->dnl; else p = &v.nl;
a = vnumb(p);
if(nonumb)a = dip->mkline;
if((a < 0) || (a >= *p))return;
nb++;
casesp(a - *p);
}
caseem(){
lgf++;
skip();
em = getrq();
}
casefl(){
tbreak();
flusho();
}
caseev(){
register nxev;
extern int block;
if(skip()){
e0:
if(evi == 0)return;
nxev = evlist[--evi];
goto e1;
}
noscale++;
nxev = atoi();
noscale = 0;
if(nonumb)goto e0;
flushi();
if((nxev >= NEV) || (nxev < 0) || (evi >= EVLSZ)){
prstrfl("Cannot do ev.\n");
if(error)done2(040);else edone(040);
return;
}
evlist[evi++] = ev;
e1:
if(ev == nxev)return;
lseek(ibf, (long)(ev*EVS*sizeof(int)), 0);
write(ibf,(char *)&block, EVS*sizeof(int));
lseek(ibf, (long)(nxev*EVS*sizeof(int)), 0);
read(ibf,(char *)&block, EVS*sizeof(int));
ev = nxev;
}
caseel(){
if(--ifx < 0){
ifx = 0;
iflist[0] = 0;
}
caseif(2);
}
caseie(){
if(ifx >= NIF){
prstr("if-else overflow.\n");
ifx = 0;
edone(040);
}
caseif(1);
ifx++;
}
caseif(x)
int x;
{
register i, notflag, true;
if(x == 2){
notflag = 0;
true = iflist[ifx];
goto i1;
}
true = 0;
skip();
if(((i = getch()) & CMASK) == '!'){
notflag = 1;
}else{
notflag = 0;
ch = i;
}
i = atoi();
if(!nonumb){
if(i > 0)true++;
goto i1;
}
switch((i = getch()) & CMASK){
case 'e':
if(!(v.pn & 01))true++;
break;
case 'o':
if(v.pn & 01)true++;
break;
#ifdef NROFF
case 'n':
true++;
case 't':
#endif
#ifndef NROFF
case 't':
true++;
case 'n':
#endif
case ' ':
break;
default:
true = cmpstr(i);
}
i1:
true ^= notflag;
if(x == 1)iflist[ifx] = !true;
if(true){
i2:
do{
v.hp = 0;
}
while(((i = getch()) & CMASK) == ' ');
if((i & CMASK) == LEFT)goto i2;
ch = i;
nflush++;
}else{
copyf++;
if(eat(LEFT) == LEFT){
while(eatblk(RIGHT,LEFT) != RIGHT)nlflg = 0;
}
copyf--;
}
}
eatblk(right,left)
int right,left;
{
register i;
e0:
while(((i = getch() & CMASK) != right) &&
(i != left) &&
(i != '\n'));
if(i == left){
while((i=eatblk(right,left)) != right)nlflg = 0;
goto e0;
}
return(i);
}
cmpstr(delim)
int delim;
{
register i, j;
register filep p;
extern filep alloc();
extern filep incoff();
filep begin;
int cnt, k;
int savapts, savapts1, savfont, savfont1,
savpts, savpts1;
if(delim & MOT)return(0);
delim &= CMASK;
if(dip != d)wbfl();
if((offset = begin = alloc()) == (filep)0)return(0);
cnt = 0;
v.hp = 0;
savapts = apts;
savapts1 = apts1;
savfont = font;
savfont1 = font1;
savpts = pts;
savpts1 = pts1;
while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
wbf(i);
cnt++;
}
wbt(0);
k = !cnt;
if(nlflg)goto rtn;
p = begin;
apts = savapts;
apts1 = savapts1;
font = savfont;
font1 = savfont1;
pts = savpts;
pts1 = savpts1;
mchbits();
v.hp = 0;
while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
if(rbf0(p) != i){
eat(delim);
k = 0;
break;
}
p = incoff(p);
k = !(--cnt);
}
rtn:
apts = savapts;
apts1 = savapts1;
font = savfont;
font1 = savfont1;
pts = savpts;
pts1 = savpts1;
mchbits();
offset = dip->op;
ffree(begin);
return(k);
}
caserd(){
lgf++;
skip();
getname();
if(!iflg){
if(quiet){
ttys.sg_flags &= ~ECHO;
stty(0, &ttys);
prstrfl("\a"); /*bell*/
}else{
if(nextf[0]){
prstr(nextf);
prstr(":");
}else{
prstr("\a"); /*bell*/
}
}
}
collect();
tty++;
pushi((filep)-1);
}
rdtty(){
char onechar;
onechar = 0;
if(read(0, &onechar, 1) == 1){
if(onechar == '\n')tty++;
else tty = 1;
if(tty != 3)return(onechar);
}
popi();
tty = 0;
if(quiet){
ttys.sg_flags |= ECHO;
stty(0, &ttys);
}
return(0);
}
caseec(){
eschar = chget('\\');
}
caseeo(){
eschar = 0;
}
caseli(){
skip();
lit = max(inumb((int *)0),1);
litlev = frame;
if((dip == d) && (v.nl == -1))newline(1);
}
caseta(){
register i;
tabtab[0] = nonumb = 0;
for(i=0; ((i < (NTAB-1)) && !nonumb); i++){
if(skip())break;
tabtab[i] = max(hnumb(&tabtab[max(i-1,0)]),0) & TMASK;
if(!nonumb) switch(ch & CMASK){
case 'C':
tabtab[i] |= CTAB;
break;
case 'R':
tabtab[i] |= RTAB;
break;
default: /*includes L*/
break;
}
nonumb = ch = 0;
}
tabtab[i] = 0;
}
casene(){
register i, j;
skip();
i = vnumb((int *)0);
if(nonumb)i = lss;
if(i > (j = findt1())){
i = lss;
lss = j;
dip->nls = 0;
newline(0);
lss = i;
}
}
casetr(){
register i, j;
lgf++;
skip();
while((i = getch() & CMASK) != '\n'){
if((i & MOT) || ((j = getch()) & MOT))return;
if((j &= CMASK) == '\n')j = ' ';
trtab[i] = j;
}
}
casecu(){
cu++;
caseul();
}
caseul(){
register i;
noscale++;
if(skip())i = 1;
else i = atoi();
if(ul && (i == 0)){
font = sfont;
ul = cu = 0;
}
if(i){
if(!ul){
sfont = font;
font = ulfont;
}
ul = i;
}
noscale = 0;
mchbits();
}
caseuf(){
register i, j;
if(skip() || !(i = getrq()) || (i == 'S') ||
((j = find(i,fontlab)) == -1))
ulfont = 1; /*default position 2*/
else ulfont = j;
#ifdef NROFF
if(ulfont == 0)ulfont = 1;
#endif
ulbit = ulfont<<9;
}
caseit(){
register i;
lgf++;
it = itmac = 0;
noscale++;
skip();
i = atoi();
skip();
if(!nonumb && (itmac = getrq()))it = i;
noscale = 0;
}
casemc(){
register i;
if(icf > 1)ic = 0;
icf = 0;
if(skip())return;
ic = getch();
icf = 1;
skip();
i = max(hnumb((int *)0),0);
if(!nonumb)ics = i;
}
casemk(){
register i, j;
if(dip != d)j = dip->dnl; else j = v.nl;
if(skip()){
dip->mkline = j;
return;
}
if((i = getrq()) == 0)return;
vlist[findr(i)] = j;
}
casesv(){
register i;
skip();
if((i = vnumb((int *)0)) < 0)return;
if(nonumb)i = 1;
sv += i;
caseos();
}
caseos(){
register savlss;
if(sv <= findt1()){
savlss = lss;
lss = sv;
newline(0);
lss = savlss;
sv = 0;
}
}
casenm(){
register i;
lnmod = nn = 0;
if(skip())return;
lnmod++;
noscale++;
i = inumb(&v.ln);
if(!nonumb)v.ln = max(i,0);
getnm(&ndf,1);
getnm(&nms,0);
getnm(&ni,0);
noscale = 0;
nmbits = chbits;
}
getnm(p,min)
int *p, min;
{
register i;
eat(' ');
if(skip())return;
i = atoi();
if(nonumb)return;
*p = max(i,min);
}
casenn(){
noscale++;
skip();
nn = max(atoi(),1);
noscale = 0;
}
caseab(){
dummy();
casetm(1);
done2(0);
}