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