xref: /plan9/sys/src/cmd/tbl/tv.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier /* tv.c: draw vertical lines */
23e12c5d1SDavid du Colombier # include "t.h"
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier void
drawvert(int start,int end,int c,int lwid)53e12c5d1SDavid du Colombier drawvert(int start, int end, int c, int lwid)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier 	char	*exb = 0, *ext = 0;
83e12c5d1SDavid du Colombier 	int	tp = 0, sl, ln, pos, epb, ept, vm;
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier 	end++;
113e12c5d1SDavid du Colombier 	vm = 'v';
123e12c5d1SDavid du Colombier 				/* note: nr 35 has value of 1m outside of linesize */
133e12c5d1SDavid du Colombier 	while (instead[end])
143e12c5d1SDavid du Colombier 		end++;
153e12c5d1SDavid du Colombier 	for (ln = 0; ln < lwid; ln++) {
163e12c5d1SDavid du Colombier 		epb = ept = 0;
173e12c5d1SDavid du Colombier 		pos = 2 * ln - lwid + 1;
183e12c5d1SDavid du Colombier 		if (pos != tp)
19*219b2ee8SDavid du Colombier 			Bprint(&tabout, "\\h'%dp'", pos - tp);
203e12c5d1SDavid du Colombier 		tp = pos;
213e12c5d1SDavid du Colombier 		if (end < nlin) {
223e12c5d1SDavid du Colombier 			if (fullbot[end] || (!instead[end] && allh(end)))
233e12c5d1SDavid du Colombier 				epb = 2;
243e12c5d1SDavid du Colombier 			else
253e12c5d1SDavid du Colombier 				switch (midbar(end, c)) {
263e12c5d1SDavid du Colombier 				case '-':
273e12c5d1SDavid du Colombier 					exb = "1v-.5m";
283e12c5d1SDavid du Colombier 					break;
293e12c5d1SDavid du Colombier 				case '=':
303e12c5d1SDavid du Colombier 					exb = "1v-.5m";
313e12c5d1SDavid du Colombier 					epb = 1;
323e12c5d1SDavid du Colombier 					break;
333e12c5d1SDavid du Colombier 				}
343e12c5d1SDavid du Colombier 		}
353e12c5d1SDavid du Colombier 		if (lwid > 1)
363e12c5d1SDavid du Colombier 			switch (interh(end, c)) {
373e12c5d1SDavid du Colombier 			case THRU:
383e12c5d1SDavid du Colombier 				epb -= 1;
393e12c5d1SDavid du Colombier 				break;
403e12c5d1SDavid du Colombier 			case RIGHT:
413e12c5d1SDavid du Colombier 				epb += (ln == 0 ? 1 : -1);
423e12c5d1SDavid du Colombier 				break;
433e12c5d1SDavid du Colombier 			case LEFT:
443e12c5d1SDavid du Colombier 				epb += (ln == 1 ? 1 : -1);
453e12c5d1SDavid du Colombier 				break;
463e12c5d1SDavid du Colombier 			}
473e12c5d1SDavid du Colombier 		if (lwid == 1)
483e12c5d1SDavid du Colombier 			switch (interh(end, c)) {
493e12c5d1SDavid du Colombier 			case THRU:
503e12c5d1SDavid du Colombier 				epb -= 1;
513e12c5d1SDavid du Colombier 				break;
523e12c5d1SDavid du Colombier 			case RIGHT:
533e12c5d1SDavid du Colombier 			case LEFT:
543e12c5d1SDavid du Colombier 				epb += 1;
553e12c5d1SDavid du Colombier 				break;
563e12c5d1SDavid du Colombier 			}
573e12c5d1SDavid du Colombier 		if (start > 0) {
583e12c5d1SDavid du Colombier 			sl = start - 1;
593e12c5d1SDavid du Colombier 			while (sl >= 0 && instead[sl])
603e12c5d1SDavid du Colombier 				sl--;
613e12c5d1SDavid du Colombier 			if (sl >= 0 && (fullbot[sl] || allh(sl)))
623e12c5d1SDavid du Colombier 				ept = 0;
633e12c5d1SDavid du Colombier 			else if (sl >= 0)
643e12c5d1SDavid du Colombier 				switch (midbar(sl, c)) {
653e12c5d1SDavid du Colombier 				case '-':
663e12c5d1SDavid du Colombier 					ext = ".5m";
673e12c5d1SDavid du Colombier 					break;
683e12c5d1SDavid du Colombier 				case '=':
693e12c5d1SDavid du Colombier 					ext = ".5m";
703e12c5d1SDavid du Colombier 					ept = -1;
713e12c5d1SDavid du Colombier 					break;
723e12c5d1SDavid du Colombier 				default:
733e12c5d1SDavid du Colombier 					vm = 'm';
743e12c5d1SDavid du Colombier 					break;
753e12c5d1SDavid du Colombier 				}
763e12c5d1SDavid du Colombier 			else
773e12c5d1SDavid du Colombier 				ept = -4;
783e12c5d1SDavid du Colombier 		} else if (start == 0 && allh(0)) {
793e12c5d1SDavid du Colombier 			ept = 0;
803e12c5d1SDavid du Colombier 			vm = 'm';
813e12c5d1SDavid du Colombier 		}
823e12c5d1SDavid du Colombier 		if (lwid > 1)
833e12c5d1SDavid du Colombier 			switch (interh(start, c)) {
843e12c5d1SDavid du Colombier 			case THRU:
853e12c5d1SDavid du Colombier 				ept += 1;
863e12c5d1SDavid du Colombier 				break;
873e12c5d1SDavid du Colombier 			case LEFT:
883e12c5d1SDavid du Colombier 				ept += (ln == 0 ? 1 : -1);
893e12c5d1SDavid du Colombier 				break;
903e12c5d1SDavid du Colombier 			case RIGHT:
913e12c5d1SDavid du Colombier 				ept += (ln == 1 ? 1 : -1);
923e12c5d1SDavid du Colombier 				break;
933e12c5d1SDavid du Colombier 			}
943e12c5d1SDavid du Colombier 		else if (lwid == 1)
953e12c5d1SDavid du Colombier 			switch (interh(start, c)) {
963e12c5d1SDavid du Colombier 			case THRU:
973e12c5d1SDavid du Colombier 				ept += 1;
983e12c5d1SDavid du Colombier 				break;
993e12c5d1SDavid du Colombier 			case LEFT:
1003e12c5d1SDavid du Colombier 			case RIGHT:
1013e12c5d1SDavid du Colombier 				ept -= 1;
1023e12c5d1SDavid du Colombier 				break;
1033e12c5d1SDavid du Colombier 			}
1043e12c5d1SDavid du Colombier 		if (exb)
105*219b2ee8SDavid du Colombier 			Bprint(&tabout, "\\v'%s'", exb);
1063e12c5d1SDavid du Colombier 		if (epb)
107*219b2ee8SDavid du Colombier 			Bprint(&tabout, "\\v'%dp'", epb);
108*219b2ee8SDavid du Colombier 		Bprint(&tabout, "\\s\\n(%d", LSIZE);
1093e12c5d1SDavid du Colombier 		if (linsize)
110*219b2ee8SDavid du Colombier 			Bprint(&tabout, "\\v'-\\n(%dp/6u'", LSIZE);
111*219b2ee8SDavid du Colombier 		Bprint(&tabout, "\\h'-\\n(#~u'");	 /* adjustment for T450 nroff boxes */
112*219b2ee8SDavid du Colombier 		Bprint(&tabout, "\\L'|\\n(#%cu-%s", linestop[start] + 'a' - 1,
1133e12c5d1SDavid du Colombier 		      vm == 'v' ? "1v" : "\\n(35u");
1143e12c5d1SDavid du Colombier 		if (ext)
115*219b2ee8SDavid du Colombier 			Bprint(&tabout, "-(%s)", ext);
1163e12c5d1SDavid du Colombier 		if (exb)
117*219b2ee8SDavid du Colombier 			Bprint(&tabout, "-(%s)", exb);
1183e12c5d1SDavid du Colombier 		pos = ept - epb;
1193e12c5d1SDavid du Colombier 		if (pos)
120*219b2ee8SDavid du Colombier 			Bprint(&tabout, "%s%dp", pos >= 0 ? "+" : "", pos);
1213e12c5d1SDavid du Colombier 		/* the string #d is either "nl" or ".d" depending
1223e12c5d1SDavid du Colombier 	   on diversions; on GCOS not the same */
123*219b2ee8SDavid du Colombier 		Bprint(&tabout, "'\\s0\\v'\\n(\\*(#du-\\n(#%cu+%s",
1243e12c5d1SDavid du Colombier 		     linestop[start] + 'a' - 1, vm == 'v' ? "1v" : "\\n(35u");
1253e12c5d1SDavid du Colombier 		if (ext)
126*219b2ee8SDavid du Colombier 			Bprint(&tabout, "+%s", ext);
1273e12c5d1SDavid du Colombier 		if (ept)
128*219b2ee8SDavid du Colombier 			Bprint(&tabout, "%s%dp", (-ept) > 0 ? "+" : "", (-ept));
129*219b2ee8SDavid du Colombier 		Bprint(&tabout, "'");
1303e12c5d1SDavid du Colombier 		if (linsize)
131*219b2ee8SDavid du Colombier 			Bprint(&tabout, "\\v'\\n(%dp/6u'", LSIZE);
1323e12c5d1SDavid du Colombier 	}
1333e12c5d1SDavid du Colombier }
1343e12c5d1SDavid du Colombier 
1353e12c5d1SDavid du Colombier 
1363e12c5d1SDavid du Colombier int
midbar(int i,int c)1373e12c5d1SDavid du Colombier midbar(int i, int c)
1383e12c5d1SDavid du Colombier {
1393e12c5d1SDavid du Colombier 	int	k;
1403e12c5d1SDavid du Colombier 
1413e12c5d1SDavid du Colombier 	k = midbcol(i, c);
1423e12c5d1SDavid du Colombier 	if (k == 0 && c > 0)
1433e12c5d1SDavid du Colombier 		k = midbcol(i, c - 1);
1443e12c5d1SDavid du Colombier 	return(k);
1453e12c5d1SDavid du Colombier }
1463e12c5d1SDavid du Colombier 
1473e12c5d1SDavid du Colombier 
1483e12c5d1SDavid du Colombier int
midbcol(int i,int c)1493e12c5d1SDavid du Colombier midbcol(int i, int c)
1503e12c5d1SDavid du Colombier {
1513e12c5d1SDavid du Colombier 	int	ct;
1523e12c5d1SDavid du Colombier 
1533e12c5d1SDavid du Colombier 	while ( (ct = ctype(i, c)) == 's')
1543e12c5d1SDavid du Colombier 		c--;
1553e12c5d1SDavid du Colombier 	if (ct == '-' || ct == '=')
1563e12c5d1SDavid du Colombier 		return(ct);
1573e12c5d1SDavid du Colombier 	if (ct = barent(table[i][c].col))
1583e12c5d1SDavid du Colombier 		return(ct);
1593e12c5d1SDavid du Colombier 	return(0);
1603e12c5d1SDavid du Colombier }
1613e12c5d1SDavid du Colombier 
1623e12c5d1SDavid du Colombier 
1633e12c5d1SDavid du Colombier int
barent(char * s)1643e12c5d1SDavid du Colombier barent(char *s)
1653e12c5d1SDavid du Colombier {
1663e12c5d1SDavid du Colombier 	if (s == 0)
1673e12c5d1SDavid du Colombier 		return (1);
1683e12c5d1SDavid du Colombier 	if (!point(s))
1693e12c5d1SDavid du Colombier 		return(0);
1703e12c5d1SDavid du Colombier 	if (s[0] == '\\')
1713e12c5d1SDavid du Colombier 		s++;
1723e12c5d1SDavid du Colombier 	if (s[1] != 0)
1733e12c5d1SDavid du Colombier 		return(0);
1743e12c5d1SDavid du Colombier 	switch (s[0]) {
1753e12c5d1SDavid du Colombier 	case '_':
1763e12c5d1SDavid du Colombier 		return('-');
1773e12c5d1SDavid du Colombier 	case '=':
1783e12c5d1SDavid du Colombier 		return('=');
1793e12c5d1SDavid du Colombier 	}
1803e12c5d1SDavid du Colombier 	return(0);
1813e12c5d1SDavid du Colombier }
1823e12c5d1SDavid du Colombier 
1833e12c5d1SDavid du Colombier 
184