]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/tbl/tt.c
merge
[plan9front.git] / sys / src / cmd / tbl / tt.c
1 /* tt.c: subroutines for drawing horizontal lines */
2 # include "t.h"
3
4 int
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
17 min(int a, int b)
18 {
19         return(a < b ? a : b);
20 }
21
22
23 int
24 fspan(int i, int c)
25 {
26         c++;
27         return(c < ncol && ctype(i, c) == 's');
28 }
29
30
31 int
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
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
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
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
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