xref: /plan9-contrib/sys/src/cmd/tbl/tb.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier /* tb.c: check which entries exist, also storage allocation */
2*3e12c5d1SDavid du Colombier # include "t.h"
3*3e12c5d1SDavid du Colombier 
4*3e12c5d1SDavid du Colombier void
checkuse(void)5*3e12c5d1SDavid du Colombier checkuse(void)
6*3e12c5d1SDavid du Colombier {
7*3e12c5d1SDavid du Colombier 	int	i, c, k;
8*3e12c5d1SDavid du Colombier 
9*3e12c5d1SDavid du Colombier 	for (c = 0; c < ncol; c++) {
10*3e12c5d1SDavid du Colombier 		used[c] = lused[c] = rused[c] = 0;
11*3e12c5d1SDavid du Colombier 		for (i = 0; i < nlin; i++) {
12*3e12c5d1SDavid du Colombier 			if (instead[i] || fullbot[i])
13*3e12c5d1SDavid du Colombier 				continue;
14*3e12c5d1SDavid du Colombier 			k = ctype(i, c);
15*3e12c5d1SDavid du Colombier 			if (k == '-' || k == '=')
16*3e12c5d1SDavid du Colombier 				continue;
17*3e12c5d1SDavid du Colombier 			if ((k == 'n' || k == 'a')) {
18*3e12c5d1SDavid du Colombier 				rused[c] |= real(table[i][c].rcol);
19*3e12c5d1SDavid du Colombier 				if ( !real(table[i][c].rcol))
20*3e12c5d1SDavid du Colombier 					used[c] |= real(table[i][c].col);
21*3e12c5d1SDavid du Colombier 				if (table[i][c].rcol)
22*3e12c5d1SDavid du Colombier 					lused[c] |= real(table[i][c].col);
23*3e12c5d1SDavid du Colombier 			} else
24*3e12c5d1SDavid du Colombier 				used[c] |= real(table[i][c].col);
25*3e12c5d1SDavid du Colombier 		}
26*3e12c5d1SDavid du Colombier 	}
27*3e12c5d1SDavid du Colombier }
28*3e12c5d1SDavid du Colombier 
29*3e12c5d1SDavid du Colombier 
30*3e12c5d1SDavid du Colombier int
real(char * s)31*3e12c5d1SDavid du Colombier real(char *s)
32*3e12c5d1SDavid du Colombier {
33*3e12c5d1SDavid du Colombier 	if (s == 0)
34*3e12c5d1SDavid du Colombier 		return(0);
35*3e12c5d1SDavid du Colombier 	if (!point(s))
36*3e12c5d1SDavid du Colombier 		return(1);
37*3e12c5d1SDavid du Colombier 	if (*s == 0)
38*3e12c5d1SDavid du Colombier 		return(0);
39*3e12c5d1SDavid du Colombier 	return(1);
40*3e12c5d1SDavid du Colombier }
41*3e12c5d1SDavid du Colombier 
42*3e12c5d1SDavid du Colombier 
43*3e12c5d1SDavid du Colombier int	spcount = 0;
44*3e12c5d1SDavid du Colombier # define MAXVEC 20
45*3e12c5d1SDavid du Colombier char	*spvecs[MAXVEC];
46*3e12c5d1SDavid du Colombier 
47*3e12c5d1SDavid du Colombier char	*
chspace(void)48*3e12c5d1SDavid du Colombier chspace(void)
49*3e12c5d1SDavid du Colombier {
50*3e12c5d1SDavid du Colombier 	char	*pp;
51*3e12c5d1SDavid du Colombier 
52*3e12c5d1SDavid du Colombier 	if (spvecs[spcount])
53*3e12c5d1SDavid du Colombier 		return(spvecs[spcount++]);
54*3e12c5d1SDavid du Colombier 	if (spcount >= MAXVEC)
55*3e12c5d1SDavid du Colombier 		error("Too many characters in table");
56*3e12c5d1SDavid du Colombier 	spvecs[spcount++] = pp = calloc(MAXCHS + MAXLINLEN, 1);
57*3e12c5d1SDavid du Colombier 	if (pp == (char *) - 1 || pp == (char *)0)
58*3e12c5d1SDavid du Colombier 		error("no space for characters");
59*3e12c5d1SDavid du Colombier 	return(pp);
60*3e12c5d1SDavid du Colombier }
61*3e12c5d1SDavid du Colombier 
62*3e12c5d1SDavid du Colombier 
63*3e12c5d1SDavid du Colombier # define MAXPC 50
64*3e12c5d1SDavid du Colombier char	*thisvec;
65*3e12c5d1SDavid du Colombier int	tpcount = -1;
66*3e12c5d1SDavid du Colombier char	*tpvecs[MAXPC];
67*3e12c5d1SDavid du Colombier 
68*3e12c5d1SDavid du Colombier int	*
alocv(int n)69*3e12c5d1SDavid du Colombier alocv(int n)
70*3e12c5d1SDavid du Colombier {
71*3e12c5d1SDavid du Colombier 	int	*tp, *q;
72*3e12c5d1SDavid du Colombier 
73*3e12c5d1SDavid du Colombier 	if (tpcount < 0 || thisvec + n > tpvecs[tpcount] + MAXCHS) {
74*3e12c5d1SDavid du Colombier 		tpcount++;
75*3e12c5d1SDavid du Colombier 		if (tpvecs[tpcount] == 0) {
76*3e12c5d1SDavid du Colombier 			tpvecs[tpcount] = calloc(MAXCHS, 1);
77*3e12c5d1SDavid du Colombier 		}
78*3e12c5d1SDavid du Colombier 		thisvec = tpvecs[tpcount];
79*3e12c5d1SDavid du Colombier 		if (thisvec == (char *)0)
80*3e12c5d1SDavid du Colombier 			error("no space for vectors");
81*3e12c5d1SDavid du Colombier 	}
82*3e12c5d1SDavid du Colombier 	tp = (int *)thisvec;
83*3e12c5d1SDavid du Colombier 	thisvec += n;
84*3e12c5d1SDavid du Colombier 	for (q = tp; q < (int *)thisvec; q++)
85*3e12c5d1SDavid du Colombier 		*q = 0;
86*3e12c5d1SDavid du Colombier 	return(tp);
87*3e12c5d1SDavid du Colombier }
88*3e12c5d1SDavid du Colombier 
89*3e12c5d1SDavid du Colombier 
90*3e12c5d1SDavid du Colombier void
release(void)91*3e12c5d1SDavid du Colombier release(void)
92*3e12c5d1SDavid du Colombier {
93*3e12c5d1SDavid du Colombier 			/* give back unwanted space in some vectors */
94*3e12c5d1SDavid du Colombier 			/* this should call free; it does not because
95*3e12c5d1SDavid du Colombier 				alloc() is so buggy */
96*3e12c5d1SDavid du Colombier 	spcount = 0;
97*3e12c5d1SDavid du Colombier 	tpcount = -1;
98*3e12c5d1SDavid du Colombier 	exstore = 0;
99*3e12c5d1SDavid du Colombier }
100*3e12c5d1SDavid du Colombier 
101*3e12c5d1SDavid du Colombier 
102