xref: /plan9/sys/src/cmd/tbl/t7.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier /* t7.c: control to write table entries */
23e12c5d1SDavid du Colombier # include "t.h"
33e12c5d1SDavid du Colombier # define realsplit ((ct=='a'||ct=='n') && table[ldata][c].rcol)
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier void
runout(void)63e12c5d1SDavid du Colombier runout(void)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	int	i;
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier 	if (boxflg || allflg || dboxflg)
113e12c5d1SDavid du Colombier 		need();
123e12c5d1SDavid du Colombier 	if (ctrflg) {
13*219b2ee8SDavid du Colombier 		Bprint(&tabout, ".nr #I \\n(.i\n");
14*219b2ee8SDavid du Colombier 		Bprint(&tabout, ".in +(\\n(.lu-\\n(TWu-\\n(.iu)/2u\n");
153e12c5d1SDavid du Colombier 	}
16*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".fc %c %c\n", F1, F2);
17*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".nr #T 0-1\n");
183e12c5d1SDavid du Colombier 	deftail();
193e12c5d1SDavid du Colombier 	for (i = 0; i < nlin; i++)
203e12c5d1SDavid du Colombier 		putline(i, i);
213e12c5d1SDavid du Colombier 	if (leftover)
223e12c5d1SDavid du Colombier 		yetmore();
23*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".fc\n");
24*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".nr T. 1\n");
25*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".T# 1\n");
263e12c5d1SDavid du Colombier 	if (ctrflg)
27*219b2ee8SDavid du Colombier 		Bprint(&tabout, ".in \\n(#Iu\n");
283e12c5d1SDavid du Colombier }
293e12c5d1SDavid du Colombier 
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier void
runtabs(int lform,int ldata)323e12c5d1SDavid du Colombier runtabs(int lform, int ldata)
333e12c5d1SDavid du Colombier {
343e12c5d1SDavid du Colombier 	int	c, ct, vforml, lf;
353e12c5d1SDavid du Colombier 
36*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".ta ");
373e12c5d1SDavid du Colombier 	for (c = 0; c < ncol; c++) {
383e12c5d1SDavid du Colombier 		vforml = lform;
393e12c5d1SDavid du Colombier 		for (lf = prev(lform); lf >= 0 && vspen(table[lf][c].col); lf = prev(lf))
403e12c5d1SDavid du Colombier 			vforml = lf;
413e12c5d1SDavid du Colombier 		if (fspan(vforml, c))
423e12c5d1SDavid du Colombier 			continue;
433e12c5d1SDavid du Colombier 		switch (ct = ctype(vforml, c)) {
443e12c5d1SDavid du Colombier 		case 'n':
453e12c5d1SDavid du Colombier 		case 'a':
463e12c5d1SDavid du Colombier 			if (table[ldata][c].rcol)
473e12c5d1SDavid du Colombier 				if (lused[c]) /*Zero field width*/
48*219b2ee8SDavid du Colombier 					Bprint(&tabout, "\\n(%2su ", reg(c, CMID));
493e12c5d1SDavid du Colombier 		case 'c':
503e12c5d1SDavid du Colombier 		case 'l':
513e12c5d1SDavid du Colombier 		case 'r':
523e12c5d1SDavid du Colombier 			if (realsplit ? rused[c] : (used[c] + lused[c]))
53*219b2ee8SDavid du Colombier 				Bprint(&tabout, "\\n(%2su ", reg(c, CRIGHT));
543e12c5d1SDavid du Colombier 			continue;
553e12c5d1SDavid du Colombier 		case 's':
563e12c5d1SDavid du Colombier 			if (lspan(lform, c))
57*219b2ee8SDavid du Colombier 				Bprint(&tabout, "\\n(%2su ", reg(c, CRIGHT));
583e12c5d1SDavid du Colombier 			continue;
593e12c5d1SDavid du Colombier 		}
603e12c5d1SDavid du Colombier 	}
61*219b2ee8SDavid du Colombier 	Bprint(&tabout, "\n");
623e12c5d1SDavid du Colombier }
633e12c5d1SDavid du Colombier 
643e12c5d1SDavid du Colombier 
653e12c5d1SDavid du Colombier int
ifline(char * s)663e12c5d1SDavid du Colombier ifline(char *s)
673e12c5d1SDavid du Colombier {
683e12c5d1SDavid du Colombier 	if (!point(s))
693e12c5d1SDavid du Colombier 		return(0);
703e12c5d1SDavid du Colombier 	if (s[0] == '\\')
713e12c5d1SDavid du Colombier 		s++;
723e12c5d1SDavid du Colombier 	if (s[1] )
733e12c5d1SDavid du Colombier 		return(0);
743e12c5d1SDavid du Colombier 	if (s[0] == '_')
753e12c5d1SDavid du Colombier 		return('-');
763e12c5d1SDavid du Colombier 	if (s[0] == '=')
773e12c5d1SDavid du Colombier 		return('=');
783e12c5d1SDavid du Colombier 	return(0);
793e12c5d1SDavid du Colombier }
803e12c5d1SDavid du Colombier 
813e12c5d1SDavid du Colombier 
823e12c5d1SDavid du Colombier void
need(void)833e12c5d1SDavid du Colombier need(void)
843e12c5d1SDavid du Colombier {
853e12c5d1SDavid du Colombier 	int	texlin, horlin, i;
863e12c5d1SDavid du Colombier 
873e12c5d1SDavid du Colombier 	for (texlin = horlin = i = 0; i < nlin; i++) {
883e12c5d1SDavid du Colombier 		if (fullbot[i] != 0)
893e12c5d1SDavid du Colombier 			horlin++;
903e12c5d1SDavid du Colombier 		else if (instead[i] != 0)
913e12c5d1SDavid du Colombier 			continue;
923e12c5d1SDavid du Colombier 		else
933e12c5d1SDavid du Colombier 			texlin++;
943e12c5d1SDavid du Colombier 	}
95*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".ne %dv+%dp\n", texlin, 2 * horlin);
963e12c5d1SDavid du Colombier }
973e12c5d1SDavid du Colombier 
983e12c5d1SDavid du Colombier 
993e12c5d1SDavid du Colombier void
deftail(void)1003e12c5d1SDavid du Colombier deftail(void)
1013e12c5d1SDavid du Colombier {
1023e12c5d1SDavid du Colombier 	int	i, c, lf, lwid;
1033e12c5d1SDavid du Colombier 
1043e12c5d1SDavid du Colombier 	for (i = 0; i < MAXHEAD; i++)
1053e12c5d1SDavid du Colombier 		if (linestop[i])
106*219b2ee8SDavid du Colombier 			Bprint(&tabout, ".nr #%c 0-1\n", linestop[i] + 'a' - 1);
107*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".nr #a 0-1\n");
108*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".eo\n");
109*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".de T#\n");
110*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".nr 35 1m\n");
111*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".ds #d .d\n");
112*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".if \\(ts\\n(.z\\(ts\\(ts .ds #d nl\n");
113*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".mk ##\n");
114*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".nr ## -1v\n");
115*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".ls 1\n");
1163e12c5d1SDavid du Colombier 	for (i = 0; i < MAXHEAD; i++)
1173e12c5d1SDavid du Colombier 		if (linestop[i])
118*219b2ee8SDavid du Colombier 			Bprint(&tabout, ".if \\n(#T>=0 .nr #%c \\n(#T\n",
1193e12c5d1SDavid du Colombier 			     linestop[i] + 'a' - 1);
1203e12c5d1SDavid du Colombier 	if (boxflg || allflg || dboxflg) /* bottom of table line */
1213e12c5d1SDavid du Colombier 		if (fullbot[nlin-1] == 0) {
1223e12c5d1SDavid du Colombier 			if (!pr1403)
123*219b2ee8SDavid du Colombier 				Bprint(&tabout, ".if \\n(T. .vs \\n(.vu-\\n(.sp\n");
124*219b2ee8SDavid du Colombier 			Bprint(&tabout, ".if \\n(T. ");
1253e12c5d1SDavid du Colombier 			drawline(nlin, 0, ncol, dboxflg ? '=' : '-', 1, 0);
126*219b2ee8SDavid du Colombier 			Bprint(&tabout, "\n.if \\n(T. .vs\n");
1273e12c5d1SDavid du Colombier 			/* T. is really an argument to a macro but because of
1283e12c5d1SDavid du Colombier 		   eqn we don't dare pass it as an argument and reference by $1 */
1293e12c5d1SDavid du Colombier 		}
1303e12c5d1SDavid du Colombier 	for (c = 0; c < ncol; c++) {
1313e12c5d1SDavid du Colombier 		if ((lf = left(nlin - 1, c, &lwid)) >= 0) {
132*219b2ee8SDavid du Colombier 			Bprint(&tabout, ".if \\n(#%c>=0 .sp -1\n", linestop[lf] + 'a' - 1);
133*219b2ee8SDavid du Colombier 			Bprint(&tabout, ".if \\n(#%c>=0 ", linestop[lf] + 'a' - 1);
1343e12c5d1SDavid du Colombier 			tohcol(c);
1353e12c5d1SDavid du Colombier 			drawvert(lf, nlin - 1, c, lwid);
136*219b2ee8SDavid du Colombier 			Bprint(&tabout, "\\h'|\\n(TWu'\n");
1373e12c5d1SDavid du Colombier 		}
1383e12c5d1SDavid du Colombier 	}
1393e12c5d1SDavid du Colombier 	if (boxflg || allflg || dboxflg) /* right hand line */ {
140*219b2ee8SDavid du Colombier 		Bprint(&tabout, ".if \\n(#a>=0 .sp -1\n");
141*219b2ee8SDavid du Colombier 		Bprint(&tabout, ".if \\n(#a>=0 \\h'|\\n(TWu'");
1423e12c5d1SDavid du Colombier 		drawvert (0, nlin - 1, ncol, dboxflg ? 2 : 1);
143*219b2ee8SDavid du Colombier 		Bprint(&tabout, "\n");
1443e12c5d1SDavid du Colombier 	}
145*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".ls\n");
146*219b2ee8SDavid du Colombier 	Bprint(&tabout, "..\n");
147*219b2ee8SDavid du Colombier 	Bprint(&tabout, ".ec\n");
1483e12c5d1SDavid du Colombier }
1493e12c5d1SDavid du Colombier 
1503e12c5d1SDavid du Colombier 
151