aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/tbl/tt.c
blob: 54c6180e8515876023ebfdfa2cad6a8300d8f1a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* tt.c: subroutines for drawing horizontal lines */
# include "t.h"

int
ctype(int il, int ic)
{
	if (instead[il])
		return(0);
	if (fullbot[il])
		return(0);
	il = stynum[il];
	return(style[ic][il]);
}


int
min(int a, int b)
{
	return(a < b ? a : b);
}


int
fspan(int i, int c)
{
	c++;
	return(c < ncol && ctype(i, c) == 's');
}


int
lspan(int i, int c)
{
	int	k;

	if (ctype(i, c) != 's')
		return(0);
	c++;
	if (c < ncol && ctype(i, c) == 's')
		return(0);
	for (k = 0; ctype(i, --c) == 's'; k++)
		;
	return(k);
}


int
ctspan(int i, int c)
{
	int	k;
	c++;
	for (k = 1; c < ncol && ctype(i, c) == 's'; k++)
		c++;
	return(k);
}


void
tohcol(int ic)
{
	if (ic == 0)
		Bprint(&tabout, "\\h'|0'");
	else
		Bprint(&tabout, "\\h'(|\\n(%2su+|\\n(%2su)/2u'", reg(ic, CLEFT),
		     reg(ic - 1, CRIGHT));
}


int
allh(int i)
{
			/* return true if every element in line i is horizontal */
				/* also at least one must be horizontl */
	int	c, one, k;

	if (fullbot[i])
		return(1);
	if (i >= nlin)
		return(dboxflg || boxflg);
	for (one = c = 0; c < ncol; c++) {
		k = thish(i, c);
		if (k == 0)
			return(0);
		if (k == 1)
			continue;
		one = 1;
	}
	return(one);
}


int
thish(int i, int c)
{
	int	t;
	char	*s;
	struct colstr *pc;

	if (c < 0)
		return(0);
	if (i < 0)
		return(0);
	t = ctype(i, c);
	if (t == '_' || t == '-')
		return('-');
	if (t == '=')
		return('=');
	if (t == '^')
		return(1);
	if (fullbot[i] )
		return(fullbot[i]);
	if (t == 's')
		return(thish(i, c - 1));
	if (t == 0)
		return(1);
	pc = &table[i][c];
	s = (t == 'a' ? pc->rcol : pc->col);
	if (s == 0 || (point(s) && *s == 0))
		return(1);
	if (vspen(s))
		return(1);
	if (t = barent( s))
		return(t);
	return(0);
}