Blame


1 5cedca1b 2004-05-15 devnull /* tu.c: draws horizontal lines */
2 5cedca1b 2004-05-15 devnull # include "t.h"
3 5cedca1b 2004-05-15 devnull
4 5cedca1b 2004-05-15 devnull void
5 5cedca1b 2004-05-15 devnull makeline(int i, int c, int lintype)
6 5cedca1b 2004-05-15 devnull {
7 5cedca1b 2004-05-15 devnull int cr, type, shortl;
8 5cedca1b 2004-05-15 devnull
9 5cedca1b 2004-05-15 devnull type = thish(i, c);
10 fa325e9b 2020-01-10 cross if (type == 0)
11 5cedca1b 2004-05-15 devnull return;
12 5cedca1b 2004-05-15 devnull shortl = (table[i][c].col[0] == '\\');
13 5cedca1b 2004-05-15 devnull if (c > 0 && !shortl && thish(i, c - 1) == type)
14 5cedca1b 2004-05-15 devnull return;
15 5cedca1b 2004-05-15 devnull if (shortl == 0)
16 5cedca1b 2004-05-15 devnull for (cr = c; cr < ncol && (ctype(i, cr) == 's' || type == thish(i, cr)); cr++)
17 5cedca1b 2004-05-15 devnull ;
18 5cedca1b 2004-05-15 devnull else
19 5cedca1b 2004-05-15 devnull for (cr = c + 1; cr < ncol && ctype(i, cr) == 's'; cr++)
20 5cedca1b 2004-05-15 devnull ;
21 5cedca1b 2004-05-15 devnull drawline(i, c, cr - 1, lintype, 0, shortl);
22 5cedca1b 2004-05-15 devnull }
23 5cedca1b 2004-05-15 devnull
24 5cedca1b 2004-05-15 devnull
25 5cedca1b 2004-05-15 devnull void
26 5cedca1b 2004-05-15 devnull fullwide(int i, int lintype)
27 5cedca1b 2004-05-15 devnull {
28 5cedca1b 2004-05-15 devnull int cr, cl;
29 5cedca1b 2004-05-15 devnull
30 5cedca1b 2004-05-15 devnull if (!pr1403)
31 8a3cbc15 2004-05-17 devnull Bprint(&tabout, ".nr %d \\n(.v\n.vs \\n(.vu-\\n(.sp\n", SVS);
32 5cedca1b 2004-05-15 devnull cr = 0;
33 5cedca1b 2004-05-15 devnull while (cr < ncol) {
34 5cedca1b 2004-05-15 devnull cl = cr;
35 5cedca1b 2004-05-15 devnull while (i > 0 && vspand(prev(i), cl, 1))
36 5cedca1b 2004-05-15 devnull cl++;
37 5cedca1b 2004-05-15 devnull for (cr = cl; cr < ncol; cr++)
38 5cedca1b 2004-05-15 devnull if (i > 0 && vspand(prev(i), cr, 1))
39 5cedca1b 2004-05-15 devnull break;
40 5cedca1b 2004-05-15 devnull if (cl < ncol)
41 5cedca1b 2004-05-15 devnull drawline(i, cl, (cr < ncol ? cr - 1 : cr), lintype, 1, 0);
42 5cedca1b 2004-05-15 devnull }
43 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\n");
44 5cedca1b 2004-05-15 devnull if (!pr1403)
45 8a3cbc15 2004-05-17 devnull Bprint(&tabout, ".vs \\n(%du\n", SVS);
46 5cedca1b 2004-05-15 devnull }
47 5cedca1b 2004-05-15 devnull
48 5cedca1b 2004-05-15 devnull
49 5cedca1b 2004-05-15 devnull void
50 5cedca1b 2004-05-15 devnull drawline(int i, int cl, int cr, int lintype, int noheight, int shortl)
51 5cedca1b 2004-05-15 devnull {
52 5cedca1b 2004-05-15 devnull char *exhr, *exhl, *lnch;
53 5cedca1b 2004-05-15 devnull int lcount, ln, linpos, oldpos, nodata;
54 5cedca1b 2004-05-15 devnull
55 5cedca1b 2004-05-15 devnull lcount = 0;
56 5cedca1b 2004-05-15 devnull exhr = exhl = "";
57 5cedca1b 2004-05-15 devnull switch (lintype) {
58 fa325e9b 2020-01-10 cross case '-':
59 5cedca1b 2004-05-15 devnull lcount = 1;
60 5cedca1b 2004-05-15 devnull break;
61 fa325e9b 2020-01-10 cross case '=':
62 fa325e9b 2020-01-10 cross lcount = pr1403 ? 1 : 2;
63 5cedca1b 2004-05-15 devnull break;
64 fa325e9b 2020-01-10 cross case SHORTLINE:
65 fa325e9b 2020-01-10 cross lcount = 1;
66 5cedca1b 2004-05-15 devnull break;
67 5cedca1b 2004-05-15 devnull }
68 fa325e9b 2020-01-10 cross if (lcount <= 0)
69 5cedca1b 2004-05-15 devnull return;
70 5cedca1b 2004-05-15 devnull nodata = cr - cl >= ncol || noheight || allh(i);
71 5cedca1b 2004-05-15 devnull if (!nodata)
72 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\v'-.5m'");
73 5cedca1b 2004-05-15 devnull for (ln = oldpos = 0; ln < lcount; ln++) {
74 5cedca1b 2004-05-15 devnull linpos = 2 * ln - lcount + 1;
75 5cedca1b 2004-05-15 devnull if (linpos != oldpos)
76 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\v'%dp'", linpos - oldpos);
77 5cedca1b 2004-05-15 devnull oldpos = linpos;
78 5cedca1b 2004-05-15 devnull if (shortl == 0) {
79 5cedca1b 2004-05-15 devnull tohcol(cl);
80 5cedca1b 2004-05-15 devnull if (lcount > 1) {
81 5cedca1b 2004-05-15 devnull switch (interv(i, cl)) {
82 fa325e9b 2020-01-10 cross case TOP:
83 fa325e9b 2020-01-10 cross exhl = ln == 0 ? "1p" : "-1p";
84 5cedca1b 2004-05-15 devnull break;
85 fa325e9b 2020-01-10 cross case BOT:
86 fa325e9b 2020-01-10 cross exhl = ln == 1 ? "1p" : "-1p";
87 5cedca1b 2004-05-15 devnull break;
88 fa325e9b 2020-01-10 cross case THRU:
89 fa325e9b 2020-01-10 cross exhl = "1p";
90 5cedca1b 2004-05-15 devnull break;
91 5cedca1b 2004-05-15 devnull }
92 5cedca1b 2004-05-15 devnull if (exhl[0])
93 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\h'%s'", exhl);
94 5cedca1b 2004-05-15 devnull } else if (lcount == 1) {
95 5cedca1b 2004-05-15 devnull switch (interv(i, cl)) {
96 fa325e9b 2020-01-10 cross case TOP:
97 fa325e9b 2020-01-10 cross case BOT:
98 fa325e9b 2020-01-10 cross exhl = "-1p";
99 5cedca1b 2004-05-15 devnull break;
100 fa325e9b 2020-01-10 cross case THRU:
101 fa325e9b 2020-01-10 cross exhl = "1p";
102 5cedca1b 2004-05-15 devnull break;
103 5cedca1b 2004-05-15 devnull }
104 5cedca1b 2004-05-15 devnull if (exhl[0])
105 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\h'%s'", exhl);
106 5cedca1b 2004-05-15 devnull }
107 5cedca1b 2004-05-15 devnull if (lcount > 1) {
108 5cedca1b 2004-05-15 devnull switch (interv(i, cr + 1)) {
109 fa325e9b 2020-01-10 cross case TOP:
110 fa325e9b 2020-01-10 cross exhr = ln == 0 ? "-1p" : "+1p";
111 5cedca1b 2004-05-15 devnull break;
112 fa325e9b 2020-01-10 cross case BOT:
113 fa325e9b 2020-01-10 cross exhr = ln == 1 ? "-1p" : "+1p";
114 5cedca1b 2004-05-15 devnull break;
115 fa325e9b 2020-01-10 cross case THRU:
116 fa325e9b 2020-01-10 cross exhr = "-1p";
117 fa325e9b 2020-01-10 cross break;
118 5cedca1b 2004-05-15 devnull }
119 5cedca1b 2004-05-15 devnull } else if (lcount == 1) {
120 5cedca1b 2004-05-15 devnull switch (interv(i, cr + 1)) {
121 fa325e9b 2020-01-10 cross case TOP:
122 fa325e9b 2020-01-10 cross case BOT:
123 fa325e9b 2020-01-10 cross exhr = "+1p";
124 5cedca1b 2004-05-15 devnull break;
125 fa325e9b 2020-01-10 cross case THRU:
126 fa325e9b 2020-01-10 cross exhr = "-1p";
127 5cedca1b 2004-05-15 devnull break;
128 5cedca1b 2004-05-15 devnull }
129 5cedca1b 2004-05-15 devnull }
130 5cedca1b 2004-05-15 devnull } else
131 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\h'|\\n(%2su'", reg(cl, CLEFT));
132 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\s\\n(%d", LSIZE);
133 5cedca1b 2004-05-15 devnull if (linsize)
134 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\v'-\\n(%dp/6u'", LSIZE);
135 5cedca1b 2004-05-15 devnull if (shortl)
136 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\l'|\\n(%2su'", reg(cr, CRIGHT));
137 5cedca1b 2004-05-15 devnull else
138 5cedca1b 2004-05-15 devnull {
139 5cedca1b 2004-05-15 devnull lnch = "\\(ul";
140 5cedca1b 2004-05-15 devnull if (pr1403)
141 5cedca1b 2004-05-15 devnull lnch = lintype == 2 ? "=" : "\\(ru";
142 5cedca1b 2004-05-15 devnull if (cr + 1 >= ncol)
143 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\l'|\\n(TWu%s%s'", exhr, lnch);
144 5cedca1b 2004-05-15 devnull else
145 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\l'(|\\n(%2su+|\\n(%2su)/2u%s%s'", reg(cr, CRIGHT),
146 5cedca1b 2004-05-15 devnull reg(cr + 1, CLEFT), exhr, lnch);
147 5cedca1b 2004-05-15 devnull }
148 5cedca1b 2004-05-15 devnull if (linsize)
149 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\v'\\n(%dp/6u'", LSIZE);
150 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\s0");
151 5cedca1b 2004-05-15 devnull }
152 5cedca1b 2004-05-15 devnull if (oldpos != 0)
153 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\v'%dp'", -oldpos);
154 5cedca1b 2004-05-15 devnull if (!nodata)
155 8a3cbc15 2004-05-17 devnull Bprint(&tabout, "\\v'+.5m'");
156 5cedca1b 2004-05-15 devnull }
157 5cedca1b 2004-05-15 devnull
158 5cedca1b 2004-05-15 devnull
159 5cedca1b 2004-05-15 devnull void
160 5cedca1b 2004-05-15 devnull getstop(void)
161 5cedca1b 2004-05-15 devnull {
162 5cedca1b 2004-05-15 devnull int i, c, k, junk, stopp;
163 5cedca1b 2004-05-15 devnull
164 5cedca1b 2004-05-15 devnull stopp = 1;
165 5cedca1b 2004-05-15 devnull for (i = 0; i < MAXLIN; i++)
166 5cedca1b 2004-05-15 devnull linestop[i] = 0;
167 5cedca1b 2004-05-15 devnull for (i = 0; i < nlin; i++)
168 5cedca1b 2004-05-15 devnull for (c = 0; c < ncol; c++) {
169 5cedca1b 2004-05-15 devnull k = left(i, c, &junk);
170 5cedca1b 2004-05-15 devnull if (k >= 0 && linestop[k] == 0)
171 5cedca1b 2004-05-15 devnull linestop[k] = ++stopp;
172 5cedca1b 2004-05-15 devnull }
173 5cedca1b 2004-05-15 devnull if (boxflg || allflg || dboxflg)
174 5cedca1b 2004-05-15 devnull linestop[0] = 1;
175 5cedca1b 2004-05-15 devnull }
176 5cedca1b 2004-05-15 devnull
177 5cedca1b 2004-05-15 devnull
178 5cedca1b 2004-05-15 devnull int
179 5cedca1b 2004-05-15 devnull left(int i, int c, int *lwidp)
180 5cedca1b 2004-05-15 devnull {
181 5cedca1b 2004-05-15 devnull int kind, li, lj;
182 5cedca1b 2004-05-15 devnull /* returns -1 if no line to left */
183 5cedca1b 2004-05-15 devnull /* returns number of line where it starts */
184 5cedca1b 2004-05-15 devnull /* stores into lwid the kind of line */
185 5cedca1b 2004-05-15 devnull *lwidp = 0;
186 fa325e9b 2020-01-10 cross if (i < 0)
187 5cedca1b 2004-05-15 devnull return(-1);
188 5cedca1b 2004-05-15 devnull kind = lefdata(i, c);
189 fa325e9b 2020-01-10 cross if (kind == 0)
190 5cedca1b 2004-05-15 devnull return(-1);
191 5cedca1b 2004-05-15 devnull if (i + 1 < nlin)
192 fa325e9b 2020-01-10 cross if (lefdata(next(i), c) == kind)
193 5cedca1b 2004-05-15 devnull return(-1);
194 5cedca1b 2004-05-15 devnull li = i;
195 5cedca1b 2004-05-15 devnull while (i >= 0 && lefdata(i, c) == kind)
196 5cedca1b 2004-05-15 devnull i = prev(li = i);
197 fa325e9b 2020-01-10 cross if (prev(li) == -1)
198 5cedca1b 2004-05-15 devnull li = 0;
199 5cedca1b 2004-05-15 devnull *lwidp = kind;
200 5cedca1b 2004-05-15 devnull for (lj = i + 1; lj < li; lj++)
201 5cedca1b 2004-05-15 devnull if (instead[lj] && strcmp(instead[lj], ".TH") == 0)
202 5cedca1b 2004-05-15 devnull return(li);
203 5cedca1b 2004-05-15 devnull for (i = i + 1; i < li; i++)
204 5cedca1b 2004-05-15 devnull if (fullbot[i])
205 5cedca1b 2004-05-15 devnull li = i;
206 5cedca1b 2004-05-15 devnull return(li);
207 5cedca1b 2004-05-15 devnull }
208 5cedca1b 2004-05-15 devnull
209 5cedca1b 2004-05-15 devnull
210 5cedca1b 2004-05-15 devnull int
211 5cedca1b 2004-05-15 devnull lefdata(int i, int c)
212 5cedca1b 2004-05-15 devnull {
213 5cedca1b 2004-05-15 devnull int ck;
214 5cedca1b 2004-05-15 devnull
215 fa325e9b 2020-01-10 cross if (i >= nlin)
216 5cedca1b 2004-05-15 devnull i = nlin - 1;
217 5cedca1b 2004-05-15 devnull if (ctype(i, c) == 's') {
218 5cedca1b 2004-05-15 devnull for (ck = c; ctype(i, ck) == 's'; ck--)
219 5cedca1b 2004-05-15 devnull ;
220 5cedca1b 2004-05-15 devnull if (thish(i, ck) == 0)
221 5cedca1b 2004-05-15 devnull return(0);
222 5cedca1b 2004-05-15 devnull }
223 5cedca1b 2004-05-15 devnull i = stynum[i];
224 5cedca1b 2004-05-15 devnull i = lefline[c][i];
225 fa325e9b 2020-01-10 cross if (i > 0)
226 5cedca1b 2004-05-15 devnull return(i);
227 fa325e9b 2020-01-10 cross if (dboxflg && c == 0)
228 5cedca1b 2004-05-15 devnull return(2);
229 5cedca1b 2004-05-15 devnull if (allflg)
230 5cedca1b 2004-05-15 devnull return(1);
231 fa325e9b 2020-01-10 cross if (boxflg && c == 0)
232 5cedca1b 2004-05-15 devnull return(1);
233 5cedca1b 2004-05-15 devnull return(0);
234 5cedca1b 2004-05-15 devnull }
235 5cedca1b 2004-05-15 devnull
236 5cedca1b 2004-05-15 devnull
237 5cedca1b 2004-05-15 devnull int
238 5cedca1b 2004-05-15 devnull next(int i)
239 5cedca1b 2004-05-15 devnull {
240 5cedca1b 2004-05-15 devnull while (i + 1 < nlin) {
241 5cedca1b 2004-05-15 devnull i++;
242 fa325e9b 2020-01-10 cross if (!fullbot[i] && !instead[i])
243 5cedca1b 2004-05-15 devnull break;
244 5cedca1b 2004-05-15 devnull }
245 5cedca1b 2004-05-15 devnull return(i);
246 5cedca1b 2004-05-15 devnull }
247 5cedca1b 2004-05-15 devnull
248 5cedca1b 2004-05-15 devnull
249 5cedca1b 2004-05-15 devnull int
250 5cedca1b 2004-05-15 devnull prev(int i)
251 5cedca1b 2004-05-15 devnull {
252 5cedca1b 2004-05-15 devnull while (--i >= 0 && (fullbot[i] || instead[i]))
253 5cedca1b 2004-05-15 devnull ;
254 5cedca1b 2004-05-15 devnull return(i);
255 5cedca1b 2004-05-15 devnull }