aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/tbl/tb.c
blob: 5cc59880165974a8ef51d2d1af76c235754e3869 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* tb.c: check which entries exist, also storage allocation */
# include "t.h"

void
checkuse(void)
{
	int	i, c, k;

	for (c = 0; c < ncol; c++) {
		used[c] = lused[c] = rused[c] = 0;
		for (i = 0; i < nlin; i++) {
			if (instead[i] || fullbot[i]) 
				continue;
			k = ctype(i, c);
			if (k == '-' || k == '=') 
				continue;
			if ((k == 'n' || k == 'a')) {
				rused[c] |= real(table[i][c].rcol);
				if ( !real(table[i][c].rcol))
					used[c] |= real(table[i][c].col);
				if (table[i][c].rcol)
					lused[c] |= real(table[i][c].col);
			} else
				used[c] |= real(table[i][c].col);
		}
	}
}


int
real(char *s)
{
	if (s == 0) 
		return(0);
	if (!point(s)) 
		return(1);
	if (*s == 0) 
		return(0);
	return(1);
}


int	spcount = 0;
# define MAXVEC 20
char	*spvecs[MAXVEC];

char	*
chspace(void)
{
	char	*pp;

	if (spvecs[spcount])
		return(spvecs[spcount++]);
	if (spcount >= MAXVEC)
		error("Too many characters in table");
	spvecs[spcount++] = pp = calloc(MAXCHS + MAXLINLEN, 1);
	if (pp == (char *) - 1 || pp == (char *)0)
		error("no space for characters");
	return(pp);
}


# define MAXPC 50
char	*thisvec;
int	tpcount = -1;
char	*tpvecs[MAXPC];

int	*
alocv(int n)
{
	int	*tp, *q;

	if (tpcount < 0 || thisvec + n > tpvecs[tpcount] + MAXCHS) {
		tpcount++;
		if (tpvecs[tpcount] == 0) {
			tpvecs[tpcount] = calloc(MAXCHS, 1);
		}
		thisvec = tpvecs[tpcount];
		if (thisvec == (char *)0)
			error("no space for vectors");
	}
	tp = (int *)thisvec;
	thisvec += n;
	for (q = tp; q < (int *)thisvec; q++)
		*q = 0;
	return(tp);
}


void
release(void)
{
			/* give back unwanted space in some vectors */
			/* this should call free; it does not because
				alloc() is so buggy */
	spcount = 0;
	tpcount = -1;
	exstore = 0;
}