xref: /plan9/sys/src/cmd/tbl/tt.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier /* tt.c: subroutines for drawing horizontal lines */
23e12c5d1SDavid du Colombier # include "t.h"
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier int
ctype(int il,int ic)53e12c5d1SDavid du Colombier ctype(int il, int ic)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier 	if (instead[il])
83e12c5d1SDavid du Colombier 		return(0);
93e12c5d1SDavid du Colombier 	if (fullbot[il])
103e12c5d1SDavid du Colombier 		return(0);
113e12c5d1SDavid du Colombier 	il = stynum[il];
123e12c5d1SDavid du Colombier 	return(style[ic][il]);
133e12c5d1SDavid du Colombier }
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier int
min(int a,int b)173e12c5d1SDavid du Colombier min(int a, int b)
183e12c5d1SDavid du Colombier {
193e12c5d1SDavid du Colombier 	return(a < b ? a : b);
203e12c5d1SDavid du Colombier }
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier 
233e12c5d1SDavid du Colombier int
fspan(int i,int c)243e12c5d1SDavid du Colombier fspan(int i, int c)
253e12c5d1SDavid du Colombier {
263e12c5d1SDavid du Colombier 	c++;
273e12c5d1SDavid du Colombier 	return(c < ncol && ctype(i, c) == 's');
283e12c5d1SDavid du Colombier }
293e12c5d1SDavid du Colombier 
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier int
lspan(int i,int c)323e12c5d1SDavid du Colombier lspan(int i, int c)
333e12c5d1SDavid du Colombier {
343e12c5d1SDavid du Colombier 	int	k;
353e12c5d1SDavid du Colombier 
363e12c5d1SDavid du Colombier 	if (ctype(i, c) != 's')
373e12c5d1SDavid du Colombier 		return(0);
383e12c5d1SDavid du Colombier 	c++;
393e12c5d1SDavid du Colombier 	if (c < ncol && ctype(i, c) == 's')
403e12c5d1SDavid du Colombier 		return(0);
413e12c5d1SDavid du Colombier 	for (k = 0; ctype(i, --c) == 's'; k++)
423e12c5d1SDavid du Colombier 		;
433e12c5d1SDavid du Colombier 	return(k);
443e12c5d1SDavid du Colombier }
453e12c5d1SDavid du Colombier 
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier int
ctspan(int i,int c)483e12c5d1SDavid du Colombier ctspan(int i, int c)
493e12c5d1SDavid du Colombier {
503e12c5d1SDavid du Colombier 	int	k;
513e12c5d1SDavid du Colombier 	c++;
523e12c5d1SDavid du Colombier 	for (k = 1; c < ncol && ctype(i, c) == 's'; k++)
533e12c5d1SDavid du Colombier 		c++;
543e12c5d1SDavid du Colombier 	return(k);
553e12c5d1SDavid du Colombier }
563e12c5d1SDavid du Colombier 
573e12c5d1SDavid du Colombier 
583e12c5d1SDavid du Colombier void
tohcol(int ic)593e12c5d1SDavid du Colombier tohcol(int ic)
603e12c5d1SDavid du Colombier {
613e12c5d1SDavid du Colombier 	if (ic == 0)
62*219b2ee8SDavid du Colombier 		Bprint(&tabout, "\\h'|0'");
633e12c5d1SDavid du Colombier 	else
64*219b2ee8SDavid du Colombier 		Bprint(&tabout, "\\h'(|\\n(%2su+|\\n(%2su)/2u'", reg(ic, CLEFT),
653e12c5d1SDavid du Colombier 		     reg(ic - 1, CRIGHT));
663e12c5d1SDavid du Colombier }
673e12c5d1SDavid du Colombier 
683e12c5d1SDavid du Colombier 
693e12c5d1SDavid du Colombier int
allh(int i)703e12c5d1SDavid du Colombier allh(int i)
713e12c5d1SDavid du Colombier {
723e12c5d1SDavid du Colombier 			/* return true if every element in line i is horizontal */
733e12c5d1SDavid du Colombier 				/* also at least one must be horizontl */
743e12c5d1SDavid du Colombier 	int	c, one, k;
753e12c5d1SDavid du Colombier 
763e12c5d1SDavid du Colombier 	if (fullbot[i])
773e12c5d1SDavid du Colombier 		return(1);
783e12c5d1SDavid du Colombier 	if (i >= nlin)
793e12c5d1SDavid du Colombier 		return(dboxflg || boxflg);
803e12c5d1SDavid du Colombier 	for (one = c = 0; c < ncol; c++) {
813e12c5d1SDavid du Colombier 		k = thish(i, c);
823e12c5d1SDavid du Colombier 		if (k == 0)
833e12c5d1SDavid du Colombier 			return(0);
843e12c5d1SDavid du Colombier 		if (k == 1)
853e12c5d1SDavid du Colombier 			continue;
863e12c5d1SDavid du Colombier 		one = 1;
873e12c5d1SDavid du Colombier 	}
883e12c5d1SDavid du Colombier 	return(one);
893e12c5d1SDavid du Colombier }
903e12c5d1SDavid du Colombier 
913e12c5d1SDavid du Colombier 
923e12c5d1SDavid du Colombier int
thish(int i,int c)933e12c5d1SDavid du Colombier thish(int i, int c)
943e12c5d1SDavid du Colombier {
953e12c5d1SDavid du Colombier 	int	t;
963e12c5d1SDavid du Colombier 	char	*s;
973e12c5d1SDavid du Colombier 	struct colstr *pc;
983e12c5d1SDavid du Colombier 
993e12c5d1SDavid du Colombier 	if (c < 0)
1003e12c5d1SDavid du Colombier 		return(0);
1013e12c5d1SDavid du Colombier 	if (i < 0)
1023e12c5d1SDavid du Colombier 		return(0);
1033e12c5d1SDavid du Colombier 	t = ctype(i, c);
1043e12c5d1SDavid du Colombier 	if (t == '_' || t == '-')
1053e12c5d1SDavid du Colombier 		return('-');
1063e12c5d1SDavid du Colombier 	if (t == '=')
1073e12c5d1SDavid du Colombier 		return('=');
1083e12c5d1SDavid du Colombier 	if (t == '^')
1093e12c5d1SDavid du Colombier 		return(1);
1103e12c5d1SDavid du Colombier 	if (fullbot[i] )
1113e12c5d1SDavid du Colombier 		return(fullbot[i]);
1123e12c5d1SDavid du Colombier 	if (t == 's')
1133e12c5d1SDavid du Colombier 		return(thish(i, c - 1));
1143e12c5d1SDavid du Colombier 	if (t == 0)
1153e12c5d1SDavid du Colombier 		return(1);
1163e12c5d1SDavid du Colombier 	pc = &table[i][c];
1173e12c5d1SDavid du Colombier 	s = (t == 'a' ? pc->rcol : pc->col);
1183e12c5d1SDavid du Colombier 	if (s == 0 || (point(s) && *s == 0))
1193e12c5d1SDavid du Colombier 		return(1);
1203e12c5d1SDavid du Colombier 	if (vspen(s))
1213e12c5d1SDavid du Colombier 		return(1);
1223e12c5d1SDavid du Colombier 	if (t = barent( s))
1233e12c5d1SDavid du Colombier 		return(t);
1243e12c5d1SDavid du Colombier 	return(0);
1253e12c5d1SDavid du Colombier }
1263e12c5d1SDavid du Colombier 
1273e12c5d1SDavid du Colombier 
128