xref: /plan9/sys/src/cmd/tbl/t5.c (revision 43af371b8d63420d32d0cb0b58914db16dcd7715)
1*3e12c5d1SDavid du Colombier /* t5.c: read data for table */
2*3e12c5d1SDavid du Colombier # include "t.h"
3*3e12c5d1SDavid du Colombier 
4*3e12c5d1SDavid du Colombier void
gettbl(void)5*3e12c5d1SDavid du Colombier gettbl(void)
6*3e12c5d1SDavid du Colombier {
7*3e12c5d1SDavid du Colombier 	int	icol, ch;
8*3e12c5d1SDavid du Colombier 
9*3e12c5d1SDavid du Colombier 	cstore = cspace = chspace();
10*3e12c5d1SDavid du Colombier 	textflg = 0;
11*3e12c5d1SDavid du Colombier 	for (nlin = nslin = 0; gets1(cstore, MAXCHS - (cstore - cspace)); nlin++) {
12*3e12c5d1SDavid du Colombier 		stynum[nlin] = nslin;
13*3e12c5d1SDavid du Colombier 		if (prefix(".TE", cstore)) {
14*3e12c5d1SDavid du Colombier 			leftover = 0;
15*3e12c5d1SDavid du Colombier 			break;
16*3e12c5d1SDavid du Colombier 		}
17*3e12c5d1SDavid du Colombier 		if (prefix(".TC", cstore) || prefix(".T&", cstore)) {
18*3e12c5d1SDavid du Colombier 			readspec();
19*3e12c5d1SDavid du Colombier 			nslin++;
20*3e12c5d1SDavid du Colombier 		}
21*3e12c5d1SDavid du Colombier 		if (nlin >= MAXLIN) {
22*3e12c5d1SDavid du Colombier 			leftover = cstore;
23*3e12c5d1SDavid du Colombier 			break;
24*3e12c5d1SDavid du Colombier 		}
25*3e12c5d1SDavid du Colombier 		fullbot[nlin] = 0;
26*3e12c5d1SDavid du Colombier 		if (cstore[0] == '.' && !isdigit(cstore[1])) {
27*3e12c5d1SDavid du Colombier 			instead[nlin] = cstore;
28*3e12c5d1SDavid du Colombier 			while (*cstore++)
29*3e12c5d1SDavid du Colombier 				;
30*3e12c5d1SDavid du Colombier 			continue;
31*3e12c5d1SDavid du Colombier 		} else
32*3e12c5d1SDavid du Colombier 			instead[nlin] = 0;
33*3e12c5d1SDavid du Colombier 		if (nodata(nlin)) {
34*3e12c5d1SDavid du Colombier 			if (ch = oneh(nlin))
35*3e12c5d1SDavid du Colombier 				fullbot[nlin] = ch;
36*3e12c5d1SDavid du Colombier 			table[nlin] = (struct colstr *) alocv((ncol + 2) * sizeof(table[0][0]));
37*3e12c5d1SDavid du Colombier 			for (icol = 0; icol < ncol; icol++) {
38*3e12c5d1SDavid du Colombier 				table[nlin][icol].rcol = "";
39*3e12c5d1SDavid du Colombier 				table[nlin][icol].col = "";
40*3e12c5d1SDavid du Colombier 			}
41*3e12c5d1SDavid du Colombier 			nlin++;
42*3e12c5d1SDavid du Colombier 			nslin++;
43*3e12c5d1SDavid du Colombier 			fullbot[nlin] = 0;
44*3e12c5d1SDavid du Colombier 			instead[nlin] = (char *) 0;
45*3e12c5d1SDavid du Colombier 		}
46*3e12c5d1SDavid du Colombier 		table[nlin] = (struct colstr *) alocv((ncol + 2) * sizeof(table[0][0]));
47*3e12c5d1SDavid du Colombier 		if (cstore[1] == 0)
48*3e12c5d1SDavid du Colombier 			switch (cstore[0]) {
49*3e12c5d1SDavid du Colombier 			case '_':
50*3e12c5d1SDavid du Colombier 				fullbot[nlin] = '-';
51*3e12c5d1SDavid du Colombier 				continue;
52*3e12c5d1SDavid du Colombier 			case '=':
53*3e12c5d1SDavid du Colombier 				fullbot[nlin] = '=';
54*3e12c5d1SDavid du Colombier 				continue;
55*3e12c5d1SDavid du Colombier 			}
56*3e12c5d1SDavid du Colombier 		stynum[nlin] = nslin;
57*3e12c5d1SDavid du Colombier 		nslin = min(nslin + 1, nclin - 1);
58*3e12c5d1SDavid du Colombier 		for (icol = 0; icol < ncol; icol++) {
59*3e12c5d1SDavid du Colombier 			table[nlin][icol].col = cstore;
60*3e12c5d1SDavid du Colombier 			table[nlin][icol].rcol = 0;
61*3e12c5d1SDavid du Colombier 			ch = 1;
62*3e12c5d1SDavid du Colombier 			if (match(cstore, "T{")) { /* text follows */
63*3e12c5d1SDavid du Colombier 				table[nlin][icol].col =
64*3e12c5d1SDavid du Colombier 				    (char *)gettext(cstore, nlin, icol,
65*3e12c5d1SDavid du Colombier 				    font[icol][stynum[nlin]],
66*3e12c5d1SDavid du Colombier 				    csize[icol][stynum[nlin]]);
67*3e12c5d1SDavid du Colombier 			} else
68*3e12c5d1SDavid du Colombier 			 {
69*3e12c5d1SDavid du Colombier 				for (; (ch = *cstore) != '\0' && ch != tab; cstore++)
70*3e12c5d1SDavid du Colombier 					;
71*3e12c5d1SDavid du Colombier 				*cstore++ = '\0';
72*3e12c5d1SDavid du Colombier 				switch (ctype(nlin, icol)) /* numerical or alpha, subcol */ {
73*3e12c5d1SDavid du Colombier 				case 'n':
74*3e12c5d1SDavid du Colombier 					table[nlin][icol].rcol = maknew(table[nlin][icol].col);
75*3e12c5d1SDavid du Colombier 					break;
76*3e12c5d1SDavid du Colombier 				case 'a':
77*3e12c5d1SDavid du Colombier 					table[nlin][icol].rcol = table[nlin][icol].col;
78*3e12c5d1SDavid du Colombier 					table[nlin][icol].col = "";
79*3e12c5d1SDavid du Colombier 					break;
80*3e12c5d1SDavid du Colombier 				}
81*3e12c5d1SDavid du Colombier 			}
82*3e12c5d1SDavid du Colombier 			while (ctype(nlin, icol + 1) == 's') /* spanning */
83*3e12c5d1SDavid du Colombier 				table[nlin][++icol].col = "";
84*3e12c5d1SDavid du Colombier 			if (ch == '\0')
85*3e12c5d1SDavid du Colombier 				break;
86*3e12c5d1SDavid du Colombier 		}
87*3e12c5d1SDavid du Colombier 		while (++icol < ncol + 2) {
88*3e12c5d1SDavid du Colombier 			table[nlin][icol].col = "";
89*3e12c5d1SDavid du Colombier 			table [nlin][icol].rcol = 0;
90*3e12c5d1SDavid du Colombier 		}
91*3e12c5d1SDavid du Colombier 		while (*cstore != '\0')
92*3e12c5d1SDavid du Colombier 			cstore++;
93*3e12c5d1SDavid du Colombier 		if (cstore - cspace + MAXLINLEN > MAXCHS)
94*3e12c5d1SDavid du Colombier 			cstore = cspace = chspace();
95*3e12c5d1SDavid du Colombier 	}
96*3e12c5d1SDavid du Colombier 	last = cstore;
97*3e12c5d1SDavid du Colombier 	permute();
98*3e12c5d1SDavid du Colombier 	if (textflg)
99*3e12c5d1SDavid du Colombier 		untext();
100*3e12c5d1SDavid du Colombier }
101*3e12c5d1SDavid du Colombier 
102*3e12c5d1SDavid du Colombier 
103*3e12c5d1SDavid du Colombier int
nodata(int il)104*3e12c5d1SDavid du Colombier nodata(int il)
105*3e12c5d1SDavid du Colombier {
106*3e12c5d1SDavid du Colombier 	int	c;
107*3e12c5d1SDavid du Colombier 
108*3e12c5d1SDavid du Colombier 	for (c = 0; c < ncol; c++) {
109*3e12c5d1SDavid du Colombier 		switch (ctype(il, c)) {
110*3e12c5d1SDavid du Colombier 		case 'c':
111*3e12c5d1SDavid du Colombier 		case 'n':
112*3e12c5d1SDavid du Colombier 		case 'r':
113*3e12c5d1SDavid du Colombier 		case 'l':
114*3e12c5d1SDavid du Colombier 		case 's':
115*3e12c5d1SDavid du Colombier 		case 'a':
116*3e12c5d1SDavid du Colombier 			return(0);
117*3e12c5d1SDavid du Colombier 		}
118*3e12c5d1SDavid du Colombier 	}
119*3e12c5d1SDavid du Colombier 	return(1);
120*3e12c5d1SDavid du Colombier }
121*3e12c5d1SDavid du Colombier 
122*3e12c5d1SDavid du Colombier 
123*3e12c5d1SDavid du Colombier int
oneh(int lin)124*3e12c5d1SDavid du Colombier oneh(int lin)
125*3e12c5d1SDavid du Colombier {
126*3e12c5d1SDavid du Colombier 	int	k, icol;
127*3e12c5d1SDavid du Colombier 
128*3e12c5d1SDavid du Colombier 	k = ctype(lin, 0);
129*3e12c5d1SDavid du Colombier 	for (icol = 1; icol < ncol; icol++) {
130*3e12c5d1SDavid du Colombier 		if (k != ctype(lin, icol))
131*3e12c5d1SDavid du Colombier 			return(0);
132*3e12c5d1SDavid du Colombier 	}
133*3e12c5d1SDavid du Colombier 	return(k);
134*3e12c5d1SDavid du Colombier }
135*3e12c5d1SDavid du Colombier 
136*3e12c5d1SDavid du Colombier 
137*3e12c5d1SDavid du Colombier # define SPAN "\\^"
138*3e12c5d1SDavid du Colombier 
139*3e12c5d1SDavid du Colombier void
permute(void)140*3e12c5d1SDavid du Colombier permute(void)
141*3e12c5d1SDavid du Colombier {
142*3e12c5d1SDavid du Colombier 	int	irow, jcol, is;
143*3e12c5d1SDavid du Colombier 	char	*start, *strig;
144*3e12c5d1SDavid du Colombier 
145*3e12c5d1SDavid du Colombier 	for (jcol = 0; jcol < ncol; jcol++) {
146*3e12c5d1SDavid du Colombier 		for (irow = 1; irow < nlin; irow++) {
147*3e12c5d1SDavid du Colombier 			if (vspand(irow, jcol, 0)) {
148*3e12c5d1SDavid du Colombier 				is = prev(irow);
149*3e12c5d1SDavid du Colombier 				if (is < 0)
150*3e12c5d1SDavid du Colombier 					error("Vertical spanning in first row not allowed");
151*3e12c5d1SDavid du Colombier 				start = table[is][jcol].col;
152*3e12c5d1SDavid du Colombier 				strig = table[is][jcol].rcol;
153*3e12c5d1SDavid du Colombier 				while (irow < nlin && vspand(irow, jcol, 0))
154*3e12c5d1SDavid du Colombier 					irow++;
155*3e12c5d1SDavid du Colombier 				table[--irow][jcol].col = start;
156*3e12c5d1SDavid du Colombier 				table[irow][jcol].rcol = strig;
157*3e12c5d1SDavid du Colombier 				while (is < irow) {
158*3e12c5d1SDavid du Colombier 					table[is][jcol].rcol = 0;
159*3e12c5d1SDavid du Colombier 					table[is][jcol].col = SPAN;
160*3e12c5d1SDavid du Colombier 					is = next(is);
161*3e12c5d1SDavid du Colombier 				}
162*3e12c5d1SDavid du Colombier 			}
163*3e12c5d1SDavid du Colombier 		}
164*3e12c5d1SDavid du Colombier 	}
165*3e12c5d1SDavid du Colombier }
166*3e12c5d1SDavid du Colombier 
167*3e12c5d1SDavid du Colombier 
168*3e12c5d1SDavid du Colombier int
vspand(int ir,int ij,int ifform)169*3e12c5d1SDavid du Colombier vspand(int ir, int ij, int ifform)
170*3e12c5d1SDavid du Colombier {
171*3e12c5d1SDavid du Colombier 	if (ir < 0)
172*3e12c5d1SDavid du Colombier 		return(0);
173*3e12c5d1SDavid du Colombier 	if (ir >= nlin)
174*3e12c5d1SDavid du Colombier 		return(0);
175*3e12c5d1SDavid du Colombier 	if (instead[ir])
176*3e12c5d1SDavid du Colombier 		return(0);
177*3e12c5d1SDavid du Colombier 	if (ifform == 0 && ctype(ir, ij) == '^')
178*3e12c5d1SDavid du Colombier 		return(1);
179*3e12c5d1SDavid du Colombier 	if (table[ir][ij].rcol != 0)
180*3e12c5d1SDavid du Colombier 		return(0);
181*3e12c5d1SDavid du Colombier 	if (fullbot[ir])
182*3e12c5d1SDavid du Colombier 		return(0);
183*3e12c5d1SDavid du Colombier 	return(vspen(table[ir][ij].col));
184*3e12c5d1SDavid du Colombier }
185*3e12c5d1SDavid du Colombier 
186*3e12c5d1SDavid du Colombier 
187*3e12c5d1SDavid du Colombier int
vspen(char * s)188*3e12c5d1SDavid du Colombier vspen(char *s)
189*3e12c5d1SDavid du Colombier {
190*3e12c5d1SDavid du Colombier 	if (s == 0)
191*3e12c5d1SDavid du Colombier 		return(0);
192*3e12c5d1SDavid du Colombier 	if (!point(s))
193*3e12c5d1SDavid du Colombier 		return(0);
194*3e12c5d1SDavid du Colombier 	return(match(s, SPAN));
195*3e12c5d1SDavid du Colombier }
196*3e12c5d1SDavid du Colombier 
197*3e12c5d1SDavid du Colombier 
198