ref: c3ba64f6935322f09b6de5c2285544fd471c605d
dir: /sys/src/cmd/tbl/tv.c/
/* 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); }