Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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