aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/tbl/tv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/tbl/tv.c')
-rw-r--r--src/cmd/tbl/tv.c183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/cmd/tbl/tv.c b/src/cmd/tbl/tv.c
new file mode 100644
index 00000000..19a4b03f
--- /dev/null
+++ b/src/cmd/tbl/tv.c
@@ -0,0 +1,183 @@
+/* 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);
+}
+
+