/* tv.c: draw vertical lines */
# include "t.h"
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)
Bprint(&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)
Bprint(&tabout, "\\v'%s'", exb);
if (epb)
Bprint(&tabout, "\\v'%dp'", epb);
Bprint(&tabout, "\\s\\n(%d", LSIZE);
if (linsize)
Bprint(&tabout, "\\v'-\\n(%dp/6u'", LSIZE);
Bprint(&tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */
Bprint(&tabout, "\\L'|\\n(#%cu-%s", linestop[start] + 'a' - 1,
vm == 'v' ? "1v" : "\\n(35u");
if (ext)
Bprint(&tabout, "-(%s)", ext);
if (exb)
Bprint(&tabout, "-(%s)", exb);
pos = ept - epb;
if (pos)
Bprint(&tabout, "%s%dp", pos >= 0 ? "+" : "", pos);
/* the string #d is either "nl" or ".d" depending
on diversions; on GCOS not the same */
Bprint(&tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s",
linestop[start] + 'a' - 1, vm == 'v' ? "1v" : "\\n(35u");
if (ext)
Bprint(&tabout, "+%s", ext);
if (ept)
Bprint(&tabout, "%s%dp", (-ept) > 0 ? "+" : "", (-ept));
Bprint(&tabout, "'");
if (linsize)
Bprint(&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(s))
return(0);
if (s[0] == '\\')
s++;
if (s[1] != 0)
return(0);
switch (s[0]) {
case '_':
return('-');
case '=':
return('=');
}
return(0);
}
|