blob: 0a0c356101e10162e69ec189b0f16ee0c0a5d9d9 [file] [log] [blame]
#ifndef lint
static char sccsid[] = "@(#)tv.c 4.3 8/11/83";
#endif
/* tv.c: draw vertical lines */
# include "t..c"
extern int allh(int i);
extern int interh(int i,int c);
extern int ctype(int il,int ic);
extern int point(int s);
int midbar(int i,int c);
int midbcol(int i,int c);
int barent(char *s);
void drawvert(int start,int end,int c,int lwid)
{
char *exb=0, *ext=0;
int tp=0, sl, ln, pos, epb, ept, vm;
end++;
vm='v';
/* note: nr 35 has value of 1m outside of linesize */
while (instead[end]) end++;
for(ln=0; ln<lwid; ln++)
{
epb=ept=0;
pos = 2*ln-lwid+1;
if (pos!=tp) fprintf(tabout, "\\h'%dp'", pos-tp);
tp = pos;
if (end<nlin)
{
if (fullbot[end]|| (!instead[end] && allh(end)))
epb=2;
else
switch (midbar(end,c))
{
case '-':
exb = "1v-.5m"; break;
case '=':
exb = "1v-.5m";
epb = 1; break;
}
}
if (lwid>1)
switch(interh(end, c))
{
case THRU: epb -= 1; break;
case RIGHT: epb += (ln==0 ? 1 : -1); break;
case LEFT: epb += (ln==1 ? 1 : -1); break;
}
if (lwid==1)
switch(interh(end,c))
{
case THRU: epb -= 1; break;
case RIGHT: case LEFT: epb += 1; break;
}
if (start>0)
{
sl = start-1;
while (sl>=0 && instead[sl]) sl--;
if (sl>=0 && (fullbot[sl] || allh(sl)))
ept=0;
else
if (sl>=0)
switch(midbar(sl,c))
{
case '-':
ext = ".5m"; break;
case '=':
ext= ".5m"; ept = -1; break;
default:
vm = 'm'; break;
}
else
ept = -4;
}
else if (start==0 && allh(0))
{
ept=0;
vm = 'm';
}
if (lwid>1)
switch(interh(start,c))
{
case THRU: ept += 1; break;
case LEFT: ept += (ln==0 ? 1 : -1); break;
case RIGHT: ept += (ln==1 ? 1 : -1); break;
}
else if (lwid==1)
switch(interh(start,c))
{
case THRU: ept += 1; break;
case LEFT: case RIGHT: ept -= 1; break;
}
if (exb)
fprintf(tabout, "\\v'%s'", exb);
if (epb)
fprintf(tabout, "\\v'%dp'", epb);
fprintf(tabout, "\\s\\n(%d",LSIZE);
if (linsize)
fprintf(tabout, "\\v'-\\n(%dp/6u'", LSIZE);
fprintf(tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */
fprintf(tabout, "\\L'|\\n(#%cu-%s", linestop[start]+'a'-1, vm=='v'? "1v" : "\\n(35u");
if (ext)
fprintf(tabout, "-(%s)",ext);
if (exb)
fprintf(tabout, "-(%s)", exb);
pos = ept-epb;
if (pos)
fprintf(tabout, "%s%dp", pos>=0? "+" : "", pos);
/* the string #d is either "nl" or ".d" depending
on diversions; on GCOS not the same */
fprintf(tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s", linestop[start]+'a'-1,vm=='v' ? "1v" : "\\n(35u");
if (ext)
fprintf(tabout, "+%s",ext);
if (ept)
fprintf(tabout, "%s%dp", (-ept)>0 ? "+" : "", (-ept));
fprintf(tabout, "'");
if (linsize)
fprintf(tabout, "\\v'\\n(%dp/6u'", LSIZE);
}
}
int midbar(int i,int c)
{
int k;
k = midbcol(i,c);
if (k==0 && c>0)
k = midbcol(i, c-1);
return(k);
}
int midbcol(int i,int c)
{
int ct;
while ( (ct=ctype(i,c)) == 's')
c--;
if (ct=='-' || ct == '=')
return(ct);
if (ct=barent(table[i][c].col))
return(ct);
return(0);
}
int barent(char *s)
{
if (s==0) return (1);
if (!point((int)s)) return(1);
if (s[0]== '\\') s++;
if (s[1]!= 0)
return(0);
switch(s[0])
{
case '_':
return('-');
case '=':
return('=');
}
return(0);
}