xref: /plan9/sys/src/cmd/tbl/tt.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 /* tt.c: subroutines for drawing horizontal lines */
2 # include "t.h"
3 
4 int
ctype(int il,int ic)5 ctype(int il, int ic)
6 {
7 	if (instead[il])
8 		return(0);
9 	if (fullbot[il])
10 		return(0);
11 	il = stynum[il];
12 	return(style[ic][il]);
13 }
14 
15 
16 int
min(int a,int b)17 min(int a, int b)
18 {
19 	return(a < b ? a : b);
20 }
21 
22 
23 int
fspan(int i,int c)24 fspan(int i, int c)
25 {
26 	c++;
27 	return(c < ncol && ctype(i, c) == 's');
28 }
29 
30 
31 int
lspan(int i,int c)32 lspan(int i, int c)
33 {
34 	int	k;
35 
36 	if (ctype(i, c) != 's')
37 		return(0);
38 	c++;
39 	if (c < ncol && ctype(i, c) == 's')
40 		return(0);
41 	for (k = 0; ctype(i, --c) == 's'; k++)
42 		;
43 	return(k);
44 }
45 
46 
47 int
ctspan(int i,int c)48 ctspan(int i, int c)
49 {
50 	int	k;
51 	c++;
52 	for (k = 1; c < ncol && ctype(i, c) == 's'; k++)
53 		c++;
54 	return(k);
55 }
56 
57 
58 void
tohcol(int ic)59 tohcol(int ic)
60 {
61 	if (ic == 0)
62 		Bprint(&tabout, "\\h'|0'");
63 	else
64 		Bprint(&tabout, "\\h'(|\\n(%2su+|\\n(%2su)/2u'", reg(ic, CLEFT),
65 		     reg(ic - 1, CRIGHT));
66 }
67 
68 
69 int
allh(int i)70 allh(int i)
71 {
72 			/* return true if every element in line i is horizontal */
73 				/* also at least one must be horizontl */
74 	int	c, one, k;
75 
76 	if (fullbot[i])
77 		return(1);
78 	if (i >= nlin)
79 		return(dboxflg || boxflg);
80 	for (one = c = 0; c < ncol; c++) {
81 		k = thish(i, c);
82 		if (k == 0)
83 			return(0);
84 		if (k == 1)
85 			continue;
86 		one = 1;
87 	}
88 	return(one);
89 }
90 
91 
92 int
thish(int i,int c)93 thish(int i, int c)
94 {
95 	int	t;
96 	char	*s;
97 	struct colstr *pc;
98 
99 	if (c < 0)
100 		return(0);
101 	if (i < 0)
102 		return(0);
103 	t = ctype(i, c);
104 	if (t == '_' || t == '-')
105 		return('-');
106 	if (t == '=')
107 		return('=');
108 	if (t == '^')
109 		return(1);
110 	if (fullbot[i] )
111 		return(fullbot[i]);
112 	if (t == 's')
113 		return(thish(i, c - 1));
114 	if (t == 0)
115 		return(1);
116 	pc = &table[i][c];
117 	s = (t == 'a' ? pc->rcol : pc->col);
118 	if (s == 0 || (point(s) && *s == 0))
119 		return(1);
120 	if (vspen(s))
121 		return(1);
122 	if (t = barent( s))
123 		return(t);
124 	return(0);
125 }
126 
127 
128