123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- /* 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);
- }
|