Blob


1 /* tv.c: draw vertical lines */
2 # include "t.h"
4 void
5 drawvert(int start, int end, int c, int lwid)
6 {
7 char *exb = 0, *ext = 0;
8 int tp = 0, sl, ln, pos, epb, ept, vm;
10 end++;
11 vm = 'v';
12 /* note: nr 35 has value of 1m outside of linesize */
13 while (instead[end])
14 end++;
15 for (ln = 0; ln < lwid; ln++) {
16 epb = ept = 0;
17 pos = 2 * ln - lwid + 1;
18 if (pos != tp)
19 Bprint(&tabout, "\\h'%dp'", pos - tp);
20 tp = pos;
21 if (end < nlin) {
22 if (fullbot[end] || (!instead[end] && allh(end)))
23 epb = 2;
24 else
25 switch (midbar(end, c)) {
26 case '-':
27 exb = "1v-.5m";
28 break;
29 case '=':
30 exb = "1v-.5m";
31 epb = 1;
32 break;
33 }
34 }
35 if (lwid > 1)
36 switch (interh(end, c)) {
37 case THRU:
38 epb -= 1;
39 break;
40 case RIGHT:
41 epb += (ln == 0 ? 1 : -1);
42 break;
43 case LEFT:
44 epb += (ln == 1 ? 1 : -1);
45 break;
46 }
47 if (lwid == 1)
48 switch (interh(end, c)) {
49 case THRU:
50 epb -= 1;
51 break;
52 case RIGHT:
53 case LEFT:
54 epb += 1;
55 break;
56 }
57 if (start > 0) {
58 sl = start - 1;
59 while (sl >= 0 && instead[sl])
60 sl--;
61 if (sl >= 0 && (fullbot[sl] || allh(sl)))
62 ept = 0;
63 else if (sl >= 0)
64 switch (midbar(sl, c)) {
65 case '-':
66 ext = ".5m";
67 break;
68 case '=':
69 ext = ".5m";
70 ept = -1;
71 break;
72 default:
73 vm = 'm';
74 break;
75 }
76 else
77 ept = -4;
78 } else if (start == 0 && allh(0)) {
79 ept = 0;
80 vm = 'm';
81 }
82 if (lwid > 1)
83 switch (interh(start, c)) {
84 case THRU:
85 ept += 1;
86 break;
87 case LEFT:
88 ept += (ln == 0 ? 1 : -1);
89 break;
90 case RIGHT:
91 ept += (ln == 1 ? 1 : -1);
92 break;
93 }
94 else if (lwid == 1)
95 switch (interh(start, c)) {
96 case THRU:
97 ept += 1;
98 break;
99 case LEFT:
100 case RIGHT:
101 ept -= 1;
102 break;
104 if (exb)
105 Bprint(&tabout, "\\v'%s'", exb);
106 if (epb)
107 Bprint(&tabout, "\\v'%dp'", epb);
108 Bprint(&tabout, "\\s\\n(%d", LSIZE);
109 if (linsize)
110 Bprint(&tabout, "\\v'-\\n(%dp/6u'", LSIZE);
111 Bprint(&tabout, "\\h'-\\n(#~u'"); /* adjustment for T450 nroff boxes */
112 Bprint(&tabout, "\\L'|\\n(#%cu-%s", linestop[start] + 'a' - 1,
113 vm == 'v' ? "1v" : "\\n(35u");
114 if (ext)
115 Bprint(&tabout, "-(%s)", ext);
116 if (exb)
117 Bprint(&tabout, "-(%s)", exb);
118 pos = ept - epb;
119 if (pos)
120 Bprint(&tabout, "%s%dp", pos >= 0 ? "+" : "", pos);
121 /* the string #d is either "nl" or ".d" depending
122 on diversions; on GCOS not the same */
123 Bprint(&tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s",
124 linestop[start] + 'a' - 1, vm == 'v' ? "1v" : "\\n(35u");
125 if (ext)
126 Bprint(&tabout, "+%s", ext);
127 if (ept)
128 Bprint(&tabout, "%s%dp", (-ept) > 0 ? "+" : "", (-ept));
129 Bprint(&tabout, "'");
130 if (linsize)
131 Bprint(&tabout, "\\v'\\n(%dp/6u'", LSIZE);
136 int
137 midbar(int i, int c)
139 int k;
141 k = midbcol(i, c);
142 if (k == 0 && c > 0)
143 k = midbcol(i, c - 1);
144 return(k);
148 int
149 midbcol(int i, int c)
151 int ct;
153 while ( (ct = ctype(i, c)) == 's')
154 c--;
155 if (ct == '-' || ct == '=')
156 return(ct);
157 if (ct = barent(table[i][c].col))
158 return(ct);
159 return(0);
163 int
164 barent(char *s)
166 if (s == 0)
167 return (1);
168 if (!point(s))
169 return(0);
170 if (s[0] == '\\')
171 s++;
172 if (s[1] != 0)
173 return(0);
174 switch (s[0]) {
175 case '_':
176 return('-');
177 case '=':
178 return('=');
180 return(0);