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